fairseq textless NLP 实战:使用 speech2unit 将原始语音量化为离散语音单元(GSLM 完整指南) fairseq textless NLP 实战使用 speech2unit 将原始语音量化为离散语音单元GSLM 完整指南【免费下载链接】fairseqFacebook AI Research Sequence-to-Sequence Toolkit written in Python.项目地址: https://gitcode.com/gh_mirrors/fa/fairseq本指南聚焦 fairseq 仓库中 textless NLP 流水线的核心组件——speech2unitSpeech to Unit Model。它负责将原始语音波形通过声学表征提取 K-Means 聚类量化两步转换为离散的语音单元discrete speech units是无监督生成式口语建模GSLM中语音→单元的关键一环。读完本文你将掌握如何为 Log-Mel 滤波器组、CPC、HuBERT、Wav2Vec 2.0 四种声学表征学习 K-Means 量化模型如何对任意音频 manifest 执行量化以及如何正确解读量化输出文件。背景speech2unit 在 GSLM 流水线中的位置在 examples/textless_nlp/gslm/README.md 中GSLMGenerative Spoken Language Modeling系统被描述为由三个组件构成的语音到语音speech2speech流水线speech2unit将原始语音量化为学习到的离散语音单元本文主题ulm在离散语音单元上训练生成式语言模型unit2speech从离散语音单元合成回语音。该流水线支持四种声学表征Log Mel Filterbank、Modified CPC、HuBERT Base 与 Wav2Vec 2.0 Large。speech2unit 的核心思想非常朴素且强大先用预训练模型或手工特征把每帧语音变成稠密向量再用 K-Means 把这些向量离散化为 K 个簇标号即单元从而把连续的语音信号压缩为一段可建模、可生成、可合成的符号序列。核心原理从连续声学表征到离散语音单元speech2unit 的整体流程分为两个阶段声学表征提取Acoustic Model对每个音频文件按帧提取声学向量序列量化Quantization Model用 K-Means 模型对每个向量预测最近的簇中心编号输出该音频对应的单元序列。该流程的工程实现集中在 examples/textless_nlp/gslm/speech2unit/ 目录下结构清晰clustering/cluster_kmeans.py学习 K-Means 聚类模型clustering/quantize_with_kmeans.py用学习到的 K-Means 模型量化音频clustering/dump_feats.py预提取并保存声学特征pretrained/utils.py特征提取的统一入口get_features/get_and_dump_features/get_feature_readerpretrained/logmel_feature_reader.py、cpc_feature_reader.py、hubert_feature_reader.py、w2v2_feature_reader.py四种声学表征的读取器。声学模型Acoustic Model四种特征提取方案Log-Mel Filterbank无需预训练模型logmel_feature_reader.py 使用soundfile读取音频、torchaudio.compliance.kaldi计算 filterbank 特征。从源码看其默认参数为num_mel_bins 8080 维 Mel 滤波器组frame_length 25.0帧长 25ms。它不需要任何预训练检查点是最轻量的基线方案。Modified CPC、HuBERT、Wav2Vec 2.0需预训练检查点若使用预训练模型需要先下载对应检查点官方托管于dl.fbaipublicfiles.com的 fairseq 模型仓库CPC 检查点为cpc_big_ll6kh_top_ctc.ptHuBERT-Base 为hubert_base_ls960.ptWav2Vec 2.0-Base 为wav2vec_vox_new.pt。从源码实现可以看到各读取器的关键行为HuBERTFeatureReader通过fairseq.checkpoint_utils.load_model_ensemble_and_task加载模型与任务配置按max_chunk1600000样本对长音频分块调用model.extract_features(..., output_layerlayer)并按task.cfg.normalize决定是否做 layer norm读取音频时校验采样率必须等于task.cfg.sample_rate。Wav2VecFeatureReader通过load_checkpoint_to_cpusetup_tasktask.build_model重建模型以前向调用model(source..., maskFalse, features_onlyTrue, layerself.layer)并取layer_results[layer]作为表征。CpcFeatureReader内置了完整的 CPC 模型定义CPCEncoderCPCARLSTM卷积编码器总下采样率为 160支持use_encoder_layer取编码器而非自回归层输出与norm_output输出归一化选项长音频同样分块max_chunk64000提取。层layer参数的选择预训练 Transformer 类模型HuBERT、Wav2Vec 2.0的不同层捕获不同层级的语音信息。因此无论是学习 K-Means 还是量化都需要通过--layer指定提取哪一层的表征默认值为-1在 cluster_kmeans.py 与 quantize_with_kmeans.py 中定义。对于 Log-Mel 特征该参数无实际意义可忽略。预训练量化模型直接可用的 K-Means 检查点为了省去自行训练 K-Means 的步骤仓库提供了与各声学表征组合的预训练 K-Means 模型下载表原文档核心内容模型文件均为km.bin| K-Means 模型 | 下载链接 | |-|-| | Log Mel Filterbank KM50 | download | | Log Mel Filterbank KM100 | download | | Log Mel Filterbank KM200 | download | | Modified CPC KM50 | download | | Modified CPC KM100 | download | | Modified CPC KM200 | download | | HuBERT Base KM50 | download | | HuBERT Base KM100 | download | | HuBERT Base KM200 | download | | wav2vec 2.0 Large KM50 | download | | wav2vec 2.0 Large KM100 | download | | wav2vec 2.0 Large KM200 | download |其中 KM50 / KM100 / KM200 表示 K-Means 的簇数量分别为 50、100、200即量化后单元词表vocabulary的大小。簇数越多单元粒度越细语言模型建模的复杂度也越高。实战一学习 K-Means 聚类模型当预训练量化模型不满足需求例如自定义声学表征、不同层、更大词表时可以自行训练 K-Means。命令如下来自原文档环境变量含义已标注N_CLUSTERSnumber_of_clusters_used_for_kmeans TYPEone_of_logmel/cpc/hubert/w2v2 CKPT_PATHpath_of_pretrained_acoustic_model LAYERlayer_of_acoustic_model_to_extract_features_from MANIFESTtab_separated_manifest_of_audio_files_for_training_kmeans KM_MODEL_PATHoutput_path_of_the_kmeans_model PYTHONPATH. python examples/textless_nlp/gslm/speech2unit/clustering/cluster_kmeans.py \ --num_clusters $N_CLUSTERS \ --feature_type $TYPE \ --checkpoint_path $CKPT_PATH \ --layer $LAYER \ --manifest_path $MANIFEST \ --out_kmeans_model_path $KM_MODEL_PATH其中PYTHONPATH.确保从仓库根目录运行时可解析examples.textless_nlp.*模块--feature_type的可选值为logmel / cpc / hubert / w2v2在 cluster_kmeans.py 的参数定义中明确。当使用logmel时无需--checkpoint_path。cluster_kmeans.py 的完整参数说明结合 cluster_kmeans.py 的源码该脚本还提供以下参数供调优与复现实验使用| 参数 | 默认值 | 说明 | |-|-|-| |--num_clusters| 50 | K-Means 簇数量即单元词表大小 | |--feature_type| 无必选其一 | 声学特征类型logmel/hubert/w2v2/cpc| |--checkpoint_path| 无 | 预训练声学模型检查点路径 | |--layer| -1 | 提取表征的模型层号 | |--manifest_path| 无 | 用于训练 K-Means 的音频 manifest | |--sample_pct| 0.1 | 用于训练 K-Means 的数据百分比默认只用 10% 音频可显著加速 | |--in_features_path| None | 直接加载已提取的.npy特征文件跳过特征提取 | |--out_features_path| None | 同时把提取的特征保存为.npy文件 | |--out_kmeans_model_path| 必填 | K-Means 模型输出路径 | |--init| k-means | MiniBatchKMeans 初始化方式 | |--max_iter| 150 | K-Means 最大迭代次数 | |--batch_size| 10000 | MiniBatchKMeans 小批量大小 | |--tol| 0.0 | 收敛容忍度 | |--max_no_improvement| 100 | 无改进即停止的迭代数 | |--n_init| 20 | 随机初始化重试次数 | |--reassignment_ratio| 0.5 | 簇重分配比例 | |--seed| 1369 | 随机种子保证可复现 |底层实现要点脚本使用sklearn.cluster.MiniBatchKMeans训练get_kmeans_model适用于大规模语音特征。训练前get_features 会根据 manifest 逐文件提取特征并展平为一个大矩阵flattenTrue训练完成后通过joblib.dump保存模型并打印特征矩阵形状与平均惯性inertia供质量参考。值得注意的是特征提取使用生成器逐文件流式处理并显式清理 GPU 缓存gc.collect()torch.cuda.empty_cache()以控制长音频数据的内存占用。实战二使用学习到的 K-Means 模型量化语音训练或下载好 K-Means 模型后即可对任意音频集合执行量化MANIFESTtab_separated_manifest_of_audio_files_to_quantize OUT_QUANTIZED_FILEoutput_quantized_audio_file_path python examples/textless_nlp/gslm/speech2unit/clustering/quantize_with_kmeans.py \ --feature_type $TYPE \ --kmeans_model_path $KM_MODEL_PATH \ --acoustic_model_path $CKPT_PATH \ --layer $LAYER \ --manifest_path $MANIFEST \ --out_quantized_file_path $OUT_QUANTIZED_FILE \ --extension .flacquantize_with_kmeans.py 的完整参数说明依据 quantize_with_kmeans.py 的源码除上例中出现的参数外还支持| 参数 | 默认值 | 说明 | |-|-|-| |--feature_type| 必填 |logmel/hubert/w2v2/cpc须与训练 K-Means 时一致 | |--acoustic_model_path| 无 | 预训练声学模型路径若提供--features_path可省略 | |--layer| -1 | 提取表征的层号须与训练 K-Means 时一致 | |--kmeans_model_path| 必填 | K-Means 模型文件路径 | |--features_path| None | 直接加载已 dump 的.npy特征文件此时无需声学模型与 manifest 的音频文件 | |--manifest_path| 无 | 待量化音频的 manifest | |--out_quantized_file_path| 必填 | 量化结果输出路径 | |--extension|.flac| 音频文件扩展名用于从输出文件名中剥离扩展名 | |--channel_id| None | 立体声文件时选择声道1或2输出文件名会附加-channel1/-channel2| |--hide-fname| False | 隐藏输出中的文件名前缀每行只输出单元序列 |量化与输出的底层行为见 main 函数若指定--features_path直接从.npy加载特征否则用get_features(..., flattenFalse)逐条提取joblib.load加载 K-Means 模型并关闭 verbose对每条话语的特征逐帧调用kmeans_model.predict(feats)得到单元索引序列输出格式为每行文件名|空格分隔的单元索引序列例如audio1|12 34 56 78 ...加--hide-fname后仅输出单元序列。重要一致性要求量化时使用的--feature_type、--layer、--acoustic_model_path必须与训练 K-Means 时完全一致否则特征分布不匹配会导致量化结果失真。同理若下载使用预训练量化模型也需严格匹配表中对应的声学表征类型。Manifest 文件格式两列制表符分隔清单manifest 是贯穿训练与量化两个步骤的输入规范原文档明确说明格式如下path_of_root_directory_containing_audio_files relative_path_of_audio_file_1\tnumber_of_frames_1 relative_path_of_audio_file_2\tnumber_of_frames_1 ...即第一行是音频文件所在根目录的绝对路径后续每一行由相对路径 Tab 帧数两列组成。解析逻辑在 clustering/utils.py 的get_audio_files中读取第一行作为 root逐行校验必须是两列并以 Tab 分隔返回(root_dir, fnames, sizes)。实际文件路径由root与相对路径拼接得到见 pretrained/utils.py。同时当sample_pct 1.0时会从该列表中随机抽样指定比例的文件用于 K-Means 训练。帧数sizes在 GSLM 相关工具中用于对齐与长度统计通常可由sox/ffprobe等工具按 10ms 帧移换算得到。进阶技巧特征预提取与复用对于大规模语料反复用预训练模型提取特征代价高昂。仓库提供了两个缓存途径训练阶段在 cluster_kmeans.py 中传入--in_features_path可跳过特征提取、直接训练传入--out_features_path可在提取的同时把特征保存为.npy内部调用 get_and_dump_features还会把 manifest 复制到特征文件同目录。单独预提取使用 dump_feats.py支持同样的--feature_type、--manifest_path、--checkpoint_path、--layer、--sample_pct、--out_features_path参数一次性把特征保存为.npy。量化阶段在 quantize_with_kmeans.py 中传入--features_path直接加载.npy此时无需再提供声学模型路径与音频 manifest可显著降低推理开销。这一设计让提特征 → 训练 K-Means → 量化三个阶段可以解耦执行方便在实验中反复调整簇数而无需重新提取特征。环境与依赖说明speech2unit 依赖 fairseq 的检查点加载接口fairseq.checkpoint_utils、fairseq.tasks因此需从仓库根目录以PYTHONPATH.方式运行。代码依赖包括torch、numpy、scikit-learnMiniBatchKMeans、joblib模型序列化、soundfile、tqdmHuBERT/Wav2Vec 读取器还依赖torchaudioLog-Mel 用torchaudio.compliance.kaldi.fbank。所有脚本均在 CPU/GPU 上通用存在 CUDA 时自动迁移模型见各 reader 的use_cudaTrue默认值。以上依赖可从各脚本顶部的 import 语句逐一核实。总结从语音到单元的完整闭环speech2unit 提供了 textless NLP 研究中语音离散化的完整解决方案选择声学表征Log-Mel零成本基线或 CPC / HuBERT / Wav2Vec 2.0需下载官方预训练检查点获得量化模型直接下载官方 KM50/KM100/KM200 检查点或使用cluster_kmeans.py基于自定义 manifest 训练量化任意语音使用quantize_with_kmeans.py输出文件名|单元序列的离散单元文件衔接下游任务量化结果可直接作为 GSLM 中 ulm单元语言模型的训练数据进而由 unit2speech 合成语音。源码级的关键路径可沿 speech2unit/README.md → clustering/cluster_kmeans.py → clustering/quantize_with_kmeans.py → pretrained/utils.py 逐层深入结合 examples/textless_nlp/gslm/README.md 理解其在无监督口语建模流水线中的完整角色。【免费下载链接】fairseqFacebook AI Research Sequence-to-Sequence Toolkit written in Python.项目地址: https://gitcode.com/gh_mirrors/fa/fairseq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考