资讯详情

资讯详情

PaddleSpeech 8k 呼叫中心 ASR 实战指南:基于 Conformer/U2 的离线与流式语音识别

人工智能语音音频【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSpeech点击查看免费下载本文以 PaddleSpeech 仓库中的 callcenter 示例 为核心系统讲解面向呼叫中心、客服电话等 8k 采样率语音场景的 ASR 全流程如何自备数据生成 manifest、如何配置离线 Conformer 与流式 Chunk Conformer、如何使用四种解码方式评估模型、以及如何做 CTC 对齐与 JIT 模型导出。读完本文你将能够独立跑通一套 8k 电话语音识别Mandarin 8k的训练、评测、对齐与部署链路。一、Recipe 定位一个只含配置、不含数据的 8k ASR 示例在 PaddleSpeech 中examples/callcenter是一个特殊的示例它不像 aishell 或 librispeech 那样自带数据下载逻辑而是只提供面向 8k 采样率的模型配置与数据配置。正如其在 examples/callcenter/README.md 中明确说明的This recipe only has model/data config for 8k ASR, user need to prepare data and generate manifest metafile. You can see Aishell or Libripseeth.也就是说用户需要自行准备 8k 电话语音数据如呼叫中心录音并参照 Aishell/Librispeech 的流程生成 manifest 元数据文件然后复用本 recipe 的配置与脚本完成训练和评测。呼叫中心语音与常规 16k 朗读语音差异明显采样率低8k、信道特性复杂、口语化与噪声较多因此单独维护一套 8k 配置是必要的。该示例的实际目录结构如下examples/callcenter/ ├── README.md └── asr1/ ├── RESULTS.md # MandarinK8 实验结果CER ├── path.sh # 环境变量与 BIN_DIRMODELu2 ├── run.sh # 主入口按 stage 驱动全流程 ├── conf/ │ ├── conformer.yaml # 离线 Conformer 训练/推理配置 │ ├── chunk_conformer.yaml # 流式分块Conformer 配置 │ ├── preprocess.yaml # fbank 特征 SpecAugment 预处理 │ ├── augmentation.json # 在线数据增强speed/shift/specaug │ └── tuning/ │ ├── decode.yaml # 离线解码配置 │ └── chunk_decode.yaml # 流式模拟解码配置 └── local/ ├── data.sh # 数据准备CMVN、词表、格式化 manifest ├── train.sh # 单机多卡训练 ├── test.sh # 四种解码方式评测 ├── align.sh # CTC 强制对齐 ├── export.sh # 导出 JIT 推理模型 └── download_lm_ch.sh # 下载中文语言模型可选从 path.sh 可以看出该 recipe 使用的模型框架是MODELu2训练与推理脚本位于paddlespeech/s2t/exps/u2/bin/包括train.py、test.py、alignment.py、export.py、test_wav.py等。U2 即论文Unified Streaming and Non-streaming Two-pass End-to-end Model for Speech RecognitionarXiv:2012.05481所描述的两遍式模型这也是本 recipe 既能跑离线识别、又能跑流式识别的原因。二、数据准备自备 8k 数据并生成 manifest2.1 原始 manifest 的字段格式callcenter 的data.sh假定用户已经准备好了data/manifest.train、data/manifest.dev、data/manifest.test三个原始 manifest 文件jsonline 格式每行一个 JSON 对象。生成这种格式的参考实现是 paddlespeech/dataset/aishell/aishell.py每个条目包含如下字段{ utt: 音频ID如 BAC009S0002W0123, utt2spk: 说话人ID, feat: /绝对路径/到/音频.wav, feat_shape: [3.2], text: 对应的中文转写文本 }其中feat_shape是音频时长秒feat直接指向 wav 文件路径format_data.py会识别其为sound类型的输入。如果你的数据是 Kaldi 风格的 ark 特征format_data.py 会直接抛出NotImplementedError——当前 recipe 只支持直接读 wav。务必保证音频为 8k 采样率这关系到后续 CMVN 与 fbank 参数的正确性。2.2 三步数据流水线local/data.sh 在拿到上述三个原始 manifest 后分三步加工Step -1备份原始文件。将data/manifest.{train,dev,test}重命名为.raw后缀供后续步骤读取。Step 0计算 CMVN 统计量。调用 utils/compute_mean_std.py 生成data/mean_std.json关键参数体现了 8k 场景的设定python3 ${MAIN_ROOT}/utils/compute_mean_std.py \ --manifest_pathdata/manifest.train.raw \ --spectrum_typefbank \ --feat_dim80 \ --delta_deltafalse \ --stride_ms10 \ --window_ms25 \ --sample_rate8000 \ --use_dB_normalizationFalse \ --num_samples-1 \ --num_workers${num_workers} \ --output_pathdata/mean_std.json对比 Aishell 的同一脚本--sample_rate16000callcenter 将sample_rate显式设为8000这是整个 recipe 最核心的差异点feat_dim80的 fbank、stride_ms10、window_ms25则与标准配置保持一致。Step 1构建字符词表。调用 utils/build_vocab.py以--unit_typechar从训练集转写文本生成data/lang_char/vocab.txtcount_threshold0表示不过滤低频字符。Step 2格式化 manifest。对 train/dev/test 三个数据集并行调用 utils/format_data.py把原始 manifest 转换为带 tokenid 的训练/评测格式输出到data/manifest.{train,dev,test}。从 paddlespeech/dataset/s2t/format_data.py 的源码可以看到转换后的条目形如{ input: [{name: input1, shape: [...], feat: /path/to/audio.wav, filetype: sound}], output: [{name: target1, shape: [...], text: 转写文本, token: ..., tokenid: ...}], utt: ..., utt2spk: ... }完成后data/目录下应有manifest.train(.raw)、manifest.dev(.raw)、manifest.test(.raw)、mean_std.json以及lang_char/vocab.txt与 conf/conformer.yaml 中train_manifest、dev_manifest、test_manifest、vocab_filepath的默认路径一一对应。三、模型配置离线 Conformer 与流式 Chunk Conformer3.1 离线版 conf/conformer.yamlconf/conformer.yaml 是默认训练配置采用Conformer 编码器 Transformer 解码器 混合 CTC/Attention的 U2 结构数据加载unit_type: char、feat_dim: 80、sortagrad: 0关闭按时长排序、batch_size: 64、maxlen_in: 512/maxlen_out: 150超长样本自动缩减 batch、num_workers: 0编码器 encoder_confoutput_size: 256、attention_heads: 4、linear_units: 2048、num_blocks: 12、dropout_rate: 0.1、input_layer: conv2d、cnn_module_kernel: 15、activation_type: swish、位置编码rel_pos、注意力rel_selfattn解码器 decoder_confattention_heads: 4、linear_units: 2048、num_blocks: 6模型目标 model_confctc_weight: 0.3CTC 与 attention 的混合权重、lsm_weight: 0.1标签平滑、length_normalized_loss: false训练策略n_epoch: 100、accum_grad: 4梯度累积、global_grad_clip: 5.0、优化器adamlr: 0.002、weight_decay: 1e-6、调度器warmuplrwarmup_steps: 25000、checkpoint.kbest_n: 50/latest_n: 5。3.2 流式版 conf/chunk_conformer.yamlconf/chunk_conformer.yaml 用于训练支持流式推理的分块模型与离线版的关键差异包括数据加载batch_size: 32、raw_wav: True直接读原始 wav、spectrum_type: fbank、target_sample_rate: 8000、dither: 1.0、use_dB_normalization: Truetarget_dB: -20、sortagrad: True、shuffle_method: batch_shuffle、num_workers: 2编码器新增流式相关字段causal: true因果卷积、use_dynamic_chunk: true动态分块训练、cnn_module_norm: layer_norm注释说明使用 LayerNorm 收敛更快、use_dynamic_left_chunk: false训练策略n_epoch: 240、lr: 0.001其余结构编码器 12 层、解码器 6 层、ctc_weight 0.3 等与离线版保持一致。从 paddlespeech/s2t/models/u2/u2.py 的源码看推理时 U2 模型会依据decoding_chunk_size与num_decoding_left_chunks决定是否调用encoder.forward_chunk_by_chunk做逐块前向这正是流式解码的底层机制。3.3 特征预处理与数据增强conf/preprocess.yaml 定义了特征提取与在线增强管线process: - type: fbank_kaldi fs: 8000 # 8k 采样率 n_mels: 80 n_shift: 160 # 10ms win_length: 400 # 25ms dither: 0.1 - type: cmvn_json cmvn_path: data/mean_std.json # SpecAugment 三件套 - type: time_warp max_time_warp: 5 inplace: true mode: PIL - type: freq_mask F: 30 n_mask: 2 inplace: true replace_with_zero: false - type: time_mask T: 40 n_mask: 2 inplace: true replace_with_zero: false注意fs: 8000、n_shift: 160 8000 × 0.01s、win_length: 400 8000 × 0.025s与 8k 采样率严格对应。conf/augmentation.json 则提供了另一套在线增强变速speed0.9~1.1prob 0.0 默认关闭、时间平移shift±5msprob 1.0、SpecAugmentspecaugF: 10、T: 50、各 2 个 mask、replace_with_zero: trueprob 1.0。RESULTS.md 中标注的实验增强组合为spec_aug shift。四、解码配置与四种解码方式4.1 离线解码 conf/tuning/decode.yamlconf/tuning/decode.yaml 的完整参数如下decode_batch_size: 128 error_rate_type: cer decoding_method: attention # attention, ctc_greedy_search, ctc_prefix_beam_search, attention_rescoring beam_size: 10 ctc_weight: 0.5 # ctc weight for attention rescoring decode mode. decoding_chunk_size: -1 # 0: 全序列解码; 0: 固定块大小; 0: 仅训练用禁止 num_decoding_left_chunks: -1 # 左侧历史块数-1 表示不限制 simulate_streaming: False # 是否模拟流式推理4.2 流式模拟解码 conf/tuning/chunk_decode.yamlconf/tuning/chunk_decode.yaml 与离线版参数完全相同唯一的区别是simulate_streaming: true——配合 chunk 模型如decoding_chunk_size: 16即可模拟流式推理的评测。RESULTS.md中 Chunk Conformer 的实验即采用Chunk Size Left Chunks 16, -1。4.3 四种解码方法local/test.sh 会遍历四种解码方式并分别输出结果文件{ckpt_prefix}/{method}.rsl解码方式说明attention纯 attention 解码自回归ctc_greedy_searchCTC 贪心搜索速度最快ctc_prefix_beam_searchCTC prefix beam searchattention_rescoring两遍式先用 CTC beam search 生成候选再用 attention 重打分通常效果最好测试时通过--opts decode.decoding_method ${type} --opts decode.decode_batch_size 1逐项覆盖默认配置。如果需要使用中文语言模型参与 CTC 解码可执行 local/download_lm_ch.sh 下载zh_giga.no_cna_cmn.prune01244.klm脚本中已给出 URL 与 MD5 校验值不过 local/test.sh 中该步骤默认处于注释状态。五、端到端流水线run.sh 的 stage 设计run.sh 采用 PaddleSpeech 通用的 stage 驱动模式配合 utils/parse_options.sh 支持--stage N --stop_stage M形式的命令行覆盖顶部的关键变量gpus0,1,2,3 stage0 stop_stage50 conf_pathconf/conformer.yaml ips # 多机训练时填写节点 IP 列表 decode_conf_pathconf/tuning/decode.yaml avg_num20各 stage 功能如下Stage功能调用脚本0数据准备CMVN、词表、格式化 manifestlocal/data.sh1模型训练多卡local/train.sh2平均 top-k 模型得到最终模型avg.sh best exp/${ckpt}/checkpoints ${avg_num}3测试 avg_n 模型四种解码方式local/test.sh4测试集 CTC 强制对齐local/align.sh51导出 JIT 推理模型local/export.sh例如只做数据准备bash run.sh --stage 0 --stop_stage 0完整跑训练到评测bash run.sh --stage 0 --stop_stage 3。训练stage 1local/train.sh 根据CUDA_VISIBLE_DEVICES中的 GPU 数量自动选择单卡或分布式模式。多卡时使用python3 -m paddle.distributed.launch --gpus... [--ips...] ${BIN_DIR}/train.py其中ips用于多机训练。脚本还支持seed控制非 0 时设置FLAGS_cudnn_deterministicTrue保证可复现但注释提示seed may break model convergence。模型平均stage 2utils/avg.sh 调用avg_model.py支持best按验证损失选 top-k与latest取最近 k 个两种模式输出exp/${ckpt}/checkpoints/avg_${avg_num}.pdparams这也是后续测试、对齐、导出所共用的 checkpoint 前缀。六、CTC 对齐与模型导出CTC 对齐stage 4local/align.sh 调用${BIN_DIR}/alignment.py基于最终模型对测试集做 CTC 强制对齐将对齐结果写入result_file.align并在结果文件所在目录生成.tier与.TextGrid格式的对齐文件——这些输出可直接用于音素级/字级边界分析或后续强制对齐工具链。模型导出stage 51local/export.sh 调用${BIN_DIR}/export.py把训练好的 checkpoint 转换为可部署的 JIT 模型CUDA_VISIBLE_DEVICES ./local/export.sh ${conf_path} \ exp/${ckpt}/checkpoints/${avg_ckpt} \ exp/${ckpt}/checkpoints/${avg_ckpt}.jit导出的.jit模型可进一步配合 PaddleSpeech 的服务端如paddlespeech/server或 runtime 部署方案 使用。七、MandarinK8 实验结果参考RESULTS.md 记录了在MandarinK8中文 8k测试集上的官方复现结果。两个模型参数量均为45.73 M增强方式均为spec_aug shiftConformer离线conf/conformer.yamlLoss 2.1795解码方式CERattention0.102304ctc_greedy_search0.084295ctc_prefix_beam_search0.084340attention_rescoring0.081675Chunk Conformer流式conf/chunk_conformer.yamlChunk16 / Left-1Loss 2.2329解码方式CERattention0.087982ctc_greedy_search0.086962ctc_prefix_beam_search0.086741attention_rescoring0.083495这两组数据可以为你评估自备数据的训练效果提供对照基线离线两遍式解码attention_rescoring在该任务上 CER 最低流式模型在 16 帧分块约束下与离线模型差距约 0.2 个百分点体现了 U2 两遍式架构在低延迟与高精度之间的折中能力。八、从源码看 U2 的流式/非流式统一机制本 recipe 之所以能同时覆盖离线与流式两种形态根源在于 paddlespeech/s2t/models/u2/u2.py 实现的统一模型训练时使用动态分块dynamic chunk策略让编码器适应分块输入推理时根据simulate_streaming与decoding_chunk_size决定是否走forward_chunk_by_chunk逐块计算编码器输出u2.py再配合ctc_prefix_beam_search生成候选、attention_rescoring二次打分形成完整的流式两遍解码。对应地训练与推理的完整实现位于 paddlespeech/s2t/exps/u2/model.pyU2Trainer/U2Tester的train_batch、test、export等命令行入口则在 paddlespeech/s2t/exps/u2/bin/ 下。理解这层调用链有助于你在修改conf/下任一配置后快速定位其生效的代码路径。结语examples/callcenter是一个轻文档、重配置的典型 recipe文档虽短但仓库内的两份 YAML、预处理与增强配置、stage 流水线脚本以及 MandarinK8 基线结果共同构成了一套完整的 8k 电话语音识别落地模板。对于需要处理客服录音、电话会议等低采样率语音场景的开发者直接复用本 recipe 的配置替换为自己的数据并生成对应 manifest即可复现出接近上表基线的离线与流式 ASR 系统。赞分享人工智能语音音频【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSpeech点击查看免费下载相关推荐PaddleSpeech 基于 SpeechXruntime的 U2/U2 流式 ASR C 工业部署实战指南PaddleSpeech 基于 SpeechXruntime的 U2/U2 流式 ASR C 工业部署实战指南 PaddleSpeech 仓库中的人工智能语音音频NLP媒体生成PaddleSpeech 基于 TAL_CSASR 中英混合教学语音数据集训练 U2Conformer/TransformerASR 模型实战指南PaddleSpeech 基于 TAL_CSASR 中英混合教学语音数据集训练 U2Conformer/TransformerASR 模型实战指南 TAL_人工智能语音音频中英混合课堂语音识别TAL_CSASR 数据集解析与 PaddleSpeech U2/Conformer 全流程实战中英混合课堂语音识别TAL_CSASR 数据集解析与 PaddleSpeech U2/Conformer 全流程实战 TAL_CSASR 是 PaddleSp人工智能语音音频NLP媒体生成上一篇ADB在浏览器中的革命ya-webadb项目解析及新手指南下一篇cppimport简化C与Python集成的开源项目创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →