我编写了以下代码,该代码应该将echo放在可用的声音文件上。不幸的是,输出是一个非常嘈杂的结果,我不太清楚。有人可以帮我这个吗?有没有跳过步骤?
#convolving a room impulse response function with a sound sample both of stereo type
from scipy.io import wavfile
inp=wavfile.read(sound_path+sound_file_name)
IR=wavfile.read(IR_path+IR_file_name)
if inp[0]!=IR[0]:
print "Size mismatch"
sys.exit(-1)
else:
rate=inp[0]
print sound_file_name
out_0=fftconvolve(inp[1][:,1],IR[1][:,0])
out_1=fftconvolve(inp[1][:,1],IR[1][:,1])
in_counter+=1
out=np.vstack((out_0,out_1)).T
out[:inp[1].shape[0]]=out[:inp[1].shape[0]]+inp[1]
wavfile.write(sound_path+sound_file_name+'_echoed.wav',rate,out)
答案 0 :(得分:2)
为声音文件添加回声只是... 添加回声。你的代码看起来并不像是在一起添加两个声音;它看起来像是将输入声音转换为其他声音。
您的数据流应如下所示:
source sound ------------------------------>|
| + ----------> target sound
---------> convolution echo --------->|
请注意,您的回声声音会比原始声音长(即它有一个"尾部。")
将两个声音加在一起只是将两个声音中的每个单独的样本相加以产生新的输出波。我不认为vstack
会这样做。
答案 1 :(得分:1)
显然,Wav文件作为int16文件导入,并且应该在将它们转换为浮点数后进行修改: http://nbviewer.ipython.org/github/mgeier/python-audio/blob/master/audio-files/audio-files-with-pysoundfile.ipynb
卷积后,需要再次重新规范化。就是这样。
希望这也有助于其他人。
from utility import pcm2float,float2pcm
input_rate,input_sig=wavfile.read(sound_path+sound_file_name)
input_sig=pcm2float(input_sig,'float32')
IR_rate,IR_sig=wavfile.read(IR_path+IR_file_name)
IR_sig=pcm2float(IR_sig,'float32')
if input_rate!=IR_rate:
print "Size mismatch"
sys.exit(-1)
else:
rate=input_rate
print sound_file_name
con_len=-1
out_0=fftconvolve(input_sig[:con_len,0],IR_sig[:con_len,0])
out_0=out_0/np.max(np.abs(out_0))
out_1=fftconvolve(input_sig[:con_len,1],IR_sig[:con_len,1])
out_1=out_0/np.max(np.abs(out_1))
in_counter+=1
out=np.vstack((out_0,out_1)).T
wavfile.write(sound_path+sound_file_name+'_'+IR_file_name+'_echoed.wav',rate,float2pcm(out,'int16'))
可以从上面的链接下载实用程序。
更新虽然它使用原始网站 Openair 进行合并时仍会产生效果,但仍不如结果好。