提案:为 Twinkle 新增 TTS 训练支持(多码本 Preprocessor + Loss)
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 35/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- python
- Lĩnh vực
- audio-video-rtc, machine-learning
Hướng nghiên cứu
Bắt đầu với cookbook/mm/fsdp2.py và pattern LatexOCRProcessor của nó, sau đó kiểm tra mã tokenizer của Qwen3-TTS để xác định các token multi-codebook được tổ chức như thế nào. Đọc community/norwegian-lora/train_lora.py trong repository MOSS-TTS để tham khảo về loss. Được xem là hoàn tất khi thiết kế của processor và loss đã được xác định, với các test kiểm tra shape của input và label cũng như việc masking bằng -100, trước khi bắt đầu công việc trên cookbook và tài liệu.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
背景
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。
工作项拆解
- W1 调研多码本 token 在序列里怎么组织(多头输出 / flatten / 残差量化),看 Qwen3-TTS 官方 tokenizer 代码确认。这决定 Preprocessor 的 encode 逻辑。
- W2 设计
TTSMultiCodebookProcessor接口:仿LatexOCRProcessor,定preprocess(row) -> Trajectory的字段(Message要不要加audio_codes字段、参考音频怎么放)。 - W3 实现
TTSMultiCodebookProcessor+ 单测:用极小 manifest 跑通 encode,断言 input_ids/labels 的 shape 和 -100 位置正确。 - W4 设计+实现
TTSMultiCodebookLoss:多码本 CE,仿现成causal_lm的接口风格,加task='multi_codebook_lm'。 - W5 加 cookbook 示例
cookbook/tts/qwen3_tts_lora.py:单卡 + LoRA + bf16,仿cookbook/transformers/fsdp2.py结构。 - W6 MOSS-TTS-Local-Transformer 适配:非 AR 局部 Transformer 训练格式不同,可能要再写个 Preprocessor 变体(W1-W5 跑通后再碰)。
- W7 文档:README 教程表加 TTS 行、docs 加一节"TTS 训练"。
不在范围内
- 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 也能跑。
- Ngôn ngữ chính
- Python
- Star
- 260
- Fork
- 55
- Merge trung bình
- 1 ngày 11 giờ
- Pull request đã merge (30 ngày)
- 15
Chuẩn bị môi trường
- Có Dockerfile hoặc tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của modelscope/twinkle
-
魔搭托管的 Twinkle API 持续超时Đang mởbug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 15/100
modelscope/twinkle#319 · 5 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 30/100
modelscope/twinkle#298 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của modelscope/twinkle
Issue tương tự
-
bug documentation
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
awslabs/visual-asset-management-system#514 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
backend bug spec:REQ-053
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
nolte/kamerplanter#2547 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
EleutherAI/lm-evaluation-harness#4425 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Gemini: respect PLANNING_DISABLED=1 in lifecycle context hooksCó thể đã có người làm @AmariAugustin đã nhận hôm nay. Đang mởbug good first issue help wanted
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 87/100
OthmanAdi/planning-with-files#329 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
wr.dynamodb.read_items returns [{}] for a single partition value that does not existCó thể đã có người làm @auraseb đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
aws/aws-sdk-pandas#3520 ·
Maintainer thường phản hồi trong vòng 2 ngày