如何用pyaudio播放立体声aiff文件?

How to play a stereo aiff file with pyaudio?

这会播放单声道 aifc 文件,但对于任何立体声文件,我都会听到很大的静电噪音:

import pyaudio
import aifc

CHUNK = 1024

wf = aifc.open('C:\path_to_file.aiff', 'rb')

p = pyaudio.PyAudio()

stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                channels=wf.getnchannels(),
                rate=wf.getframerate(),
                output=True)

data = wf.readframes(CHUNK)

while data != '':
    stream.write(data)
    data = wf.readframes(CHUNK)

stream.stop_stream()
stream.close()

p.terminate()

我正在测试的立体声文件:https://archive.org/details/TestAifAiffFile

我在 windows 7,如果这很重要的话。

我在 Linux 上试过你的代码,我也听到了可怕的噪音。

aifc 模块似乎可以正确读取文件,我将其转换为 NumPy 数组,看起来不错:

import numpy as np

data = wf.readframes(wf.getnframes())
sig = np.frombuffer(data, dtype='<i2').reshape(-1, wf.getnchannels())

所以我猜问题出在 PyAudio 或您对它的使用上。

我不知道解决方案,但我可以为您提供替代方案:使用 soundfile and sounddevice.

import soundfile as sf
import sounddevice as sd

data, fs = sf.read('02DayIsDone.aif')
sd.play(data, fs, blocking=True)

每隔一个样本交换一次就可以了。将整个文件加载到 data,然后执行

a = numpy.fromstring(data, dtype = '<i2')
temp = a[1::2]
a[1::2] = a[::2]
a[::2] = temp

然后播放 a 就好像它是一串音频样本而不是一个 numpy 数组。我已经在两个不同的 aiff 文件上对其进行了测试,并且在这两种情况下它都保留了两个通道并正确播放。

这可能是因为文件的字节顺序与 pyaudio 期望的字节顺序相反。

而不是用字节链做棘手的事情,你也可以考虑 audioread 包而不是 aifc/wave/... 它使用任何可用的后端解码你的音频文件,而不管文件格式,它总是 returns 16 位小端有符号整数 PCM 数据的缓冲区,您可以将其提供给 pyaudio。