尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SpeechBrain 波形映射语音增强实战:基于 VoiceBank 数据集与全卷积网络(FCN)的训练全流程

SpeechBrain 波形映射语音增强实战:基于 VoiceBank 数据集与全卷积网络(FCN)的训练全流程 SpeechBrain 波形映射语音增强实战基于 VoiceBank 数据集与全卷积网络FCN的训练全流程【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain本文基于 SpeechBrain 仓库中 recipes/Voicebank/enhance/waveform_map/README.md 对应的配方recipe展开它实现了一套直接在时域波形上进行映射的语音增强waveform mapping based speech enhancement系统使用 VoiceBank 数据集训练以端到端方式从带噪波形直接回归出干净波形。读完本文你将掌握该配方的数据集准备、FCN 全卷积模型结构、超参数文件含义、训练脚本的数据流与评估逻辑并能直接复现训练与推理流程。技术背景为什么选择波形映射语音增强的目标是从带噪语音中恢复出干净语音。主流做法有两类频域方法spectral mapping / masking先对带噪信号做 STFT 得到频谱在频域学习掩码或频谱映射再用 ISTFT 重建波形。仓库中 recipes/Voicebank/enhance/spectral_mask 即是此类代表。时域波形映射waveform mapping本配方所采用的方式直接以原始带噪波形为输入、干净波形为训练目标通过神经网络完成noisy_wav → clean_wav的端到端回归。波形映射的显著优势是不需要任何手工设计的特征提取与信号重建模块整个前端处理由网络自行学习训练与推理流程因此变得非常简洁。在 hparams/train.yaml 中可以看到STFT/ISTFT 相关配置全部被注释掉# compute_STFT、# compute_ISTFT等这正是时域方法无需频谱变换的直接证据。数据集准备VoiceBanknoisy-vctk-16k数据集的目录结构VoiceBank 是语音增强领域广泛使用的标准评测数据集。本配方通过 voicebank_prepare.py 完成数据准备它期望data_folder下存在以下目录均为 16kHz 重采样后的版本目录用途clean_trainset_28spk_wav_16k训练集干净语音28 位说话人noisy_trainset_28spk_wav_16k训练集带噪语音与干净语音一一对应trainset_28spk_txt训练集文本标注clean_testset_wav_16k测试集干净语音noisy_testset_wav_16k测试集带噪语音testset_txt测试集文本标注下载与重采样脚本中提供了download_vctk(destination, tmp_dirNone, devicecpu)辅助函数它会下载 VoiceBank 的 6 个 zip 压缩包clean/noisy 的训练与测试集及对应文本解压后使用torchaudio.transforms.Resample(orig_freq48000, new_freq16000)将原始 48kHz 采样率降采样为 16kHz并重新打包为noisy-vctk-16k.zip。重采样可以指定运行设备device参数方便在 GPU 上加速。训练/验证集划分脚本通过valid_speaker_count参数默认 2控制验证集规模从 28 位训练说话人TRAIN_SPEAKERS列表如p226、p287、p227等中取出前 N 位作为验证集说话人其余作为训练集valid_speakers TRAIN_SPEAKERS[:valid_speaker_count] wav_lst_train get_all_files(train_noisy_folder, match_andextension, exclude_orvalid_speakers) wav_lst_valid get_all_files(train_noisy_folder, match_andextension, match_orvalid_speakers)测试集则使用全部测试目录下的 wav 文件。这样划分保证了验证集说话人与训练集完全不相交评估结果更能反映模型的泛化能力。JSON 标注文件生成create_json()为每条语音生成一条 JSON 记录包含noisy_wav/clean_wav带噪与干净音频的相对路径以{data_root}占位符开头运行时由replacements{data_root: hparams[data_folder]}替换length语音时长秒由read_audio读取信号后按signal.shape[0] / 16000计算words/phones词级与音素级标注。音素由 LibriSpeech 词表create_lexicon自动下载解析查得并对连续重复音素做了去重处理缺失词条由脚本内置的MISSING_LEXICON字典补齐。最终生成train.json、valid.json、test.json三个文件存放在save_folder即 hparams 中的output_folder下。prepare_voicebank支持skip_prepTrue跳过已完成的准备通过检查三个 JSON 文件是否已存在判断。模型结构全卷积网络 FCN模型定义在 hparams/models/FCN.yaml对应论文End-to-End Waveform Utterance Enhancement for Direct Evaluation Metrics Optimization by Fully Convolutional Neural NetworksTASLP, 2018。它是一套纯 1D 卷积的时域映射网络层类型关键参数IN0InstanceNorm1dinput_size1affineTrueconv1~conv7Conv1dout_channelsbase_channels(80)kernel_size55IN1~IN7InstanceNorm1dinput_size80act1~act7LeakyReLUnegative_slope0.3conv_outConv1dout_channels1kernel_size55要点说明感受野设计卷积核kernel_size: 55约 3.4ms 16kHz7 层堆叠后网络能感知足够长的上下文窗口对语音帧进行局部建模通道数base_channels: 80配置注释提示Use 30 for small version即减小到 30 可得到轻量版本归一化全部使用InstanceNorm1d且track_running_stats: False避免 batch 统计引入训练/推理不一致适合 batch_size 较小的场景输出层conv_out输出 1 个通道对应单声道干净波形与输入input_shape: [null, null, 1]呼应可替换性配置注释提示卷积层Can be replaced with SincConv——SpeechBrain 在 speechbrain/nnet/CNN.py 中同时实现了SincConv可学习的 sinc 带通滤波器组SincConv定义于该文件第 30 行与Conv1d第 314 行你可以用!name:speechbrain.nnet.CNN.SincConv直接替换以获得可解释的前端滤波器。模型通过Sequential容器speechbrain/nnet/containers.py按命名顺序组装超参kernel_size、base_channels通过!ref引用复用便于统一调参。超参数文件解析train.yamlhparams/train.yaml 是配方的核心配置基于 SpeechBrain 的 HyperPyYAML 机制编写!ref引用、!new实例化、!name函数引用、!apply执行。逐段拆解如下。基础路径与随机种子seed: 3234 __set_seed: !apply:speechbrain.utils.seed_everything [!ref seed] data_folder: /localscratch/noisy-vctk-16k output_folder: !ref ./results/waveform_map/seed save_folder: !ref output_folder/save train_log: !ref output_folder/train_log.txt enhanced_folder: !ref output_folder/enhanced种子必须在 YAML 顶部、任何带参数的模块实例化之前设置以保证全程可复现data_folder指向下载并解压好的 VoiceBank 数据目录output_folder按seed隔离实验目录其中包含save/检查点、enhanced/增强后音频、train_log.txt训练日志。数据文件与训练参数train_annotation: !ref output_folder/train.json valid_annotation: !ref output_folder/valid.json test_annotation: !ref output_folder/test.json skip_prep: False number_of_epochs: 150 N_batch: 1 lr: 0.001 device: cuda:0 sorting: ascending dataloader_options: batch_size: !ref N_batch三个标注文件由prepare_voicebank生成默认训练150 个 epoch、batch_size1逐条样本更新、学习率0.001Adam 优化器sorting: ascending表示按音频时长升序排列训练集同时自动关闭 dataloader 的shuffle见 train.py 中dataio_prep的逻辑ascending/descending 时filtered_sortedshuffleFalserandom 时保持打乱其他取值直接抛NotImplementedErrordevice默认cuda:0可在命令行通过 run_opts 覆盖。模型、优化器与检查点models: !include:models/FCN.yaml epoch_counter: !new:speechbrain.utils.epoch_loop.EpochCounter limit: !ref number_of_epochs modules: model: !ref models[model] opt_class: !name:torch.optim.Adam lr: !ref lr checkpointer: !new:speechbrain.utils.checkpoints.Checkpointer checkpoints_dir: !ref save_folder recoverables: model: !ref models[model] counter: !ref epoch_counter通过!include:models/FCN.yaml一行切换模型——把该语句指向其他模型文件即可替换网络modules把 FCN 模型注册到 Brain 类的self.modules.modelEpochCounter定义于 speechbrain/utils/epoch_loop.py配合Checkpointer实现断点续训recoverables同时保存模型与 epoch 计数。损失函数与日志compute_cost: !name:speechbrain.nnet.losses.mse_loss # compute_cost: !name:speechbrain.nnet.loss.stoi_loss.stoi_loss train_logger: !new:speechbrain.utils.train_logger.FileTrainLogger save_file: !ref train_log tensorboard_train_logger: !new:speechbrain.utils.train_logger.TensorboardLogger save_dir: !ref tensorboard_logs默认损失为均方误差MSE实现于 speechbrain/nnet/losses.py 第 320 行的mse_loss——它会对预测与目标做长度截断容忍allowed_len_diff3的差异并用长度掩码计算真实误差支持mean/batch/sum等 reduction 方式。注释中还给出了第二个选项stoi_loss实现于 speechbrain/nnet/loss/stoi_loss.py 第 135 行其返回值为-1 * STOI以便用 SGD 直接优化该可微指标。更换损失函数只需取消注释、切换!name即可这正是 SpeechBrain 配方高度模块化的体现。训练脚本核心逻辑train.py 是整个配方的执行入口核心是继承自sb.Brain的SEBrain类。前向计算compute_forwardnoisy_wavs, lens batch.noisy_sig noisy_wavs torch.unsqueeze(noisy_wavs, -1) predict_wavs self.modules.model(noisy_wavs)[:, :, 0]从 batch 中取出带噪波形unsqueeze(-1)增加通道维度以匹配 FCN 的input_shape [null, null, 1]前向得到预测波形后取[:, :, 0]去掉输出通道维。损失与评估compute_objectivesloss self.hparams.compute_cost(predict_wavs, clean_wavs, lens)训练阶段只计算损失验证/测试阶段还会用stoi_loss计算STOI注意它返回负值故统计时-self.stoi_metric.summarize(average)转回正值值越大越好用第三方pesq库以宽频带模式计算PESQpesq(fs16000, ref..., deg..., modewb)在sb.Stage.TEST阶段将增强波形归一化后写入磁盘pred_wav pred_wav / torch.max(torch.abs(pred_wav)) * 0.99 audio_io.save(enhance_path, torch.unsqueeze(pred_wav[: int(length)].cpu(), 0), 16000)增强音频保存在enhanced_folder下命名与输入样本一致追加.wavlength由相对长度乘上样本长度还原为绝对采样点数用于裁剪尾部填充。数据管道dataio_prep通过sb.utils.data_pipeline.takes/provides装饰器定义两条动态管道sb.utils.data_pipeline.takes(noisy_wav) sb.utils.data_pipeline.provides(noisy_sig) def noisy_pipeline(noisy_wav): return sb.dataio.dataio.read_audio(noisy_wav) sb.utils.data_pipeline.takes(clean_wav) sb.utils.data_pipeline.provides(clean_sig) def clean_pipeline(clean_wav): return sb.dataio.dataio.read_audio(clean_wav)即从 JSON 记录的noisy_wav/clean_wav路径实时读取音频输出键为id、noisy_sig、clean_sig。三个数据集train/valid/test均由DynamicItemDataset.from_json构建共享同一条管道定义。主流程hparams_file, run_opts, overrides sb.parse_arguments(sys.argv[1:]) ... sb.utils.distributed.ddp_init_group(run_opts) run_on_main(prepare_voicebank, ...) datasets dataio_prep(hparams) sb.create_experiment_directory(...) se_brain.fit(epoch_counter..., train_set..., valid_set...) test_stats se_brain.evaluate(test_set..., max_keypesq, ...)sb.parse_arguments支持命令行传入超参数覆盖如python train.py hparams/train.yaml --number_of_epochs 50数据准备通过run_on_main仅在主进程中执行一次兼容多卡 DDP训练完成后用max_keypesq加载 PESQ 最优的检查点进行测试集评估检查点保存策略为save_and_keep_only(metastats, max_keys[pesq])即只保留验证集 PESQ 最好的模型。运行方法进入配方目录后执行注意实际配置文件位于hparams/子目录cd recipes/Voicebank/enhance/waveform_map python train.py hparams/train.yaml前提条件安装 SpeechBrain 及其依赖pesq库用于评测将 VoiceBank 数据放置于data_folder或用download_vctk下载重采样或在命令行通过--data_folder /path/to/data覆盖默认路径有可用 GPU 时保持默认device: cuda:0。训练产出物results/waveform_map/seed/save/模型检查点按 PESQ 择优保留results/waveform_map/seed/enhanced/测试集增强后的 wav 音频results/waveform_map/seed/train_log.txt及logs/文本/TensorBoard 训练日志use_tensorboard: True时启用。原 README 还提到官方提供了完整实验目录checkpoints、logs 等的预训练结果下载用于直接对比或推理验证当前仓库中同一目录下还提供了 spectral_mask频域掩码、MetricGAN、MetricGAN-U、SEGAN、SGMSE 等对照配方便于横向比较不同增强范式的效果。小结本配方用不足 250 行训练脚本 两个 YAML 配置完整实现了一套可复现的时域波形映射语音增强系统voicebank_prepare.py负责数据下载、重采样与 JSON 标注生成FCN.yaml定义 7 层全卷积映射网络train.yaml通过 HyperPyYAML 将数据、模型、损失、优化器、检查点与日志全部参数化SEBrain统一承载前向、损失、评估与增强音频导出逻辑。对研究者而言这套结构是快速验证新模型 新损失组合的高效起点——只需修改!include指向的模型文件或compute_cost指向的损失函数即可。【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表