PyAudio&WAV了解如何存储和播放音频

2021-09-27 05:45:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难理解这些音频文件是如何工作的。我加载的WAV文件如下:

from scipy.io import wavfile
RATE, data = wavfile.read('audio.wav')

这是一个单通道(MONO)文件(我认为它们是一样的,对吗?)。它有形状(1555794,),当我回放它时,听起来很合理:

p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=RATE, input=True, output=True)
stream.write(data)
stream.close()
p.terminate()

我有另一个文件,我在Audacity中创建的,基本上是一样的,只是我复制了第一个通道,使之成为两个通道。当我加载它时,和上面一样,我现在有了data_2channel。当我试着用上面同样的5行来播放data_2channel时,它会播放,但速度是原来的两倍,听起来像是在半速播放。这并不意外。为了让它正常播放,我必须这样做:

p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=RATE, input=True, output=True)
for d in data_2channel:
    stream.write(d)
stream.close()
p.terminate()

这个,我能咽,但我不太明白。当我尝试用2个值来写ndarray时,流是否认识到了这一点,并且做了一些不同于用13000个值来填充1d数组的事情?你知道吗

所以我想,让我们把data_2channel转换回一个频道:

>>> data
array([-1552, -1635, -1361, ..., -2695, -3610, -2742], dtype=int16)

>>> data_2channel.T[0]
array([-1551, -1638, -1357, ..., -2700, -3606, -2744], dtype=int16)

因此data_2channel.T[0]看起来与data几乎相同,但当我尝试播放文件时,出现以下错误:

File "../lib/python3.5/site-packages/pyaudio.py", line 586, in write
    exception_on_underflow)
ValueError: ndarray is not C-contiguous

不知道该怎么想,我试着将data转换成python list,再转换回ndarray,然后试着回放:

p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=RATE, input=True, output=True)
stream.write(np.array(data.tolist()))
stream.close()
p.terminate()

这听起来和我的文件很相似;好像我把它慢了8倍,但不知何故还是保持了相同的时间长度。我不明白为什么听起来不一样。我试着画出两个阵列,它们看起来完全一样。但不知怎么的,把它转换成一个列表,然后再转换回来,破坏了一些东西。有人能给我解释一下这一切是怎么回事吗?你知道吗

编辑

而且它不会把整个文件播放给我。它只发挥了大约50%。我发现我可以通过将channels参数更改为2(duh)来播放双通道文件。你知道吗

stream = p.open(format=pyaudio.paInt16, channels=2, rate=RATE, input=True, output=True)
stream.write(data_2channel)

然而,在这方面的播放是削减到约25%的原始。我很困惑。。你知道吗