背景
Twinkle 现在支持文本 LLM 和多模态,但没有 TTS 训练支持(cookbook 里没 TTS 示例,模型支持表也没列 TTS 变体)。我想给它加上 TTS 的 LoRA SFT 能力,先发个方案对一下,如果没问题我会按工作项实现并提交PR。
目标
让 Twinkle 能跑这两类 TTS 模型的 LoRA SFT:
- 多码本 AR-LM(如 Qwen3-TTS-12Hz-1.7B-Base):输入"文本+参考音频",输出"目标音频的多码本 token"
- 非 AR 局部 Transformer(如 MOSS-TTS-Local-Transformer-v1.5)
两类架构不同,但 LoRA 都挂在 q/k/v 这些线性层,组件能复用。
设计
仿 cookbook/mm/fsdp2.py 里 LatexOCRProcessor 的范式(自定义 Preprocessor 子类 + Trajectory/Message),加两个组件:
TTSMultiCodebookProcessor(Preprocessor 子类)
把 manifest 里的多码本 audio_codes 组织成训练样本:
- 文本 + 参考音频部分:label 置 -100(不学)
- 目标音频部分:保留多码本 label(学)
- 输出形如
Trajectory(messages=[Message(role='user', content=text, audio=ref_codes), Message(role='assistant', audio_codes=target_codes)])
TTSMultiCodebookLoss(Loss 子类)
多码本 next-token 交叉熵:每个位置对每个码本算 CE 再求和,只在 label != -100 的位置算。多码本 loss 的写法参考 OpenMOSS 官方 MOSS-TTS 仓库 community/norwegian-lora/train_lora.py。
工作项拆解
不在范围内
- vocoder / codec 本身训练(冻结用官方训好的)
- 全量 SFT(先做 LoRA,全量以后再说)
想确认的几点
Message 类要不要扩展支持 audio_codes 字段?还是复用现成的 images 之类?
- 多码本 loss 是写个新 Loss 类,还是给现成 CE 加个 multi-codebook 模式?
task='multi_codebook_lm' 这个 task 名合不合适?要不要走现成 task 机制?
- cookbook 放
cookbook/tts/ 还是 cookbook/transformers/ 下?
硬件
我在昇腾 NPU 单卡上做(bf16 LoRA),但组件本身不绑死硬件,CUDA 也能跑。
背景
Twinkle 现在支持文本 LLM 和多模态,但没有 TTS 训练支持(cookbook 里没 TTS 示例,模型支持表也没列 TTS 变体)。我想给它加上 TTS 的 LoRA SFT 能力,先发个方案对一下,如果没问题我会按工作项实现并提交PR。
目标
让 Twinkle 能跑这两类 TTS 模型的 LoRA SFT:
两类架构不同,但 LoRA 都挂在 q/k/v 这些线性层,组件能复用。
设计
仿
cookbook/mm/fsdp2.py里LatexOCRProcessor的范式(自定义 Preprocessor 子类 + Trajectory/Message),加两个组件:TTSMultiCodebookProcessor(Preprocessor 子类)把 manifest 里的多码本 audio_codes 组织成训练样本:
Trajectory(messages=[Message(role='user', content=text, audio=ref_codes), Message(role='assistant', audio_codes=target_codes)])TTSMultiCodebookLoss(Loss 子类)多码本 next-token 交叉熵:每个位置对每个码本算 CE 再求和,只在 label != -100 的位置算。多码本 loss 的写法参考 OpenMOSS 官方
MOSS-TTS仓库community/norwegian-lora/train_lora.py。工作项拆解
TTSMultiCodebookProcessor接口:仿LatexOCRProcessor,定preprocess(row) -> Trajectory的字段(Message要不要加audio_codes字段、参考音频怎么放)。TTSMultiCodebookProcessor+ 单测:用极小 manifest 跑通 encode,断言 input_ids/labels 的 shape 和 -100 位置正确。TTSMultiCodebookLoss:多码本 CE,仿现成causal_lm的接口风格,加task='multi_codebook_lm'。cookbook/tts/qwen3_tts_lora.py:单卡 + LoRA + bf16,仿cookbook/transformers/fsdp2.py结构。不在范围内
想确认的几点
Message类要不要扩展支持audio_codes字段?还是复用现成的images之类?task='multi_codebook_lm'这个 task 名合不合适?要不要走现成 task 机制?cookbook/tts/还是cookbook/transformers/下?硬件
我在昇腾 NPU 单卡上做(bf16 LoRA),但组件本身不绑死硬件,CUDA 也能跑。