对于我需要的项目
以下代码是"工作"除了声音爆裂,这是因为我无法保证音频输出的继续数据流。过滤需要一些时间,而且声音会在很短的时间内冻结。
将来我想对原始音频数据做一些额外的计算。我想知道哪种方法最能保持声音平滑。
import pyaudio
import wave
from scipy import signal
from struct import *
chunk = 1024
f = wave.open("sample.wav","rb")
p = pyaudio.PyAudio()
stream = p.open(format = p.get_format_from_width(f.getsampwidth()),
channels = f.getnchannels(),
rate = f.getframerate(),
output = True)
data = f.readframes(chunk)
b, a = signal.butter(2, 0.01)
tmp = len(data)/2
s = '<'
for i in range(0,tmp):
s = s + 'h'
while data != '':
sig = signal.filtfilt(b, a, unpack(s,data))
output_signal = pack(s,*sig)
stream.write(output_signal)
data = f.readframes(chunk)
stream.stop_stream()
stream.close()
p.terminate()
提前致谢!
答案 0 :(得分:0)
您可以尝试在两个程序中拆分数据的生产者和使用者(这是pyaudio),并使用常规的Unix管道连接它们。 Unix管道起缓冲作用。例如:
在producer.py中:
while data != '':
sig = signal.filtfilt(b, a, unpack(s,data))
output_signal = pack(s,*sig)
sys.stdout.write(output_signal) # <===
data = f.readframes(chunk)
在consumer.py中:
while 1:
data = sys.stdin.read(1024)
if not data: break
stream.write(data)
命令行调用:
python producer.py | python consumer.py
如果有效,那么您也可以使用python consumer.py
从其他程序中运行os.popen()
。