ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ESPnet Switchboard 轮转预测(Turn-Taking)模型实战指南:基于 Whisper 的 Judge 模型训练、推理与音频基础模型基准评测

2026/9/25 22:32:17 拓冰建站 浏览量
ESPnet Switchboard 轮转预测(Turn-Taking)模型实战指南:基于 Whisper 的 Judge 模型训练、推理与音频基础模型基准评测 人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载本指南以 ESPnet 仓库中 egs2/swbd/slu1 配方Recipe为核心系统讲解如何训练一个裁判式Judge轮转预测模型它以 40ms 为粒度对对话中的连续说话Continuation、反馈词Backchannel、话轮转换Turn Change、打断Interruption与沉默Silence五类事件输出似然likelihood预测。读完本文你将掌握从 Switchboard 原始语料构建 40ms 轮转标注数据、训练 Whisper 编码器轮转分类模型、以滑动窗口方式推理以及用它量化评测音频基础模型Audio Foundation Model人机对话轮转能力的完整技术方案。配方概览与核心资源egs2/swbd/slu1是 ESPnet 中专门用于轮转预测Turn taking prediction的配方其核心产出是一个可在人机对话中担任裁判的模型——它不直接生成回复而是对每一 40ms 音频块预测五类轮转事件的似然从而客观衡量一个语音 AI 在何时开口、何时附和、何时打断等对话动态上的表现。该方案对应论文《Talking Turns: Benchmarking Audio Foundation Models on Turn-Taking Dynamics》Arora 等ICLR 2025。配方提供的三个核心资源训练配置conf/train_asr_whisper_turn_taking.yaml推理配置conf/decode_asr_chunk.yaml预训练模型官方在 Hugging Face 上以espnet/Turn_taking_prediction_SWBD名称发布了在 Switchboard 上训练好的模型可直接复用做推理与评测或作为下游微调起点。官方评测结果ROC_AUC配方文档给出的模型在 Switchboard 测试集上的 ROC_AUC 结果如下模型为decode_asr_chunk_asr_model_valid.loss.ave评测集为testdatasetContinuationBackchannelTurn changeInterruptionSilenceOveralldecode_asr_chunk_asr_model_valid.loss.ave/test93.389.490.891.395.192.0可以看到五类事件整体 ROC_AUC 达到 92.0其中沉默类Silence最难混淆95.1反馈词Backchannel相对最具挑战性89.4。这一表格来自配方官方文档是复现时的参考基准。标签体系与评估指标设计轮转预测本质上是一个五分类问题其标签定义与评估方法集中实现在 egs2/swbd/slu1/pyscripts/utils/compute_turn_take_metrics.py 中这是整个配方的度量大脑。五类标签与枚举索引源码通过LabelIndex枚举定义了标签到概率数组索引的映射标签含义LabelIndex 值CContinuation继续说话0NASilence沉默1INInterruption打断2BCBackchannel反馈词如嗯哦3TTurn Change话轮转换4模型对每个 40ms chunk 输出一个 5 维概率向量第LabelIndex.L.value个元素即标签L的似然。硬标签阈值在计算 Macro F1 等需要硬标签的指标时源码通过LabelThreshold枚举在验证集上调整得到将概率向量转换为单一标签标签阈值C0.2NA0.45IN0.4BC0.4T0.4转换逻辑见assign_hard_label()按 C → NA → IN → BC → T 的顺序依次判断概率是否超过对应阈值若全部未超过则取 argmax 对应的标签。对话能力指标MetricThreshold针对音频基础模型的评测源码还定义了四个软标签阈值用于做事件的两两对比指标阈值含义turn_change0T 似然 − C 似然 0 则判定为话轮转换backchannel0.1BC 似然 0.1 判定为产生反馈词interrupt−0.45IN 似然 − C 似然 −0.45 判定为打断success_interrupt−0.1T 似然 − C 似然 −0.1 判定打断成功基于这些阈值ScoreResult类实现了六个评估方法compute_F1()Macro F1、compute_roc_auc()ROC_AUC、compute_confusion_matrix()混淆矩阵以及四个面向对话能力的功能指标——turn_change_metric()AI 在用户暂停时是否正确开口、make_backchannel_metric()AI 是否在正确时机产生反馈词、make_interruption_metric()AI 是否在正确时机打断、turn_willingness_metric()AI 说话时是否释放话轮意愿、handle_interruption_metric()AI 是否恰当处理被打断。模型时序参数ModelParamclass ModelParam(enum.Enum): min_start_time 0.2 # 模型在音频前 0.2 秒后才开始做预测 chunk_length 0.04 # 模型每 0.04 秒40ms做一次预测这两个参数贯穿数据准备、推理与评估全过程chunk 起点从 0.2s 开始、步长 40ms所有下游解析逻辑都依赖它们。数据准备从 Switchboard 构建 40ms 轮转标注训练轮转模型的第一步是为每个 40ms chunk 生成带标签的监督数据。配方在 egs2/swbd/slu1/local/data.sh 中完成了全部数据准备对应run.sh的 stage 1 之前的内层 stage 1-3关键流程如下下载与初加工通过 local/swbd1_data_download.sh 准备 Switchboard LDC 语料需在 egs2/swbd/slu1/db.sh 中配置SWBD路径下载turn_take_splits.zip训练/验证/测试的文件划分随后做字典准备、数据预加工并把音频通过 sox 统一重采样到 16kHz。文本清洗对转写文本做缩写词还原等清理如._、.等噪声符号处理。双通道标注生成运行 local/create_switchboard_data_2channels.py读取 Switchboard 双通道A/B 两说话人的 word-level 与 sentence-level 转写结合 local/backchannels.csv 中的反馈词标注以 40ms 粒度逐 chunk 判断 A、B 两通道处于IPU说话段、BC反馈词还是NA无活动输出Train/Val/Test_Two_Channel_Label.csv。单通道事件标签映射双通道标注随后由 local/create_switchboard_data_2channels_mono.py 转换为单通道的事件序列*_Mono.csv其映射逻辑如下两通道均无活动 →NA沉默仅 A 通道有 IPU若前一说话人为 A或 AB 重叠则记为C继续说话否则记为T话轮转换说话人切换到 A仅 B 通道有 IPU同理前说话人为 B或 BA记为C否则记为T两通道同时 IPU →I打断/重叠出现BC标注时按前说话人是否匹配输出BC或BC_1/BC_2例外标记。生成的每条记录格式为file_id,chunk_start,chunk_end,label,speaker即Test_Two_Channel_Label_Mono.csv中每行对应一个 40ms chunk携带该 chunk 的事件标签与当前说话人。类别平衡下采样由于对话中绝大多数 chunk 都是继续说话或沉默配方通过 local/subsample_2channel_switchboard_mono.py 对训练集和验证集做下采样使各类别样本数大致与数量最少的T类接近以T的样本数为基准按比例随机抽取从而避免类别严重失衡。测试集则保持完整不采样。生成 ESPnet 数据目录最终由 local/create_espnet_data_folders.py 将标注 CSV 转换为 Kaldi 风格的data/{train,valid,test}目录wav.scp、segments、text、utt2spk。实现要点是以每个 chunk 的结束时间为锚点向前取 30 秒的音频窗口作为训练/验证样本不足 30 秒则从 0 开始text中存放该窗口对应的事件标签序列——也就是说模型在训练时输入 30 秒对话音频、输出的是该窗口最后一个 40ms chunk 的轮转事件。测试集text则为整段对话拼接的事件序列。训练 Judge 轮转预测模型一键启动训练在配方目录下运行./run.sh --stop_stage 11即完成从数据准备到模型训练stage 1-11的全流程。run.sh通过 egs2/swbd/slu1/slu.sh 驱动其中与本任务强相关的关键参数为--use_lm false不使用语言模型--ngpu 2、--nj 322 卡训练、32 个并行数据任务--feats_type raw、--audio_format flac.ark原始波形输入以 flac.ark 格式存储--token_type word、--nbpe 2000词级 token 化本任务中 token 序列实际对应标签序列--feats_normalize utterance_mvn按句归一化--max_wav_duration 40训练样本最长 40 秒数据准备阶段已按 30 秒窗口切片此参数留有余量--no_asr_eval true训练阶段不计算 CER/WER因为标签并非转写文本--inference_slu_model valid.loss.ave.pth解码阶段默认使用验证集 loss 平均的模型--score_opts -s评分阶段参数。slu.sh中 stage 10 为 SLU collect stats统计收集、stage 11 为 SLU 训练espnet2.bin.slu_train。训练目录默认为exp/slu_train_asr_whisper_turn_taking_raw_en_word2000按slu_tag的命名规则自动生成。训练配置逐项解析conf/train_asr_whisper_turn_taking.yaml 是模型架构与训练超参的核心要点如下optim: adam optim_conf: lr: 0.0005 scheduler: warmuplr scheduler_conf: warmup_steps: 500 max_epoch: 32 num_iters_per_epoch: 750 batch_size: 4000 encoder: whisper encoder_conf: whisper_model: medium dropout_rate: 0.0 use_specaug: false freeze_param: [encoder] normalize: null frontend: null input_size: 1 # 仅为通过 build_model() 检查而占位 model_conf: ctc_weight: 0.0 lsm_weight: 0.1 length_normalized_loss: false superb_setup: true num_class: 5 ssl_input_size: 1024 extract_feats_in_collect_stats: false use_only_last_correct: true best_model_criterion: - - valid - loss - min keep_nbest_models: 10逐项说明编码器直接使用 OpenAI Whispermedium作为特征提取骨干且freeze_param: [encoder]冻结编码器参数只训练下游分类头。frontend: null、normalize: null表明 Whisper 自带特征处理无需额外前端对应源码 espnet2/slu/espnet_model.py 中对 Whisper 编码器frontend should be None的断言。superb_setup启用 SUPERB 式轻量分类头见下文源码剖析此时ctc_weight: 0.0关闭 CTC 分支模型退化为编码器 线性分类结构。num_class: 5输出五类轮转事件C/NA/IN/BC/T。ssl_input_size: 1024Whisper medium 编码器输出的特征维度对应其 hidden size。use_only_last_correct: true分类头只取编码器输出的最后一帧做分类即用整个 30 秒窗口的上下文预测窗口末端 chunk 的事件。extract_feats_in_collect_stats: falsecollect stats 阶段只生成占位统计文件而不真正前向提取特征。优化器Adamlr5e-4 warmuplr 调度500 步 warmupbatch_size 4000 按 token 数计最大 32 epoch。源码级的训练前向逻辑superb_setup分支的实现位于 espnet2/slu/espnet_model.pyL167-L173、L217-L233核心代码逻辑为if self.superb_setup: self.decoder None self.act_fn torch.nn.Tanh() self.num_class num_class self.transform_mean torch.nn.Linear(ssl_input_size, ssl_input_size) self.transform_linear torch.nn.Linear(ssl_input_size, num_class)前向时编码器输出经Tanh激活后先过transform_mean再按use_only_last_correct决定取最后一帧encoder_out[k, encoder_out_lens[k] - 1]还是取时间维平均torch.mean(..., dim0)最后经transform_linear映射为 5 维 logits与标签序列的交叉熵即为训练损失encoder_out self.transform_linear(feats) text text.reshape(-1) - 2 # 标签 id 减去 2对齐到 0~4 loss_lightweight torch.nn.functional.cross_entropy(encoder_out, text)这里的text - 2与推理端argmax 2相互对应见下节构成完整的标签编码闭环。推理滑动窗口式 chunk 预测一键启动推理对 Switchboard 测试集执行推理./run.sh --stage 12 --stop_stage 12推理使用espnet2.bin.slu_inference见 slu.sh 的 stage 12读取 conf/decode_asr_chunk.yamlbeam_size: 1 ctc_weight: 0.3 lm_weight: 0.0 penalty: 0.0 maxlenratio: 0.0 minlenratio: 0.0 run_chunk: true其中run_chunk: true是关键开关它让推理器进入按 chunk 滑窗预测的模式而非标准 beam search 解码。滑窗推理的底层实现在 espnet2/bin/slu_inference.py 中run_chunk分支的窗口参数默认值为sim_chunk_length: int 640滑动步长 640 个采样点即 640 / 16000 40ms与ModelParam.chunk_length一致start_chunk: int 3200起始偏移 3200 个采样点即 0.2 秒与ModelParam.min_start_time一致每次输入的窗口为[(i1)*640 3200 - 480000 : (i1)*640 3200]即至多 480000 个采样点30 秒的滑动上下文。推理时对每个 40ms 步进执行一次编码器前向取窗口最后一帧经transform_mean → transform_linear得到 5 维 logits经 Softmax 得到似然argmax 2即对应标签 idm torch.nn.Softmax() token_int [(m(encoder_out[0])).tolist()] token_int_corr [np.argmax(k) 2 for k in token_int] text ,.join([str(k) for k in token_int[0]]) # 5 维概率以逗号分隔拼接推理输出格式推理结果写入手decode_asr_chunk_slu_model_valid.loss.ave/test/texttext目录随inference_tag命名规则生成每行格式为音频文件名 chunk1 的 5 维似然数组 chunk2 的 5 维似然数组 ...每个似然数组是一个以逗号分隔的 5 元素列表第 i 个元素对应LabelIndex值为 i 的标签的似然。示例moshi_audio_1.wav 0.52,0.25,0.03,0.04,0.16 0.20,0.62,0.02,0.02,0.14即第一个 chunk 中 C/NA/IN/BC/T 的似然分别为 0.52/0.25/0.03/0.04/0.16。应用到自己的测试集若要将模型用于自有数据只需将自己的人机对话数据整理成与 Switchboard 测试集相同的结构Kaldi 风格 data 目录即wav.scp等文件然后运行./run.sh --stage 12 --stop_stage 12 --test_sets ${own_test_set}即可获得该数据集上逐 chunk 的似然预测。评估ROC_AUC 与 Macro F1一键启动评估./run.sh --stage 13 --stop_stage 13stage 13 中slu.sh 在常规打分之外会调用 local/score.sh后者执行 local/score_turn_take.py完成轮转指标的正式评测。评测流程拆解score_turn_take.py的输入为两份文件模型似然预测${exp_root}/decode_asr_chunk_slu_model_valid.loss.ave/test/text真实轮转决策Test_Two_Channel_Label_Mono.csv。流程为compute_turn_decisions(ref_arr)解析真实 CSV生成每个文件、每个 chunk 结束时间上的事件标签与说话人标签见 compute_turn_take_metrics.py 的compute_turn_decisions注意其中把I归一化为IN。compute_turn_likelihoods(hyp_arr, min_start_time, chunk_length)按ModelParam的 0.2s 起点与 40ms 步长解析似然预测文本为每个 chunk 结束时间建立 5 维概率向量解析时还会把sw0前缀从文件名中去掉以对齐 CSV。构造ScoreResult(true_dict, pred_dict, turn_dict, labels, human_humanTrue)以human_humanTrue模式人类-人类对话上评测 judge 模型将两套数据按文件名与 chunk 结束时间对齐同时生成硬标签与软标签数组。输出 Macro F1compute_F1逐标签打印分类报告与 ROC_AUCcompute_roc_auc以软似然对硬真实标签逐类计算并打印 Overall。指标正确性的测试验证配方附带完整的单元测试 egs2/TEMPLATE/asr1/pyscripts/utils/test_compute_turn_take_metrics.py该测试同时是文档中如何计算指标的可执行示例。测试以moshi_audio_1的 7~8 个 chunk 为最小样例逐条验证了test_F1_simple手工推演 C/NA/IN/BC/T 各类的 TP/FP/FN/TN断言compute_F1()返回的逐类 Macro F1如 C0.844、NA0.788、IN0.462、BC1.0、T0.788test_confusion_matrix_simple断言 5×5 混淆矩阵test_turn_change_metric_simple、test_make_backchannel_metric_simple、test_make_interruption_metric_simple、test_turn_willingness_metric_simple、test_handle_interruption_metric_simple分别以注释形式给出每个功能指标的手工计算推导并断言返回的准确率数值。这些测试不仅是回归保障更是理解四个对话能力指标判定逻辑的最佳注释——例如turn_change_metric只在用户说话且前 3 个 chunk 均为 NA暂停时采样比较T 似然 − C 似然与MetricThreshold.turn_change0从而分别计算AI 让用户继续说与AI 开口抢话两种情形下的准确率。使用 Judge 模型基准评测音频基础模型这是配方文档给出的端到端应用场景用训练好的 judge 轮转模型量化一个音频基础模型Audio FM如 Moshi 这类语音对话系统的轮转动态质量。完整流程分四步第 1 步收集人机对话数据采集人类 音频基础模型的真实对话音频例如 Moshi 的单通道录音。第 2 步获取 judge 模型的似然预测按上文推理一节对 FM 对话数据运行./run.sh --stage 12 --stop_stage 12或直接在自有测试集上运行得到逐 chunk 似然输出。输出结构为每一行是一条似然预测 以音频文件名开头 后接空格分隔的每个 chunk 的似然预测。 每个 chunk 的似然预测是一个数组 数组第 L 个元素存储标签 L 的似然 索引对应 LabelIndex.L.value。 示例条目 moshi_audio_1.wav 0.52,0.25,0.03,0.04,0.16 0.20,0.62,0.02,0.02,0.14第 3 步提取真实轮转决策使用说话人分离speaker diarization模型从人类与 AI 的交互音频中提取轮转决策输出为与Test_Two_Channel_Label_Mono.csv相同格式的文件即每一行是 40ms 粒度的人机对话轮转决策。 每条记录结构为 file_id,[start time],[end time],[Turn Taking Event],[Speaker Turn] 示例条目 moshi_audio_1,0.96,1.0,C,A其中 Speaker Turn 取值包括AAI 在说、B人类在说、ABAI 被人类打断的重叠、BA人类被 AI 打断的重叠、NA尚未开始说话详见compute_turn_take_metrics.py中的TurnLabel枚举。这些说话人信息正是turn_change_metric、make_interruption_metric等指标判定谁在说、何时被打断的依据。第 4 步计算评测指标将 judge 模型的似然预测与真实轮转决策同时送入评估库即可计算提出的评测指标。可执行示例见 egs2/TEMPLATE/asr1/pyscripts/utils/test_compute_turn_take_metrics.py它演示了如何用compute_turn_likelihoods/compute_turn_decisions构建ScoreResult再调用六个指标方法。对 FM 评测场景构造ScoreResult时无需human_humanTrue该模式专用于 judge 模型自身在人类-人类数据上的验证而是将模型似然作为true_dict伪标签来源、FM 的决策作为pred_dict从而用软标签对比与成对比较的方式评估 FM 的轮转表现。推荐的指标组合turn_change_metric衡量用户暂停时AI 是否在正确时机开口make_backchannel_metric衡量AI 是否在正确时机发出反馈词make_interruption_metric衡量AI 是否在正确时机打断turn_willingness_metric衡量AI 说话时是否恰当释放话轮给用户handle_interruption_metric衡量AI 被用户打断时是否恰当让出话轮成功/失败打断。引用该配方与评测方法对应的论文引用如下inproceedings{ arora2025talking, title{Talking Turns: Benchmarking Audio Foundation Models on Turn-Taking Dynamics}, author{Siddhant Arora and Zhiyun Lu and Chung-Cheng Chiu and Ruoming Pang and Shinji Watanabe}, booktitle{The Thirteenth International Conference on Learning Representations}, year{2025}, } inproceedings{watanabe2018espnet, author{Shinji Watanabe and Takaaki Hori and Shigeki Karita and Tomoki Hayashi and Jiro Nishitoba and Yuya Unno and Nelson Yalta and Jahn Heymann and Matthew Wiesner and Nanxin Chen and Adithya Renduchintala and Tsubasa Ochiai}, title{{ESPnet}: End-to-End Speech Processing Toolkit}, year{2018}, booktitle{Proceedings of Interspeech}, pages{2207--2211}, doi{10.21437/Interspeech.2018-1456}, }小结与延伸围绕egs2/swbd/slu1配方本文完整覆盖了从数据构建、模型训练、滑窗推理到指标评测与 FM 基准评测的整条链路。其设计要点可以总结为三点40ms 粒度统一ModelParam.min_start_time0.2与chunk_length0.04在数据标注local/create_switchboard_data_2channels.py、推理窗口espnet2/bin/slu_inference.py 的sim_chunk_length640采样点与指标解析compute_turn_take_metrics.py三处保持一致是端到端可对齐的基石冻结 Whisper 编码器 轻量分类头superb_setup只训练两个线性层训练成本低且易于复现use_only_last_correct让每个预测都能利用 30 秒上下文软硬两套标签体系硬标签阈值化用于 F1 与混淆矩阵软似然用于 ROC_AUC 与成对比较型对话能力指标兼顾裁判自检与FM 评测两类场景。若想深入了解指标判定细节可直接阅读 compute_turn_take_metrics.py 的源码注释与配套测试若需复现完整实验可按本文给出的三条命令依次执行数据准备与训练、推理、评估并将官方发布的Turn_taking_prediction_SWBD模型作为对照基准。赞分享人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载相关推荐ESPnet Bagpiper SpeechLM1 训练与推理实战基于富文本描述的开放音频基础模型ESPnet Bagpiper SpeechLM1 训练与推理实战基于富文本描述的开放音频基础模型 导读 本文聚焦 ESPnet 仓库中 egs2/bagpi人工智能语音音频深度学习NLPFAIRChem OCP 预训练模型评估指南基于 Hydra 配置与 EvalRunner 的 UMA 模型评测实战FAIRChem OCP 预训练模型评估指南基于 Hydra 配置与 EvalRunner 的 UMA 模型评测实战 FAIRChemOCPOpen Ca人工智能机器学习深度学习预训练科学计算科研基础模型ESPnet 神经音频编解码器实战基于 MUSDB18 语料训练与评测 DAC44.1 kHz模型ESPnet 神经音频编解码器实战基于 MUSDB18 语料训练与评测 DAC44.1 kHz模型 本篇技术指南以 ESPnet 仓库中 egs2/mus人工智能语音音频深度学习NLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考