ARTICLE DETAIL

资讯详情

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

dGSLM 单元到语音解码器:基于 HuBERT Fisher 单元的 HiFi-GAN 声码器实战指南(fairseq)

dGSLM 单元到语音解码器:基于 HuBERT Fisher 单元的 HiFi-GAN 声码器实战指南(fairseq) dGSLM 单元到语音解码器基于 HuBERT Fisher 单元的 HiFi-GAN 声码器实战指南fairseq【免费下载链接】fairseqFacebook AI Research Sequence-to-Sequence Toolkit written in Python.项目地址: https://gitcode.com/gh_mirrors/fa/fairseqdGSLMGenerative Spoken Dialogue Language Modeling以无文本方式直接建模双声道对话语音其完整链路由三个组件构成Fisher HuBERT 编码器语音→离散单元、SpeechDLM 双塔 Transformer 语言模型单元→单元以及单元到语音的 HiFi-GAN 声码器解码器。本文聚焦 fairseq 仓库中examples/textless_nlp/dgslm/vocoder_hifigan/这一解码器模块讲解如何获取预训练声码器检查点、通过命令行脚本批量将离散单元序列还原为 16 kHz 波形以及如何用HifiganVocoder类在 Python 中交互式合成语音并深入其底层CodeHiFiGANVocoder/CodeGenerator实现原理帮助你完整跑通 dGSLM 的单元→音频落地方案。模块定位dGSLM 语音合成链路的最后一级dGSLM 的整体流程见 examples/textless_nlp/dgslm/README.md可概括为Speech-to-Unit 编码器基于 Fisher 语料训练 3 轮的 HuBERT 模型配合 500 类的 k-means 量化器把双声道原始音频转为离散单元序列见 hubert_fisher 说明SpeechDLM 语言模型双塔 Transformer 架构通过交叉注意力同时建模两个声道的单元能够生成包含笑声、语气词等副语言信号的自然对话Unit-to-Speech 解码器本文主题一个基于离散单元的 HiFi-GAN 声码器在 Fisher 数据集上训练负责把模型生成或编码器提取的离散单元序列重新合成为可听的波形。本模块的核心产出物是vocoder_hifigan/目录下的预训练声码器及其配套脚本generate_stereo_waveform.py命令行批量解码脚本dgslm_utils.pyHifiganVocoder交互式解码类与HubertTokenizer编码类同文件create_code_file.py将两个声道的单元文件合并为统一输入格式的辅助脚本。预训练模型检查点官方为 Fisher 语料上的 HuBERT 离散单元训练了对应的 HiFi-GAN 声码器检查点可从文档提供的地址获取包含两个文件HiFi-GAN vocoder based on HuBERT Fisher Unitsmodel checkpointhifigan_vocoder配置config.jsonhifigan_vocoder即声码器权重文件内部以state_dict[generator]的形式存放生成器Generator的状态字典config.json为模型架构配置如num_embeddings、embedding_dim、multispkr等加载时通过json.load解析并传入CodeHiFiGANVocoder。从源码可以确认加载流程vocoder.pyCodeHiFiGANVocoder构造时先用配置构建CodeHiFiGANModel再torch.load(checkpoint_path)读取权重并load_state_dict(state_dict[generator])随后调用remove_weight_norm()去除权重归一化以进入推理状态。因此使用前请确认权重文件与配置是配套的一对。输入数据格式两声道单元序列的 JSON 行无论使用命令行脚本还是HifiganVocoder类输入的核心数据都是每行一个字典的文本文件形如{audio: file_1, unitA: 8 8 ... 352 352, unitB: 217 8 ... 8 8} {audio: file_2, unitA: 5 5 ... 65 65, unitB: 6 35 ... 8 9} ...其中audio源音频文件名仅用于命名输出文件unitA/unitB两个声道各自的离散单元序列以空格分隔的整数 ID 字符串。该文件的加载实现见 generate_stereo_waveform.py逐行ast.literal_eval解析为 Python 字典因此每一行必须是合法的 Python 字面量字典。如果你的数据是两个独立声道的单元文件形如file1|7 376 376 ...可以先用 create_code_file.py 合并为上述格式python examples/textless_nlp/dgslm/create_code_file.py \ $CHANNEL1_UNITS $CHANNEL2_UNITS $OUTPUT_CODE_FILE该脚本逐行读取两个文件按|分隔出文件名与单元串断言两声道的单元数量一致assert len(units1.split()) len(units2.split())并要求两个文件名去掉-channel1/-channel2后缀后一致最后写出{audio: base_fname, unitA: ..., unitB: ...}的字典行。--channels参数默认unitA,unitB用于自定义字典键名。命令行批量解码generate_stereo_waveform.py将离散单元还原为波形的最直接方式是使用官方脚本python examples/textless_nlp/dgslm/vocoder_hifigan/generate_stereo_waveform.py \ --in-file $INPUT_CODE_FILE \ --vocoder $VOCODER_PATH \ --vocoder-cfg $VOCODER_CONFIG \ --results-path $OUTPUT_DIR其中$INPUT_CODE_FILE即上文所述 JSON 行格式的单元文件$VOCODER_PATH指向hifigan_vocoder权重$VOCODER_CONFIG指向配套的config.json$OUTPUT_DIR为输出目录。脚本支持的完整参数源码见 generate_stereo_waveform.py如下参数默认值说明--in-file必填输入单元文件格式同create_code_file.py的输出--vocoder必填声码器权重路径--vocoder-cfg必填声码器配置config.json路径--channelsunitA,unitB逗号分隔的声道名列表按顺序对应两个声道--sample-rate16000输出音频采样率--results-pathNone输出目录若未设置音频按输入audio字段指定路径保存--channel1-spk0第一声道扬声器 ID--channel2-spk4第二声道扬声器 ID--mixFalse将两个声道混合输出为单声道取两声道均值--cpuFalse强制在 CPU 上运行几个关键行为说明双声道处理脚本按channels列表与[channel1_spk, channel2_spk]逐对处理每个样本的两个声道各自通过声码器得到单声道波形后torch.stack(wavs, dim-1)拼成立体声若加--mix则改为对两个声道求均值输出单声道GPU 优先默认use_cuda torch.cuda.is_available() and not args.cpu无 GPU 时需加--cpu否则脚本会在尝试.cuda()时报错输出命名当存在--results-path时输出文件名为{audio 字段去掉扩展名}.wav若输入行缺少audio字段则退化为{样本序号}_pred.wav由dump_result使用soundfile.write按--sample-rate写出generate_stereo_waveform.py。Python 交互式解码HifiganVocoder 类若希望在自定义脚本或 Notebook 中集成解码可以直接使用dgslm_utils.py中的HifiganVocoder类dgslm_utils.py# Load the Hifigan vocoder from examples.textless_nlp.dgslm.dgslm_utils import HifiganVocoder decoder HifiganVocoder( vocoder_path /path/to/hifigan_vocoder, vocoder_cfg_path /path/to/config.json, ) # Decode the units to waveform codes [ 7 376 376 133 178 486 486 486 486 486 486 486 486 2 486, 7 499 415 177 7 7 7 7 7 7 136 136 289 289 408, ] wav decoder.codes2wav(codes) # array of shape (2, 4800) # Play the waveform import IPython.display as ipd ipd.Audio(wav, rate16_000)该类的核心方法code2wav(code, speaker_id0, pred_durFalse)解码单声道的单元串。code既可以是7 376 ...这样的字符串内部自动split()并转 int也可以是整数列表随后构造成{code: LongTensor(1, -1)}输入若模型配置multispkrTrue还会附加spkr张量最终返回numpy数组dgslm_utils.pycodes2wav(codes, speaker_ids[0, 4], pred_durFalse)同时解码两个声道并np.stack成立体声默认扬声器 ID 为[0, 4]——这也解释了上述命令行脚本中--channel1-spk、--channel2-spk默认值0与4的由来若传入字典如{unitA: ..., unitB: ...}会先取values()转为列表再按序解码dgslm_utils.py输出采样率为 16 kHz示例中 15 个单元×2 声道对应约 0.3 秒波形shape(2, 4800)ipd.Audio(wav, rate16_000)即可在 Notebook 中直接播放。底层实现原理CodeHiFiGANVocoder 与 CodeGeneratorHifiganVocoder与命令行脚本都封装自 fairseq 内置的CodeHiFiGANVocoder模型注册名CodeHiFiGANVocoder见 vocoder.py。其前向过程vocoder.py会先过滤非法单元mask x[code] 0再调用CodeHiFiGANModel生成波形并detach()返回。真正的生成器CodeGeneratorcodehifigan.py继承自标准 HiFi-GAN 的Generator扩展要点如下单元词嵌入self.dict nn.Embedding(cfg[num_embeddings], cfg[embedding_dim])把离散单元 ID 映射为稠密向量后转置为B×C×T的条件特征x self.dict(kwargs[code]).transpose(1, 2)多说话人支持由配置中的multispkr字段控制。开启且未使用embedder_params时创建nn.Embedding(num_speakers, embedding_dim)的说话人嵌入表默认num_speakers200前向时要求输入必须包含spkr否则断言失败require spkr input for multispeaker CodeHiFiGAN vocoder说话人嵌入通过_upsample复制到与单元条件相同的帧数后拼接时长预测器若配置含dur_predictor_params则创建VariancePredictor当pred_durTrue时对单元序列预测每帧对数时长torch.round(torch.exp(log_dur_pred) - 1)后repeat_interleave扩展帧数仅支持单样本推理——这是 SpeechDLM 生成带时长信息单元时使用的可选能力F0 可选条件配置f0时支持将量化基频嵌入f0_quant_embed或原始 F0 作为额外条件拼接到输入。因此能否使用spkr/pred_dur完全取决于config.json中是否开启了multispkr与dur_predictor_paramsHifiganVocoder与脚本内部都是通过self.vocoder.model.multispkr动态判断的。端到端实践从 SpeechDLM 生成到音频合成将本模块接入完整 dGSLM 生成流程典型步骤是用SpeechDLM模型从前缀单元序列采样生成续写单元可参考 sample_speech_dlm.py 或 dgslm README 中的示例其输出仍是{unitA: ..., unitB: ...}形式的单元字典将生成结果写入 JSON 行格式文件audio字段可带-generated后缀以区分原始音频这是sample_speech_dlm.py的默认行为调用本文的generate_stereo_waveform.py或HifiganVocoder.codes2wav合成 16 kHz 波形。需要强调的是声码器的输入单元空间必须与编码器Fisher HuBERT 500 类 k-means保持一致即 SpeechDLM、编码器与声码器三者的单元词典应来自同一套量化体系否则合成结果会失真。引用若该工作对你的研究有帮助请引用原论文article{nguyen2022dgslm, title {Generative Spoken Dialogue Language Modeling}, author {Nguyen, Tu Anh and Kharitonov, Eugene and Copet, Jade and Adi, Yossi and Hsu, Wei-Ning and Elkahky, Ali and Tomasello, Paden and Algayres, Robin and Sagot, Benoit and Mohamed, Abdelrahman and Dupoux, Emmanuel}, eprint{2203.16502}, archivePrefix{arXiv}, primaryClass{cs.CL}, year{2022} }【免费下载链接】fairseqFacebook AI Research Sequence-to-Sequence Toolkit written in Python.项目地址: https://gitcode.com/gh_mirrors/fa/fairseq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表