ClearerVoice-Studio 语音增强模型训练实战:FRCRN / MossFormerGAN / MossFormer2 从零训练到微调全指南 人工智能语音音频处理深度学习【免费下载链接】ClearerVoice-StudioAn AI-Powered Speech Processing Toolkit and Open Source SOTA Pretrained Models, Supporting Speech Enhancement, Separation, and Target Speaker Extraction, etc.项目地址https://gitcode.com/gh_mirrors/cl/ClearerVoice-Studio点击查看免费下载本篇指南以 ClearerVoice-Studio 仓库中 train/speech_enhancement/README.md 为核心脉络展开。它面向希望在语音增强方向从零训练或微调 SOTA 模型的开发者系统讲解 FRCRN_SE_16K、MossFormerGAN_SE_16K、MossFormer2_SE_48K 三种模型的架构原理、数据集与 scp 清单准备、训练配置逐项解析、多卡启动与断点续训/微调流程并结合 train.py、solver.py、dataloader.py、loss.py 等源码给出可验证的实现细节。读完本文你将具备直接复现仓库训练流程并迁移到自有数据集的能力。一、项目概览三种可训练的语音增强模型ClearerVoice-Studio 的train/speech_enhancement子模块提供了完整的语音增强训练脚本目前支持三种模型的从零训练fresh train与微调finetune模型名采样率技术路线出处FRCRN_SE_16K16000 HzFRCRN卷积循环编码解码器 复数网络FRCRN 论文ICASSP 2022MossFormerGAN_SE_16K16000 HzMossFormer2 主干 GAN 对抗训练MossFormer2 论文ICASSP 2024MossFormer2_SE_48K48000 HzMossFormer2 主干 掩蔽MaskingMossFormer2 论文ICASSP 2024从仓库源码可以确认三种网络通过统一入口 networks.py 中的network_wrapper按名称分发if args.network FRCRN_SE_16K: from models.frcrn.frcrn import FRCRN_SE_16K self.se_network FRCRN_SE_16K(args).model elif args.network MossFormer2_SE_48K: from models.mossformer2.mossformer2_se_wrapper import MossFormer2_SE_48K self.se_network MossFormer2_SE_48K(args).model elif args.network MossFormerGAN_SE_16K: from models.mossformer_gan.generator import MossFormerGAN_SE_16K self.se_network MossFormerGAN_SE_16K(args).model self.discriminator MossFormerGAN_SE_16K(args).discriminator注意MossFormerGAN_SE_16K除了生成器se_network还会额外构建一个判别器discriminator而另外两个模型discriminator为None——这一点直接决定了三者训练循环的差异详见后文「训练循环内部机制」。二、三种模型的架构与原理2.1 FRCRN_SE_16K复数卷积循环网络FRCRNFrequency-domain Recurrent Convolutional Network是面向单通道语音增强的通用方法在各种噪声环境下均有良好的泛化表现。根据项目文档说明其训练出的模型曾在 IEEE ICASSP 2022 DNS Challenge 中取得较好成绩。其核心设计是新的卷积循环编码解码器Convolutional Recurrent Encoder-DecoderCRED框架基于卷积编码解码器CED架构扩展而来针对 CED 卷积核感受野受限的问题引入频域循环层frequency recurrent layers显著提升卷积核的建模能力引入复数前馈序列记忆网络Complex Feedforward Sequential Memory NetworkCFSMN来降低循环网络的复杂度全程使用复数域网络运算构建完整的复数深度模型既能更高效地建模长序列语音又能同时增强语音的幅度与相位。在仓库实现中其模型定义位于 models/frcrn/frcrn.py配套模块包括 conv_stft.py、complex_nn.py、se_layer.py、unet.py。其训练目标由 loss.py 中的loss_frcrn_se_16k定义为复数掩蔽 MSE 损失 SI-SNR 损失的组合loss CMask_MSE_Loss SiSNR_loss其中loss_complex_mask依据带噪 STFT 与干净 STFT 构造复数比率掩蔽complex ratio mask的真值并分实部、虚部计算 MSEloss_sisnr则计算尺度不变信噪比SI-SNR取负号作为损失。因此 FRCRN 的训练同时约束了时域波形质量与频域掩蔽精度。2.2 MossFormerGAN_SE_16KMossFormer2 对抗训练MossFormerGAN 的动机来自 CMGAN 与 TF-GridNet 两篇工作。其改进点包括使用扩展的 MossFormer2 主干替代 CMGAN 中的 Conformer引入 TF-GridNet 提出的Full-band Self-attention 模块整个增强网络采用 CMGAN 描述的对抗训练方案进行优化判别器方面将 CNN 网络扩展为基于注意力的网络。MossFormerGAN 面向 16kHz 语音增强训练。其生成器与判别器实现在 models/mossformer_gan/generator.py 与 models/mossformer_gan/discriminator.py其余组件见 conformer.py、mossformer.py、fsmn.py、se_layer.py。从 loss.py 的loss_mossformergan_se_16k可以看到其综合损失结构loss 0.1 * loss_ri 0.9 * loss_mag 0.2 * time_loss 0.05 * gen_loss_GAN即实虚部损失loss_ri、幅度损失loss_mag、时域损失time_loss预测波形与干净波形的 L1 距离以及 GAN 生成损失gen_loss_GANMSE 形式的加权组合判别器侧则基于 PESQ 得分回归discrim_loss_metric进行优化并且只有当批内 PESQ 可计算非静音段时才更新判别器。训练时的数据处理也与前两者不同见_run_one_epoch_mossformergan_se_16k输入波形会先做能量归一化乘以缩放因子c再经 STFT、power_compress后送入生成器生成器输出经power_uncompress与 ISTFT 还原回波形参与时域损失计算。2.3 MossFormer2_SE_48K全带 48kHz 语音增强MossFormer2_SE_48K是一个全带48kHz语音增强模型。文档指出随着通信平台与高质量媒体消费的发展全带 48kHz 语音增强日益重要此前 FullSubNet、DeepFilterNet、resemble-enhance 等开源仓库均已发布预训练模型而 ClearVoice 的 clearvoice 页面提供了MossFormer2_SE_48K模型及本文所述的训练与微调脚本。模型工作流程如下以**带噪 fbank滤波器组特征**作为输入预测Phase-Sensitive MaskPSM相位敏感掩蔽将预测掩蔽作用于带噪 STFT 频谱通过 IFFT 将估计的 STFT 频谱还原为波形。主组件是MossFormer2 block每个 block 由一个 MossFormer 模块和一个循环模型Recurrent model构成block 数量可调以加深网络MossFormer2_SE_48K采用了24 个 MossFormer2 block。从 mossformer2_se_wrapper.py 可看到其输入输出的差异该模型依赖load_fbank: 1配置让数据加载器额外返回 fbank带一阶、二阶 delta 拼接见Fbank_Processor训练循环_run_one_epoch_mossformer2_se_48k中直接self.model(fbanks)。其损失由 loss.py 的psm_loss给出对归一化带噪幅度加权的 PSM 掩蔽 MSE且支持对mask_list中多层中间掩蔽输出一并计算损失深度监督multi-loss。三、环境准备克隆、Conda 与依赖安装若尚未为 ClearerVoice-Studio 创建 Conda 环境请依次执行步骤 1 和 2环境已就绪则直接跳到步骤 3。1. 克隆仓库git clone https://github.com/modelscope/ClearerVoice-Studio.git2. 创建 Conda 环境并安装依赖cd ClearerVoice-Studio conda create -n ClearerVoice-Studio python3.8 conda activate ClearerVoice-Studio pip install -r requirements.txt文档说明更高的 Python 版本例如 python 3.12.1通常也支持。仓库根目录的 requirements.txt 列出了全部运行依赖同时train/speech_enhancement下的训练还依赖yamlargparse用于 YAML 配置解析见 train.py、torchaudiofbank 提取与librosa音频重采样与目录扫描。四、数据准备VoiceBank-DEMAND 与 scp 清单4.1 推荐数据集如果没有现成训练数据项目推荐下载VoiceBank-DEMAND数据集Edinburgh DataShare 上的公开数据集存放位置不限。训练启动所需的全部条件只是两个scp 清单文件参照仓库中提供的样例data/tr_demand_28_spks_16k.scp—— 训练数据清单见 tr_demand_28_spks_16k.scpdata/cv_demand_testset_16k.scp—— 交叉验证/测试数据清单见 cv_demand_testset_16k.scp。随后在config/train/*.yaml中将tr_list与cv_list替换为你自己的 .scp 文件路径即可开始训练。4.2 scp 文件格式源码级解读从 dataloader/misc.py 的read_and_config_file可以看出 scp 的解析规则训练/验证清单decode0每行以空白分隔支持两种形态3 列noisy_wav_path clean_wav_path duration含时长信息2 列noisy_wav_path clean_wav_path。推理清单decode1每行只需要第一列的待增强音频路径path_s[0]可支持目录自动用 librosa 扫描.wav/.flac、单个文件或 scp 文件三种输入形态。# 训练侧解析结果 sample {inputs: tmp_paths[0], labels: tmp_paths[1], duration: float(tmp_paths[2])}4.3 数据加载与裁剪训练侧的数据处理在 dataloader/dataloader.py 中完成audioread用 soundfile 读入按需用 librosa 重采样到配置采样率多声道取单通道audio_norm对波形做 RMS 归一化到 -25 dB 量级并记录反向缩放因子scalar供推理时还原幅值Wave_Processor.process按segment_length sampling_rate * max_length秒截断或补零到固定长度截断起点随机选取Fbank_Processor.process基于 torchaudio 的 Kaldi fbank 接口计算 40/60 维 fbank并拼接一阶与二阶 delta。重要提示来自原文档如果你的训练数据总量较小100 小时且每条语音时长超过 20 秒建议把语音裁剪成更小的片段4s ~ 5s。这样既能扩大数据量又能避免过长的数据加载时间。五、训练配置详解config/train/*.yaml仓库为三种模型各提供了一份训练配置存放于 config/train 目录。配置通过 train.py 中yamlargparse.ArgumentParser解析YAML 中的键与命令行参数一一对应命令行传参可覆盖 YAML 配置。5.1 三种模型的训练配置对照参数FRCRN_SE_16KMossFormerGAN_SE_16KMossFormer2_SE_48Ksampling_rate160001600048000win_typehanninghamminghammingwin_len6404001920win_inc320100384fft_len6404001920num_mels——60init_learning_rate0.0010.00050.0005finetune_learning_rate0.00010.00010.00005max_epoch100120100weight_decay0.000010.00001—clip_grad_norm10.10.10.seed777777777num_workers444batch_size414accu_grad111effec_batch_size1228max_length秒124load_fbank——15.2 关键参数语义结合源码FFT 参数win_len/win_inc/fft_len/win_type分帧窗长、帧移、FFT 点数与窗函数。48kHz 模型使用 40ms 窗1920 点、8ms 帧移384 点16kHz 模型使用 40ms 窗640 点、20ms 帧移320 点。num_mels仅 MossFormer2_SE_48K 使用控制 fbank 的 Mel 频带数仓库配置为 60对应Fbank_Processor中的num_mel_bins。init_learning_rate / finetune_learning_rate新训练与微调分别使用的学习率。由 solver.py 的_load_pretrained_model可见加载预训练权重进行微调时优化器学习率会被强制切换为finetune_learning_rate。accu_grad / effec_batch_size梯度累积。为 1 时启用每累积effec_batch_size / batch_size个 mini-batch 才执行一次参数更新等效扩大 batch size注意effec_batch_size必须是batch_size的整数倍。max_length数据加载时的语音截断长度秒训练中随机截取固定长度片段见AudioDataset。clip_grad_norm梯度裁剪阈值默认 10.0各训练循环在backward()后调用torch.nn.utils.clip_grad_norm_。seed随机种子train.py 中对 Python、NumPy、PyTorch 及 cuDNN 确定性分别做了设置便于复现。load_fbank置 1 时数据加载器额外返回 fbank 张量MossFormer2_SE_48K 必需返回三元组(inputs, labels, fbanks)见collate_fn_2x_wavs_fbank。tt_list可选train.py 支持通过--tt-list额外指定测试集配置中未给出时测试阶段跳过。5.3 示例配置全文MossFormer2_SE_48Kmode: train network: MossFormer2_SE_48K checkpoint_dir: checkpoints/MossFormer2_SE_48K # FFT parameters sampling_rate: 48000 win_type: hamming win_len: 1920 win_inc: 384 fft_len: 1920 num_mels: 60 # Train tr_list: data/tr_demand_28_spks_16k.scp cv_list: data/cv_demand_testset_16k.scp init_learning_rate: 0.0005 finetune_learning_rate: 0.00005 batch_size: 4 max_epoch: 100 clip_grad_norm: 10. # Log seed: 777 # dataset load_fbank: 1 # 让 dataloader 返回 fbank num_workers: 4 accu_grad: 1 # 梯度累积 effec_batch_size: 8 # 每卡等效 batch size须为 batch_size 整数倍 max_length: 4 # 训练语音截断长度秒六、启动训练train.sh 与三种训练模式6.1 train.sh 脚本解读仓库提供了开箱即用的训练启动脚本 train.shgpu_id4,6 # 可见 GPU n_gpu2 # 训练使用的 GPU 数 networkMossFormer2_SE_48K # 训练哪个网络 #networkFRCRN_SE_16K #networkMossFormerGAN_SE_16K checkpoint_dircheckpoints/$network # 新训练留空/按 network 命名续训时填 log_name config_pthconfig/train/${network}.yaml # 配置文件仅新训练使用 train_from_last_checkpoint0 # 1从上次 checkpoint 续训0否。若为 1 但找不到 last checkpoint 则重新开始 init_checkpoint_path../../clearvoice/checkpoints/${network}/last_best_checkpoint.pt # 微调时提供预训练/历史模型路径否则设为 None print_freq10 # 每隔多少步打印一次训练信息 checkpoint_save_freq1000 # 每隔多少步保存一次 checkpoint脚本运行时会自动创建checkpoint_dir并把对应config_pth拷贝到checkpoint_dir/config.yamlcp $config_pth $checkpoint_dir/config.yaml随后通过torch.distributed.launch以--nproc_per_node$n_gpu启动多卡分布式训练CUDA_VISIBLE_DEVICES指定可见卡master_port取当前秒数避免端口冲突。启动命令原文档bash train.sh启动前只需在train.sh中设置好network并按下述逻辑选择训练模式networkMossFormer2_SE_48K # 训练 MossFormer2_SE_48K 模型 train_from_last_checkpoint1 # 设为 1 表示存在 last checkpoint 时从中续训 init_checkpoint_path./ # 微调时填初始模型路径否则设为 None6.2 三种训练模式的源码级机制模式选择集中在 solver.py 的_init()中优先级为断点续训resumetrain_from_last_checkpoint1时优先读取checkpoint_dir/last_checkpoint文件其内容记录最新的model.ckpt-{epoch}-{step}.pt文件名同时恢复模型权重、优化器状态、epoch与step若不存在则退化为新训练。微调finetuneinit_checkpoint_path ! None时加载预训练权重。加载过程对module.前缀做了兼容处理可加载state_dict中带或不带module.前缀的权重形状不匹配的键会被跳过并打印提示随后把优化器学习率改写为finetune_learning_rate。若路径不存在则从零开始。全新训练fresh train两者皆不满足时直接开始新训练。注意微调场景下如果使用 MossFormerGAN_SE_16K还会尝试加载同目录下以.disc.pt结尾的判别器权重checkpoint_path.replace(.pt, .disc.pt)。6.3 训练循环内部机制solver.pySolver.train()是训练主循环值得关注的机制包括每轮三阶段train → validation →可选test分布式时各进程损失通过dist.all_reduce求均值。早停与学习率衰减验证损失连续 5 个 epoch 无提升时进入halving状态先回载last_best_checkpoint再把学习率减半连续 10 个 epoch 无提升则触发早停break。Checkpoint 保存每隔checkpoint_save_freq步保存model.ckpt-{epoch}-{step}.pt并同步更新last_checkpoint指针文件每当验证损失刷新最低值额外保存last_best_checkpoint。MossFormerGAN 还会单独保存discriminator.ckpt-...及其指针。TensorBoard 日志训练、验证、可选测试损失写入{checkpoint_dir}/tensorboard/SummaryWriter。单卡 / 多卡自适应train.py 通过环境变量WORLD_SIZE判断是否分布式分布式下模型会被包成 DDP并将 BatchNorm 转为SyncBatchNorm。NaN 防护FRCRN 与 MossFormer2 训练循环遇到nan损失会跳过该 batchMossFormerGAN 的loss_mossformergan_se_16k在损失为 nan 时返回(None, None)由外层跳过。训练过程中每print_freq步会打印进度包括 epoch/step、单 batch 耗时、当前学习率以及模型相关的损失项FRCRN 打印 Total/CMask/SiSNR 损失MossFormer2 打印 Mask_LossMossFormerGAN 打印 Gen_Loss 与 Disc_Loss便于监控收敛。七、推理与验证inference.sh 与解码参数7.1 推理脚本与流程训练完成后可通过 inference.sh 进行推理脚本本质是运行CUDA_VISIBLE_DEVICES4 python3 -u inference.py --config config/inference/${network}.yamlinference.py 的流程为构建网络 → 从checkpoint_dir加载模型权重reload_for_eval位于 utils/misc.py→ 读取input_path中的音频清单 → 逐条decode_one_audio增强 → 按推理配置的采样率写出到output_dir。推理配置位于 config/inference与训练配置共享 FFT 参数但增加了解码参数参数FRCRN_SE_16KMossFormerGAN_SE_16KMossFormer2_SE_48Kone_time_decode_length秒1201020decode_window秒114checkpoint_dircheckpoints/FRCRN_SE_16Kcheckpoints/MossFormerGAN_SE_16Kcheckpoints/MossFormer2_SE_48Kone_time_decode_length单次解码允许的最大音频长度秒更长的音频将采用分段解码见 utils/decode.py 的decode_one_audiodecode_window分段解码时每个窗口的长度秒input_path支持三种形态——wav 目录、wav scp 清单或单个 wav 文件与read_and_config_file(decode1)的行为一致output_dir增强后音频的输出目录推理时会自动创建os.makedirs输出 wav 的采样率等于配置中的sampling_rate。推理示例配置MossFormer2_SE_48Kmode: inference use_cuda: 1 num_gpu: 1 sampling_rate: 48000 network: MossFormer2_SE_48K checkpoint_dir: checkpoints/MossFormer2_SE_48K input_path: data/cv_demand_testset_16k.scp output_dir: outputs/MossFormer2_SE_48K # decode parameters one_time_decode_length: 20 # 单次解码最大时长秒更长音频走分段解码 decode_window: 4 # 分段解码窗口长度 # FFT parameters win_type: hamming win_len: 1920 win_inc: 384 fft_len: 1920 num_mels: 60八、从训练到部署与 ClearVoice 推理体系的衔接训练产出的 checkpoint 可直接衔接仓库 clearvoice 目录下的推理体系。train.sh中init_checkpoint_path的示例路径../../clearvoice/checkpoints/${network}/last_best_checkpoint.pt也说明预训练权重通常存放在clearvoice/checkpoints/模型名/last_best_checkpoint.pt供微调或直接部署使用inference.sh 中的checkpoint_dir同样指向checkpoints/${network}目录。需要说明的是当前仓库镜像中clearvoice/checkpoints目录并未包含实际权重文件若要从零训练后接入推理请以自己训练生成的 checkpoint 为准若希望直接微调官方预训练权重可先在本地准备好对应.pt文件再设置init_checkpoint_path。九、常见问题与调参建议基于源码的实践提示梯度累积的正确配置effec_batch_size必须是batch_size的整数倍否则self.accu_count (effec_batch_size / batch_size)永远不成立、参数无法更新。三种配置的比值分别为 3FRCRN、2MossFormerGAN、2MossFormer2。MossFormer2_SE_48K 必须开启load_fbank: 1其训练循环直接使用 fbank 输入for i, (inputs, labels, fbanks) in enumerate(data_loader)配置缺失会导致解包错误。训练数据过短会被补零Wave_Processor对短于max_length的语音做零填充过短的样本占比过高可能影响训练质量建议配合裁剪策略4s~5s保证数据规模与时长均衡。版本兼容性solver.py 在加载优化器失败时会给出针对性提示——MossFormer2_SE_48K 建议使用较低版本 torch提示please use torch {torch.__version__} or lowerMossFormerGAN_SE_16K 则要求较高版本 torch。若遇到 checkpoint 加载异常可据此调整 PyTorch 版本。多卡训练脚本使用torch.distributed.launch务必保证gpu_id数量与n_gpu一致并确保CUDA_VISIBLE_DEVICES的卡数与--nproc_per_node匹配。可复现性仓库在train.py中统一设置了随机种子并关闭 cuDNN benchmark配置中seed: 777可自行调整。十、总结本文围绕 ClearerVoice-Studio 的语音增强训练子模块完整复现了原文档的核心内容并从源码层面展开三种模型FRCRN_SE_16K、MossFormerGAN_SE_16K、MossFormer2_SE_48K的架构与损失设计、scp 数据清单的解析规则、训练/推理配置的逐项语义、train.sh 的三种启动模式全新训练 / 断点续训 / 微调以及训练循环中的早停、学习率减半、梯度累积与 checkpoint 管理机制。无论是复现仓库默认的 VoiceBank-DEMAND 训练流程还是把该流程迁移到自有数据集与自定义模型规模上本文给出的配置对照表与源码级说明都可以作为直接可用的实操手册。进一步可参阅 train/speech_enhancement/README.md 原文档以及 networks.py、solver.py、dataloader.py、loss.py 等实现文件深入研读。赞分享人工智能语音音频处理深度学习【免费下载链接】ClearerVoice-StudioAn AI-Powered Speech Processing Toolkit and Open Source SOTA Pretrained Models, Supporting Speech Enhancement, Separation, and Target Speaker Extraction, etc.项目地址https://gitcode.com/gh_mirrors/cl/ClearerVoice-Studio点击查看免费下载相关推荐用 abogen 文本转语音 5 分钟把电子书变成带字幕的有声读物用 abogen 文本转语音 5 分钟把电子书变成带字幕的有声读物 abogen 是一款开源的有声读物生成器用文本转语音技术把 EPUB、PDF、MarkdoAI 应用语音音频媒体生成本地部署PyPTO-Gym 中 movedim 算子的 PyPTO 实现view 取片 assemble 拼回的轴搬运 kernel 骨架解析PyPTO Gym 中 movedim 算子的 PyPTO 实现view 取片 assemble 拼回的轴搬运 kernel 骨架解析 movedim 是人工智能语音音频处理深度学习Flair 语言模型训练实战从零训练与微调你自己的 Flair EmbeddingsFlair 语言模型训练实战从零训练与微调你自己的 Flair Embeddings 导读 Flair Embeddings上下文串嵌入ContextuaNLP深度学习机器学习上一篇Resume-Matcher Swiss 设计系统组件实战按钮、输入框、卡片、对话框与状态指示器的完整实现指南下一篇Claude Code 斜杠命令实战用 /setup-ci-cd 为任意项目一键搭建 CI/CD 质量门禁创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考