#!/usr/bin/env python # -*- coding: utf-8 -*- #http://blog.csdn.net/myhaspl #code:myhaspl@qq.com import wave import pylab as pl import numpy as np import copy print 'http://blog.csdn.net/myhaspl' print 'myhaspl@qq.com' print print 'working...' print "read wav data...." # 打开WAV文档 f = wave.open(r"jg.wav", "rb") fo = wave.open(r"hyspeak.wav", "wb") fi=wave.open(r"back.wav", "rb") # 读取波形数据 # (nchannels, sampwidth, framerate, nframes, comptype, compname) params = f.getparams() nchannels, sampwidth, framerate, nframes = params[:4] str_data = f.readframes(nframes) fi_params=fi.getparams() fi_nframes = fi_params[3] fi_str_data=fi.readframes(fi_nframes) #将波形数据转换为数组,并更改 print "update wav data...." wave_data = np.fromstring(str_data, dtype=np.short) fi_wave_data= np.fromstring(fi_str_data, dtype=np.short) #复制并除去背景声音 new_wave_data=copy.deepcopy(wave_data) temp_wavedata=fi_wave_data[:len(new_wave_data)] new_wave_data=(new_wave_data-temp_wavedata*0.5)*2 new_wave_data=np.array(new_wave_data) new_wave_data =new_wave_data.astype(wave_data.dtype) new_str_data=new_wave_data.tostring() #写波形数据参数 print "save new wav files...." fo.setnchannels(nchannels) fo.setframerate(framerate) fo.setsampwidth(sampwidth) fo.writeframes(new_str_data) # 绘制波形 wave_data.shape = -1, 2 wave_data = wave_data.T time = np.arange(0, nframes) * (1.0 / framerate) pl.subplot(221) pl.plot(time, wave_data[0]) pl.subplot(222) pl.plot(time, wave_data[1], c="g") pl.xlabel("time (seconds)") # 绘制波形 new_wave_data.shape = -1, 2 new_wave_data =new_wave_data.T new_time = np.arange(0, nframes) * (1.0 / framerate) pl.subplot(223) pl.plot(new_time,new_wave_data[0]) pl.subplot(224) pl.plot(new_time, new_wave_data[1], c="g") pl.xlabel("time (seconds)") pl.show()
本博客所有内容是原创,未经书面许可,严禁任何形式的转载
python根据上篇博文的结果消除背景声音,原理就是上篇博文的算法的逆过程