我想从波形音频文件中去除噪音(嘶嘶声)。全波音频图在这里:
我正在使用以下代码。这可能是一个愚蠢的尝试,但在 matlab 中我注意到噪声部分的幅度在 0-3000 之间变化。所以我试图将它们全部归零并将新帧保存到新的 wav 文件中。不知何故,它不起作用!
import wave
import sys
ip = wave.open(sys.argv[1], 'r')
op = wave.open(sys.argv[2], 'w')
op.setparams(ip.getparams())
for i in range(ip.getnframes()):
iframes = ip.readframes(1)
amp = int(iframes.encode('hex'),16)
if amp > 32767:
amp = 65535 - int(iframes.encode('hex'),16)#-ve
print amp
else:
amp = int(iframes.encode('hex'),16)#+ve
print amp
if amp < 2000:
#make it zero
final_frame = '\x00\x00'
else:
#Keep the frame
final_frame = iframe
op.writeframes(final_frame)
op.close()
ip.close()
运行上面的脚本后变成了这样:
噪声部分 (<= 2500 ) 仍然存在..所以请建议我如何去除那些不必要的部分!
最好的问候,
最佳答案
您的第一个问题是您将值解码为大端,而它们是 actually little-endian .您可以使用 struct
module 轻松解决此问题.我还添加了 abs
函数,因为振幅通常是距零的距离,它始终为正数。
amplitude = abs(struct.unpack('<h', iframe))
这将使您的代码按照您的预期进行。不幸的是,它并没有解决更大的问题,即这完全是错误的方法。它不查看波形本身,一次只查看一个样本。满刻度运行的简单正弦波将有 许多 样本低于您的阈值,您将通过将它们设置为零来引入明显的失真。
关于python - 使用 Python 从原始 WAV 音频文件中去除噪音(嘶嘶声),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22816401/