ARTICLE DETAIL

建站实战干货

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

GSLM 评估指标全解析:unilm/kosmos-2 中文本无关语音语言建模的 ASR、ABX 与零样本指标体系

2026/9/14 2:07:53 拓冰建站 浏览量
GSLM 评估指标全解析:unilm/kosmos-2 中文本无关语音语言建模的 ASR、ABX 与零样本指标体系 GSLM 评估指标全解析unilm/kosmos-2 中文本无关语音语言建模的 ASR、ABX 与零样本指标体系【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm本文以 GSLM 指标模块 为主线系统讲解生成式语音语言建模Generative Spoken Language Modeling, GSLM中用于评测语音到语音系统的三类指标基于 ASR 转写的文本指标、基于音素判别性的 ABX 指标以及 ZeroSpeech 挑战中的 sWUGGY/sBLIMP 零样本指标。读者将掌握从语音单元采样、单元到语音合成UTS到指标计算的完整评测流水线理解每个指标的脚本入口、命令行参数与底层实现原理可直接复用于 LibriSpeech 上的自监督语音模型对比实验。一、GSLM 与它的三类评测指标在 kosmos-2 仓库 中GSLM 系统由三个组件构成speech2unit将原始语音量化为离散语音单元、ulm在离散单元上训练的生成式语言模型与unit2speechUTS从离散单元合成语音。评测位于流水线末端metrics 目录 汇总了论文中使用的全部指标分为三大类指标族评测对象核心思路ASR Metrics完整 ULMUTS 生成的语音用 ASR 模型将合成语音转写为文本再施加文本类指标同时直接使用 ASR 转写的词错误率WER作为指标之一ABX Metricsspeech2unit 产出的离散表示评测量化表示中音素类别的可分性ABX 判别性sWUGGY / sBLIMP词法/句法层面的单元序列采用 ZeroSpeech 2021 挑战 Track S 的评分方案衡量单元序列对单词与语法结构的编码能力其中 sWUGGY 与 sBLIMP 的细节直接参考 ZeroSpeech 挑战的评分指标说明ASR 与 ABX 两族指标在本模块内有完整脚本与操作指南是本文讲解的重点。二、基于 ASR 的端到端评估流程asr_metrics 说明 给出了 ULM 评估的完整生命周期训练 ULM 并从中采样ulm 模块对采样得到的单元序列运行 UTS 合成语音unit2speech 模块ASR 预处理将生成音频降采样到 16 KHz并将生成音频长度与 ground-truth 话语对齐运行 ASR 转写计算转写结果上的评估指标。文档假设前两步已完成以下聚焦第 35 步。2.1 预处理一降采样到 16 KHz批量转换可直接运行python $FAIRSEQ_ROOT/examples/textless_nlp/gslm/unit2speech/convert_to_16k.py $UTS_OUTPUT $UTS_OUTPUT_DOWNSAMPLE其中$UTS_OUTPUT是生成音频所在目录$UTS_OUTPUT_DOWNSAMPLE为降采样后音频的保存目录。2.2 预处理二按长度对齐可选但推荐如果要比较给定相同前缀条件下生成语音与 ground-truth 语音的流畅度和多样性最好强制两者长度一致。脚本为 cut_as.py位于misc子目录python $FAIRSEQ_ROOT/examples/textless_nlp/gslm/metrics/asr_metrics/misc/cut_as.py \ --samples_dir$UTS_OUTPUT_DOWNSAMPLE --out_dir$UTS_OUTPUT_DOWNSAMPLE_CUT \ --prompts_descriptiondata/ground_truth_continuation_dev.json其中ground_truth_continuation_dev.json是携带元数据的 LibriSpeech dev-clean ground-truth 文本若在 dev-clean 上评测由项目在公开文件服务器发布另有对应的 test-clean 版本。这类文件包含至少 6 秒长音频序列的文本是后续指标过滤与续写对比的依据——从 continuation_eval.py 源码可以看到脚本会assert all(float(v) 6.0 ...)校验这一前提。2.3 准备 manifest 与 dummy 转写ASR 使用预训练的 wav2vec 模型首先需要通过 wav2vec_manifest.py 生成 manifest 文件粗略地告知 ASR 系统需要转写哪些文件并下载960h_scratch.pt检查点python $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 输出目录$MANIFEST_DIR为输出目录。运行 ASR 还需安装 KenLM、Flashlight decoder并下载 KenLM 4-gram 英文语言模型。由于官方评估脚本需要 ground-truth 转写才能计算质量指标而 ULM 生成内容没有 ground-truth因此只需生成 dummy 转写占位cp $FAIRSEQ_ROOT/examples/textless_nlp/gslm/metrics/asr_metrics/misc/dict.ltr.txt $MANIFEST_DIR python $FAIRSEQ_ROOT/examples/textless_nlp/gslm/metrics/asr_metrics/misc/dummy_asr_data.py \ --tsv$MANIFEST_DIR/train.tsv --output-dir$MANIFEST_DIR2.4 运行 ASRmkdir -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各参数作用如下参数取值示例说明--taskaudio_pretraining使用 wav2vec 预训练任务范式加载音频--nbest1每句输出 1 条候选--path960h_scratch.pt预训练 wav2vec 检查点--gen-subsettrain使用 manifest 的 train 子集--results-path$PATH_TO_ASR_OUTPUT转写结果输出目录--w2l-decoderkenlm使用 KenLM 语言模型解码器--lm-model4-gram.binKenLM 4-gram 英文语言模型--lexiconlibrispeech/lexicon_ltr.lstLibriSpeech 词表由项目发布--word-score-1词级分数权重--sil-weight0静音权重--lm-weight2语言模型权重--criterionctcCTC 训练准则--labelsltr字母级标签--max-tokens300000每批最大 token 数--remove-bpeletter合并字母级 BPE 输出为词转写结果形如hypo.word-960h_scratch.pt-train.txt将作为后续所有文本指标的输入。2.5 文本类评估指标所有指标脚本均运行在1_000 条最短且时长 ≥ 6 秒的序列上为从 ASR 转写中过滤出这些序列每个脚本都需要 manifest 与ground_truth_continuation_*文件路径。过滤逻辑在 ppx.py 与 self_auto_bleu.py 中共用先按序列时长排序取最短的 1000 个再在 manifest 中按文件名__前的 ID匹配行号。困惑度PPXpython $FAIRSEQ_ROOT/examples/textless_nlp/gslm/metrics/asr_metrics/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。从源码看ppx.py 通过torch.hub.load(pytorch/fairseq, transformer_lm.wmt19.en)加载 WMT19 英文 Transformer 语言模型计算每句的 positional logprob 均值输出 logprob 与 perplexity 的均值±标准误SEM、中位数及 10%–90% 置信区间并会丢弃 NaN 样本并告警。PPX 反映生成语音转写文本的流畅性。Self- 与 Auto-BLEU多样性python $FAIRSEQ_ROOT/examples/textless_nlp/gslm/metrics/asr_metrics/self_auto_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注意 README 中写的是self_bleu.py仓库内实际脚本名为 self_auto_bleu.py。脚本用多进程并行计算 8 个变体并输出均值和 SEMSelf-BLEU对每条话语以其余全部话语为参考计算 BLEUget_self_bleu衡量语料级多样性Auto-BLEU对每条话语内部用句中其余 n-gram 作为参考计算 n-gram 覆盖率auto_bleu衡量句内重复度每种均提供 BLEU-2unigrambigram权重(0.5, 0.5)与 BLEU-3权重(1/3, 1/3, 1/3)以及 arithmetic / geometric 两种聚合模式见 tasks 定义。Self-BLEU 越低说明语料越多样Auto-BLEU 越低说明句内重复越少。Continuation-BLEU续写相似度python $FAIRSEQ_ROOT/examples/textless_nlp/gslm/metrics/asr_metrics/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_eval.py 将 ASR 转写按序列名聚合为续写集合与ground_truth_continuation_*.json中的 ground-truth 续写文本比较使用权重(0.5, 0.5)的 BLEU-2、geometric 聚合、无长度惩罚no_length_penaltyTrue输出续写平均词数与中位 BLEU±SEM。该指标衡量生成语音与人类真实续写的语义/词汇吻合度。AUC流畅性—多样性权衡曲线基于上述指标PPX 与 Self/Auto-BLEU可以估计困惑度/多样性权衡曲线的 AUCArea Under Curve用于跨模型、跨超参的排序比较。项目在 Colab notebook 中提供了 AUC 计算的可视化示例。三、基于 ABX 的离散单元质量评估ABX 用于评测 speech2unit 获得的离散单元质量音素类别可分性。abx_metrics 说明 给出生命周期训练或复用声学模型学习 K-means 聚类模型完成语音量化用学到的聚类计算 ABX 所需的离散特征借助 libri-light 的 ABX 评估脚本计算 ABX 得分。文档假设前两步已完成重点在特征抽取与 ABX 计算。3.1 前置libri-light 环境需要按 libri-light 官方指引完成安装与 ABX 评估数据准备包括下载 ABX 计算所需的 item 数据。3.2 导出量化特征TYPEhubert LAYER6 CKPT_PATHPATH_TO_HUBERT_MODEL_CHECKPOINT_FILE KM_MODEL_PATHPATH_TO_PRETRAINED_KM_MODEL_FILE SUBSETdev-clean MANIFESTPATH_TO_MANIFEST_FOR_LS_DEV-CLEAN DATA_DIRPATH_TO_DIR_TO_STORE_FEATURES/$SUBSET PYTHONPATH. python examples/textless_nlp/gslm/metrics/abx_metrics/dump_abx_feats.py \ --feature_type $TYPE \ --kmeans_model_path $KM_MODEL_PATH \ --checkpoint_path $CKPT_PATH \ --layer $LAYER \ --manifest_path $MANIFEST \ --out_dir_path $DATA_DIR \ --extension .flacdump_abx_feats.py 的参数说明参数说明--feature_type声学特征类型可选logmel/hubert/w2v2/cpc必填--kmeans_model_path推理用的 K-means 模型文件joblib格式--checkpoint_path预训练模型检查点--layer抽取特征的预训练模型层号默认-1--manifest_path含根目录与文件名的 manifest 文件--out_dir_path量化输出目录必填--extension音频扩展名默认.flac源码逻辑main先通过 speech2unit 模块的 get_features 抽取指定层声学特征再用 get_audio_files 读取 manifest 文件列表对每条话语执行kmeans_model.predict(feats)最后通过one_hot(pred, n_clusters)实现见 L69-L70将聚类索引转为 one-hot 向量并以.npy格式保存到$DATA_DIR。也就是说ABX 的输入特征是量化后的 one-hot 离散表示而非连续特征这正是 ABX 用于检验离散单元质量的用意。3.3 用 libri-light 计算 ABXLIBRILIGHT_ROOTPATH_TO_LIBRILIGHT SUBSETdev-clean DATA_DIRPATH_TO_DIR_TO_STORE_FEATURES/$SUBSET ITEM_FILE_PATH$LIBRILIGHT_ROOT/eval/ABX_data/$SUBSET.item OUT_DIRPATH_TO_DIR_TO_STORE_ABX_SCORES/$SUBSET FILE_EXTENSION.npy FEATURE_SIZE0.02 # depends on the model used PYTHONPATH$LIBRILIGHT_ROOT \ python $LIBRILIGHT_ROOT/eval/eval_ABX.py \ $DATA_DIR \ $ITEM_FILE_PATH \ --file_extension $FILE_EXTENSION \ --feature_size $FEATURE_SIZE \ --out $OUT_DIR \ --mode allFEATURE_SIZE特征帧间隔秒取决于抽取声学特征所用的模型声学模型FEATURE_SIZEHuBERT、Wav2Vec 2.00.02CPC、Log Mel0.01若 GPU 可用可追加--cuda标志加速计算。ABX 得分越低表示不同音素类别在离散表示空间中可分性越强、单元质量越高。四、源码级细节与工程注意点4.1 BLEU 工具的定制改造所有 BLEU 类指标Self/Auto/Continuation-BLEU都复用了 misc/bleu_utils.py 中的sentence_bleu/corpus_bleu。该文件是从 NLTK 的bleu_score拷贝改造而来有两点关键差异见文件头部注释与 L107-L114允许关闭长度惩罚no_length_penaltyTrue——对 Self-BLEU 而言长度惩罚没有意义允许用 arithmetic 均值替代 geometric 均值聚合各 n-gram 精度。因此评测脚本调用时通常会组合weights(0.5, 0.5)、no_length_penaltyTrue、averaging_modegeometric或arithmetic从而得到与标准 BLEU 不同的无惩罚变体。4.2 目标序列过滤为什么是最短 1000 条get_target_sequences 以ground_truth_continuation_*为唯一事实来源每条目形如(序列ID, [时长秒数, 真实续写文本])断言时长全部 ≥ 6 秒然后按时长升序取前to_take1000个 ID随后在 manifest 每行的文件名中去掉__后缀与 ID 匹配得到待评测行号集合。这保证了不同系统之间的指标可比性——大家评测的是同一批最短、最稳定的长语音样本。4.3 路径与脚本名勘误原 asr_metrics README 中存在两处笔误按仓库实际目录应为cut_as.py实际位于examples/textless_nlp/gslm/metrics/asr_metrics/misc/cut_as.pyREADME 中写作examples/textless_nlp/asr_metrics/cut_as.pySelf-/Auto-BLEU 脚本名为self_auto_bleu.pyREADME 中写作self_bleu.py。4.4 运行前提与环境依赖ASR 指标依赖预训练 wav2vec 检查点960h_scratch.pt、KenLM 与 Flashlight decoder、KenLM 4-gram 语言模型、LibriSpeech lexicon以及项目发布的ground_truth_continuation_dev/test.json与lexicon_ltr.lst数据文件PPX 计算会在线加载fairseq的 WMT19 英文 LM需要可访问模型 hubABX 指标依赖 libri-light 环境及其 ABX 数据manifest 文件格式与仓库其余模块一致首行根目录随后每行相对路径 样本数可从 get_target_sequences 的读取逻辑看出。五、总结如何选择与组合这些指标三类指标分别回答不同层面的问题ASR 文本指标PPX、Self/Auto-BLEU、Continuation-BLEU、WER衡量语音到语音系统最终输出的流畅性与多样性并通过 AUC 综合排序ABX直达 speech2unit 的离散单元表示检验音素类别是否被清晰区分sWUGGY / sBLIMP则从词法与句法维度审视单元序列的语言学编码能力。实践中可按需组合训练 speech2unit 后用 ABX 快速验证单元质量训练 ULM 并合成后用 ASR 指标评估整体生成效果再用 AUC 对比不同配置的流畅性—多样性权衡。所有脚本均位于 kosmos-2/fairseq/examples/textless_nlp/gslm/metrics可直接在 LibriSpeech 上复现论文中的评测流程。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考