U-Net实现语音分离的代码分析
发布网友
发布时间:2022-12-23 10:48
我来回答
共1个回答
热心网友
时间:2023-10-21 04:14
不是自己对着论文复现的,是网上找来自己改的
数据集处理,将DSD100数据集的音频文件转换为时频声谱。
DSD 包含两个文件夹,一个是混合音频的文件夹"Mixtures", 另一个是人声、鼓、贝司、其他乐器的分轨音频"Sources"。每个文件夹里包含两个子文件夹,"Dev" 是训练集,"Test"是测试集。
主要用到 util.SaveSpectrogram(y_mix, y_vocal, y_inst, fname)
输入音频路径,训练模型或用现有模型,从原始音频获得分离的人声/分离的音频
调用了五个主要接口:
util.LoadDataset(target) 加载数据集,target就是要分离的目标,这里为“voice”
network.TrainUNet(Xlist,Ylist,savefile="unet.model",epoch=30) 训练网络
util.LoadAudio(fname) 加载音频
util.ComputeMask(input_mag, unet_model="unet.model", hard=True) 计算掩码
util.SaveAudio(fname, mag, phase) 保存音频
(如果有现成的模型,则只需要调用后三个函数)
函数返回的 Xlist 是混合音频的声谱, Ylist 是分轨的target音频的声谱。
find_files 是 librosa.util.find_files
load 是 librosa.core.load , 加载各种格式的音频
stft 是 librosa.core.stft ,短时傅里叶变化
(没想通为什么 number of frequency bins = 1 + n_fft/2 )
( 网上的解释 :The continuous Fourier transform possesses symmetries when computed on real signals (Hermitian symmetry). The discrete version, an FFT (of even length) possesses a slighty twisted symmetry.就是说FFT计算出来的结果是频率上对称的,存在"plicated" in positive and negative frequencies.)
(phase也看不懂)
mag 是magnitude,做了绝对值
phase = np.exp(1.j*np.angle(spec)) 返回spec的复数角度
istft 是 librosa.core.istft
write_wav 是 librosa.output.write_wav
stft 是 librosa.core.stft ,短时傅里叶变化。SaveSpectrogram这个函数是处理数据集时用的,将数据集里的音频转化为声谱。
network.UNet() 调用U-Net神经网络,用训练好的模型来计算 hard mask 或 soft mask。
UNet class
TrainUNet:
U-Net其实就是输入空间与输出空间相同的一个映射。在训练时,输入是(MixSpec, TargetSpec) = (混合声谱,目标声谱),用Adam方法优化参数θ来得到一个mask = UNet_θ(MixSpec),MixSpec*mask使得尽可能*近TargetSpec。