在 Python 中读取 \*.wav 文件

新手上路,请多包涵

我需要分析写入 .wav 文件的声音。为此,我需要将此文件转换为一组数字(例如数组)。我想我需要使用 wave 包。但是,我不知道它究竟是如何工作的。例如我做了以下事情:

 import wave
w = wave.open('/usr/share/sounds/ekiga/voicemail.wav', 'r')
for i in range(w.getnframes()):
    frame = w.readframes(i)
    print frame

作为这段代码的结果,我希望看到声压是时间的函数。相比之下,我看到了很多奇怪的、神秘的符号(不是十六进制数)。任何人都可以帮我解决这个问题吗?

原文由 Roman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 448
2 个回答

根据 文档scipy.io.wavfile.read(somefile) 返回两个项目的元组:第一个是每秒样本的 采样率,第二个是 numpy 包含从文件读取的所有数据的数组:

 from scipy.io import wavfile
samplerate, data = wavfile.read('./output/audio.wav')

原文由 Alex Martelli 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 struct 模块,您可以获取波帧(在 -32768 和 32767 之间的 2 的互补 二进制中(即 0x80000x7FFF 读取)。一个 MONO, 16-BIT, WAVE 文件。我发现 这个网页 在制定这个方面非常有用:

 import wave, struct

wavefile = wave.open('sine.wav', 'r')

length = wavefile.getnframes()
for i in range(0, length):
    wavedata = wavefile.readframes(1)
    data = struct.unpack("<h", wavedata)
    print(int(data[0]))

此片段读取 1 帧。要读取超过一帧(例如 13),请使用

wavedata = wavefile.readframes(13)
data = struct.unpack("<13h", wavedata)

原文由 nak 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题