0

我正在尝试使用 预处理要在神经网络中使用soundfile.read()的音频文件,但是对于具有相同采样率和长度的不同 .FLAC 文件,该函数对返回的数据进行了不同的格式化。例如,调用data, sr = soundfile.read(audiofile1)生成一个具有形状的数组data.shape = (48000, 2)(其中单个元素的值是幅度,0 或 NumPy float64 中的负幅度),而调用data, sr = soundfile.read(audiofile2)生成一个具有形状的数组data.shape = (48000,)(其中单个元素的值在 NumPy float64 中变化)。

此外,如果有帮助的话,audiofile1是从通过 PyAudio 拍摄的录音中提取的录音,而是audiofile2来自 LibriSpeech 语料库的样本。

所以,我的问题是双重的:

为什么会soundfile.read()产生两种不同的数据格式,如何确保该函数将来返回相同格式的数组?

4

2 回答 2

0

您的audiofile2样本是单声道的,而您的audiofile1录音是立体声的(即您可能使用配置了的 PyAudio 流录制它channels=2)。所以我建议您首先弄清楚您的应用程序需要单声道还是立体声。

如果您真正关心的是单声道音频信号,您可以通过平均声道将立体声(或更一般的 N 声道)音频转换为单声道:

data, sr = soundfile.read(audiofile)
if np.dim(data)>1:
  data = np.mean(data,axis=1)

如果您需要立体声音频,那么您可以通过复制您拥有的通道来创建一个附加通道(尽管这不会添加通常的附加信息,例如不同通道之间的相位或幅度差异):

if np.dim(data)<2:
  data = np.tile(data,(2,1)).transpose()
于 2020-07-15T02:10:49.673 回答
0

它很简单:

data, sr = soundfile.read(audiofile2, always_2d=True)

有了这个,data.shape总会有两个元素;data.shape[0]将是帧数,data.shape[1]将是通道数。

于 2020-07-15T06:28:04.050 回答