LiveTalking 更新:集成 vLLM-Omni TTS服务

LiveTalking 最近完成了一次重要的基础设施升级------引入 vLLM-Omni 作为 TTS 推理引擎,并在单张 RTX 3090 上实现了 130ms 首包延迟、13GB 显存占用的流式语音合成。本文从技术角度梳理这次更新的设计思路与实现细节。


为什么要换 TTS 引擎?

LiveTalking 是一个实时的数字人驱动系统,核心链路是 文本 → 语音 → 唇形 → 视频渲染。TTS 处于链路最上游,它的延迟直接决定了端到端响应速度。

在这之前,项目已经接入了腾讯云、阿里云、Azure、Fish Speech、CosyVoice、XTTS 等十余种 TTS 后端,但始终面临两个问题:

  1. 云服务不可离线部署。有些应用场景不能上网,需要全离线部署,此时不能用tts云服务。
  2. 自部署方案碎片化。每种模型有自己的 API 格式、部署方式、采样率,接入和维护成本高。

vLLM-Omni 在 2025 年底发布后,我们看到了统一这些碎片的可能性------它将语音模型的推理纳入 vLLM 框架,提供标准的 OpenAI 兼容 Speech API,同时继承了 vLLM 的 PagedAttention 和连续批处理优化。

于是有了这次更新的核心模块:OmniTTS


架构设计:OmniTTS 适配器

LiveTalking 有一套插件化的 TTS 抽象层。所有 TTS 后端继承 BaseTTS,实现 txt_to_audio() 方法,通过 @register("tts", "xxx") 装饰器注册到全局工厂中。

OmniTTS 遵循同样的契约,但设计上更简洁------整个适配器不到 200 行,核心逻辑只有三步:

python 复制代码
# 1. 构造 OpenAI 兼容请求
body = {
    "input": text,
    "model": "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice",
    "voice": "vivian",
    "response_format": "pcm",
    "speed": 1.0,
    "language": "zh",
    "task_type": "CustomVoice",
}

# 2. 流式 POST,按服务端自然块大小迭代
res = requests.post(f"{server_url}/v1/audio/speech",
                    json=body, stream=True)
for chunk in res.iter_content(chunk_size=None):
    yield chunk

# 3. PCM 重采样 → 20ms 帧 → 推入渲染管线
stream = np.frombuffer(chunk, dtype=np.int16).astype(np.float32) / 32767
stream = resampy.resample(x=stream, sr_orig=24000, sr_new=16000)

几个设计决策值得一提:

chunk_size=None 。我们没有像传统的流式处理那样指定固定块大小(如 6400 字节),而是将 iter_content(chunk_size=None),让 HTTP 层直接按服务端传输编码的自然边界返回数据。这样做的好处是不引入额外缓冲,下游通过一个 last_stream 循环缓冲区拼接余量,保证 20ms 帧边界对齐不丢样本。

模型无关的采样率适配 。不同 vLLM-Omni 模型的输出采样率不同------Qwen3-TTS 是 24kHz,Fish Speech 是 44.1kHz,Voxtral 是 16kHz。OmniTTS 通过 omni_tts_src_sr 参数声明源采样率,内部用 resampy 统一重采样到系统标准的 16kHz,上层无需感知模型差异。

运行时参数覆写 。语音、语速、语言、任务类型等参数既可以在启动时指定默认值,也可以由上游 Avatar 在每条消息的 datainfo 中动态覆写。这意味着同一个数字人会话可以在不同句子之间切换不同的音色或语速,而无需重新初始化连接。


Web 管理界面:

与 OmniTTS 配套,我们为 LiveTalking 新增了一个完整的 TTS 语音管理 Web 界面。它在设计上有几个明确的工程目标:

零依赖 。纯静态 HTML + 原生 JavaScript + Bootstrap 5,不依赖任何前端构建工具或框架。部署时只需把文件放在 Flask 的 static 目录下即可。

全功能闭环。三块核心功能覆盖语音管理的完整生命周期:

  • 语音列表 :调用 GET /v1/audio/voices,以表格展示预设语音和已上传的克隆语音。预设与上传语音同名时自动去重,优先展示用户上传版本。支持一键选用的同时提供删除操作的 UI 入口。

  • 语音克隆 :封装了 POST /v1/audio/voices 的 multipart 上传流程。同意记录 ID 自动生成(consent_ + 时间戳 + 随机串),参考文本改为必填字段,并在音频文件旁内置「识别」按钮------调用浏览器 SpeechRecognition API 实现本地语音转文字,避免依赖额外的 ASR 服务端调用。

  • 合成测试 :完整的 POST /v1/audio/speech 参数面板,覆盖语速滑块(0.25--4.0x)、语言选择(11 种)、输出格式(6 种)、任务类型(3 种)以及可选的高级参数。合成结果以 Blob 形式缓存在浏览器内存中,支持在线播放和下载,无需服务端存储临时文件。


vLLM-Omni 支持的 TTS 模型全景

vLLM-Omni 目前已支持多款主流开源 TTS 模型,覆盖不同质量与速度需求的场景。这些都是可以通过同一套 API 直接调用的:

模型 采样率 参数量 特色
Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice 24kHz 1.7B 阿里通义千问 TTS,语音克隆与定制,首选推荐
Qwen/Qwen3-TTS-12Hz-1.7B-Base 24kHz 1.7B 基础模式,需提供参考音频进行上下文克隆
Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice 24kHz 0.6B 轻量版,适合更低延迟场景
fishaudio/s2-pro 44.1kHz --- Fish Speech S2 Pro,高保真音质
FunAudioLLM/Fun-CosyVoice3-0.5B-2512 24kHz 0.5B 阿里 CosyVoice3,极轻量高效
mistralai/Voxtral-4B-TTS-2603 16kHz 4B Mistral 出品,原生多语言
openbmb/VoxCPM2 16kHz --- 清华 & 面壁智能联合推出
OpenMOSS-Team/MOSS-TTS-Nano 24kHz --- 超轻量,适合边缘设备

vLLM-Omni 为这些模型提供了统一的 OpenAI 兼容接口层:

接口 方法 功能
/v1/audio/speech POST 文本转语音(支持流式)
/v1/audio/voices GET 列出所有可用语音
/v1/audio/voices POST 上传音频样本进行语音克隆
/v1/audio/transcriptions POST 语音转文字(ASR)

开发者切换模型只需改一个参数,无需修改业务代码。


性能实测:3090 单卡部署

以下数据基于 NVIDIA RTX 3090 24GB ,模型为 Qwen/Qwen3-TTS-12Hz-0.6B-Base,使用 vLLM-Omni 默认配置,未做任何量化或裁剪:

指标 数值 说明
首包延迟(TTFB) ~130ms 从 POST 请求发出到首个 PCM chunk 到达
显存占用 ~13GB 模型加载后的稳态显存(包含 KV Cache)
推理模式 流式 HTTP Transfer-Encoding: chunked
输出格式 PCM 24kHz 16bit 下游重采样到 16kHz
并发策略 单路串行 可扩展为 Continuous Batching

vLLM-Omni 的 PagedAttention 使得 KV Cache 在流式生成的整个生命周期中高效管理,模型常驻显存避免了冷启动。对于实时对话场景,130ms 的首包延迟意味着用户说完一句话后,数字人几乎可以立即开始回应------这在体感上是「无缝」的。

显存方面,13GB 在 3090 的 24GB 总容量下还有充裕余量。剩余显存可以用于并行运行数字人的视频渲染模型(如 MuseTalk、Wav2Lip),实现单卡端到端部署。


其他更新

除了 OmniTTS 和 Web 管理界面,还完成了一些基础层面的改进:

  • 环境变量管理 :新增 .env.example 模板和 python-dotenv 自动加载,将 API Key 等敏感配置从命令行参数中解耦出来。

总结

这次更新的主线很清晰------用 vLLM-Omni 统一 TTS 推理层,用 OmniTTS 适配器接入 LiveTalking 的插件体系,用Web 页面补齐语音管理的交互体验。最终在 3090 单卡上实现了 130ms 首包、13GB 显存的流式 TTS。

LiveTalking --- 开源实时交互数字人引擎,支持 musetalk/wav2lip/ernerf,WebRTC/RTMP 推流。

GitHub:https://github.com/lipku/LiveTalking

国内镜像:https://gitee.com/lipku/LiveTalking

文档:https://doc.livetalking.ai

相关推荐
其实防守也摸鱼1 小时前
Claude 大模型新手入门与实战指南
人工智能·python·功能测试·ai·大模型·测评
Dust-Chasing1 小时前
Claude Code源码剖析 - 权限系统
人工智能·python·ai
茉莉玫瑰花茶1 小时前
综合案例 - AI 智能租房助手 [ 4 ]
数据库·python·ai·langgraph
Par@ish1 小时前
关于开源GNU通用许可(GPLv3)详细解说
web安全·开源·开源协议
c_lb72882 小时前
期货量化策略从 Windows 迁到 Linux 服务器:环境注意点
linux·服务器·windows·python
北凉军2 小时前
更换PyCharm 任务栏图标
ide·python·pycharm
yijianace2 小时前
Python爬虫实战:BooksToScrape 多线程爬取与图片下载
开发语言·爬虫·python
LadenKiller2 小时前
期货多品种轮动标的池:天勤 query_quotes 筛品种写法
python·区块链
郑洁文2 小时前
基于Python+回归分析的电子产品需求数据分析与预测
python·数据分析·回归·电子产品需求数据·电子产品数据分析