【问题标题】:Reading .wav as bytes将 .wav 读取为字节
【发布时间】:2021-09-22 21:03:59
【问题描述】:

我正在使用 2 个工具在 Python 中读取 .wav 文件。首先 - 使用模块 soundfile:

wav = sf.read(speech_file)
b = io.BytesIO(wav[0])

结果我得到了这样的字节数据。没错:

....\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ .....

然后我用模块wave阅读.wav:

wf = wave.open(speech_file, "rb")
data = wf.readframes(wf.getparams().nframes)

结果字节完全不正确:

....a\x00\xda\x00\xcb\x00\xba\x00\xb0\x00\xa3\x00\x8f\x00|\x00g\x00S\x00=\x00&\x00\x0b\x00\xf3\xff\xd4\xff\xb0\xff\x8d\xffe\xff\xff\x18\xff\xef\xfe\xc6\xfe\x99\xfed\xfe-\xfe\xf5\xfd\xc0\xfd\x92\xfdj....

为什么两个不同的工具没有给出相同的结果?如何从第一个字节对象制作第二个字节对象?事实上,我不能使用wave 的字节,因为它与原声完全不同。

【问题讨论】:

  • 为什么你认为第一个结果是正确的? WAVE 文件以已知的标题开始。前几个字节是字符“RIFF”。我不这么认为。 wave 模块跳过标头并返回数据,该数据看起来更像 16 位 PCM 数据。在现实世界中,你永远不会得到一长串的 0。总是有背景噪音。
  • 我将字节转换为 numpy 数组,然后将其可视化。第一个工具提供真实的声音信号timg.in/BFlNn
  • 您知道样本是 16 位值,而不是字节?
  • 真的,如果不查看代码或访问文件,我们将无能为力。 wave 模块运行良好;我用过很多次了。
  • 已将 .wav 和字节数据加载到 drive。希望它有助于解决问题。原始 .wav 配乐是俄语语音。我上面加载的所有代码

标签: python wav wave soundfile


【解决方案1】:

内置模块wave读取DSD格式的.wav文件,音轨表示为0和1的序列。但是,soundfile读取PCM格式的.wav,这是信号幅度值的数组。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2017-10-09
  • 2016-04-11
  • 2013-08-19
  • 1970-01-01
  • 2020-11-14
  • 2011-02-09
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多