ARTICLE DETAIL

资讯详情

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

Parler-TTS 训练与微调完全指南:从模型架构原理到 600M 参数训练配方复现

Parler-TTS 训练与微调完全指南:从模型架构原理到 600M 参数训练配方复现 语音AI 应用深度学习【免费下载链接】parler-ttsInference and training library for high-quality TTS models.项目地址https://gitcode.com/GitHub_Trending/pa/parler-tts点击查看免费下载导读本文以 Parler-TTS 仓库的 training/README.md 为核心系统讲解如何从零训练或微调你自己的 Parler-TTS 高质量文本转语音TTS模型。你将掌握 Parler-TTS 的三段式架构原理、环境安装与模型初始化流程、带自然语言描述条件的数据集准备方法以及通过accelerate launch一键复现 Parler-TTS Mini v0.1600M 参数训练配方的完整命令行与 JSON 配置写法。文中所有结论均可对照仓库源码training/run_parler_tts_training.py、training/arguments.py、training/data.py、training/eval.py、helpers/model_init_scripts/逐一验证。一、Parler-TTS 架构速览Parler-TTS 的架构至少在本文档所述版本几乎完全复刻了 MusicGen 的模型结构可分解为三个独立阶段文本编码器Text Encoder把文本描述description映射为序列化的隐藏状态表示。Parler-TTS 使用完全冻结frozen的文本编码器初始化自 Flan-T5。Parler-TTS 解码器Decoder一个自回归语言模型LM以编码器隐藏状态为条件逐 token 生成音频 token即 code。音频编解码器Audio Codec把解码器预测出的音频 token 还原为音频波形。Parler-TTS 使用 Descript 的DAC模型不过其他 codec如 EnCodec也可以替换使用。在此基础上Parler-TTS 引入了三个关键微调与 MusicGen 的差异文本描述description经由文本编码器编码后送入解码器的交叉注意力cross-attention层文本提示prompt即要朗读的句子只经过一个嵌入层然后拼接到解码器的输入隐藏状态上音频编码器选用DAC而非 Encodec因为前者表现出更好的音频质量。这三条差异在源码中都有直接体现parler_tts/modeling_parler_tts.py中ParlerTTSForConditionalGeneration.forward接收input_idsdescription与prompt_input_idsprompt两路文本输入分别走文本编码器与嵌入层freeze_encoders(freeze_text_encoderTrue)方法用于冻结编码器以节省算力见 训练脚本 的调用。音频侧则由parler_tts/dac_wrapper/目录下的DACConfig/DACModel包装实现DACConfig默认num_codebooks9、codebook_size1024、sampling_rate44100见 configuration_dac.py。一句话记忆描述描述说话风格走交叉注意力提示要读的文本走嵌入拼接音频由 DAC 编解码。二、快速开始环境准备训练 Parler-TTS 需要按顺序完成以下三步准备安装依赖找到或初始化待训练的模型找到并必要时标注训练数据集。2.1 安装依赖Parler-TTS 的训练代码基于PyTorch与Accelerate编写并额外依赖wandb等用于日志记录与评估的库。克隆仓库并安装带训练依赖的包git clone https://github.com/huggingface/parler-tts.git cd parler-tts pip install -e .[train]安装完成后强烈建议可选但推荐注册并登录 wandb 账号以更好地跟踪实验指标与 loss使用wandb官方快速入门指南运行accelerate config配置 Accelerate务必设置你计划用于训练的 GPU 数量以及训练/推理使用的数据类型 dtype例如 A100 上建议bfloat16V100 上建议float16关联 Hugging Face 账号以便后续把训练好的模型推送到 Hub 与社区分享git config --global credential.helper store huggingface-cli login登录时需要输入一个来自 Hugging Face 设置页签发的认证 token且该 token 必须具备 write 写权限没有就新建一个。2.2 从零初始化模型或直接使用预训练权重根据你的算力与数据规模需要在微调预训练模型和从零训练新模型之间做选择微调路线官方发布了一个在 10.5K 小时标注数据上训练的600M 检查点仓库 idparler-tts/parler_tts_mini_v0.1可直接在此基础上微调适配自己的场景从零训练路线使用 helpers/model_init_scripts/ 下的初始化脚本自建模型。仓库提供了两个初始化脚本示例。先看最小的 dummy 模型适合先跑通流程python helpers/model_init_scripts/init_dummy_model.py ./parler-tts-untrained-dummy --text_model google-t5/t5-small --audio_model parler-tts/dac_44khZ_8kbps本文档后续以及复现 Parler-TTS Mini v0.1 训练配方使用一个600M 参数模型python helpers/model_init_scripts/init_model_600M.py ./parler-tts-untrained-600M --text_model google/flan-t5-base --audio_model parler-tts/dac_44khZ_8kbps从源码看这两个脚本init_dummy_model.py、init_model_600M.py本质上是同一套逻辑读取文本编码器与音频编码器的AutoConfig以音频 codec 的codebook_size和num_codebooks为基准构造ParlerTTSDecoderConfigdummy 版为 4 层、hidden_size 512、max_position_embeddings 2048600M 版为 24 层、hidden_size 1024、ffn_dim 4096、16 注意力头、max_position_embeddings 4096注释标明30 s 2580帧生成随机初始化的解码器后用ParlerTTSForConditionalGeneration.from_sub_models_pretrained把三个子模型拼装成完整模型最后设置 generation configdecoder_start_token_id、max_length 30 * frame_rate、do_sampleTrue等并保存。提示600M 脚本把vocab_size设为codebook_size 64注释说明64 而不是 1是为了让词表大小成为 64 的倍数这在硬件友好的维度对齐上有实际意义。2.3 创建或寻找数据集训练 Parler-TTS 需要满足三个要素的数据集语音数据speech data语音的文本转写text transcription条件文本描述conditioning text description——可以用 Data-Speech 这类库生成它能够用自然语言自动标注说话人的音高、语速、噪音水平等特征。官方文档特别说明他们选择用主要语音特征speaker pitch、speaking rate、level of noise 等作为描述但你完全可以自由使用任何手写或生成的有意义的文本描述。Parler-TTS Mini v0.1 使用的训练数据是完整的LibriTTS-R数据集约 1K 小时高质量语音Multilingual LibriSpeech的10K 小时子集。两套数据都使用 Data-Speech 配方标注分别对应parler-tts/libritts_r_tags_tagged_10k_generated与parler-tts/mls-eng-10k-tags_tagged_10k_generated两个已标注数据集training/README.md第 104-108 行。这里有一个关键设计后文训练部分还会展开标注描述数据与原始语音数据是分开存储的因为把音频写进 Hub 成本很高。训练脚本负责把它们按 id 合并回原始数据集——这一逻辑实现在 training/data.py 的load_multiple_datasets中先分别加载语音数据集与 metadata 数据集通过id_column_name对应的 id 做列拼接concatenate_datasets(..., axis1)并校验两侧 id 完全一致不一致即抛错。三、训练一键复现 v0.1 配方training/run_parler_tts_training.py 是一个端到端训练脚本一条命令完成三件事加载数据集并在必要时与标注数据集metadata dataset合并预计算音频 token用 DAC 把波形编码为离散码训练 Parler-TTS。3.1 完整训练命令复现 Parler-TTS Mini v0.1 训练配方的完整命令如下这是官方文档给出的原始命令可直接复制使用accelerate launch ./training/run_parler_tts_training.py \ --model_name_or_path ./parler-tts-untrained-600M/parler-tts-untrained-600M/ \ --feature_extractor_name parler-tts/dac_44khZ_8kbps \ --description_tokenizer_name google/flan-t5-base \ --prompt_tokenizer_name google/flan-t5-base \ --report_to wandb \ --overwrite_output_dir true \ --train_dataset_name blabble-io/libritts_rblabble-io/libritts_rblabble-io/libritts_rparler-tts/mls_eng_10k \ --train_metadata_dataset_name parler-tts/libritts_r_tags_tagged_10k_generatedparler-tts/libritts_r_tags_tagged_10k_generatedparler-tts/libritts_r_tags_tagged_10k_generatedparler-tts/mls-eng-10k-tags_tagged_10k_generated \ --train_dataset_config_name cleancleanotherdefault \ --train_split_name train.clean.360train.clean.100train.other.500train \ --eval_dataset_name blabble-io/libritts_rparler-tts/mls_eng_10k \ --eval_metadata_dataset_name parler-tts/libritts_r_tags_tagged_10k_generatedparler-tts/mls-eng-10k-tags_tagged_10k_generated \ --eval_dataset_config_name otherdefault \ --eval_split_name test.othertest \ --target_audio_column_name audio \ --description_column_name text_description \ --prompt_column_name text \ --max_duration_in_seconds 30 \ --min_duration_in_seconds 2.0 \ --max_text_length 400 \ --add_audio_samples_to_wandb true \ --id_column_name id \ --preprocessing_num_workers 8 \ --do_train true \ --num_train_epochs 40 \ --gradient_accumulation_steps 8 \ --gradient_checkpointing false \ --per_device_train_batch_size 3 \ --learning_rate 0.00095 \ --adam_beta1 0.9 \ --adam_beta2 0.99 \ --weight_decay 0.01 \ --lr_scheduler_type constant_with_warmup \ --warmup_steps 20000 \ --logging_steps 1000 \ --freeze_text_encoder true \ --do_eval true \ --predict_with_generate true \ --include_inputs_for_metrics true \ --evaluation_strategy steps \ --eval_steps 10000 \ --save_steps 10000 \ --per_device_eval_batch_size 12 \ --audio_encoder_per_device_batch_size 20 \ --dtype bfloat16 \ --seed 456 \ --output_dir ./output_dir_training/ \ --temporary_save_to_disk ./audio_code_tmp/ \ --save_to_disk ./tmp_dataset_audio/ \ --max_eval_samples 96 \ --dataloader_num_workers 8 \ --group_by_length true3.2 多数据集拼接语法特别要注意多个训练数据集、metadata 数据集、配置和 split 可以通过符号分隔一次性加载各参数一一对应train_dataset_name: blabble-io/libritts_rblabble-io/libritts_rblabble-io/libritts_rparler-tts/mls_eng_10k, train_metadata_dataset_name: parler-tts/libritts_r_tags_tagged_10k_generatedparler-tts/libritts_r_tags_tagged_10k_generatedparler-tts/libritts_r_tags_tagged_10k_generatedparler-tts/mls-eng-10k-tags_tagged_10k_generated, train_dataset_config_name: cleancleanotherdefault, train_split_name: train.clean.360train.clean.100train.other.500train,从源码看training/data.py的convert_dataset_str_to_list负责把分隔的字符串拆成等长的列表并校验每个 dataset 都必须有对应的 config、split、metadata dataset、sample 数数量不匹配会直接抛ValueError。拆解上面 v0.1 的配置blabble-io/libritts_rconfigclean使用train.clean.360切分blabble-io/libritts_rconfigclean使用train.clean.100切分blabble-io/libritts_rconfigother使用train.other.500切分parler-tts/mls_eng_10kconfigdefault使用train切分。每个数据子集都配有自己的 metadata 数据集eval 侧同理eval_split_name使用test.othertest。load_multiple_datasets最终把所有子集concatenate_datasets拼成一个训练集。3.3 JSON 配置文件写法除了超长的命令行参数你也可以把所有参数写进一个 JSON 文件。仓库自带的 helpers/training_configs/starting_point_0.01.json 与上面的命令行超参数完全一致启动方式更简洁accelerate launch ./training/run_parler_tts_training.py ./helpers/training_configs/starting_point_0.01.json从 run_parler_tts_training.py 的源码看脚本用HfArgumentParser解析ModelArguments、DataTrainingArguments、ParlerTTSTrainingArguments三组参数当sys.argv只有一个参数且以.json结尾时走parse_json_file否则走parse_args_into_dataclasses解析命令行——所以命令行与 JSON 两种传参方式是等价的。三种参数类的完整字段定义与默认值见 training/arguments.py。3.4 训练日志与进度参考训练日志会上报到 wandb前提是你传了--report_to wandb官方文档给出了一个真实训练日志的 wandb 示例Parler-TTS 300M 标点版本。从零开始训练新模型很容易让人望而生畏官方建议先看 v0.1 实际训练过程的日志原始 README 中提供了链接。3.5 多 GPU 扩展DDP扩展到多 GPU 非常容易运行accelerate config并选择多 GPU 选项指定要使用的 GPU ID 即可。上述脚本无需任何代码改动即可用 DDP分布式数据并行运行。官方在训练 Parler-TTS v0.1 时使用了一个 8 × H100 80GB 的节点训练约 4 天。3.6 值得注意的关键参数官方文档专门列出了几个容易被忽略但对流程有重大影响的参数train_metadata_dataset_name/eval_metadata_dataset_name指定承载条件文本描述的数据集名称如果有。例如 Data-Speech 标注产出的数据集如parler-tts/libritts_r_tags_tagged_10k_generated保存时没有音频列——因为写入和推送音频数据成本太高——所以需要按 id 拼回原始 LibriTTS-R 数据集。合并逻辑见 training/data.py 的load_multiple_datasets它会自动移除 metadata 与原始数据中重复的列、重命名 id 列并做 id 一致性校验。audio_encoder_per_device_batch_size由于音频编码器被冻结、音频 code 计算成本高且只需算一次脚本会预计算音频 token该参数指定这个预处理阶段每台设备的 batch size源码默认值 8v0.1 配方用 20。预计算实现在 run_parler_tts_training.py用DataCollatorEncodecWithPadding组装批次、以torch.no_grad()跑audio_decoder.encode(..., bandwidthbandwidth)[audio_codes]再把(1, bsz, codebooks, seq_len)转成(bsz, seq_len, codebooks)的 labels并追加 BOS、通过build_delay_pattern_mask构造延迟模式标签delay pattern mask代码注释给出了[B, a, b, E, ...]的标签形态。save_to_disk与temporary_save_to_disk当训练数据规模扩大、需要反复调整超参或模型结构时不希望每次训练都重算音频 token。这两个参数充当保存中间数据集的临时缓冲temporary_save_to_disk暂存每个 split 的音频标签save_to_disk保存最终处理后的向量化数据集。源码逻辑是——若save_to_disk目录非空则直接load_from_disk跳过预计算run_parler_tts_training.py。注意处理后数据由文本 音频 token组成比原始音频更省内存额外磁盘占用可忽略。predict_with_generate与add_audio_samples_to_wandb评估阶段生成音频、计算 WER 与 CLAP 相似度并把音频样本上传到 wandb 的必要开关。其中predict_with_generatetrue会触发generate_step用训练中的模型自回归生成音频再交给compute_metrics计算指标见 run_parler_tts_training.py。freeze_text_encoder冻结文本编码器节省计算资源v0.1 配方置为true。对应源码调用model.freeze_encoders(model_args.freeze_text_encoder)run_parler_tts_training.py。3.7 两个补充说明lr_scheduler_type定义学习率调度策略可选constant_with_warmup或cosine。当你在实验训练配置或只训练很少的 epoch 时constant_with_warmup通常更有利——因为短训练中学习率会保持高位而较长的训练用cosine调度通常效果更好。官方补充源码中该参数直接传给transformers的get_schedulerrun_parler_tts_training.py并会按accelerator.num_processes折算 warmup 与总步数。dtype模型计算所用的数据类型。注意它只控制前向/反向传播计算的 dtype不影响模型参数和优化器状态的 dtype。支持float32默认、float16、bfloat16。源码中run_parler_tts_training.py会把它映射为 Accelerate 的混合精度设置float16→fp16bfloat16→bf16其余 →no同时由于T5 类模型不支持 fp16脚本在fp16下会通过AutocastKwargs(enabledFalse)关掉文本编码器路径的自动混合精度。3.8 评估指标如何计算训练脚本在 eval 阶段依赖两个外部模型计算指标实现见 training/eval.pyCLAP 相似度clap_similarity用 CLAP 模型ModelArguments中默认laion/larger_clap_music_and_speech见 arguments.py分别提取文本描述与生成音频的特征计算余弦相似度均值衡量生成音频是否符合描述WER 词错误率wer用 ASR 模型默认distil-whisper/distil-large-v2见 arguments.py转写生成音频再与 prompt 文本计算词错误率衡量朗读内容是否正确。对 Whisper 系列模型还会按检测到的语言选择英文归一化器。四、微调一行命令适配自己的场景官方文档最后的技巧是微调 把model_name_or_path换成预训练模型。例如--model_name_or_path parler-tts/parler_tts_mini_v0.1其余训练参数数据集、时长过滤、优化器、调度器、评估策略等完全复用上面的配方即可。这也是先复现 v0.1再做自己的数据适配这条最稳妥的实践路径。五、参考资料与源码索引训练入口脚本training/run_parler_tts_training.py端到端加载数据 → 预计算音频 token → 训练 → 评估参数定义命令行与 JSON 的完整字段、默认值、帮助说明training/arguments.py数据加载与合并逻辑语法解析、metadata 拼接、音频重采样、动态 padding collatortraining/data.py评估指标CLAP 相似度、WERtraining/eval.py训练配置文件与文中命令行等价的 JSONhelpers/training_configs/starting_point_0.01.json模型初始化脚本dummy 与 600M 两套 decoder 配置helpers/model_init_scripts/init_dummy_model.py、helpers/model_init_scripts/init_model_600M.py核心模型实现文本编码器/解码器/音频编解码器的组装与生成逻辑parler_tts/modeling_parler_tts.py、parler_tts/configuration_parler_tts.pyDAC 音频编解码器包装parler_tts/dac_wrapper/适用前提提醒本文所有命令与参数均以当前仓库内容为准训练脚本基于 PyTorch、Accelerate、Transformers 与 datasets 生态安装时请使用pip install -e .[train]并确保按照你的 GPU 型号配置accelerate config的 GPU 数量与 dtypeA100 建议bfloat16V100 建议float16。赞分享语音AI 应用深度学习【免费下载链接】parler-ttsInference and training library for high-quality TTS models.项目地址https://gitcode.com/GitHub_Trending/pa/parler-tts点击查看免费下载相关推荐Coqui TTS 微调实战指南从预训练模型选择到 --restore_path 恢复训练Coqui TTS 微调实战指南从预训练模型选择到 restore_path 恢复训练 本文基于 TTS 仓库的官方微调文档 docs/source/fi人工智能语音音频深度学习预训练CANN/cannbot-skillstensor_api使用指导手册tensor_api 使用指导手册 适用架构 DAV_3510 __NPU_ARCH__ 3510 CANN 9.0.0 beta.2ops tenAI 技能人工智能AI 评测CANNAscendlllyasviel/Annotators模型训练从预训练到微调的完整指南lllyasviel/Annotators模型训练从预训练到微调的完整指南 引言为什么需要专业的模型训练指南 在计算机视觉和深度学习领域模型训练是一个复人工智能计算机视觉深度学习上一篇Puppeteer Page.evaluateOnNewDocument 深度指南页面加载前注入脚本的时机、原理与最佳实践下一篇字节跳动AHN技术突破大模型长文本处理效率提升50%内存占用减少74%创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表