ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

GSLM 文本无监督语言模型 ASR 评测指南:从音频预处理到 PPX/BLEU 指标全流程解析

GSLM 文本无监督语言模型 ASR 评测指南:从音频预处理到 PPX/BLEU 指标全流程解析 GSLM 文本无监督语言模型 ASR 评测指南从音频预处理到 PPX/BLEU 指标全流程解析【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm导读本文聚焦kosmos-2/fairseq/examples/textless_nlp/gslm中ASR-based evaluation基于语音识别的评测完整技术链路当生成式口语语言模型Generative Spoken Language Model, GSLM完成单位序列采样、并经 unit2speech 模块合成为音频后如何通过预处理、wav2vec 2.0 语音识别与后置文本指标量化模型在流利度fluency与多样性diversity上的表现。读完本文你将掌握 16KHz 重采样、按长度对齐、manifest 生成、KenLM 解码器推理以及 PerplexityPPX、Self-/Auto-BLEU、Continuation-BLEU 与 AUC 的完整命令行实操与底层实现原理。GSLM 评测闭环ASR 在哪个环节发挥作用从仓库根目录的 GSLM 总览 可以看出GSLM 系统由三个核心组件串联speech2unit把原始语音量化为离散语音单位ulmUnit Language Model在离散单位序列上训练的生成式语言模型unit2speech把离散单位序列重新合成为语音。ASR-based evaluation 位于整条链路的最末端用于闭环验证整个生成系统的文本级表现。其生命周期共分 5 步训练 ULM 并从中采样见 ulm 说明对采样得到的单位序列运行 UTSunit-to-speech合成见 unit2speech 说明ASR 预处理将生成的音频重采样至 16 KHz并把生成音频长度与真实语音对齐运行 ASR用预训练 wav2vec 模型转写生成语音计算后 ASR 评测指标包括 PPX、Self-/Auto-BLEU、Continuation-BLEU 与 AUC。本文假设前两步已经完成重点讲解第 3~5 步的实操与实现。所有评测脚本均位于 asr_metrics 目录其中ppx.py、self_auto_bleu.py、continuation_eval.py三个指标脚本与misc/下的辅助工具共同构成完整评测套件。第一步预处理——让生成音频与真实语音可比重采样至 16 KHz评测的第一步是把 UTS 输出的音频统一转为 16 KHz 单声道 WAV。仓库提供的批量转换脚本是 convert_to_16k.py其底层通过sox完成转换python $FAIRSEQ_ROOT/examples/textless_nlp/gslm/unit2speech/convert_to_16k.py $UTS_OUTPUT $UTS_OUTPUT_DOWNSAMPLE参数含义$UTS_OUTPUTUTS 生成的音频所在目录$UTS_OUTPUT_DOWNSAMPLE重采样后音频的输出目录可选参数--extension输入音频扩展名默认wav。从源码看转换核心命令为sox -c 1 -b 16 input -t wav output rate 16k见 convert_to_16k.py即强制单声道、16-bit 采样精度并重采样至 16k。脚本会递归遍历输入目录find_all_files保留相对路径结构后逐一转换。按长度对齐cut_as.py这一步是可选的但如果想比较给定相同前缀时生成语音与真实语音的流利度和多样性就需要强制二者长度一致。仓库提供了 misc/cut_as.pypython $FAIRSEQ_ROOT/examples/textless_nlp/asr_metrics/cut_as.py \ --samples_dir$UTS_OUTPUT_DOWNSAMPLE --out_dir$UTS_OUTPUT_DOWNSAMPLE_CUT \ --prompts_descriptiondata/ground_truth_continuation_dev.json参数含义--samples_dir重采样后的音频目录必填--out_dir裁剪后音频的输出目录必填--prompts_description真实语音标注 JSON 文件路径必填。该脚本的实现逻辑cut_as.py值得细读它用torchaudio加载每个 WAV断言采样率必须为 16000然后读取 prompt 描述中该序列的目标时长秒换算成目标帧数target_frames int(l * sr)若音频帧数足够则截取前target_frames帧标记flag1否则保留原音频标记flag0。文件名中的 prompt id 通过split(__)[0]提取并与 JSON 中的键匹配最终输出统计信息Total files: N; sufficiently long: M其中足够长的音频即长度满足目标时长的样本。真实语音标注文件ground_truth_continuation_dev.json是 LibriSpeech dev-clean 的真实文本续写标注含元数据评测默认在 dev-clean 上进行对应 test-clean 的版本为ground_truth_continuation_test.json。这类文件包含的是长度至少 6 秒的音频序列文本是后续所有指标脚本筛选用例的依据。第二步运行 ASR——用 wav2vec 2.0 KenLM 解码转写生成 manifest 文件ASR 系统需要 manifest 来定位待转写的文件列表。仓库提供了 wav2vec/wav2vec_manifest.py并需要下载960h_scratch.pt预训练 checkpointpython $FAIRSEQ_ROOT/examples/wav2vec/wav2vec_manifest.py \ $UTS_OUTPUT_DOWNSAMPLE_CUT --valid-percent 0.0 --dest $MANIFEST_DIR --ext wav参数含义$UTS_OUTPUT_DOWNSAMPLE_CUT预处理后的 UTS 输出目录--valid-percent 0.0不划分验证集全部作为训练集文件manifest 中统一写入train.tsv--dest $MANIFEST_DIRmanifest 输出目录--ext wav限定 WAV 扩展名。除此之外运行 ASR 还需要安装 KenLM 与 Flashlight decoder并下载 KenLM 4-gram 英文语言模型4-gram.bin。生成 dummy 转写由于 GSLM 评测只关心 ASR 输出的转写文本而生成语音没有真实文本标签因此需要伪造 ground-truth 转写来满足评测脚本的格式要求cp $FAIRSEQ_ROOT/examples/textless_nlp/gslm/asr_metrics/misc/dict.ltr.txt $MANIFEST_DIR python $FAIRSEQ_ROOT/examples/textless_nlp/gslm/asr_metrics/misc/dummy_asr_data.py --tsv$MANIFEST_DIR/train.tsv \ --output-dir$MANIFEST_DIR其中dict.ltr.txt是字母级letter-level词典可在 misc/dict.ltr.txt 中查看包含空格符、26 个英文字母及撇号及其在语料中的频次统计这是 CTC 字母解码所需的词典文件。执行 ASR 推理mkdir -p asr python $FAIRSEQ_ROOT/examples/speech_recognition/infer.py \ $MANIFEST_DIR \ --task audio_pretraining --nbest 1 --path 960h_scratch.pt \ --gen-subsettrain --results-path $PATH_TO_ASR_OUTPUT \ --w2l-decoder kenlm --lm-model 4-gram.bin \ --lexicon librispeech/lexicon_ltr.lst --word-score -1 \ --sil-weight 0 --lm-weight 2 --criterion ctc --labels ltr --max-tokens 300000 --remove-bpe letter关键参数说明--task audio_pretraining使用 wav2vec 2.0 预训练任务--path 960h_scratch.pt960 小时数据上训练的 checkpoint--w2l-decoder kenlm使用 KenLM 外部语言模型解码--lm-model 4-gram.bin与--lexicon lexicon_ltr.lst4-gram 语言模型与 LibriSpeech 词表--word-score -1、--sil-weight 0、--lm-weight 2解码器超参分别控制词得分、静音权重与语言模型权重--criterion ctc --labels ltrCTC 准则与字母标签--max-tokens 300000批大小上限--remove-bpe letter去除字母级 BPE 标记--results-pathASR 输出目录最终转写文件为hypo.word-960h_scratch.pt-train.txt。推理入口位于 speech_recognition/infer.py属于仓库自带的开箱即用评测脚本。第三步指标计算——四个维度量化生成语音质量所有指标脚本均遵循同一套样本过滤策略只评测1,000 条最短且长度 ≥ 6 秒的序列。该策略由get_target_sequences函数实现在 ppx.py 与 self_auto_bleu.py 中均有定义读取ground_truth_continuation_*标注断言所有序列时长 ≥ 6.0 秒按时长升序排序取前 1000 个序列 id再从 manifest 的train.tsv中按文件名__前的部分匹配对应行号。因此每个指标脚本都要求传入--manifest与--prompts-description两个路径。PerplexityPPX衡量流利度python ppx.py $PATH_TO_ASR_OUTPUT/hypo.word-960h_scratch.pt-train.txt --cut-tail\ --manifest$MANIFEST_DIR/train.tsv --prompts-descriptiondata/ground_truth_continuation_dev.json参数说明--cut-tail忽略每行最后一个 tokenASR 会把序列 ID 追加在行尾--cut-id可选是否去掉每行第一个 token典型场景是序列 ID--manifest/--prompts-description用于过滤出评测子集。底层实现ppx.py中PPX 通过torch.hub.load(pytorch/fairseq, transformer_lm.wmt19.en, tokenizermoses, bpefastbpe)加载 WMT19 英文 Transformer 语言模型在eval().cuda()模式下关闭 dropout对每行转写调用lm.score(sent)取positional_scores的均值作为句级负对数似然随后逐句计算exp(logprob)得到困惑度。脚本会剔除 NaN 结果并给出警告最终输出logprob与perplexity两套统计各自的Mean ± SEM标准误、Median与90% 置信区间10 分位…90 分位。Self- 与 Auto-BLEU衡量多样性python self_bleu.py $PATH_TO_ASR_OUTPUT/hypo.word-960h_scratch.pt-train.txt --cut-tail \ --manifest$MANIFEST_DIR/train.tsv --prompts-descriptiondata/ground_truth_continuation_dev.json多样性指标的核心思想是如果模型反复生成相似的句子则任意一条生成结果与其余生成结果的重叠度会很高BLEU 值因此偏高。self_bleu.py实际对应脚本 self_auto_bleu.pySelf-BLEU对每条语句以其余所有语句为参考计算 BLEU衡量整体重复度Auto-BLEU对每条语句用其自身的前后片段互为参考计算 BLEUauto_bleu函数self_auto_bleu.py衡量句内自相似性。脚本一次性输出 8 个变体指标覆盖 2-gram 与 3-gram 两种粒度、算术平均与几何平均两种聚合方式Self-BLEU2-arithmetic / Self-BLEU2-geometricAuto-BLEU2-arithmetic / Auto-BLEU2-geometricSelf-BLEU3-arithmetic / Self-BLEU3-geometricAuto-BLEU3-arithmetic / Auto-BLEU3-geometric实现上通过multiprocessing.Pool并行计算最多 16 进程最终以百分数形式输出metric - SEM。需要注意这里的 BLEU 实现来自 misc/bleu_utils.py是从 NLTK 移植并做了两处关键修改源码注释明确说明允许关闭长度/简洁性惩罚对 self-bleu 无意义、允许使用算术平均替代几何平均这两个开关对应no_length_penalty与averaging_mode参数。Continuation-BLEU衡量与真实续写的匹配度python continuation_eval.py --asr-transcript $PATH_TO_ASR_OUTPUT/hypo.word-960h_scratch.pt-train.txt \ --manifest$MANIFEST_DIR/train.tsv --prompts-descriptiondata/ground_truth_continuation_dev.jsonContinuation-BLEUcontinuation_eval.py与前两者不同它把 ASR 转写与真实语音标注中的续写文本对齐比较。实现细节continuation_eval.py从 ASR 转写每行的序列 ID行尾-id形式映射回 manifest 的文件名按--take-shortest默认 1000选出最短的候选序列以真实续写文本original_continuations[k][1]为参考对模型生成的多个候选计算BLEU-2几何平均无长度惩罚输出平均续写长度词数与Median BLEU - SEM。该指标能够直接反映在相同前缀下模型生成的续写与人类真实续写在用词上的吻合程度是流利度与内容忠实度的综合度量。AUC困惑度与多样性的权衡曲线基于上述指标可以进一步估计PPX/多样性权衡曲线的 AUC曲线下面积。GSLM 评测框架的思路是困惑度PPX反映流利度BLEU 系指标反映多样性两者天然存在权衡——通过在不同配置如不同 ULM 规模或采样温度下采样多个模型把每组 (多样性, PPX) 画成权衡曲线并计算 AUC即可用单一标量对比不同模型配置的总体表现。仓库以 Colab notebook 提供 AUC 计算示例。评测脚本的通用设计模式与扩展建议纵观三个指标脚本可以发现 GSLM 评测套件遵循一致的工程模式理解该模式有助于你在自己的数据集上复用统一入口参数均接受--asr-transcript或位置参数、--manifest、--prompts-description统一的样本过滤get_target_sequences(manifest, ground_truth, to_take1000)在各脚本中保持一致保证所有指标基于同一评测子集结果可横向对比行尾 ID 约定ASR 输出每行末尾的-数字是序列 ID因此所有脚本都通过line.split()[-1].split(-)[1][:-1]或--cut-tail处理统计输出格式统一均以 Mean ± SEM、Median 与置信区间或百分数输出便于直接写入论文表格。如需在 LibriSpeech 之外的数据集上评测只需替换ground_truth_continuation_*.json标注文件、更新--prompts-description路径、并保证生成音频文件名中的 prompt id__前缀与标注文件键一致即可其余流程无需改动。小结ASR-based evaluation 为 GSLM 这类无文本监督的口语生成模型提供了唯一的文本侧量化窗口预处理阶段的重采样与长度对齐保证了生成/真实音频的可比性wav2vec 2.0 KenLM 解码把语音转成可计算的文本而 PPX、Self-/Auto-BLEU、Continuation-BLEU 与 AUC 四类指标分别从流利度、多样性、内容忠实度与整体权衡四个维度刻画模型质量。本文给出的全部命令与参数均可直接在 asr_metrics 目录 中对应脚本中验证是复现 GSLM 论文评测结果或开展新实验的起点。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表