如何用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。
这会播放单声道 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。