技术合作

在 SGLang-Omni 上部署原生流式 48 kHz 的 MOSS-TTS Local Transformer v1.5 语音服务

我们正在发布 MOSS-TTS-Local-Transformer-v1.5 在 SGLang-Omni 上的端到端 serving 支持,这项工作由 SGLang-Omni Team 和 OpenMOSS 团队共同完成。


在 SGLang-Omni 上部署原生流式 48 kHz 的 MOSS-TTS Local Transformer v1.5 语音服务

MOSI、OpenMOSS团队与 SGLang-Omni Team·2026年6月

我们正在发布 MOSS-TTS-Local-Transformer-v1.5 在 SGLang-Omni 上的端到端 serving 支持。这项工作由 SGLang-Omni Team 和 OpenMOSS团队 共同完成。

MOSS-TTS-Local-Transformer-v1.5 是一个开放的 TTS 模型,支持 48 kHz 立体声、zero-shot voice cloning、长文本合成、多语言生成、时长控制和 native streaming。用 demo script 调起这个模型并不难,真正难的是把它服务好:一个请求会跨过参考音频编码、Qwen3-4B 自回归 backbone、frame-local 的 12-codebook sampling loop,以及有状态的 codec decoder。

SGLang-Omni 没有把 MOSS-TTS-Local-Transformer-v1.5 硬塞进单个 LLM decode loop,而是把它作为三阶段 pipeline 来服务。本文的工作主要围绕这层映射:阶段边界在哪里,哪些部分需要模型专用 hook,以及模型在负载下运行后暴露出了哪些瓶颈。

MOSS-TTS-Local-Transformer-v1.5 模型

MOSS-TTS-Local-Transformer-v1.5 是 MOSS-TTS v1.5 家族的第二个旗舰模型。它沿用了 Audio Tokenizer + LLM autoregressive 路线,使用更重的 audio codec,以及 Global Transformer + Local Transformer 的生成路径。

它支持 direct TTS、continuation、zero-shot voice cloning、时长控制、显式 pause markup 例如 [pause 3.2s],以及最长 10 分钟的 long-form generation。模型覆盖 31 种主要语言,训练数据约为 400 万小时多语言语音。

MOSS-TTS-Local-Transformer-v1.5 模型架构

MOSS-TTS-Local-Transformer-v1.5 model architecture

在音频边界,MOSS 使用 MOSS-Audio-Tokenizer-v2,这是一个 encoder 和 decoder 合计约 2B 参数的 neural audio tokenizer。它以 12.5 Hz 运行,支持 0.125 kbps 到 4 kbps 的可变比特率压缩,重建 48 kHz 立体声音频,并通过 residual vector quantization (RVQ) 表示语音。

生成核心使用 Qwen3-4B backbone。global transformer 按 frame 推进序列。对于每一帧,一层 local transformer 先输出 stop/continue 决策,然后按顺序采样 12 个 RVQ codebook,并在采样下一个 codebook 前把当前采样结果反馈回来。

serving 可见的 token layout 是 [T, 13]:一个 text/control channel 和 12 个 audio codebook channel。text 位置在 channel 0 放 text token,其余 channel 放 audio padding。audio 位置在 channel 0 放 slot/control token,并在每个 audio codebook channel 放一个 RVQ code。这是 MOSS 第一次不再像普通 next-token model 的地方:每个生成的 frame 是一行,而不是一个标量 token。

在公开 model-level evaluation set 上:

BenchmarkWER(越低越好)SIM(越高越好)
Seed-TTS-Eval5.10%69.23%
CV3-Eval7.48%61.59%
MiniMax Multilingual6.37%75.31%
X Voice20.48%63.00%

这些是 offline model metrics。后面的 serving benchmark 使用不同的 evaluation pipeline,应当按端到端系统测量来解读。

MOSS-TTS-Local-Transformer-v1.5 在阿里云 PPU-ZW810 集群上以千卡规模训练。本文聚焦 serving 侧。

为什么 MOSS 需要多阶段 serving runtime

标准 LLM serving engine 围绕一个重复执行的 model loop 构建。MOSS 的一个请求中包含三类不同的工作:

  • 预处理和参考编码。 文本会被 tokenize,参考音频会被加载,参考 waveform 会被编码成 RVQ codes。
  • Autoregressive TTS engine。 Qwen3 backbone 和 local transformer 生成 [1, 13] 的 frame rows。
  • Streaming vocoder。 生成的 RVQ rows 会被有状态的 MOSS codec decoder 解码为 waveform chunks。

每个阶段的瓶颈都不同。参考编码运行大型 neural codec encoder。AR generation 把普通 backbone decode 和一个很小但严格串行的 local codebook loop 混在一起。vocoder 是有状态 decoder,必须跨 chunks 保留 streaming state。系统需要同时管理这三部分,并避免某个阶段的 batching 或内存行为破坏其他阶段。

用 SGLang-Omni 服务 MOSS

SGLang-Omni 将 MOSS-TTS Local Transformer v1.5 作为三阶段 pipeline 来服务:

preprocessing -> tts_engine -> vocoder

preprocessing 阶段解析 OpenAI-compatible request,准备 multi-channel prompt,并为 voice cloning 编码参考音频。tts_engine 阶段运行在 OmniScheduler 上,因此 MOSS 可以复用 SGLang 的 request batching 和 KV-cache 机制,同时携带模型专用的 [T, 13] rows。vocoder 阶段以 stream 方式消费生成的 rows,并从一个持久化的 codec streaming session 返回 audio chunks。

复用的部分是 runtime 形态:stage lifecycle、scheduler interface、inter-stage routing、streaming outputs、process placement,以及 stage-level resource accounting。MOSS 专用的部分更小也更显式:如何构造 multi-channel prompt,如何运行 frame-local codebook loop,以及如何把 MOSS codec 接成 streaming decoder。下一节只聚焦这些 MOSS 专用瓶颈和优化。

MOSS 端到端优化

pipeline 功能完成后,我们优化了 profiling 中反复出现重复工作或 launch overhead 的阶段。

AreaChangeMain BenefitSource
Model serving baselineMOSS Local model、pipeline 和 API 支持建立三阶段 serving 路径PR #728
Reference encodingbatched encoding、content-addressed LRU cache 和 single-flight deduplication避免为复用 speaker 重复运行 codec encoderPR #748PR #778PR #788
AR enginedecode-state pool、frame CUDA Graph support 和 GPU-native row hash让 decode state 保持稳定 GPU 地址,并移除每帧 host hashingPR #745
AR engineframe launch-state pooling 和 async decode plumbing降低 launch 准备开销,并修复 decode-step ownership 问题PR #759PR #758
AR enginecompiled seeded sampler融合 hot sampling path,同时保持 deterministic per-request samplingPR #773
Vocoderstateful streaming session、stream slots 和 coalesced chunk scheduling用 request isolation 支持 frame-level audio streamingPR #753
Vocoderstateful vocoder CUDA Graph加速短 streaming decode stepsPR #798
Cross-stageexplicit colocated memory budgeting防止 codec 和 AR 的内存压力互相干扰PR #810

Source 列为 SGLang-Omni GitHub PR 编号,点击可查看详情。

参考音频编码

voice cloning 经常在很多 prompts 之间复用同一批 speakers。在 MOSS 中这一点很重要,因为参考编码要在 AR generation 开始前运行大型 codec encoder。

内容寻址的参考音频缓存

Content-addressed reference audio cache

SGLang-Omni 将 batched reference encoding 与 content-addressed LRU cache 结合。重复的 reference 由音频内容而不是路径作为 key,因此复制或重命名后的文件仍然可以复用同一个 encoded RVQ result。single-flight 路径会合并同一个 speaker 的并发 miss,避免冷缓存突发时启动重复的 codec encode。

在 SeedTTS English evaluation 中,在 2x H100、concurrency 16 下,将 reference cache capacity 从 256 提升到 1024 entries,使 throughput 提升 32.0%,mean latency 降低 24.3%。内存成本很小,因为 encoded code tensors 很紧凑;更大的 cache 主要是避免 active speaker working set 被驱逐。

AR Engine

MOSS AR engine 有两层计算:Qwen3 backbone 和 local transformer frame-decode loop。SGLang-Omni 用 CUDA Graphs 捕获两者,但保持分离,因为它们的结构和 ownership 不同。

Eager 与 CUDA Graph 执行对比

Eager vs. CUDA Graph execution

backbone graph 使用 SGLang 标准的 CUDA Graph path 进行 causal LM decode。MOSS 专用的 frame graph 捕获一个完整 frame 的 local transformer micro-loop:stop/continue sampling、12 个顺序 codebook projections、codebook feedback,以及为下一帧组装 feedback embedding。它从这个很小但高度串行的 loop 中移除了 launch overhead。

为了让 graph replay 成为可能,MOSS 将 per-request decode state 保存在持久化的 GPU-side pool 中。feedback embeddings、sampling parameters、seeds、counters 和 audio history 跨 frame 保持稳定地址。SGLang-Omni 还把 generated-row radix hash 移到 GPU,避免每帧 CPU hash 和 D2H synchronization。

每帧的 13 次 sampling operation 使用 seeded GPU sampler。我们只 compile 这个 sampling path,不 compile backbone 或 local transformer。在 SeedTTS English、concurrency 16 下,这个窄范围优化在不改变更大模型执行路径的情况下,使 throughput 提升 12.3%,mean latency 降低 11.1%,mean RTF 降低 10.5%。

Streaming Vocoder

vocoder 阶段把生成的 RVQ frames 转换为 audio chunks。由于 MOSS-Audio-Tokenizer-v2 支持 stateful streaming decode,SGLang-Omni 在 vocoder executor 内保留一个持久化的 codec streaming session。

scheduler 管理 stream slots、offline fallback slot、chunk thresholds 和 coalesced decode steps。首个 chunk 可以使用较小 threshold 来降低 time to first audio,后续 chunks 则使用更大的窗口来提高 throughput。当多个请求都有足够的 pending frames 时,scheduler 会把它们合并到一次 codec call 中解码。

短 streaming chunks 对 launch 很敏感,因此 SGLang-Omni 用 CUDA Graphs 捕获常见的 vocoder frame counts。实现中 codec state buffers 保持稳定地址并原地更新,使 graph 可以跨 streaming steps replay。

短 streaming chunks 的加速最明显:

Frames per StepEagerCUDA GraphSpeedup
466.3 ms30.1 ms2.20x
565.8 ms30.7 ms2.14x
865.6 ms34.0 ms1.93x
1365.4 ms40.4 ms1.62x
2574.8 ms58.3 ms1.28x
100222.9 ms215.3 ms1.04x

当 frame count 没有被 capture,或内存紧张时,graph path 会 fallback 到 eager decode。streaming/non-streaming consistency checks 覆盖了这条路径。

内存预算

在默认 MOSS Local config 中,preprocessing、AR generation 和 vocoder execution 可以 colocate 到一张 GPU 上。这种紧凑布局很方便,但 AR engine 和 codec runtime 的 allocation pattern 不同。因此 SGLang-Omni 给 AR engine 一个显式的 colocated memory contract,并为 codec runtime allocations 和 streaming state 预留 headroom。

在单卡 colocated 配置、concurrency 8 下,显式 codec memory budgeting 使 throughput 提升 8.9%,mean RTF 降低 8.4%。更重要的是,它让 memory pressure 下的部署行为可预测。

性能

我们在包含 1088 个 samples 的 SeedTTS English set 上评估优化后的 serving path。下面结果来自启用 vocoder CUDA Graph 后的完整 CI evaluation,使用 2x GPU 和 client concurrency 16。ASR scoring 使用 Qwen3-ASR-1.7B,speaker similarity 使用 WavLM-Large finetune。

ModeCompleted / FailedThroughputAudio ThroughputMean LatencyMean RTFWER
Non-streaming1088 / 05.976 req/s26.303 audio s/s2.669 s0.6441.75%
Streaming1088 / 02.909 req/s12.804 audio s/s5.474 s1.3222.14%

non-streaming 达到 5.976 req/s,mean RTF 为 0.644。streaming 会发出增量 audio chunks;在 concurrency 16 下,平均 inter-chunk interval 是 0.109 s,每个请求平均发出 8.82 个 chunks。streaming throughput 更低是预期内的:vocoder 会用更小 chunks 更频繁地运行,并与 AR engine 共享 GPU 时间。

两个模式的质量数字保持接近:同一个 CI run 中,non-streaming WER 是 1.75%,streaming WER 是 2.14%。streaming/non-streaming artifact consistency checks 也通过。

不要把单项优化的测量结果相加成一个 headline number,因为它们是在不同硬件和 concurrency 设置下采集的。它们更适合用作 MOSS 耗时分布图:reference caching 移除冗余 encoder work,frame CUDA Graphs 移除 local-loop launch overhead,sampler compilation 优化 hot sampling path,vocoder CUDA Graphs 加速短 streaming chunks,memory budgeting 稳定 colocated deployment。

自己试用

SGLang-Omni MOSS-TTS-Local cookbook 提供完整 setup、API options 和 streaming examples。最小路径如下:

安装并启动服务

docker pull lmsysorg/sglang-omni:dev
docker run -it --gpus all --shm-size 32g --ipc host --network host --privileged \
 lmsysorg/sglang-omni:dev /bin/zsh

git clone git@github.com:sgl-project/sglang-omni.git
cd sglang-omni
uv venv .venv -p 3.12
source .venv/bin/activate
uv pip install -v -e .

hf download OpenMOSS-Team/MOSS-TTS-Local-Transformer-v1.5

sgl-omni serve \
 --model-path OpenMOSS-Team/MOSS-TTS-Local-Transformer-v1.5 \
 --port 8000

默认布局会把 AR backbone 和 codec/vocoder colocate 到一张 GPU 上。显式配置位于 examples/configs/moss_tts_local.yaml。

server 启动后,一个基础 synthesis request 会返回 WAV 文件:

curl -X POST http://localhost:8000/v1/audio/speech \
 -H "Content-Type: application/json" \
 -d '{"input": "SGLang-Omni is a great project for high-fidelity speech generation."}' \
 --output output.wav

voice cloning、streaming PCM、duration control、pause markup、pronunciation hints、language hints、sampling parameters 和 benchmark commands 见 cookbook。

Roadmap

当前路径已经端到端可用,但仍有几个部分值得继续改进:

Pool-native frame CUDA Graph。 当前 frame-decode graph 使用 persistent state pools,但 sampling parameters 和 generated rows 旁边仍有一些 staging。更原生的 pool-to-pool graph path 可以简化 launch/resolve 边界。

Adaptive streaming scheduling。 Streaming TTS 存在真实的 latency-throughput trade-off。我们正在探索 load-aware chunk sizing、priority-aware slot scheduling 和更好的 coalescing policies,使低负载请求获得更快的 first audio,同时让高负载部署恢复更多 throughput。

Broader compilation coverage。 codec encoder 和 Qwen3 backbone 仍有 targeted compilation experiments 的空间。我们会把 compile scope 控制在足够窄的范围内,避免 cold-start regressions 和输出变化。

Wider benchmark coverage。 当前测量聚焦 CI 中的 SeedTTS English。我们计划扩展到中文、多语言 evaluation、long-form generation、multiple speaker pools、不同 reference lengths,以及更接近生产的 traffic mixes。

加入我们

如果你对 TTS、omni models、streaming inference、CUDA Graphs、scheduling、communication、model onboarding、benchmarking 或 production serving 感兴趣,欢迎加入我们。

致谢

SGLang-Omni - Jiaxin Deng,Haoguang Cai, Shangming Cai, Yuhao Chen, Kangxiang Shao, Hao Jin, Yifei Gao, Jingwen Gu, Zhihao Guo, Chenchen Hong, Xinli Jing, Xiangrui Ke, Estella Liu, Xinyu Lu, Ratish Palanisamy, Mick Qian, Yijiang Tian, Zijie Xia, Xuesong Ye, Yue Yin, Gaokai Zhang, Xiaoyu Zhang, Chenyang Zhao, Yichi Zhang。

MOSS-TTS Local Transformer v1.5 - Yitian Gong, Kuangwei Chen, Zhicheng Zhang, Botian Jiang, Yiyang Zhang, Kang Yu, Yang Gao, Xiaogui Yang, Qinyuan Chen, Zhaoye Fei, Shimin Li, Xipeng Qiu。

了解更多

MOSI、OpenMOSS 团队与 SGLang-Omni Team・2026 年 6 月

我们正在发布 MOSS-TTS-Local-Transformer-v1.5 在 SGLang-Omni 上的端到端 serving 支持。这项工作由 SGLang-Omni Team 和 OpenMOSS 团队 共同完成。

MOSS-TTS-Local-Transformer-v1.5 是一个开放的 TTS 模型,支持 48 kHz 立体声、zero-shot voice cloning、长文本合成、多语言生成、时长控制和 native streaming。用 demo script 调起这个模型并不难,真正难的是把它服务好:一个请求会跨过参考音频编码、Qwen3-4B 自回归 backbone、frame-local 的 12-codebook sampling loop,以及有状态的 codec decoder。

SGLang-Omni 没有把 MOSS-TTS-Local-Transformer-v1.5 硬塞进单个 LLM decode loop,而是把它作为三阶段 pipeline 来服务。本文的工作主要围绕这层映射:阶段边界在哪里,哪些部分需要模型专用 hook,以及模型在负载下运行后暴露出了哪些瓶颈。

MOSS-TTS-Local-Transformer-v1.5 模型

MOSS-TTS-Local-Transformer-v1.5 是 MOSS-TTS v1.5 家族的第二个旗舰模型。它沿用了 Audio Tokenizer + LLM autoregressive 路线,使用更重的 audio codec,以及 Global Transformer + Local Transformer 的生成路径。

它支持 direct TTS、continuation、zero-shot voice cloning、时长控制、显式 pause markup 例如 [pause 3.2s],以及最长 10 分钟的 long-form generation。模型覆盖 31 种主要语言,训练数据约为 400 万小时多语言语音。

MOSS-TTS-Local-Transformer-v1.5 model architecture

在音频边界,MOSS 使用 MOSS-Audio-Tokenizer-v2,这是一个 encoder 和 decoder 合计约 2B 参数的 neural audio tokenizer。它以 12.5 Hz 运行,支持 0.125 kbps 到 4 kbps 的可变比特率压缩,重建 48 kHz 立体声音频,并通过 residual vector quantization (RVQ) 表示语音。

生成核心使用 Qwen3-4B backbone。global transformer 按 frame 推进序列。对于每一帧,一层 local transformer 先输出 stop/continue 决策,然后按顺序采样 12 个 RVQ codebook,并在采样下一个 codebook 前把当前采样结果反馈回来。

serving 可见的 token layout 是 [T, 13]:一个 text/control channel 和 12 个 audio codebook channel。text 位置在 channel 0 放 text token,其余 channel 放 audio padding。audio 位置在 channel 0 放 slot/control token,并在每个 audio codebook channel 放一个 RVQ code。这是 MOSS 第一次不再像普通 next-token model 的地方:每个生成的 frame 是一行,而不是一个标量 token。

在公开 model-level evaluation set 上:

表格

BenchmarkWER(越低越好)SIM(越高越好)
Seed-TTS-Eval5.10%69.23%
CV3-Eval7.48%61.59%
MiniMax Multilingual6.37%75.31%
X Voice20.48%63.00%

这些是 offline model metrics。后面的 serving benchmark 使用不同的 evaluation pipeline,应当按端到端系统测量来解读。

MOSS-TTS-Local-Transformer-v1.5 在阿里云 PPU-ZW810 集群上以千卡规模训练。本文聚焦 serving 侧。

为什么 MOSS 需要多阶段 serving runtime

标准 LLM serving engine 围绕一个重复执行的 model loop 构建。MOSS 的一个请求中包含三类不同的工作:

  • 预处理和参考编码。 文本会被 tokenize,参考音频会被加载,参考 waveform 会被编码成 RVQ codes。
  • Autoregressive TTS engine。 Qwen3 backbone 和 local transformer 生成 [1, 13] 的 frame rows。
  • Streaming vocoder。 生成的 RVQ rows 会被有状态的 MOSS codec decoder 解码为 waveform chunks。

每个阶段的瓶颈都不同。参考编码运行大型 neural codec encoder。AR generation 把普通 backbone decode 和一个很小但严格串行的 local codebook loop 混在一起。vocoder 是有状态 decoder,必须跨 chunks 保留 streaming state。系统需要同时管理这三部分,并避免某个阶段的 batching 或内存行为破坏其他阶段。

用 SGLang-Omni 服务 MOSS

SGLang-Omni 将 MOSS-TTS Local Transformer v1.5 作为三阶段 pipeline 来服务:

preprocessing -> tts_engine -> vocoder

preprocessing 阶段解析 OpenAI-compatible request,准备 multi-channel prompt,并为 voice cloning 编码参考音频。tts_engine 阶段运行在 OmniScheduler 上,因此 MOSS 可以复用 SGLang 的 request batching 和 KV-cache 机制,同时携带模型专用的 [T, 13] rows。vocoder 阶段以 stream 方式消费生成的 rows,并从一个持久化的 codec streaming session 返回 audio chunks。

复用的部分是 runtime 形态:stage lifecycle、scheduler interface、inter-stage routing、streaming outputs、process placement,以及 stage-level resource accounting。MOSS 专用的部分更小也更显式:如何构造 multi-channel prompt,如何运行 frame-local codebook loop,以及如何把 MOSS codec 接成 streaming decoder。下一节只聚焦这些 MOSS 专用瓶颈和优化。

MOSS 端到端优化

pipeline 功能完成后,我们优化了 profiling 中反复出现重复工作或 launch overhead 的阶段。

表格

AreaChangeMain BenefitSource
Model serving baselineMOSS Local model、pipeline 和 API 支持建立三阶段 serving 路径PR #728
Reference encodingbatched encoding、content-addressed LRU cache 和 single-flight deduplication避免为复用 speaker 重复运行 codec encoderPR #748PR #778PR #788
AR enginedecode-state pool、frame CUDA Graph support 和 GPU-native row hash让 decode state 保持稳定 GPU 地址,并移除每帧 host hashingPR #745
AR engineframe launch-state pooling 和 async decode plumbing降低 launch 准备开销,并修复 decode-step ownership 问题PR #759PR #758
AR enginecompiled seeded sampler融合 hot sampling path,同时保持 deterministic per-request samplingPR #773
Vocoderstateful streaming session、stream slots 和 coalesced chunk scheduling用 request isolation 支持 frame-level audio streamingPR #753
Vocoderstateful vocoder CUDA Graph加速短 streaming decode stepsPR #798
Cross-stageexplicit colocated memory budgeting防止 codec 和 AR 的内存压力互相干扰PR #810

Source 列为 SGLang-Omni GitHub PR 编号,点击可查看详情。

参考音频编码

voice cloning 经常在很多 prompts 之间复用同一批 speakers。在 MOSS 中这一点很重要,因为参考编码要在 AR generation 开始前运行大型 codec encoder。

Content-addressed reference audio cache

SGLang-Omni 将 batched reference encoding 与 content-addressed LRU cache 结合。重复的 reference 由音频内容而不是路径作为 key,因此复制或重命名后的文件仍然可以复用同一个 encoded RVQ result。single-flight 路径会合并同一个 speaker 的并发 miss,避免冷缓存突发时启动重复的 codec encode。

在 SeedTTS English evaluation 中,在 2x H100、concurrency 16 下,将 reference cache capacity 从 256 提升到 1024 entries,使 throughput 提升 32.0%,mean latency 降低 24.3%。内存成本很小,因为 encoded code tensors 很紧凑;更大的 cache 主要是避免 active speaker working set 被驱逐。

AR Engine

MOSS AR engine 有两层计算:Qwen3 backbone 和 local transformer frame-decode loop。SGLang-Omni 用 CUDA Graphs 捕获两者,但保持分离,因为它们的结构和 ownership 不同。

Eager vs. CUDA Graph execution

backbone graph 使用 SGLang 标准的 CUDA Graph path 进行 causal LM decode。MOSS 专用的 frame graph 捕获一个完整 frame 的 local transformer micro-loop:stop/continue sampling、12 个顺序 codebook projections、codebook feedback,以及为下一帧组装 feedback embedding。它从这个很小但高度串行的 loop 中移除了 launch overhead。

为了让 graph replay 成为可能,MOSS 将 per-request decode state 保存在持久化的 GPU-side pool 中。feedback embeddings、sampling parameters、seeds、counters 和 audio history 跨 frame 保持稳定地址。SGLang-Omni 还把 generated-row radix hash 移到 GPU,避免每帧 CPU hash 和 D2H synchronization。

每帧的 13 次 sampling operation 使用 seeded GPU sampler。我们只 compile 这个 sampling path,不 compile backbone 或 local transformer。在 SeedTTS English、concurrency 16 下,这个窄范围优化在不改变更大模型执行路径的情况下,使 throughput 提升 12.3%,mean latency 降低 11.1%,mean RTF 降低 10.5%。

Streaming Vocoder

vocoder 阶段把生成的 RVQ frames 转换为 audio chunks。由于 MOSS-Audio-Tokenizer-v2 支持 stateful streaming decode,SGLang-Omni 在 vocoder executor 内保留一个持久化的 codec streaming session。

scheduler 管理 stream slots、offline fallback slot、chunk thresholds 和 coalesced decode steps。首个 chunk 可以使用较小 threshold 来降低 time to first audio,后续 chunks 则使用更大的窗口来提高 throughput。当多个请求都有足够的 pending frames 时,scheduler 会把它们合并到一次 codec call 中解码。

短 streaming chunks 对 launch 很敏感,因此 SGLang-Omni 用 CUDA Graphs 捕获常见的 vocoder frame counts。实现中 codec state buffers 保持稳定地址并原地更新,使 graph 可以跨 streaming steps replay。

短 streaming chunks 的加速最明显:

表格

Frames per StepEagerCUDA GraphSpeedup
466.3 ms30.1 ms2.20x
565.8 ms30.7 ms2.14x
865.6 ms34.0 ms1.93x
1365.4 ms40.4 ms1.62x
2574.8 ms58.3 ms1.28x
100222.9 ms215.3 ms1.04x

当 frame count 没有被 capture,或内存紧张时,graph path 会 fallback 到 eager decode。streaming/non-streaming consistency checks 覆盖了这条路径。

内存预算

在默认 MOSS Local config 中,preprocessing、AR generation 和 vocoder execution 可以 colocate 到一张 GPU 上。这种紧凑布局很方便,但 AR engine 和 codec runtime 的 allocation pattern 不同。因此 SGLang-Omni 给 AR engine 一个显式的 colocated memory contract,并为 codec runtime allocations 和 streaming state 预留 headroom。

在单卡 colocated 配置、concurrency 8 下,显式 codec memory budgeting 使 throughput 提升 8.9%,mean RTF 降低 8.4%。更重要的是,它让 memory pressure 下的部署行为可预测。

性能

我们在包含 1088 个 samples 的 SeedTTS English set 上评估优化后的 serving path。下面结果来自启用 vocoder CUDA Graph 后的完整 CI evaluation,使用 2x GPU 和 client concurrency 16。ASR scoring 使用 Qwen3-ASR-1.7B,speaker similarity 使用 WavLM-Large finetune。

表格

ModeCompleted / FailedThroughputAudio ThroughputMean LatencyMean RTFWER
Non-streaming1088 / 05.976 req/s26.303 audio s/s2.669 s0.6441.75%
Streaming1088 / 02.909 req/s12.804 audio s/s5.474 s1.3222.14%

non-streaming 达到 5.976 req/s,mean RTF 为 0.644。streaming 会发出增量 audio chunks;在 concurrency 16 下,平均 inter-chunk interval 是 0.109 s,每个请求平均发出 8.82 个 chunks。streaming throughput 更低是预期内的:vocoder 会用更小 chunks 更频繁地运行,并与 AR engine 共享 GPU 时间。

两个模式的质量数字保持接近:同一个 CI run 中,non-streaming WER 是 1.75%,streaming WER 是 2.14%。streaming/non-streaming artifact consistency checks 也通过。

不要把单项优化的测量结果相加成一个 headline number,因为它们是在不同硬件和 concurrency 设置下采集的。它们更适合用作 MOSS 耗时分布图:reference caching 移除冗余 encoder work,frame CUDA Graphs 移除 local-loop launch overhead,sampler compilation 优化 hot sampling path,vocoder CUDA Graphs 加速短 streaming chunks,memory budgeting 稳定 colocated deployment。

自己试用

SGLang-Omni MOSS-TTS-Local cookbook 提供完整 setup、API options 和 streaming examples。最小路径如下:

安装并启动服务

docker pull lmsysorg/sglang-omni:dev
docker run -it --gpus all --shm-size 32g --ipc host --network host --privileged \
 lmsysorg/sglang-omni:dev /bin/zsh

git clone git@github.com:sgl-project/sglang-omni.git
cd sglang-omni
uv venv .venv -p 3.12
source .venv/bin/activate
uv pip install -v -e .

hf download OpenMOSS-Team/MOSS-TTS-Local-Transformer-v1.5

sgl-omni serve \
 --model-path OpenMOSS-Team/MOSS-TTS-Local-Transformer-v1.5 \
 --port 8000

默认布局会把 AR backbone 和 codec/vocoder colocate 到一张 GPU 上。显式配置位于 examples/configs/moss_tts_local.yaml。

server 启动后,一个基础 synthesis request 会返回 WAV 文件:

curl -X POST http://localhost:8000/v1/audio/speech \
 -H "Content-Type: application/json" \
 -d '{"input": "SGLang-Omni is a great project for high-fidelity speech generation."}' \
 --output output.wav

voice cloning、streaming PCM、duration control、pause markup、pronunciation hints、language hints、sampling parameters 和 benchmark commands 见 cookbook。

Roadmap

当前路径已经端到端可用,但仍有几个部分值得继续改进:

Pool-native frame CUDA Graph。 当前 frame-decode graph 使用 persistent state pools,但 sampling parameters 和 generated rows 旁边仍有一些 staging。更原生的 pool-to-pool graph path 可以简化 launch/resolve 边界。

Adaptive streaming scheduling。 Streaming TTS 存在真实的 latency-throughput trade-off。我们正在探索 load-aware chunk sizing、priority-aware slot scheduling 和更好的 coalescing policies,使低负载请求获得更快的 first audio,同时让高负载部署恢复更多 throughput。

Broader compilation coverage。 codec encoder 和 Qwen3 backbone 仍有 targeted compilation experiments 的空间。我们会把 compile scope 控制在足够窄的范围内,避免 cold-start regressions 和输出变化。

Wider benchmark coverage。 当前测量聚焦 CI 中的 SeedTTS English。我们计划扩展到中文、多语言 evaluation、long-form generation、multiple speaker pools、不同 reference lengths,以及更接近生产的 traffic mixes。

加入我们

如果你对 TTS、omni models、streaming inference、CUDA Graphs、scheduling、communication、model onboarding、benchmarking 或 production serving 感兴趣,欢迎加入我们。

致谢

SGLang-Omni - Jiaxin Deng,Haoguang Cai, Shangming Cai, Yuhao Chen, Kangxiang Shao, Hao Jin, Yifei Gao, Jingwen Gu, Zhihao Guo, Chenchen Hong, Xinli Jing, Xiangrui Ke, Estella Liu, Xinyu Lu, Ratish Palanisamy, Mick Qian, Yijiang Tian, Zijie Xia, Xuesong Ye, Yue Yin, Gaokai Zhang, Xiaoyu Zhang, Chenyang Zhao, Yichi Zhang。

MOSS-TTS Local Transformer v1.5 - Yitian Gong, Kuangwei Chen, Zhicheng Zhang, Botian Jiang, Yiyang Zhang, Kang Yu, Yang Gao, Xiaogui Yang, Qinyuan Chen, Zhaoye Fei, Shimin Li, Xipeng Qiu。

了解更多