如何在 python 中读取多个 wav 文件,并转换为 numpy 数组进行绘图

Posted

技术标签:

【中文标题】如何在 python 中读取多个 wav 文件,并转换为 numpy 数组进行绘图【英文标题】:how to read multiple wav files in python, and convert to numpy arrays to plot 【发布时间】:2018-09-26 05:42:00 【问题描述】:

我需要在我的项目目录中读取多个名为 chunk1.wav、chunk2.wav... 的波形文件,并将它们转换为 numpy 数组进行绘图。我可以为单个 wav 文件执行此操作,将其转换为 numpy 并使用 matplotlib 绘制它,但无法为 wav 文件数组执行此操作。

我全面搜索了如何使用 .read() 函数从 scipy 库中导入一组 wav 文件。我尝试使用字符串数组,但 read() 函数不能将变量“理解”为参数,更不用说字符串数组了。 关于如何实现这种多 wav 读取的任何建议?

import pyaudio
import wave
from matplotlib import pyplot as plt
import numpy as np
from pydub import Audiosegment
from pydub.silence import split_on_silence
from scipy.io.wavfile import read

no_of_files = 15
file_name = []

for i in range(0, no_of_files):
    file_name.append("chunk0.wav".format(i))

a = read(file_name[5]) #test to see if it works for one file
a = np.array(a[1],dtype=float)
plt.plot(a)
plt.show()

我得到的错误:

文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/io/wavfile.py”,第 168 行,在 _read_riff_chunk “明白了。”.format(repr(str1))) ValueError: 文件格式 ''... 不理解。

【问题讨论】:

你能显示 file_names[5] 的值是什么样的吗,我怀疑错误在那里,但不能确定 @SvenH。所以当我 print(file_name[5]) 它给出了我所期望的 chunk5.wav 如果该文件不在您当前的工作目录中,请尝试提供完整路径“C:/.../etc/chunk5.wav” @SvenH。是的,我确定该文件在我的密码中,我也尝试提供完整地址,但我得到了同样的错误 【参考方案1】:

查看 scipy 内部结构,这是由于文件签名未被理解造成的,从您收到的错误消息看来,文件签名丢失(''),或者从文件中读取数据存在其他问题:

def _read_riff_chunk(fid):
    str1 = fid.read(4)  # File signature
    if str1 == b'RIFF':
        is_big_endian = False
        fmt = '<I'
    elif str1 == b'RIFX':
        is_big_endian = True
        fmt = '>I'
    else:
        # There are also .wav files with "FFIR" or "XFIR" signatures?
        raise ValueError("File format ... not "
"understood.".format(repr(str1)))

我使用 python wave 库一目了然地看不到任何类似的限制,因此可以尝试使用它读取数据,然后将数据转换为 numpy 数组

【讨论】:

所以我发现如果我使用 a = read('name'),其中 name = "output.wav" 被定义为一个字符串,而 output.wav 是我目录中的一个文件,它效果很好,但是当我使用 read('file_name[5]') 时它会给出错误,知道如何输入数组字符串吗? 所以我现在怀疑当这些被分块时发生了一些事情,导致它们丢失了签名。我想用chunk5.wav 而不是output.wav做上述应该失败 是的,你是对的。用“chunk5.wav”来做是行不通的。我将查看丢失的签名,这些块是使用 pyAudio 库生成的,我在其中将单独的单词从存储在 output.wav 中的句子中分离出来,并将每个单词存储为 chunk.wav。知道如何修复签名吗?谢谢 抱歉,不确定,我会回去检查生成块的代码,并确定它是在分块中还是在保存中。我认为 WAV 是非常结构化的文件,因此您需要以正确的方式保存它们,可能使用库函数,切割 WAV 看起来不会给您多个 wav

以上是关于如何在 python 中读取多个 wav 文件,并转换为 numpy 数组进行绘图的主要内容,如果未能解决你的问题,请参考以下文章

python读取wav文件并播放[pyaudio/wave]

读取音频 wav 文件并绘制在 python 中平滑的音频频率响应

谁知道如何在python中用处理wav文件,并且对他的频谱进行分析的程序

创建并使用 WAV 文件作为对象 Python

如何使用python [duplicate]连接多个.wav文件

以毫秒为单位读取 python 中的 wav