《分离歌曲中的人声和背景音乐(tensorflow).docx》由会员分享,可在线阅读,更多相关《分离歌曲中的人声和背景音乐(tensorflow).docx(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、分离歌曲中的人声和背景音乐(tensorflow)#混合了背景音乐以及人声的数据self.x_mixed_srctf.placeholder(tf.float32,shapeNone,None,num_features,namex_mixed_src)#背景音乐数据self.y_music_srctf.placeholder(tf.float32,shapeNone,None,num_features,namey_music_src)#人声数据self.y_voice_srctf.placeholder(tf.float32,shapeNone,None,num_features,namey_
2、voice_src)#keepdropout用于RNN网络的droupoutself.dropout_ratetf.placeholder(tf.float32)#初始化神经网络self.y_pred_music_src,self.y_pred_voice_work_init()#设置损失函数self.lossself.loss_init()#设置优化器self.optimizerself.optimizer_init()#创立会话self.sesstf.Session()#需要保存模型所以获取saverself.savertf.train.Saver(max_to_keep1)设置变量、占位
3、符初始化神经网络设置损失函数设置优化器创立会话保存模型是不是都是很熟悉的那一套啊顺着上面的代码我们来看看初始化神经网络的函数network_init的实现#构建神经网络defnetwork_init(self):rnn_layer#根据num_hidden_units的长度来决定创立几层RNN每个RNN长度为sizeforsizeinself.num_hidden_units:#使用GRU同时加上dropoutlayer_celltf.nn.rnn_cell.GRUCell(size)layer_celltf.contrib.rnn.DropoutWrapper(layer_cell,inpu
4、t_keep_probself.dropout_rate)rnn_layer.append(layer_cell)#创立多层RNNmulti_rnn_celltf.nn.rnn_cell.MultiRNNCell(rnn_layer)outputs,statetf.nn.dynamic_rnn(cellmulti_rnn_cell,inputsself.x_mixed_src,dtypetf.float32)#全连接层y_dense_music_srctf.layers.dense(inputsoutputs,unitsself.num_features,activationtf.nn.rel
5、u,namey_dense_music_src)y_dense_voice_srctf.layers.dense(inputsoutputs,unitsself.num_features,activationtf.nn.relu,namey_dense_voice_src)y_music_srcy_dense_music_src/(y_dense_music_srcy_dense_voice_srcnp.finfo(float).eps)*self.x_mixed_srcy_voice_srcy_dense_voice_src/(y_dense_music_srcy_dense_voice_s
6、rcnp.finfo(float).eps)*self.x_mixed_srcreturny_music_src,y_voice_src上面就是我们神经网络构造的核心了N层RNN网络再加一个全连接层接着来看损失函数#损失函数defloss_init(self):withtf.variable_scope(loss)asscope:#求方差losstf.reduce_mean(tf.square(self.y_music_src-self.y_pred_music_src)tf.square(self.y_voice_src-self.y_pred_voice_src),nameloss)ret
7、urnloss然后就是优化器#优化器defoptimizer_init(self):ottimizertf.train.AdamOptimizer(learning_rateself.learning_rate).minimize(self.loss)returnottimizer保存以及加载模型的函数#保存模型defsave(self,directory,filename,global_step):#假如目录不存在那么创立ifnotos.path.exists(directory):os.makedirs(directory)self.saver.save(self.sess,os.path
8、.join(directory,filename),global_stepglobal_step)returnos.path.join(directory,filename)#加载模型假如没有模型那么初始化所有变量defload(self,file_dir):#初始化变量self.sess.run(tf.global_variables_initializer()#没有模型的话就重新初始化kpttf.train.latest_checkpoint(file_dir)print(kpt:,kpt)startepo0ifkpt!None:self.saver.restore(self.sess,k
9、pt)indkpt.find(-)startepoint(kptind1:)returnstartepo然后就是训练、验证、测试模型的函数#保存模型defsave(self,directory,filename,global_step):#假如目录不存在那么创立ifnotos.path.exists(directory):os.makedirs(directory)self.saver.save(self.sess,os.path.join(directory,filename),global_stepglobal_step)returnos.path.join(directory,filen
10、ame)#加载模型假如没有模型那么初始化所有变量defload(self,file_dir):#初始化变量self.sess.run(tf.global_variables_initializer()#没有模型的话就重新初始化kpttf.train.latest_checkpoint(file_dir)print(kpt:,kpt)startepo0ifkpt!None:self.saver.restore(self.sess,kpt)indkpt.find(-)startepoint(kptind1:)returnstartepo代码写完了在终端执行pythontrain.py就开场训练了可
11、以看到损失在渐渐下降讲明我们的模型起到作用了运行到最后损失大概再0.5-0.6之间测试代码上面只是在训练啊我们要把它用起来啊所以还要再写个测试代码test.py跟train的代码有点类似首先也是一些参数的设置defparse_arguments(argv):parserargparse.ArgumentParser()parser.add_argument(-input_dir,typestr,help待测试的音频文件的文件夹存放MP3文件,default./songs/input)parser.add_argument(-output_dir,typestr,help声乐别离后的视频文件目录
12、为WAV格式,default./songs/output)parser.add_argument(-model_dir,typestr,help模型保存的文件夹,default./model)parser.add_argument(-model_filename,typestr,help模型保存的文件名,defaultsvmrnn.ckpt)parser.add_argument(-dataset_sr,typeint,help数据集音频文件的采样率,default16000)parser.add_argument(-dropout_rate,typefloat,helpdropout率,de
13、fault0.95)returnparser.parse_args(argv)if_name_main_:main(parse_arguments(sys.argv1:)假如想调整参数在运行命令行的时候传入参数就可以了接着来看main函数defmain(args):input_dirargs.input_diroutput_dirargs.output_dirdataset_srargs.dataset_srmodel_dirargs.model_dirdropout_rateargs.dropout_rate#假如输入目录不存在返回错误ifnotos.path.exists(input_di
14、r):raiseNameError(音频输入文件夹./songs/input不存在)#输出文件夹不存在那么创立ifnotos.path.exists(output_dir):os.mkdir(output_dir)#找到要别离背景音乐以及人声的音频文件song_filenameslist()forfileinos.listdir(input_dir):iffile.endswith(.mp3):song_filenames.append(os.path.join(input_dir,file)我们将待测试的音频文件放到songs/input文件夹下最后得到的结果保存到songs/output文
15、件夹下所以先检查输入文件夹是否存在先假如存在将里面的MP3文件放到列表中接着就是读取这些音频文件了#加载输入音频文件wavs_monolist()forfilenameinsong_filenames:wav_mono,_librosa.load(filename,srdataset_sr,monoTrue)wavs_mono.append(wav_mono)然后设置一些参数接着把音频文件的数据从时域转到频域#用于短时傅里叶变换窗口大小n_fft1024#步幅;帧移对应卷积中的stride;hop_lengthn_fft/4#用于创立rnn节点数num_hidden_units1024,102
16、4,1024,1024,1024#将其转到频域stfts_monolist()forwav_monoinwavs_mono:stft_monolibrosa.stft(wav_mono,n_fftn_fft,hop_lengthhop_length)stfts_mono.append(stft_mono.transpose()然后初始化神经网络并导入我们上面训练好的模型#初始化神经网络modelSVMRNN(num_featuresn_fft/21,num_hidden_unitsnum_hidden_units)#导入模型model.load(file_dirmodel_dir)接着就对文件
17、一一处理了forwav_filename,wav_mono,stft_monoinzip(song_filenames,wavs_mono,stfts_mono):wav_filename_baseos.path.basename(wav_filename)#单声道音频文件wav_mono_filenamewav_filename_base.split(.)0_mono.wav#别离后的背景音乐音频文件wav_music_filenamewav_filename_base.split(.)0_music.wav#别离后的人声音频文件wav_voice_filenamewav_filename_
18、base.split(.)0_voice.wav#要保存的文件的相对途径wav_mono_filepathos.path.join(output_dir,wav_mono_filename)wav_music_hat_filepathos.path.join(output_dir,wav_music_filename)wav_voice_hat_filepathos.path.join(output_dir,wav_voice_filename)print(Processing%s.%wav_filename_base)stft_mono_magnitude,stft_mono_phasese
19、parate_magnitude_phase(datastft_mono)stft_mono_magnitudenp.array(stft_mono_magnitude)y_music_pred,y_voice_predmodel.test(x_mixed_srcstft_mono_magnitude,dropout_ratedropout_rate)#根据振幅以及相位转为复数用于下面的逆短时傅里叶变换y_music_stft_hatcombine_magnitude_phase(magnitudesy_music_pred0,phasesstft_mono_phase)y_voice_stf
20、t_hatcombine_magnitude_phase(magnitudesy_voice_pred0,phasesstft_mono_phase)y_music_stft_haty_music_stft_hat.transpose()y_voice_stft_haty_voice_stft_hat.transpose()#逆短时傅里叶变换将数据从频域转到时域y_music_hatlibrosa.istft(y_music_stft_hat,hop_lengthhop_length)y_voice_hatlibrosa.istft(y_voice_stft_hat,hop_lengthhop
21、_length)#保存数据librosa.output.write_wav(wav_mono_filepath,wav_mono,dataset_sr)librosa.output.write_wav(wav_music_hat_filepath,y_music_hat,dataset_sr)librosa.output.write_wav(wav_voice_hat_filepath,y_voice_hat,dataset_sr)代码写好后将任意一个MP3文件放到input文件夹下运行pythontest.py就开场工作了得到结果如下可以听到提取出来的背景音乐还是有点人声的不过相对原文件人声已经小很多了而纯人声中仔细听也还能听到很小很小的乐器的声音毕竟我们的损失没有降到接近0所以并不是太完美但是效果还可以了因为时间限制只训练到了19200步不过损失已经没有明显的下降了源码链接如下0zvm