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 |
| 本地 Transformer | 4 层 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安装微调所需依赖(相比推理多了accelerate与wandb):
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额外引入accelerate与wandb,finetune-deepspeed再补充deepspeed。
四、构造多轮对话训练集:JSONL 格式详解(核心)
微调的关键是数据格式。所有数据统一使用conversations多轮对话格式,每条记录是一个conversations列表,其中:
role:user(用户语音)或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 bf162)单机 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 bf163)参数分片: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_size、step_time、steps_per_sec、samples_per_sec与eta,便于盯进度。
常用可调超参数速查
| 类别 | 参数 |
|---|---|
| 优化器 | --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:原始训练 JSONLPREPARED_JSONL:prepare_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_machines、num_processes、machine_rank、main_process_ip、main_process_port(例如 2 节点 16 卡:num_machines: 2、num_processes: 16、节点 0 / 1 各设对应machine_rank),训练命令保持不变。
八、微调之后:验证与部署
训练产物保存在--output-dir指定目录(每个 checkpoint 自带完整mossttsrealtime包,可独立加载)。验证与上线可复用官方入口:
- Gradio 流式 Demo:
python3 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.py?A:预先把音频编码成audio_codes,训练时不再重复跑编解码器,显著提速;数据大时用accelerate launch多卡并行分片编码。
Q:能只用单轮数据吗?A:可以,但多轮 + 单轮混合训练能同时保留单句克隆与多轮对话能力,效果更稳。
小结
用 MOSS-TTS-Realtime 微调专属语音 Agent 的路径非常清晰:
- 装依赖:
pip install -e ".[torch-runtime,finetune]" - 造数据:
conversations多轮 JSONL,assistant轮保持同一音色 - 预处理:
prepare_data.py把音频编码为audio_codes - 训练:
sft.py单卡 → DDP → ZeRO-3 渐进式放大 - 一键:
run_train.sh串起全流程 - 上线:
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),仅供参考