不是自己对着论文复现的,是网上找来自己改的 数据集处理,将DSD100数据集的音频文件转换为时频声谱。 DSD 包含两个文件夹,一个是混合音频的文件夹"Mixtures", 另一个是人声、鼓、贝司、其他乐器的分轨音频"Sources"。每个文件夹里包含两个子文件夹,"Dev" 是训练集,"Test"是测试集。 主要用到 (y_mix, y_vocal, y_inst, fname) 输入音频路径,训练模型或用现有模型,从原始音频获得分离的人声/分离的音频 调用了五个主要接口: (target) 加载数据集,target就是要分离的目标,这里为“voice” (Xlist,Ylist,savefile="",epoch=30) 训练网络 (fname) 加载音频 (input_mag, unet_model="", hard=True) 计算掩码 (fname, mag, phase) 保存音频 (如果有现成的模型,则只需要调用后三个函数) 函数返回的 Xlist 是混合音频的声谱, Ylist 是分轨的target音频的声谱。 find_files 是 load 是 , 加载各种格式的音频 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计算出来的结果是频率上对称的,存在"duplicated" in positive and negative frequencies.) (phase也看不懂) mag 是magnitude,做了绝对值 phase = (*(spec)) 返回spec的复数角度 istft 是 write_wav 是 stft 是 ,短时傅里叶变化。SaveSpectrogram这个函数是处理数据集时用的,将数据集里的音频转化为声谱。 () 调用U-Net神经网络,用训练好的模型来计算 hard mask 或 soft mask。 UNet class TrainUNet: U-Net其实就是输入空间与输出空间相同的一个映射。在训练时,输入是(MixSpec, TargetSpec) = (混合声谱,目标声谱),用Adam方法优化参数θ来得到一个mask = UNet_θ(MixSpec),MixSpec*mask使得尽可能逼近TargetSpec。