
SpeechBrain 实战MEDIA 法语口语理解数据集准备与 Wav2Vec 2.0 CTC 训练全解【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrainMEDIA 是面向法语口语理解SLU与语音识别ASR的基准数据集其原始发布形态是 ELRA 目录下的 XML 标注与立体声录音无法直接喂给深度学习训练管线。本文以 SpeechBrain 仓库中的recipes/MEDIA配方为主线完整讲解如何用 media_prepare.py 将原始 MEDIA 语料解析、清洗并转换为 SpeechBrain 标准 CSV 数据集随后基于 HuggingFace 的 LeBenchmark 法语 Wav2Vec 2.0 模型配合 CTC 损失训练出 ASR 与 SLU 系统。读完本文你将掌握 MEDIA 数据集的完整预处理链路、ASR/SLU 两种配方的差异含 full/relax 概念体系与 CVER 指标原理并能直接复现仓库中报告的实验结果。MEDIA 数据集背景与配方设计依据MEDIA 是一个法语人机口语对话语料库语料围绕酒店预订等任务域采集录音中包含真实用户spk与充当系统引导者的Compère即 Wizard-of-Oz 式操作员的对话。原始数据以两种形态分开发布Media ASRELRA-S0272提供音频与转写所需的信息Media SLUELRA-E0024提供语义标注concept/specif与 XML 原始文件。因此无论训练 ASR 还是 SLU 任务都需要同时取得上述两个语料库。此外运行数据准备还需要两个补充 CSV 文件channels.csv与concepts_full_relax.csv来自配方作者提供的下载目录必须放置到recipes/MEDIA目录下。该配方严格按照 G. Laperrière 等人的论文《The Spoken Language Understanding MEDIA Benchmark Dataset in the Era of Deep Learning: data updates, training and evaluation tools》LREC 2022实现其中对数据集做出的关键更新包括新增从未被使用过的test2推理语料、引入 full/relax 两套概念标注体系、以及标准化评估工具如 u-CVER。仓库在 recipes/MEDIA 下组织为两个独立配方ASR/CTC基于 CTC Wav2Vec 2.0 的 MEDIA 语音识别SLU/CTC基于 CTC Wav2Vec 2.0 的 MEDIA 口语理解把语义概念序列当作 CTC 标签直接解码。两个配方的训练代码与数据准备脚本结构高度一致SLU 配方在 ASR 基础上额外引入了概念错误率指标与两种概念粒度。第一步数据准备media_prepare.py数据准备入口是 recipes/MEDIA/media_prepare.py核心函数为prepare_media。训练脚本通过run_on_main调用它在 DDP 场景下只在主进程执行一次从而保证多卡训练时不会重复处理数据。前置条件与目录约定运行脚本前需要确保已下载ELRA-S0272与ELRA-E0024两个语料库并解压到同一个data_folder下脚本假定存在S0272/与E0024/MEDIA1FR_00/MEDIA1FR/DATA/等目录结构已下载channels.csv记录每个录音中说话人所在声道的映射表与concepts_full_relax.csv记录 full 概念与 relax 概念的对应关系系统中安装了sox与soxi命令行工具音频声道拆分、重采样与时长读取依赖它们。prepare_media 参数详解prepare_media的完整签名如下来自 recipes/MEDIA/media_prepare.pydef prepare_media( data_folder, # 存放 S0272 与 E0024 的根目录 save_folder, # CSV 与预处理 wav 的输出目录 channels_path, # channels.csv 路径 concepts_path, # concepts_full_relax.csv 路径 skip_wavTrue, # 若已处理过 wav 则跳过音频存储 methodslu, # full 或 relax仅对 slu 任务生效 taskfull, # slu 或 asr skip_prepFalse, # 若为 True 直接跳过整个数据准备 process_test2False, # 是否处理 test2 新语料 ):各参数的行为与约束参数取值作用与注意事项data_folder路径存放S0272/、E0024/的根目录脚本递归扫描S0272/**/*.wavsave_folder路径自动创建wav/与csv/子目录分别存放重采样后的单声道 wav 与train.csv、dev.csv、test.csv可选test2.csvchannels_path路径channels.csv第一列为声道R/L第二列为录音 IDconcepts_path路径concepts_full_relax.csv第一列为 full 概念第二列为对应 relax 概念skip_wavbool音频已处理过可设True跳过 sox 拆分节省时间methodfull/relaxfull保留概念中的 specifier如time带修饰relax将其移除传其他值直接抛ValueErrortaskslu/asr决定解析 XML 时是否提取semAnnotation语义标注asr只取转写文本skip_prepboolTrue时函数立即返回适合数据已就绪的重复实验process_test2boolTrue时额外生成test2.csv它由首版发布后新增、从未被社区使用过的对话构成可作第二个推理测试集脚本带有幂等保护skip()检测到csv/train.csv、csv/dev.csv、csv/test.csv三者都已存在时会直接跳过整轮处理并输出日志Csv files already exist, skipping data preparation!。内部处理流程源码级prepare_media的执行链路可分为四步音频预处理对S0272下每个立体声 wav先按channels.csv查出说话人所在声道R→ 声道 2L→ 声道 1用sox remix只保留该声道再以sox -G -r 16000重采样到 16 kHz最终文件命名为{声道}{录音ID}.wav。之所以必须重采样是因为MEDIA 原始音频只有 8 kHz而 Wav2Vec 2.0 期望 16 kHz 输入——这一处理在准备脚本内完成对应 split_audio_channels。XML 解析train/dev/test脚本内置了 6 个 XML 到分集的映射media_lot1~4.xml→ train、media_testHC.xml→ test、media_testHC_a_blanc.xml→ dev从E0024/MEDIA1FR_00/MEDIA1FR/DATA/读取。解析器逐dialogue、逐turn处理只保留speakerspk真实用户的话轮并通过parse_sentences将话轮内嵌的semAnnotation/sem/Sync节点还原成带起止时间戳的句子序列。test2 处理当process_test2True脚本用egrep找出已用对话 ID与S0272中全部 wav 求差集得到unused_dialogs再从semantizer_files/目录读取结构不同的*_HC.xml标签为大写Turn、SemDebut/SemFin走独立的parse_test2解析路径。源码中还包含一个针对录音 70 的边界时间修正见 parse_test2可见作者对数据噪声做了细致的清洗。CSV 落盘append_data用soxi -D读取整段 wav 时长逐句计算duration stop - start过滤掉空转写、零时长或超出 wav 边界的片段最终写入 12 列标准 SpeechBrain CSV列头为ID, duration, start, stop, wav, wav_format, spk_id, spk_id_format, wrd, wrd_format, char, char_format见 write_first_row。ID的格式为{声道}{录音ID}#{说话人}#{start}_{stop}。文本与概念的规范化SLU 任务下process_text_node会把语义概念以标签形式内联到文本中每个句子同时生成两列——wrd列形如concept 文本内容 char列则是按字符切分、以_连接的序列如 c o n ...。这样设计的目的是让 CTC 模型能直接把概念标签 文本当作一个序列建模实现端到端语义理解。normalize_sentence对法语文本做了大量针对性清洗见 media_prepare.py包括撇号处理 →、→把撇号与前后词正确粘连/分离拼写纠错如gcest→cest、a-t- il→a-t-il、bleu marine→bleu-marine、Mont de Marsan→Mont-De-Marsan数字连字符展开dix-、vingt-、soixante-等数十个连字符数字改写为空格分隔正则清洗括号内容替换为*除 - _外的标点一律删除多余空白折叠。说话人名称同样经过normalize_speaker修正如-/#→_、speaker1→speaker、以及一批历史 ID 勘误映射保证 spk_id 的一致性。第二步ASR 配方CTC Wav2Vec 2.0运行方式ASR 配方位于 recipes/MEDIA/ASR/CTC目录包含 train_hf_wav2vec.py、media_prepare.py与顶层同名脚本一致和 hparams/train_hf_wav2vec.yaml。运行前务必先把!PLACEHOLDER替换为真实路径python train_hf_wav2vec.py hparams/train_hf_wav2vec.yamlYAML 中需要手动填写的占位符有三个占位符含义data_folder存放 S0272 与 E0024 的根目录channels_pathchannels.csv的路径concepts_pathconcepts_full_relax.csv的路径模型架构与超参数ASR 系统由三部分组成见 train_hf_wav2vec.yamlWav2Vec 2.0 前端speechbrain.integrations.huggingface.wav2vec2.Wav2Vec2默认加载法国 LeBenchmark 预训练的wav2vec2-FR-3K-large开启output_norm对输出做 LayerNorm默认不冻结freeze: False支持整个模型微调DNN 编码器VanillaNN3 个隐藏块、每块 512 神经元、LeakyReLU 激活输入维度为 Wav2Vec 输出 1024输出层Linear(512 → 67)加上 log-softmax67 对应 MEDIA 的字符集含 blank。关键训练超参数ASR 与 SLU 配方一致参数值说明seed4242在 YAML 顶部通过speechbrain.utils.seed_everything固定batch_size/test_batch_size4 / 2训练/测试批大小avoid_if_longer_than90.0剔除超过 90 秒的样本对应开放式麦克风产生的超长句number_of_epochs30训练轮数lr1主模型优化器 Adadelta 的初始学习率rho0.95, eps1e-8lr_wav2vec0.0001Wav2Vec 优化器 Adam 的初始学习率annealing_factor/annealing_factor_wav2vec0.8 / 0.9两组 NewBobScheduler 的退火因子blank_index0CTC blank 索引sortingascending训练集按时长升序排序此时 DataLoader 关闭 shuffleWav2Vec 前端与 DNN 头部使用两套独立优化器与学习率调度器init_optimizers分别为model_wav2vec2与model创建 Adamlr1e-4与 Adadeltalr1优化器并都注册进 Checkpointer 以便断点续训。这样做的原因是预训练前端应当以更保守的学习率微调而随机初始化的 DNN 头部需要更激进的学习率。训练流程与评估ASR(sb.core.Brain)的compute_forward链路为波形 → Wav2Vec2 特征1024 维→ VanillaNN → 线性层 → log-softmax得到 CTC 帧级概率compute_objectives用speechbrain.nnet.losses.ctc_loss计算损失并在验证/测试阶段用speechbrain.decoders.ctc_greedy_decode做贪心解码累积CER字符错误率与 CTC 损失两类指标。验证阶段以 CER 为min_keys执行模型保存与早停式 checkpoint 保留测试阶段把 CER/CTC 明细写入cer_test.txt、ctc_test.txt。数据加载部分dataio_prepare展示了 SpeechBrain 标准流程DynamicItemDataset.from_csv读入 CSV → 按duration过滤与排序 → 通过audio_pipeline按 CSV 中的start/stop切取音频片段sample_rate16000→text_pipeline把字符序列交给CTCTextEncoder编码为索引序列 →PaddedBatch打包送入 DataLoader。ASR 复现结果原配方文档报告的官方复现结果如下数据集版本 2008-03-27Media ReleasehyperparamsTest ChERWav2Vec训练时间2008-03-27train_with_wav2vec.yaml4.78LeBenchmark wav2vec2-FR-3K-large每个 epoch 约 12m30s其中 ChER 为字符错误率Character Error Rate。训练好的模型发布在 SpeechBrain 的 HuggingFace 组织下仓库名asr-wav2vec2-ctc-MEDIA可直接用于推理。第三步SLU 配方概念序列 CTCSLU 配方位于 recipes/MEDIA/SLU/CTC训练脚本 train_hf_wav2vec.py 与 ASR 版几乎相同核心区别在于标签不再是纯字符而是概念标签 字符的内联序列数据准备阶段由process_text_node生成因此output_neurons取决于概念体系的规模同时评估阶段额外引入概念级错误率指标。运行方式占位符替换同 ASRpython train_hf_wav2vec.py hparams/train_hf_wav2vec_full.yaml # full 方法 python train_hf_wav2vec.py hparams/train_hf_wav2vec_relax.yaml # relax 方法full 与 relax 两套概念体系MEDIA 的语义标注由concept概念与specif修饰符组成。以full/relax两种粒度解析 XML 时结果不同full完整版method: full保留 specifier——当specif ! null时把修饰符拼接到概念后面源码concept specif概念更细、类别更多对应 train_hf_wav2vec_full.yamloutput_neurons: 212relax宽松版method: relax通过concepts_full_relax.csv的映射表把带修饰符的概念折叠回基础概念如time*前缀匹配概念更粗、类别更少对应 train_hf_wav2vec_relax.yamloutput_neurons: 141。get_concept_relax的匹配规则支持通配若 CSV 中的 full 概念以*结尾则做前缀匹配concept[:len(c)-1] c[:-1]否则要求完全相等。relax 方法正是 LREC 2022 论文中提出的标准化评估口径之一。三类指标CER / COER / CVERSLU 评估在 CER 之外新增两个概念级指标其实现均在 YAML 中通过ErrorRateStats的专用参数开启指标配置要点含义CERcer_computer默认参数对完整概念文本序列的字符错误率COERextract_concepts_values: True, keep_values: False, tag_in: , tag_out: 仅保留概念名、丢弃取值后的概念错误率CVERextract_concepts_values: True, keep_values: True, tag_in: , tag_out: 保留概念及其取值的概念取值错误率其底层机制位于 speechbrain/utils/metric_stats.pyErrorRateStats.append在统计前调用extract_concepts_values按tag_in/tag_out即/切出概念块再依据keep_values决定是否剥离取值。原配方文档特别说明本仓库实现的 CVER 是严格版本任何单个字符错误都计为错误等价于论文中的 u-CVER没有加入 MEDIA 社区评估中常用的人工宽松规则——这意味着报告的数字比其他采用宽松规则的实现更保守横向对比时需注意口径一致。SLU 复现结果原配方文档报告的官方复现结果数据集版本 2008-03-27模型 LeBenchmark wav2vec2-FR-3K-large每个 epoch 约 12m30sMedia ReleasehyperparamsTest ChERTest CERTest CVERHuggingFace 模型2008-03-27train_with_wav2vec_relax.yaml7.4620.1031.41slu-wav2vec2-ctc-MEDIA-relax2008-03-27train_with_wav2vec_full.yaml7.7824.8835.77slu-wav2vec2-ctc-MEDIA-full可以看到 relax 体系在各项指标上都优于 full 体系——这与 relax 将细粒度 specifier 折叠为粗粒度概念、降低序列标注难度直接相关。扩展用 test2 作为第二个推理集若想评估模型在未见过的新发布语料上的泛化能力可在 YAML 中把process_test2置为True重新跑数据准备脚本会生成csv/test2.csv随后将csv_test从test.csv改为test2.csv即可在评估阶段使用该新语料。注意 test2 的 XML 结构大写标签、SemDebut/SemFin边界、独立的说话人节点与原 XML 不同因此脚本专门实现了parse_test2路径其中get_unused_dialogs通过与已用对话求差集的方式确定语料范围。小结与复现检查清单从原始 ELRA 语料库到可复现的 ASR/SLU 实验关键环节可归纳为五步下载 ELRA-S0272、ELRA-E0024 及两个补充 CSV放入recipes/MEDIA目录在 YAML 中替换data_folder、channels_path、concepts_path三个占位符根据任务选择task: asr或task: sluSLU 还需选method: full/relax并注意output_neurons随之变化首次运行会触发prepare_media完成 8 kHz→16 kHz 重采样、声道拆分、XML 解析与 CSV 生成需要系统预装sox/soxi训练 30 个 epoch验证集以 CER 为早停/保存依据最终在测试集或test2.csv上输出 CER/COER/CVER 明细文件。本配方同时展示了 SpeechBrain 的两个通用模式用run_on_main包裹数据准备实现 DDP 安全以及用双优化器 双 NewBobScheduler 微调预训练前端与随机初始化头部这两点可以迁移到其他基于大规模预训练模型的 ASR/SLU 配方中。说明本配方的数据准备与训练代码作者为 Gaëlle Laperrière2023实现依据为 LREC 2022 论文《The Spoken Language Understanding MEDIA Benchmark Dataset in the Era of Deep Learning: data updates, training and evaluation tools》。如将 SpeechBrain 用于研究或商业用途请按照 recipes/MEDIA/README.md 中的 BibTeX 条目引用 SpeechBrain 论文arXiv:2407.00463 与 arXiv:2106.04624。【免费下载链接】speechbrainA PyTorch-based Speech Toolkit项目地址: https://gitcode.com/GitHub_Trending/sp/speechbrain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考