Repository metrics
- Stars
- (4,990 stars)
- PR merge metrics
- (PR metrics pending)
Description
Motivation.
Issue #938 tracked Qwen3-TTS to production readiness through February. All original production criteria were met - RTF 0.34 (target <1.0), TTFP 131ms (target <200ms), stable 2-stage deployment, streaming output, and benchmark tooling.
March shifts focus to four themes:
- Harden Qwen3-TTS - close remaining bugs, land in-progress features, continue performance work
- Expand TTS model coverage - Fish Speech S2 Pro, GLM-TTS, MOSS-TTS, Ming-omni-tts, Index-TTS, and others
- Build a TTS integration agent - automate the new-model onboarding process to accelerate model support
- Improve infrastructure - config refactor, metrics, WebSocket streaming, batch endpoint
This RFC supersedes #938 and serves as the single tracking issue for all TTS work in March.
Proposed Change.
1. Where We Are (Mid-March Summary)
Qwen3-TTS is production-ready. Key merges since #938:
- Performance: Re-prefill code predictor + Code2Wav CUDA graph (#1617), batch
.tolist()to eliminate GPU syncs (#1614), flexible initial phase for TTFA reduction (#1583), GPU-resident buffers to eliminate CPU round-trips (#1852) - Reliability: Fix all-silence output (#1664), fix Base ICL voice clone (#1554, #1731), fix voice clone streaming quality and stop-token crash (#1945), request validation (#1641), HTTP error responses (#1687)
- Infrastructure: Non-async chunk support (#1678), TTS model developer guide (#1693), CI model pre-download (#1727), nightly performance benchmark (#1700), benchmark scripts (#1573), WebSocket streaming (#1719), Gradio demo (#1231), WAV streaming format (#1819), entrypoint refactoring (#1908), config refactor phase 1 (#1115)
Current performance (H100/H200):
| Concurrency | TTFP | RTF | Throughput |
|---|---|---|---|
| 1 | 131ms | 0.34 | 2.95x realtime |
| 4 | 200ms (median) | 0.49 | 7.38x realtime |
2. Open PRs
2.1 Qwen3-TTS
| PR | Title | Author | Priority | Status |
|---|---|---|---|---|
| #1700 | Nightly performance benchmark | @linyueqian | P0 | Merged |
| #1573 | Benchmark scripts | @linyueqian | P1 | Merged |
| #1645 | Report supported tasks for omni models | @linyueqian | P1 | Merged |
| #1719 | WebSocket streaming audio output | @Sy0307 | P0 | Merged |
| #1714 | Dynamic TTFA based on Code2Wav load | @JuanPZuluaga | P1 | Merged |
| #1852 | GPU-resident buffers, boost throughput+latency | @JuanPZuluaga | P1 | Merged |
| #1945 | Fix Base voice clone streaming quality and stop-token crash | @linyueqian | P0 | Merged |
| #1985 | Keep audio_codes on GPU, eliminate per-step sync stalls | @DomBrown | P1 | Under review |
| #1925 | Talker CUDA graph | @evezhier | P1 | Under review |
| #1913 | CodePredictor torch.compile with reduce-overhead | @JuanPZuluaga | P1 | Under review |
| #1911 | Add Qwen-TTS test cases and unify style | @R2-Y | P1 | Under review |
| #1797 | Code2Wav triton SnakeBeta + CUDA graph | @JuanPZuluaga | P1 | In progress |
| #1883 | Streaming text input for Qwen3-TTS | @thrashingstate | P1 | In progress |
| #1963 | Support changing speaker of Qwen3-Omni | @R2-Y | P2 | In progress |
| #1857 | Better Qwen3-TTS online serving demo | @linyueqian | P2 | In progress |
| #1720 | Audio/speech metrics (Prometheus) | @Temirulan | P1 | In progress |
| #1230 | Streaming text input via WebSocket | @lishunyang12 | P1 | In progress |
| #1227 | Speaker embedding passthrough API | @marksverdhei | P2 | Open |
| #1389 | Base64 input for ref-audio | @lolyhop | P2 | Open |
2.2 Infrastructure & Cross-Model
| PR | Title | Author | Priority | Status |
|---|---|---|---|---|
| #1115 | Model Pipeline Configuration System | @lishunyang12 | P0 | Merged |
| #1958 | Auto gpu_memory_utilization config tool | @linyueqian | P1 | Under review |
| #1701 | Speech batch entrypoint | @divyanshsinghvi | P1 | WIP |
| #1829 | Standardize data entry key names | @divyanshsinghvi | P1 | Under review |
| #1851 | Remove duplicated config keyword max batch size | @tzhouam | P2 | Under review |
| #1807 | RFC: Unify test case stage config YAMLs | - | P2 | Open |
2.3 New TTS Models
| PR | Title | Author | Priority | Status |
|---|---|---|---|---|
| #1798 | Fish Speech S2 Pro support | @linyueqian | P1 | Merged |
| #1859 | Fish Speech S2 Pro perf improvement | @Sy0307 | P1 | Under review |
| #1803 | Mistral TTS support | @y123456y78 | P1 | In progress |
| #1370 | MOSS-TTS support | @anurag12-webster | P1 | In progress |
| #1517 | Chatterbox TTS (Turbo) support | @lishunyang12 | P2 | In progress |
| #1748 | FunAudioChat S2S support | @nemoramo | P1 | Under review |
| #464 | Step-Audio-R1.1 support | @wuli666 | P2 | WIP |
| #334 | Index-TTS support | @divyanshsinghvi | P2 | WIP (since Dec) |
| #1703 | CosyVoice3 async_chunk hardening | @indevn | P1 | Open |
2.4 Performance & Optimization
| PR | Title | Author | Priority | Status |
|---|---|---|---|---|
| #1985 | GPU-resident audio_codes, deferred D2H | @DomBrown | P1 | Under review |
| #1925 | Talker CUDA graph | @evezhier | P1 | Under review |
| #1913 | CodePredictor torch.compile | @JuanPZuluaga | P1 | Under review |
| #1797 | Code2Wav triton SnakeBeta + CUDA graph | @JuanPZuluaga | P1 | In progress |
| #1758 | Qwen3-Omni code predictor re-prefill + SDPA | @LJH-LBJ | P1 | In progress |
3. Open Issues
3.1 Bugs
| Issue | Title | Severity | Status |
|---|---|---|---|
| Fixed (#1945) | |||
| Fixed | |||
| Fixed | |||
| Fixed | |||
| Fixed | |||
| Fixed | |||
| Fixed | |||
| Fixed | |||
| Fixed | |||
| #1965 | Online service crashed | High | Open |
| #1896 | Qwen3-TTS slow on A100 with v0.16.0 | Medium | Open |
| #1849 | Qwen3-TTS fails to start on Ascend 910B/C in v0.16.0 | Medium | Open |
3.2 Feature Requests
| Issue | Title | Priority | Status |
|---|---|---|---|
| #1766 | Streaming text input for Qwen3-TTS | P1 | In progress (#1230, #1883) |
| #1760 | Separate endpoint for voice clone prompt creation | P2 | Open |
| #1676 | Stream wav format from speech API | P2 | Fixed (#1819) |
| #1603 | Voice clone RFC for Qwen3-TTS Base | P2 | Open |
3.3 New Model Requests
| Issue | Model | PR | Status |
|---|---|---|---|
| #821 | GLM-TTS | #834 (closed) | Assigned to @YeungYathin |
| #1319 | MOSS-TTS | #1370 | In progress |
| #899 | Chatterbox TTS (Turbo) | #1517 | In progress (reopened) |
| #1551 | F5-TTS | - | Open |
| #229, #545 | Index-TTS / Index-TTS2 | #334 (WIP) | WIP |
| #1461 | Ming-omni-tts | - | Open |
| #1154 | VoxCPM | - | Open |
| #184 | VibeVoice | - | Open |
| #862 | Step-Audio-R1.1 | #464 (WIP) | WIP |
| #271, #272 | Step Audio 2 / Step Audio EditX | - | Open |
| #1824 | Kimi-Audio-7B | - | New |
| #1962 | VoXtream2 | - | New |
| #1967 | SoulX-Duplug-0.6B | - | New |
| #1748 | FunAudioChat S2S | #1748 | In progress |
4. March Work Plan
4.1 P0: Must Ship
| Task | PR/Issue | Owner | ETA | Status |
|---|---|---|---|---|
| Nightly performance benchmark CI | #1700 | @linyueqian | Done | |
| WebSocket streaming audio | #1719 | @Sy0307 | Done | |
| Fix hanging requests | #1525 | @linyueqian | Done | |
| Fix v0.17 voice clone regression | #1774 | @Sy0307 | Done (#1945) | |
| Config refactor phase 1 | #1115 | @lishunyang12 | Done (Mar 12) |
4.2 P1: Should Ship
| Task | PR/Issue | Owner | ETA | Status |
|---|---|---|---|---|
| Audio/speech Prometheus metrics | #1720 | @Temirulan | Mar 16 | In progress |
| Dynamic TTFA | #1714 | @JuanPZuluaga | Done | |
| Streaming text input | #1230, #1766, #1883 | @lishunyang12, @thrashingstate | Mar 23 | In progress |
| Speech batch endpoint | #1701 | @divyanshsinghvi | Mar 23 | WIP |
| CosyVoice3 stabilization | #1685, #1703 | @divyanshsinghvi, @indevn | Mar 23 | #1685 Done, #1703 open |
| Fish Speech S2 Pro | #1798 | @linyueqian | Done | |
| Fish Speech S2 Pro perf | #1859 | @Sy0307 | Mar 23 | Under review |
| MOSS-TTS integration | #1370 | @anurag12-webster | Mar 30 | In progress |
| TTS integration agent | - | @linyueqian | Ongoing | See section 5.2 |
| Qwen3-TTS test coverage | #1911 | @R2-Y | Mar 23 | Under review |
| Performance: talker CUDA graph | #1925 | @evezhier | Mar 23 | Under review |
| Performance: CodePredictor torch.compile | #1913 | @JuanPZuluaga | Mar 23 | Under review |
| Performance: GPU-resident audio_codes | #1985 | @DomBrown | Mar 23 | Under review |
4.3 P2: Stretch Goals / Start This Month
| Task | Issue | Owner | Notes |
|---|---|---|---|
| GLM-TTS | #821 | @YeungYathin | AR -> Vocoder, 2-stage. Previous PR #834 closed. Newly assigned. Follow #1225 and #1693. |
| Ming-omni-tts | #1461 | Unassigned | inclusionAI/Ming-omni-tts-16.8B-A3B. AR+FlowMatching -> AudioVAE, 2-stage. |
| Index-TTS | #334 | @divyanshsinghvi | WIP since Dec, needs rebase. |
| F5-TTS | #1551 | @ekagra-ranjan | Flow-matching DiT. May need new stage types. |
| Chatterbox TTS (Turbo) | #899 | @lishunyang12 | PR #1517 reopened, in progress. |
| FunAudioChat S2S | #1748 | @nemoramo | AR -> Code2Wav, 2-stage. Under review. |
| Step-Audio-R1.1 | #862 | @wuli666 | PR #464 WIP. |
| Kimi-Audio-7B | #1824 | Unassigned | New model request. |
| VoXtream2 | #1962 | Unassigned | New model request. |
| SoulX-Duplug-0.6B | #1967 | Unassigned | New model request. |
| Speaker embedding passthrough | #1227 | @marksverdhei | Pre-computed x-vectors, voice blending. |
5. Architecture & Design
5.1 New Model Onboarding (Manual Path)
Per RFC #1225 and developer guide #1693:
- Define stage architecture (AR, decoder, vocoder, etc.)
- Create YAML stage config with
async_chunk: true - Implement stage input processor (
<stage_a>2<stage_b>_async_chunk) - Add
chunked_decode_streaming()to final stage - Add e2e tests and examples
5.2 TTS Integration Agent (Automated Path)
Build an agent to automate new TTS model onboarding. Given a HuggingFace model, the agent should:
- Analyze model architecture (AR, DiT, flow-matching, etc.) and identify stage boundaries
- Generate YAML stage config following patterns in RFC #1225
- Scaffold stage input processors, model wrappers, and e2e tests
- Validate against the TTS model developer guide (#1693)
This reduces manual effort per model and enables the community to contribute models faster. Especially valuable for AR-based models that follow the same pattern as Qwen3-TTS.
Owner: @linyueqian
5.3 WebSocket vs HTTP Streaming
Both should coexist:
- HTTP
/v1/audio/speechwithTransfer-Encoding: chunkedfor OpenAI-compatible clients - WebSocket
/v1/audio/speech/wsfor interactive/bidirectional use cases - WebSocket enables streaming text input (#1230)
5.4 Metrics Strategy (#1720)
Key metrics to standardize across all TTS models:
tts_request_duration_seconds(histogram)tts_time_to_first_audio_seconds(histogram)tts_realtime_factor(histogram)tts_active_requests(gauge)tts_tokens_per_second(summary)
5.5 Config Refactor Impact (#1115)
PR #1115 has merged (Mar 12). All existing TTS configs will need migration to the new format. New models should target the new format.
6. Model Support Matrix
| Model | Architecture | Stages | Offline | Online | Streaming | async_chunk | Status |
|---|---|---|---|---|---|---|---|
| Qwen3-TTS | AR -> SpeechTokenizer | 2 | Yes | Yes | Yes | Yes | Production |
| Fish Speech S2 Pro | Dual-AR (Slow+Fast) -> DAC | 3 | Yes | Yes | Yes | Yes | Merged |
| CosyVoice3 | AR -> Flow+HiFiGAN | 2 | Yes | Yes | Partial | WIP | Beta |
| Mistral TTS | AR -> Mimi Decoder | 2 | WIP | - | - | - | In Progress |
| MOSS-TTS | AR -> AudioDecoder | 2 | WIP | - | - | - | In Progress |
| Index-TTS | GPT+DVAE -> Vocoder | 2 | WIP | - | - | - | WIP |
| GLM-TTS | AR -> Vocoder | 2 | - | - | - | - | Not Started |
| Ming-omni-tts | AR+Flow -> AudioVAE | 2 | - | - | - | - | Not Started |
| F5-TTS | DiT (flow-matching) | 1-2 | - | - | - | - | Not Started |
| Chatterbox TTS (Turbo) | - | - | - | - | - | - | In Progress (#1517) |
| FunAudioChat S2S | AR -> Code2Wav | 2 | WIP | - | - | - | In Progress (#1748) |
| Step-Audio-R1.1 | TBD | TBD | WIP | - | - | - | WIP (#464) |
| VoxCPM | AR<->DIT -> Vocoder | 2 | - | - | - | - | Not Started |
| VibeVoice | TBD | TBD | - | - | - | - | Not Started |
| Kimi-Audio-7B | TBD | TBD | - | - | - | - | New Request |
| VoXtream2 | TBD | TBD | - | - | - | - | New Request |
| SoulX-Duplug-0.6B | TBD | TBD | - | - | - | - | New Request |
7. Timeline
| Week | Focus |
|---|---|
| Mar 23-28 | #1701 (batch endpoint), #1230/#1883 (streaming input), CosyVoice3 #1703, performance PRs (#1925, #1913, #1985, #1797), test coverage (#1911) |
| Mar 30+ | MOSS-TTS integration, new model PRs (Mistral TTS, GLM-TTS, Ming-omni-tts), TTS agent iteration |
Feedback Period.
Two weeks (Mar 10 - Mar 24, 2026).
CC List.
@hsliuustc0106 @Gaohan123 @gcanlin @Sy0307 @linyueqian @JuanPZuluaga @divyanshsinghvi @lishunyang12 @Temirulan @ekagra-ranjan @marksverdhei @anurag12-webster @indevn @ZhanqiuHu @Lidang-Jiang @LJH-LBJ @gerayking @tsdocode @xulusjb @dubin555 @zhaotyer @RomanKoshkin @YanickSchraner @JackLeeHal @yuanheng-zhao @lolyhop @pengchengneo @farzanehnakhaee70 @MyronWang @qibaoyuan @wuli666 @nemoramo @lengrongfu @Etelis @ashok-arora @david6666666 @DomBrown @evezhier @thrashingstate @R2-Y @tzhouam
Any Other Things.
Related Issues & RFCs:
- #938 - Qwen3-TTS Production Ready (February milestone, predecessor)
- #1225 - General TTS Model Implementation (architecture patterns)
- #1479 - WebSocket Streaming Audio Output RFC (completed)
- #1595 - Decouple Model-Specific Logic from Model Runner
- #1600 - TTS Model Performance Optimization on NPU
- #886 - NPU 2026 Q1 Roadmap
- #1131 - Modular Chunk-Based Communication Architecture
- #1770 - Migrate to Model Runner V2
- #1603 - Voice Clone RFC for Qwen3-TTS Base
- #808 - vLLM-Omni Model Support (master tracking)
- #1807 - Unify Migration of Omni Test Case Stage Config YAMLs (new)