今天我们宣布,在 SGLang-Omni 上实现对 Higgs Audio v3 TTS 的端到端服务。Higgs Audio v3 TTS 是 Boson AI 为对话式语音智能体开发的文本转语音模型:它能够以低延迟生成自然且富有表现力的语音,支持 100 种语言,单词错误率/字符错误率仅为个位数,并允许开发者直接从输入文本流中控制情感、风格、韵律和音效。
对我们而言,服务 Higgs 不仅仅是增加一个 TTS 模型。Higgs 代表了一类更广泛的生成工作负载,在这类负载中,端到端的路径不再是单一的自回归解码循环。相反,生成过程被拆分为多个阶段,每个阶段具有不同的计算模式、延迟要求和内存行为。SGLang-Omni 正是我们为这类多阶段模型构建的推理框架。
注意:演示视频来自 Higgs Audio v3 TTS,其合成音频生成由 SGLang-Omni 支持。
认识 Higgs Audio v3 TTS
专为真实对话设计
一个好的对话式 TTS 模型不能等到一个完整打磨好的段落才发声。在真实的语音智能体场景中,模型可能只看到半句话,甚至几个词,就需要开始说话。随着更多文本的到达,生成的语音仍需在说话人身份、情感和节奏上保持连贯。
Higgs Audio v3 TTS 正是为这种流式交互模式而设计的。它可以在完整句子或标点符号到达之前就开始合成,然后随着文本流的增长继续生成,同时保持稳定的输出。
在架构上,Higgs 是一个基于 Qwen3-4B 主干网络、参数量约为 40 亿的自回归解码器。它处理交错排列的文本和音频 token。音频通过 Higgs Tokenizer 编码为 8 个离散码本,帧率为 25 fps,采用延迟模式交错排列,通过融合的多码本嵌入映射到主干网络的隐藏状态中,再通过融合的多码本输出头解码回 24 kHz 的波形。生成过程在文本块和音频块之间交替进行,因此每个新的音频片段都同时基于参考音频和已生成的上下文。
多语言质量
在 Boson AI 内部的 Higgs-Multilingual 评测集(涵盖 111 种语言和方言)上,Higgs Audio v3 TTS 在 100 种语言上实现了个位数的 WER/CER。在公开的多语言语音克隆基准测试中,v3 在 Seed-TTS、CV3 和 MiniMax-Multilingual 上也取得了宏观平均个位数的 WER/CER。零样本语音克隆仅需一段简短参考音频片段,且同一参考片段可跨语言使用。
下表报告了零样本语音克隆的 WER/CER(↓,%)。每个数字均为对应基准测试语言集的宏观平均值,使用了可复现的指标和归一化方法。
| 基准测试 | 语言数量 | WER/CER ↓ |
|---|---|---|
| Seed-TTS | 2 | 1.11 |
| CV3 | 9 | 4.41 |
| MiniMax-Multilingual | 23 | 2.74 |
| Higgs-Multilingual | 111 | 3.61 |
每种语言在 Seed-TTS 上的详细分解结果以及 WavLM 说话人相似度指标,可在 SGLang Omni Higgs Cookbook 中查阅。
通过文本流控制语音输出
Higgs Audio v3 TTS 同样设计为可控的。开发者可以直接在输入文本中插入控制标签,以在同一段话语中改变情绪、切换说话风格、调整语速和音高、插入停顿或触发音效:
<|emotion:amusement|><|prosody:expressive_high|>Wait, wait, that was kind of hilarious. <|sfx:laughter|>Hehe, no, seriously, I was not ready for that.
标签系列涵盖 20 多种情绪(`<|emotion:elation|>`、`<|emotion:anger|>`、`<|emotion:sadness|>`……)、风格(`<|style:singing|>`、`<|style:whispering|>`、`<|style:shouting|>`)、韵律(`<|prosody:speed_very_slow|>`、`<|prosody:pitch_high|>`、`<|prosody:pause|>`、`<|prosody:long_pause|>`)以及音效(`<|sfx:cough|>`、`<|sfx:laughter|>`、`<|sfx:sigh|>`……)。不同类别的标签可以组合使用。完整目录见 SGLang Omni Higgs Cookbook。
使用 SGLang-Omni 部署 Higgs
Higgs 在 SGLang-Omni 上部署并进行了优化。与标准的大语言模型不同,Higgs 以及许多现代 TTS 或多模态全能模型并不自然地适配单一的统一自回归解码循环。它们的端到端生成路径包含多个阶段:有些类似于标准的自回归解码,有些是轻量级的函数式计算,还有一些则持续消费数据块并流式返回音频。
SGLang-Omni 的目标是以简洁的运行时结构来服务这类模型:每个阶段根据自身的计算模式进行调度,阶段之间通过低开销通道进行通信,而 GPU 分配、进程拓扑和内存预算则由框架统一管理。
基于高性能 SGLang 后端的多阶段解码
单阶段模型已有成熟的推理服务路径:自回归大语言模型由 SGLang 主框架优化,扩散模型则由 SGLang-Diffusion 支持。SGLang-Omni 专注于不同的领域:那些端到端生成过程被拆分为多个具有不同计算特性的阶段的模型。Higgs 就是一个例子。Qwen3-Omni 的 Thinker → Talker → MTP 流水线、Fish Audio S2-Pro 的串行嵌套双 AR 设计,以及 Ming-Omni 和 LLaDA2.0-Uni 等全模态模型,都属于同一类别。
正因如此,SGLang-Omni 运行时是围绕“阶段”这一抽象概念构建的。模型配置会静态声明流水线中的各个阶段、它们的 GPU 分配以及进程拓扑。分配层和拓扑层负责准备工作进程。协调器负责在阶段之间路由请求。每个阶段充当一个 IO 外壳:它从上游阶段接收数据,将工作交给其内部的调度器,并将输出流式传输给下游阶段。
不同的阶段可以使用不同的调度器。AR 阶段,例如 Qwen3-Omni Thinker,通常使用 OmniScheduler,它在保留 SGLang 的连续批处理、混合预填充/解码调度、KV 缓存管理、树缓存和 CUDA Graph 支持的同时,将这些功能适配到面向全模态的原生请求对象和流式输出上。非 AR 阶段,例如小型编码器和聚合器,可以使用 SimpleScheduler,它本质上是一个清晰的 get → forward → put 循环。流式阶段则使用 StreamingSimpleScheduler 来管理数据块和完成生命周期,例如处于流式模式下的 Higgs 声码器。
阶段之间的接口是统一的,但每个阶段可以选择与其自身计算模式相匹配的执行策略。为了使这一点既实用又高效,我们专注于三个基础设施组件:
- 分层通信。轻量级控制消息(包括提交、数据就绪、流式传输、完成、关闭和中止)通过 ZMQ/msgpack 控制平面传输。张量负载通过中继数据平面传输,可用的后端包括 shm、nccl、nixl 和 mooncake。同进程边界可使用本地调度,符合条件的同 GPU 流式传输块可使用 CUDA IPC,跨进程边界则保持相同的阶段级契约。
- 进程-GPU-阶段拓扑。流水线在配置中声明阶段、路由、流式传输边、进程组、GPU 放置、张量并行大小以及可选的融合阶段组。非 TP 阶段显式声明其进程组。TP 阶段扩展为每个秩的进程,其中秩 0 拥有外部阶段 IO。紧凑的共置部署和更大的拆分/TP 部署是同一拓扑描述的不同实例,而非独立的服务堆栈。
- 内存隔离。在多阶段运行时中,GPU 内存是阶段级的资源契约,而非全局调度器的一个分配份额。每个由 GPU 支持的阶段可以声明 `runtime.resources.total_gpu_memory_fraction`;在启动前,放置验证会汇总每个 GPU 上的预算。当多个进程组共享一张显卡时,这些预算必须明确指定,这样某个阶段就不会静默地消耗为另一阶段预留的内存。
复用全模态特定优化
在集成 Higgs 的同时,我们还将反复出现的全模态优化提取为可复用的框架模块。相似的计算模式不应在每个模型中重新实现,性能优化工作应存在于运行时中,而非分散在特定模型的流水线里。
- 支持 CUDA Graph 的反馈运行器。Higgs 的 `tts_engine` 默认启用 CUDA Graph 捕获,并使用专为 AR + 多码本反馈循环设计的模型运行器。该运行器处理静态缓冲区分配、延迟捕获以及对 Python 端 gather/scatter 操作的额外关注。相同的运行器接口还支持 Qwen3-Omni、Fish Audio S2-Pro 以及其他 SGLang-Omni 模型的单步前瞻异步解码。
- 流式声码器调度器。Higgs、Qwen3-Omni、Fish Audio S2-Pro 及相关模型都需要类似的流式音频生命周期:初始化每个请求的状态、累积传入的代码块、在上下文足够时立即输出音频窗口、在 stream_done 时刷新,并向流式客户端返回紧凑的最终负载。编解码器和窗口逻辑仍因模型而异,但服务生命周期是共通的。
借助这些抽象,新的多阶段模型不再需要散布在代码库各处的、包含 if-else 分支的定制化流水线。开发者将模型划分为调度段,选择合适的调度器和模型运行器钩子,声明拓扑结构和内存契约,然后让框架处理路由、流式传输、数据移动、进程放置以及阶段级资源隔离。
不断壮大的多阶段模型生态
Higgs 现已加入 SGLang-Omni 已支持的 TTS 和全模态模型行列:
| 模型 | 类型 | 备注 |
|---|---|---|
| Higgs Audio v3 TTS | TTS | 语音克隆、流式传输、100 种语言 |
| Fish Audio S2-Pro | TTS | 语音克隆、流式传输 |
| Voxtral TTS | TTS | 预设语音、流式传输、9 种语言 |
| Qwen3-TTS | TTS | 语音克隆、流式传输、10 种语言 |
| MOSS-TTS | TTS | 语音克隆、流式传输、31 种语言 |
| Qwen3-Omni | 全模态 | 文本/图像/音频/视频 → 文本 + 音频 |
| Ming-Omni | 全模态 | 流式 TTS |
| LLaDA2.0-Uni | 多模态 | 文本 + 图像理解与生成 |
这些模型从外部看各不相同,但在推理系统层面,它们面临相同的根本问题:如何将多个异构阶段组织成稳定、高效且可扩展的生成流水线。这就是为什么将 Higgs 接入 SGLang-Omni 主要工作是声明其流水线(预处理 → audio_encoder → tts_engine → 声码器)并添加模型特定的钩子,而不是从头构建服务栈。
端到端优化 Higgs
除了框架抽象,我们还对 Higgs 流水线进行了端到端优化。主要优化项如下所列;实现细节和进度追踪请参见 Higgs 优化路线图(#478)及代码仓库。
- AR 主干:为解码循环捕获 CUDA Graph,为全模态 AR 循环实现异步一步前瞻解码,并将每步的逐 D2H 同步批处理为单次传输。
- 编码器:将预处理融合到编码器阶段,为重复使用的参考音频设置 LRU 缓存,以及一个批处理音频编码器。
- 声码器:批处理声码器解码。
- 缓存:基于参考音频划分的 RadixAttention 缓存,并采用额外键命名空间,以便重复的语音克隆参考可以复用前缀缓存。
- 调度与流式传输:放弃定制调度器,改用共享的 OmniScheduler,并加入实时 SSE 流式调度器,以减少首段音频的生成时间。
性能
我们在完整的 Seed-TTS EN 数据集上评估 Higgs(每次运行 N=1088)。客户端使用 --max-concurrency 参数扫描,Higgs 服务器配置为 max_running_requests=16、bf16 并启用 CUDA Graph。每行报告在 1× H100 上运行 3 次的平均值。
| 并发数 | 吞吐量(请求/秒) | 平均延迟 | RTF(每请求) | 音频秒数/秒 |
|---|---|---|---|---|
| 1 | 1.62 | 617 毫秒 | 0.147 | 6.89 |
| 2 | 2.70 | 742 毫秒 | 0.180 | 11.37 |
| 4 | 5.45 | 733 毫秒 | 0.177 | 22.84 |
| 8 | 8.91 | 898 毫秒 | 0.217 | 37.38 |
| 16 | 14.74 | 1079 毫秒 | 0.262 | 61.84 |
- 并发数:客户端在途请求的最大数量(--max-concurrency)。
- 吞吐量(请求/秒):完成的请求数除以基准测试总挂钟时间。
- 平均延迟:每个请求的平均端到端时间,从发送请求到接收完整响应。
- RTF(每请求):每个请求的处理时间与生成的音频时长之平均比值。低于 1 的值表示快于实时。
- 音频秒数/秒:生成的音频总秒数除以基准测试总挂钟时间。
要复现结果,请遵循基准测试脚本。
亲自尝试
详细说明请参见 SGLang Omni Higgs Cookbook。以下命令展示了实现可用设置的最快捷路径。
安装与部署
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 bosonai/higgs-audio-v3-tts-4b
sgl-omni serve \
--model-path bosonai/higgs-audio-v3-tts-4b \
--port 8000
零样本合成
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"input": "Hello, how are you?"}' \
--output output.wav
参考输出:
对于语音克隆,我们建议同时提供参考音频和参考转录文本,这通常能提高克隆质量:
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "Have a nice day and enjoy south california sunshine.",
"references": [{
"audio_path": "https://sgl-project.github.io/sglang-omni/_static/audio/male-voice.wav",
"text": "Hey, Adam here. Let'\''s create something that feels real, sounds human, and connects every time."
}],
"temperature": 0.8,
"top_k": 50,
"max_new_tokens": 1024
}' \
--output output.wav
参考输入:
参考输出:
流式传输
设置 "stream": true 以通过服务器发送事件接收音频。客户端可以在完整生成完成前开始播放,因为声码器会增量式地发出 WAV 数据块。-N 标志会禁用 curl 的输出缓冲,以便 SSE 事件在到达时立即打印:
curl -N -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "Get the trust fund to the bank early.",
"references": [{
"audio_path": "https://sgl-project.github.io/sglang-omni/_static/audio/male-voice.wav",
"text": "Hey, Adam here. Let'\''s create something that feels real, sounds human, and connects every time."
}],
"stream": true
}'
对于原始 PCM 流式传输(无 SSE JSON),请参阅 Higgs TTS cookbook。
参考输出:
内联控制 token
控制 token 可以直接嵌入输入字段,不同类别的 token 也可以组合使用。一般来说,将情感、风格、语速、音高或富有表现力的韵律等传递性 token 放在每一轮对话的开头;在需要停顿的位置放置 `<|prosody:pause|>` / `<|prosody:long_pause|>`;并将每个 `<|sfx:…|>` 与紧随其后的对应拟声词配对。完整目录请参见技术手册。
情感:愉悦 + 笑声
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "<|emotion:amusement|><|prosody:expressive_high|>Wait, wait, that was kind of hilarious. <|sfx:laughter|>Hehe, no, seriously, I was not ready for that.",
"temperature": 0.8,
"top_k": 50,
"max_new_tokens": 1024
}' \
--output output.wav
参考输出:
情感:愤怒 + 喊叫
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "<|emotion:anger|><|style:shouting|>No, that is not okay! We cannot ship something that sounds broken, delayed, and unnatural.",
"temperature": 0.8,
"top_k": 50,
"max_new_tokens": 1024
}' \
--output output.wav
参考输出:
情感:惊讶 + 尖叫
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "<|emotion:surprise|><|prosody:pitch_high|><|sfx:screaming|>Ah! Wait, I almost forgot! Higgs Audio v3 also supports over one hundred languages.",
"references": [{
"audio_path": "https://sgl-project.github.io/sglang-omni/_static/audio/ref_voice.wav",
"text": "It was the night before my birthday. Hooray! It’s almost here! It may not be a holiday, but it’s the best day of the year."
}],
"temperature": 0.8,
"top_k": 50,
"max_new_tokens": 1024
}' \
--output output.wav
参考输出:
组合示例:
下面的示例在一个简短的高考风格英语听力对话中,结合了情感、音效和韵律 token,对话在两位说话者之间进行:
指令
第一部分——她询问错过的课程:
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "<|emotion:contemplation|>Hi David, I missed the biology class today because I caught a cold. <|sfx:cough|>Ahem! Sorry, Could you tell me what the teacher covered?",
"references": [{
"audio_path": "https://sgl-project.github.io/sglang-omni/_static/audio/female-voice.wav",
"text": "By repeating what students say, teachers can demonstrate that they are listening. By extending what students say."
}],
"temperature": 0.8,
"top_k": 50,
"max_new_tokens": 1024
}' \
--output part1.wav
第二部分——他解释课程内容:
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "<|emotion:enthusiasm|>Sure, no problem! We learned how plants make food through photosynthesis, and <|prosody:long_pause|> there will be a quiz this Friday.",
"references": [{
"audio_path": "https://sgl-project.github.io/sglang-omni/_static/audio/male-voice.wav",
"text": "Hey, Adam here. Let'\''s create something that feels real, sounds human, and connects every time."
}],
"temperature": 0.8,
"top_k": 50,
"max_new_tokens": 1024
}' \
--output part2.wav
第三部分——她向他道谢:
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "<|emotion:relief|>Oh, that is really helpful. Thank you!",
"references": [{
"audio_path": "https://sgl-project.github.io/sglang-omni/_static/audio/female-voice.wav",
"text": "By repeating what students say, teachers can demonstrate that they are listening. By extending what students say."
}],
"temperature": 0.8,
"top_k": 50,
"max_new_tokens": 1024
}' \
--output part3.wav
拼接(每行之间约 0.6 秒间隔):
ffmpeg -y \
-i part1.wav -f lavfi -t 0.6 -i anullsrc=r=24000:cl=mono \
-i part2.wav -f lavfi -t 0.6 -i anullsrc=r=24000:cl=mono \
-i part3.wav \
-filter_complex "[0:a][1:a][2:a][3:a][4:a]concat=n=5:v=0:a=1" \
gaokao_listening.wav
参考输出:
演示
你也可以通过一条命令同时启动后端和浏览器 UI:
CUDA_VISIBLE_DEVICES=0 ./playground/higgs/start.sh
路线图
对于 SGLang-Omni 来说,端到端地服务 Higgs 是一个重要的里程碑,但并非终点。我们正在多个方向上持续推进:
- 跟踪上游 SGLang(#658):迁移至最新的 SGLang,使 AR 主干网络能够持续继承主线 SGLang 的改进,包括 CUDA/PyTorch 构建更新、内核优化、调度以及推测解码。
- 按模型重构(#661):延续 RFC #188 的方向,采用更清晰的按模型抽象。我们希望新模型集成更像“声明拓扑结构并接入钩子”,而不是在整个框架中添加特殊分支。
- 端到端强化学习(#663):将 SGLang-Omni 用作全模态和 TTS 模型的高吞吐量 rollout 后端,并设置明确的奖励目标,进一步连接推理服务与后训练环节。
跨节点多阶段流水线以及更完整的扩散阶段支持也正在进行中。随着阶段抽象、统一调度器接口、分层通信以及跨阶段内存预算的到位,这些能力可以在同一框架内发展,而无需再搭建另一套服务栈。
加入我们
SGLang-Omni 仍在快速发展。我们希望它成为多阶段生成模型的通用推理基础:新模型不应需要从头搭建推理服务栈,也不应将特殊逻辑分散在十几个文件中。它们应当能够以清晰的阶段、拓扑声明和模型特定的钩子来表达,而调度、通信、内存管理和流式处理则由框架来处理。
如果您对多阶段推理、TTS、全能模型、多模态生成、推理系统或强化学习回滚后端感兴趣,我们非常期待与您合作。无论您的专长是内核、调度、通信、模型接入还是基准测试,都欢迎贡献和讨论。
致谢
SGLang-Omni — 蔡浩广、蔡尚明、陈秋江、邓嘉欣、高文耀、高逸飞、顾靖雯、关一桐、陈晨红、金浩、景新立、李胜贵、林俊荣、陆新宇、罗源、Ratish Palanisamy、钱明、曲金涛、史帅、王超、Richard Wang、王淑文、夏子杰、杨宇浩、叶雪松、尹悦、范尹、张高凯、张晓宇、张一驰、赵晨阳。
Higgs Audio v3 TTS (Boson AI) — 李沐、Alex Smola、Lindsey Allen、孟思林、白珂、Ruskin Raj Manku、周华鹏、沈东明、Jonah Mackey、李毅、尹维苏、刘一志、王新宇、余浩。
了解更多
- 模型:bosonai/higgs-audio-v3-tts-4b
- 博客:Higgs Audio v3 TTS
- 推理服务框架:GitHub 上的 SGLang-Omni
- 文档:SGLang-Omni 文档 · Higgs TTS 使用手册
- Higgs 优化路线图:#478
- 设计背景:SGLang-Omni:为多阶段生成模型重新设计推理框架
Today we are announcing end-to-end serving for Higgs Audio v3 TTS on SGLang-Omni. Higgs Audio v3 TTS is Boson AI's text-to-speech model for conversational voice agents: it generates natural and expressive speech at low latency, supports 100 languages with single-digit WER/CER, and lets developers control emotion, style, prosody, and sound effects directly from the input text stream.
For us, serving Higgs is not just about adding one more TTS model. Higgs represents a broader class of generation workloads where the end-to-end path is no longer a single autoregressive decode loop. Instead, generation is split across multiple stages with different compute patterns, latency requirements, and memory behavior. SGLang-Omni is the inference framework we built for exactly this class of multi-stage models.
Note: The demo video is from Higgs Audio v3 TTS, where the synthetic audio generation is supported on SGLang-Omni.
Meet Higgs Audio v3 TTS
Designed for Real Conversations
A good conversational TTS model cannot wait for a fully polished paragraph. In a real voice-agent setting, the model may only see half a sentence, or even a few words, before it needs to start speaking. As more text arrives, the generated voice still has to remain coherent in speaker identity, emotion, and pace.
Higgs Audio v3 TTS was designed for that streaming interaction pattern. It can begin synthesis before a full sentence or punctuation mark arrives, then continue as the text stream grows while preserving a stable delivery.
Architecturally, Higgs is a roughly 4B-parameter autoregressive decoder built on a Qwen3-4B backbone. It consumes interleaved text and audio tokens. Audio is encoded by the Higgs Tokenizer into 8 discrete codebooks at 25 fps, staggered with a delayed pattern, mapped into the backbone hidden states through a fused multi-codebook embedding, and decoded back into a 24 kHz waveform through a fused multi-codebook head. Generation alternates between text and audio chunks, so each new audio segment is grounded in both the reference audio and the context generated so far.
Multilingual Quality
On Boson AI's internal Higgs-Multilingual suite, which covers 111 languages and dialects, Higgs Audio v3 TTS reaches single-digit WER/CER on 100 languages. On public multilingual voice-cloning benchmarks, v3 also achieves macro-averaged single-digit WER/CER on Seed-TTS, CV3, and MiniMax-Multilingual. Zero-shot voice cloning only needs a short reference clip, and the same reference can be used across languages.
The table below reports WER/CER (↓, %) for zero-shot voice cloning. Each number is macro-averaged over the language set of the corresponding benchmark, using reproducible metrics and normalization.
| Benchmark | Languages | WER/CER ↓ |
|---|---|---|
| Seed-TTS | 2 | 1.11 |
| CV3 | 9 | 4.41 |
| MiniMax-Multilingual | 23 | 2.74 |
| Higgs-Multilingual | 111 | 3.61 |
Per-language Seed-TTS breakdowns and WavLM speaker similarity are available in the SGLang Omni Higgs Cookbook.
Controlling Delivery from the Text Stream
Higgs Audio v3 TTS is also designed to be controllable. Developers can put control tags directly into the input text to change emotion, switch speaking style, adjust speed and pitch, insert pauses, or trigger sound effects within the same utterance:
<|emotion:amusement|><|prosody:expressive_high|>Wait, wait, that was kind of hilarious. <|sfx:laughter|>Hehe, no, seriously, I was not ready for that.
The tag families cover 20+ emotions (<|emotion:elation|>, <|emotion:anger|>, <|emotion:sadness|>, ...), styles (<|style:singing|>, <|style:whispering|>, <|style:shouting|>), prosody (<|prosody:speed_very_slow|>, <|prosody:pitch_high|>, <|prosody:pause|>, <|prosody:long_pause|>), and sound effects (<|sfx:cough|>, <|sfx:laughter|>, <|sfx:sigh|>, ...). Tags from different categories can be combined. The full catalogue is in the SGLang Omni Higgs Cookbook.
Serving Higgs with SGLang-Omni
Higgs is served and optimized on SGLang-Omni. Unlike a standard LLM, Higgs and many modern TTS or omni models do not fit naturally into one uniform autoregressive decode loop. Their end-to-end generation path contains multiple stages: some look like standard AR decoding, some are lightweight function-style computation, and some continuously consume chunks and stream audio back.
The goal of SGLang-Omni is to serve this kind of model with a clean runtime structure: each stage is scheduled according to its own compute pattern, stages communicate through low-overhead channels, and GPU placement, process topology, and memory budgets are managed by the framework.
Multi-stage Decoding with a High-Performance SGLang Backend
Single-stage models already have strong serving paths: autoregressive LLMs are optimized by SGLang main, and diffusion models are supported by SGLang-Diffusion. SGLang-Omni focuses on a different regime: models whose end-to-end generation is split into multiple stages with different compute characteristics. Higgs is one example. Qwen3-Omni's Thinker → Talker → MTP pipeline, Fish Audio S2-Pro's serially nested Dual-AR design, and fully omni-modal models such as Ming-Omni and LLaDA2.0-Uni fall into the same category.
This is why the SGLang-Omni runtime is built around the stage abstraction. A model configuration statically declares the stages in the pipeline, their GPU placement, and the process topology. The placement and topology layers prepare the workers. The Coordinator routes requests between stages. Each Stage acts as an IO shell: it receives data from upstream stages, hands work to its internal Scheduler, and streams outputs to downstream stages.
Different stages can use different schedulers. AR stages, such as the Qwen3-Omni Thinker, usually use OmniScheduler, which preserves SGLang's continuous batching, mixed prefill/decode scheduling, KV cache management, tree cache, and CUDA Graph support while adapting them to omni-native request objects and streaming outputs. Non-AR stages, such as small encoders and aggregators, can use SimpleScheduler, which is essentially a clear get → forward → put loop. Streaming stages use StreamingSimpleScheduler to manage chunk and done lifecycles, such as the Higgs vocoder in streaming mode.
The interface between stages is uniform, but each stage can choose the execution strategy that matches its own compute pattern. To make this practical and fast, we focus on three pieces of infrastructure:
- Layered communication. Lightweight control messages, including submit, data-ready, stream, complete, shutdown, and abort, go through a ZMQ/msgpack control plane. Tensor payloads move through the relay data plane, with
shm,nccl,nixl, andmooncakebackends available. Same-process edges can use local dispatch, eligible same-GPU streaming chunks can use CUDA IPC, and cross-process edges keep the same stage-level contract. - Process-GPU-stage topology. Pipelines declare stages, routing, streaming edges, process groups, GPU placement, tensor-parallel size, and optional fused stage groups in config. Non-TP stages explicitly declare their process group. TP stages expand into per-rank processes, with rank 0 owning external stage IO. Compact colocated deployments and larger split/TP deployments are different instances of the same topology description, not separate serving stacks.
- Memory isolation. In a multi-stage runtime, GPU memory is a stage-level resource contract rather than one global scheduler fraction. Each GPU-backed stage can declare
runtime.resources.total_gpu_memory_fraction; placement validation sums budgets per GPU before startup. When multiple process groups share a card, those budgets must be explicit, so one stage cannot silently consume memory reserved for another.
Reusing Omni-Specific Optimizations
While integrating Higgs, we also pulled recurring omni optimizations into reusable framework modules. Similar compute patterns should not be reimplemented in each model, and performance work should live in the runtime rather than being scattered across model-specific pipelines.
- CUDA-Graph-friendly feedback runners. Higgs'
tts_engineenables CUDA Graph capture by default and uses a model runner designed for the AR + multi-codebook feedback loop. The runner handles static buffer assignment, deferred capture, and extra care around Python-side gather/scatter. The same runner interface also supports one-step-lookahead async decode for Qwen3-Omni, Fish Audio S2-Pro, and other SGLang-Omni models. - Streaming vocoder schedulers. Higgs, Qwen3-Omni, Fish Audio S2-Pro, and related models all need a similar streaming audio lifecycle: initialize per-request state, accumulate incoming code chunks, emit audio windows as soon as enough context is available, flush on
stream_done, and return a compact final payload to streaming clients. Codec and windowing logic remain model-specific, but the serving lifecycle is shared.
With these abstractions, a new multi-stage model does not need a bespoke pipeline with if-else branches scattered across the codebase. Developers partition the model into scheduling segments, choose the right scheduler and model-runner hooks, declare topology and memory contracts, and let the framework handle routing, streaming, data movement, process placement, and stage-level resource isolation.
A Growing Multi-Stage Model Ecosystem
Higgs now joins the TTS and omni models already supported by SGLang-Omni:
| Model | Type | Notes |
|---|---|---|
| Higgs Audio v3 TTS | TTS | Voice cloning, streaming, 100 languages |
| Fish Audio S2-Pro | TTS | Voice cloning, streaming |
| Voxtral TTS | TTS | Named voices, streaming, 9 languages |
| Qwen3-TTS | TTS | Voice cloning, streaming, 10 languages |
| MOSS-TTS | TTS | Voice cloning, streaming, 31 languages |
| Qwen3-Omni | Omni | Text/image/audio/video → text + audio |
| Ming-Omni | Omni | Streaming TTS |
| LLaDA2.0-Uni | Multimodal | Text + image understanding and generation |
These models look different from the outside, but at the inference-system level they share the same underlying problem: how to organize multiple heterogeneous stages into a stable, efficient, and extensible generation pipeline. That is why onboarding Higgs on SGLang-Omni was mostly about declaring its pipeline (preprocessing → audio_encoder → tts_engine → vocoder) and adding model-specific hooks, rather than building a serving stack from scratch.
Optimizing Higgs End-to-End
Beyond the framework abstraction, we also optimized the Higgs pipeline end to end. The main pieces are listed below; implementation details and tracking live in the Higgs optimization roadmap (#478) and the repository.
- AR backbone: CUDA Graph capture for the decode loop, async one-step-lookahead decode for the omni AR loop, and batching per-step D2H syncs into a single transfer.
- Encoder: fusing preprocessing into the encoder stage, an LRU cache for reused reference audio, and a batched audio encoder.
- Vocoder: batched vocoder decode.
- Caching: RadixAttention cache partitioned by reference audio with
extra_keynamespacing, so repeated voice-cloning references can reuse prefix cache. - Scheduling and streaming: dropping the bespoke scheduler in favor of the shared
OmniScheduler, plus real SSE streaming schedulers to reduce time to first audio.
Performance
We evaluate Higgs on the full Seed-TTS EN set (N=1088 per run). The client sweeps --max-concurrency against a Higgs server configured with max_running_requests=16, bf16, and CUDA Graph enabled. Each row reports the mean of 3 runs on 1× H100.
| Concurrency | Throughput (req/s) | Mean latency | RTF (per-req) | audio_s/s |
|---|---|---|---|---|
| 1 | 1.62 | 617 ms | 0.147 | 6.89 |
| 2 | 2.70 | 742 ms | 0.180 | 11.37 |
| 4 | 5.45 | 733 ms | 0.177 | 22.84 |
| 8 | 8.91 | 898 ms | 0.217 | 37.38 |
| 16 | 14.74 | 1079 ms | 0.262 | 61.84 |
- Concurrency: Maximum number of in-flight client requests (
--max-concurrency). - Throughput (req/s): Completed requests divided by total benchmark wall-clock time.
- Mean latency: Average end-to-end time per request, from sending the request to receiving the full response.
- RTF (per-req): Average ratio of processing time to generated audio duration per request. Values below 1 are faster than real time.
- audio_s/s: Total seconds of audio produced divided by total benchmark wall-clock time.
To reproduce the results, follow the benchmark script.
Try it Yourself
Detailed instructions are in the SGLang Omni Higgs Cookbook. The commands below show the shortest path to a working setup.
Install and Serve
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 bosonai/higgs-audio-v3-tts-4b
sgl-omni serve \
--model-path bosonai/higgs-audio-v3-tts-4b \
--port 8000
Zero-shot synthesis
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"input": "Hello, how are you?"}' \
--output output.wav
Reference output:
For voice cloning, we recommend providing both the reference audio and the reference transcript (text), which usually improves cloning quality:
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "Have a nice day and enjoy south california sunshine.",
"references": [{
"audio_path": "https://sgl-project.github.io/sglang-omni/_static/audio/male-voice.wav",
"text": "Hey, Adam here. Let'\''s create something that feels real, sounds human, and connects every time."
}],
"temperature": 0.8,
"top_k": 50,
"max_new_tokens": 1024
}' \
--output output.wav
Reference input:
Reference output:
Streaming
Set "stream": true to receive audio over Server-Sent Events. The client can start playback before the full generation finishes because the vocoder emits incremental WAV chunks. The -N flag disables curl's output buffering so SSE events print as they arrive:
curl -N -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "Get the trust fund to the bank early.",
"references": [{
"audio_path": "https://sgl-project.github.io/sglang-omni/_static/audio/male-voice.wav",
"text": "Hey, Adam here. Let'\''s create something that feels real, sounds human, and connects every time."
}],
"stream": true
}'
For raw PCM streaming (no SSE JSON), see the Higgs TTS cookbook.
Reference output:
Inline Control Tokens
Control tokens can be embedded directly in the input field, and tokens from different categories can be combined. In general, put delivery tokens such as emotion, style, speed, pitch, or expressive prosody at the beginning of each turn; place <|prosody:pause|> / <|prosody:long_pause|> where the pause should happen; and pair each <|sfx:…|> with matching onomatopoeia right after it. The full catalogue is in the cookbook.
Emotion: amusement + laughter
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "<|emotion:amusement|><|prosody:expressive_high|>Wait, wait, that was kind of hilarious. <|sfx:laughter|>Hehe, no, seriously, I was not ready for that.",
"temperature": 0.8,
"top_k": 50,
"max_new_tokens": 1024
}' \
--output output.wav
Reference output:
Emotion: anger + shouting
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "<|emotion:anger|><|style:shouting|>No, that is not okay! We cannot ship something that sounds broken, delayed, and unnatural.",
"temperature": 0.8,
"top_k": 50,
"max_new_tokens": 1024
}' \
--output output.wav
Reference output:
Emotion: surprise + screaming
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "<|emotion:surprise|><|prosody:pitch_high|><|sfx:screaming|>Ah! Wait, I almost forgot! Higgs Audio v3 also supports over one hundred languages.",
"references": [{
"audio_path": "https://sgl-project.github.io/sglang-omni/_static/audio/ref_voice.wav",
"text": "It was the night before my birthday. Hooray! It’s almost here! It may not be a holiday, but it’s the best day of the year."
}],
"temperature": 0.8,
"top_k": 50,
"max_new_tokens": 1024
}' \
--output output.wav
Reference output:
Combined example:
The example below combines emotion, sound effects, and prosody tokens in a short Gaokao-style English listening dialogue between two speakers:
Commands
Part 1 — she asks about the missed class:
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "<|emotion:contemplation|>Hi David, I missed the biology class today because I caught a cold. <|sfx:cough|>Ahem! Sorry, Could you tell me what the teacher covered?",
"references": [{
"audio_path": "https://sgl-project.github.io/sglang-omni/_static/audio/female-voice.wav",
"text": "By repeating what students say, teachers can demonstrate that they are listening. By extending what students say."
}],
"temperature": 0.8,
"top_k": 50,
"max_new_tokens": 1024
}' \
--output part1.wav
Part 2 — he explains what was covered:
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "<|emotion:enthusiasm|>Sure, no problem! We learned how plants make food through photosynthesis, and <|prosody:long_pause|> there will be a quiz this Friday.",
"references": [{
"audio_path": "https://sgl-project.github.io/sglang-omni/_static/audio/male-voice.wav",
"text": "Hey, Adam here. Let'\''s create something that feels real, sounds human, and connects every time."
}],
"temperature": 0.8,
"top_k": 50,
"max_new_tokens": 1024
}' \
--output part2.wav
Part 3 — she thanks him:
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "<|emotion:relief|>Oh, that is really helpful. Thank you!",
"references": [{
"audio_path": "https://sgl-project.github.io/sglang-omni/_static/audio/female-voice.wav",
"text": "By repeating what students say, teachers can demonstrate that they are listening. By extending what students say."
}],
"temperature": 0.8,
"top_k": 50,
"max_new_tokens": 1024
}' \
--output part3.wav
Concatenate (~0.6 s gap between lines):
ffmpeg -y \
-i part1.wav -f lavfi -t 0.6 -i anullsrc=r=24000:cl=mono \
-i part2.wav -f lavfi -t 0.6 -i anullsrc=r=24000:cl=mono \
-i part3.wav \
-filter_complex "[0:a][1:a][2:a][3:a][4:a]concat=n=5:v=0:a=1" \
gaokao_listening.wav
Reference output:
Demo
You can also launch the backend and browser UI with one command:
CUDA_VISIBLE_DEVICES=0 ./playground/higgs/start.sh
Roadmap
For SGLang-Omni, serving Higgs end to end is an important milestone, but it is not the finish line. We are continuing to push on several tracks:
- Tracking upstream SGLang (#658): moving to the latest SGLang so AR backbones continue to inherit improvements from mainline SGLang, including CUDA/PyTorch build updates, kernel improvements, scheduling, and speculative decoding.
- Per-model refactor (#661): continuing the direction of RFC #188 with a cleaner per-model abstraction. We want new-model integration to look more like "declare topology and plug in hooks" than adding special branches across the framework.
- End-to-end RL (#663): using SGLang-Omni as a high-throughput rollout backend for omni and TTS models with explicit reward targets, further connecting serving and post-training.
Cross-node multi-stage pipelines and fuller diffusion-stage support are also in progress. With stage abstraction, a unified scheduler interface, layered communication, and cross-stage memory budgeting already in place, these capabilities can grow within the same framework instead of requiring another serving stack.
Join us
SGLang-Omni is still moving quickly. We want it to become a general inference foundation for multi-stage generative models: new models should not need a serving stack from scratch, nor special-case logic scattered across a dozen files. They should be expressible as clear stages, topology declarations, and model-specific hooks, with scheduling, communication, memory management, and streaming handled by the framework.
If you are interested in multi-stage inference, TTS, omni models, multimodal generation, inference systems, or RL rollout backends, we would love to work with you. Whether your strength is kernels, scheduling, communication, model onboarding, or benchmarking, contributions and discussions are welcome.
Acknowledgments
SGLang-Omni — Haoguang Cai, Shangming Cai, Qiujiang Chen, Jiaxin Deng, Wenyao Gao, Yifei Gao, Jingwen Gu, Yitong Guan, Chenchen Hong, Hao Jin, Xinli Jing, Shenggui Li, Junrong Lin, Xinyu Lu, Yuan Luo, Ratish Palanisamy, Mick Qian, JinTao Qu, Shuai Shi, Chao Wang, Richard Wang, Shuwen Wang, Zijie Xia, Yuhao Yang, Xuesong Ye, Yue Yin, Fan Yin, Gaokai Zhang, Xiaoyu Zhang, Yichi Zhang, Chenyang Zhao.
Higgs Audio v3 TTS (Boson AI) — Mu Li, Alex Smola, Lindsey Allen. Silin Meng, Ke Bai. Ruskin Raj Manku, Huapeng Zhou, Dongming Shen, Jonah Mackey, Erik Li, Weisu Yin, Yizhi Liu, Xinyu Wang, Hao Yu.
Learn More
- Model:
bosonai/higgs-audio-v3-tts-4b - Blog: Higgs Audio v3 TTS
- Serving framework: SGLang-Omni on GitHub
- Documentation: SGLang-Omni docs · Higgs TTS cookbook
- Higgs optimization roadmap: #478
- Design background: SGLang-Omni: Redesigning the Inference Framework for Multi-Stage Generative Models