MOSS-TTS-Realtime 微调教程:用多轮对话数据定制专属语音Agent
2026/9/16 14:54:36 网站建设 项目流程

MOSS-TTS-Realtime 微调教程:用多轮对话数据定制专属语音Agent

【免费下载链接】MOSS-TTSAn open-source model family for long-form speech, dialogue synthesis, voice design, sound effects, and real-time streaming TTS项目地址: https://gitcode.com/GitHub_Trending/mo/MOSS-TTS

MOSS-TTS-Realtime是 OpenMOSS 推出的实时流式 TTS 模型,专为多轮对话语音 Agent 设计。本教程带你用**多轮对话数据微调(Fine-tuning)**它,定制一个音色统一、上下文连贯的专属语音助手。全程只需 4 个文件、一条命令即可启动训练,无需深厚算法背景也能上手。

关键词:MOSS-TTS-Realtime 微调、TTS 模型 SFT、多轮对话数据训练、专属语音 Agent、声音克隆微调


一、认识 MOSS-TTS-Realtime:为什么值得微调

在动手之前,先搞清楚它「强在哪」,你就明白微调后能拿到什么。

MOSS-TTS-Realtime 属于 MOSS TTS 家族中的实时成员,核心定位是「上下文感知 + 流式合成」:

  • 多轮上下文建模:不止孤立合成单句,而是把历史文本 + 历史声学信息一起作为条件,让每一句回复都承上启下。
  • 音色克隆 & 全程一致:基于参考音频(ref_wav)克隆音色,并在整段多轮对话中保持稳定。
  • 长上下文:最长支持32K(约 40 分钟)上下文,长对话也不跑偏。
  • 低延迟:单卡 L20 上 TTFB(首包延迟)约180ms,RTF(实时率)约0.51,适合真实对话。
  • 多语言:支持中文、英文等20 种语言

🎯 微调的价值:让模型继承你指定的音色与说话风格,并学会「在你的业务场景里」如何组织语气、停顿与措辞,从而成为一个真正属于你的专属语音 Agent。


二、模型架构:微调到底在训练什么

理解架构能帮你判断显存需求、也更容易调试。MOSS-TTS-Realtime 采用分层架构

  • 1.7B 参数主干(Backbone):由 Qwen3-1.7B 初始化,负责编码语言与上下文信息,并暴露其隐状态。
  • 200M 本地 Transformer:架构与主干对齐,基于主干隐状态自回归生成 RVQ 音频 token
  • MOSS-Audio-Tokenizer(Cat):把音频 token 重建为 24kHz 高保真波形。

技术规格一览:

项目规格
主干模型初始化自 Qwen3-1.7B
本地 Transformer4 层 Transformer Block
音频编解码器Cat(因果式音频 Tokenizer)
采样率 / 帧率24,000 Hz / 12.5 Hz(1s ≈ 12.5 token)
代码本16 层 RVQ
生成方式纯自回归(AR)

因为主体是 1.7B 主干 + 轻量本地网络,单机 DDP 通常就够微调,这也是它对普通用户友好的原因。更多细节可查阅 moss_tts_realtime/README.md 与 docs/moss_tts_realtime_model_card.md。


三、环境准备:一键安装微调依赖

先克隆仓库(只读使用,请勿修改仓库内文件):

git clone https://gitcode.com/GitHub_Trending/mo/MOSS-TTS cd MOSS-TTS

安装微调所需依赖(相比推理多了acceleratewandb):

pip install --extra-index-url https://download.pytorch.org/whl/cu128 -e ".[torch-runtime,finetune]"

如果你计划使用DeepSpeed ZeRO-3(参数全分片,适合更大模型 / 多机),额外安装:

pip install --extra-index-url https://download.pytorch.org/whl/cu128 -e ".[torch-runtime,finetune-deepspeed]"

💡 依赖定义见 pyproject.toml:finetune额外引入acceleratewandbfinetune-deepspeed再补充deepspeed


四、构造多轮对话训练集:JSONL 格式详解(核心)

微调的关键是数据格式。所有数据统一使用conversations多轮对话格式,每条记录是一个conversations列表,其中:

  • roleuser(用户语音)或assistant(Agent 语音)
  • text:该轮文本内容
  • wav:该轮音频文件路径
  • ref_wav(可选):用于声音克隆的参考音频

1)单轮数据(等同普通 TTS / 声音克隆)

只有一个assistant轮次;没有参考音频时可省略ref_wav

{"id": "000001", "ref_wav": "./data/ref0.wav", "conversations": [{"role": "assistant", "text": "She said she would be here by noon.", "wav": "./data/utt0001.wav"}]}

2)多轮数据(VoiceAgent 交互)

user轮代表用户与 VoiceAgent 的语音,assistant轮代表 MOSS-TTS-Realtime 合成的语音,必须与ref_wav同一说话人user轮可以是不同说话人)。单轮与多轮数据可混合训练,兼顾两种能力:

{"id": "000003", "ref_wav": "./data/ref0.wav", "conversations": [ {"role": "user", "text": "I just landed in Paris, about six hours before my next flight.", "wav": "./data/user_utt0001.wav"}, {"role": "assistant", "text": "Nice, welcome to Paris! Six hours is perfect for a short city walk.", "wav": "./data/assistant_utt0001.wav"}, {"role": "user", "text": "Just a backpack, I don't want anything too rushed.", "wav": "./data/user_utt0002.wav"}, {"role": "assistant", "text": "Got it. I'd suggest starting near the Seine and grabbing a coffee.", "wav": "./data/assistant_utt0002.wav"} ]}

⚠️ 铁律:所有assistant轮必须是同一说话人,这决定微调后 Agent 的音色一致性。


五、数据预处理:把音频编码为 audio_codes

训练前,用 prepare_data.py预先把目标音频编码为audio_codes(RVQ 码),避免训练时反复编码、拖慢速度。

音频编解码由MOSS-Audio-Tokenizer(Cat)完成,把波形与离散音频 token 互转,是合成保真度的基础:

单进程预处理:

python moss_tts_realtime/finetuning/prepare_data.py \ --codec-path OpenMOSS-Team/MOSS-Audio-Tokenizer \ --device auto \ --input-jsonl train_raw.jsonl \ --output-jsonl train_with_codes.jsonl
  • 默认会连参考音频一起预编码;若只需目标音频,加--skip-reference-audio-codes
  • 数据量大时可用accelerate launch --num_processes 16 ...多机多卡并行编码,按 rank 切分成多个 shard(如train_with_codes.rank00000-of-00016.jsonl),训练阶段sft.py支持直接用 glob 读取。

六、启动训练:单卡 → DDP → ZeRO-3

训练入口是 sft.py,数据由 dataset.py 组装。

1)单卡基线(最易上手)

accelerate launch moss_tts_realtime/finetuning/sft.py \ --model-path OpenMOSS-Team/MOSS-TTS-Realtime \ --codec-path OpenMOSS-Team/MOSS-Audio-Tokenizer \ --train-jsonl train_with_codes.jsonl \ --output-dir output/moss_tts_realtime_sft \ --per-device-batch-size 1 \ --gradient-accumulation-steps 8 \ --learning-rate 1e-5 \ --warmup-ratio 0.03 \ --num-epochs 3 \ --mixed-precision bf16

2)单机 8 卡数据并行(DDP)

使用模板配置 accelerate_ddp_8gpu.yaml:

accelerate launch \ --config_file moss_tts_realtime/finetuning/configs/accelerate_ddp_8gpu.yaml \ moss_tts_realtime/finetuning/sft.py \ --model-path OpenMOSS-Team/MOSS-TTS-Realtime \ --codec-path OpenMOSS-Team/MOSS-Audio-Tokenizer \ --train-jsonl 'prepared/train_with_codes.rank*.jsonl' \ --output-dir output/moss_tts_realtime_sft_ddp \ --per-device-batch-size 1 \ --gradient-accumulation-steps 4 \ --mixed-precision bf16

3)参数分片:FSDP / DeepSpeed ZeRO-3(可选)

对 1.7B 模型,单机 DDP 一般已足够;需要更强分片时可选:

  • FSDP:配置 accelerate_fsdp_1.7b.yaml,参数 / 梯度 / 优化器状态按 rank 分片。
  • DeepSpeed ZeRO-3:配置 accelerate_zero3_1.7b.yaml,全分片,适合更大模型与多机,需安装deepspeed

📊 训练日志会自动打印带时间戳的前缀、global_batch_sizestep_timesteps_per_secsamples_per_seceta,便于盯进度。

常用可调超参数速查

类别参数
优化器--learning-rate--weight-decay--adam-beta1/2--adam-eps
学习率调度--lr-scheduler-type--warmup-steps--warmup-ratio
稳定性--max-grad-norm--mixed-precision(no / fp16 / bf16)
观测--wandb-project(可选接入 Weights & Biases)

七、一键启动脚本 run_train.sh

不想拼长命令?直接跑 run_train.sh:

bash moss_tts_realtime/finetuning/run_train.sh

它会自动串联「预处理 → 训练」,常用环境变量:

  • RAW_JSONL:原始训练 JSONL
  • PREPARED_JSONLprepare_data.py的输出
  • TRAIN_JSONL:训练输入(单文件 / 目录 / glob,未设则自动推断)
  • OUTPUT_DIR:训练输出目录
  • ACCELERATE_CONFIG_FILE:可选的 DDP / FSDP / ZeRO-3 配置
  • SKIP_PREPARE=1:跳过预处理,直接用已有数据训练
  • TRAIN_EXTRA_ARGS_STR:透传给sft.py的额外训练参数

用 ZeRO-3 一键启动示例:

RAW_JSONL=train_raw.jsonl \ PREPARED_JSONL=prepared/train_with_codes.jsonl \ OUTPUT_DIR=output/moss_tts_realtime_sft_zero3 \ ACCELERATE_CONFIG_FILE=moss_tts_realtime/finetuning/configs/accelerate_zero3_1.7b.yaml \ TRAIN_EXTRA_ARGS_STR='--per-device-batch-size 1 --gradient-accumulation-steps 4 --num-epochs 3 --warmup-ratio 0.03 --mixed-precision bf16' \ bash moss_tts_realtime/finetuning/run_train.sh

多机训练

只需改配置里的num_machinesnum_processesmachine_rankmain_process_ipmain_process_port(例如 2 节点 16 卡:num_machines: 2num_processes: 16、节点 0 / 1 各设对应machine_rank),训练命令保持不变


八、微调之后:验证与部署

训练产物保存在--output-dir指定目录(每个 checkpoint 自带完整mossttsrealtime包,可独立加载)。验证与上线可复用官方入口:

  • Gradio 流式 Demopython3 moss_tts_realtime/app.py
  • FastAPI 服务python3 moss_tts_realtime/fast_api.py,再调 tts_client.py 验证
  • 多轮流式:example_multiturn_stream_to_tts.py(第 0 轮重置 KV cache,后续轮复用,天然承载上下文)

推理实现见 modeling_mossttsrealtime.py,推荐解码参数:temperature=0.8、top_p=0.6、top_k=30、repetition_penalty=1.1、repetition_window=50


九、常见问题 FAQ

Q:1.7B 模型微调需要多少卡?A:单卡可做基线(per-device-batch-size 1+ 梯度累积);追求速度用单机 8 卡 DDP;更大规模再用 FSDP / ZeRO-3。

Q:user轮和assistant轮一定要同一个人吗?A:不必。assistant轮必须与ref_wav同一说话人user轮可以是不同说话人,这正贴近真实对话。

Q:为什么训练前要prepare_data.pyA:预先把音频编码成audio_codes,训练时不再重复跑编解码器,显著提速;数据大时用accelerate launch多卡并行分片编码。

Q:能只用单轮数据吗?A:可以,但多轮 + 单轮混合训练能同时保留单句克隆与多轮对话能力,效果更稳。


小结

用 MOSS-TTS-Realtime 微调专属语音 Agent 的路径非常清晰:

  1. 装依赖pip install -e ".[torch-runtime,finetune]"
  2. 造数据conversations多轮 JSONL,assistant轮保持同一音色
  3. 预处理prepare_data.py把音频编码为audio_codes
  4. 训练sft.py单卡 → DDP → ZeRO-3 渐进式放大
  5. 一键run_train.sh串起全流程
  6. 上线app.py/fast_api.py部署验证

按此流程,你无需修改仓库任何文件,即可完成一次稳定、音色统一、上下文连贯的专属语音 Agent 微调。

【免费下载链接】MOSS-TTSAn open-source model family for long-form speech, dialogue synthesis, voice design, sound effects, and real-time streaming TTS项目地址: https://gitcode.com/GitHub_Trending/mo/MOSS-TTS

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询