StreamVox
StreamVox 是一个开源的本地流式语音合成 SDK,用统一的 TTSEngine 接入 Qwen3-TTS、S2-Pro、VoxCPM2 和 MOSS-TTS-Nano,适用于语音助手、实时对话、配音和离线播报。音频按块生成,可以边合成边播放,无需等待整段完成。
当前版本:2.0.0 · CPython 3.12。预编译发行包面向 Windows x64;Linux x86_64 的环境准备与直接运行方式见 Linux 源码运行。SDK 全部功能免费提供,采用 Apache-2.0;模型权重和第三方组件遵循各自许可证。
主要特性
- 流式合成:逐块输出音频,便于接入播放器、语音助手和实时通信。
- 多模型、统一接口:支持参考音色克隆,并按模型提供音色设计、续写、多说话人和情绪控制等能力。
- 多种硬件后端:支持 CPU,以及 NVIDIA、AMD、Intel 显卡;同一个安装包包含 llama.cpp 的 CPU、CUDA、Vulkan 后端,ONNX 组件可选择 CPU、CUDA 或 DirectML。
- 轻量运行环境:使用 llama.cpp 与 ONNX Runtime,运行依赖无需安装 PyTorch。
- 本地与离线部署:内置模型下载和文件校验;模型文件完整时,可以直接从本地目录离线合成。
- 参考音色复用:参考音频可预先编码为 Prompt,并按模型缓存,减少重复处理。
性能与资源占用
流式推理速度
以下为 SDK 2.0.0 在 Windows 11、NVIDIA GeForce RTX 4090 24 GB、Intel Core i7-13700KF 上的单请求实测。各模型使用同一段参考音频和固定中文短句进行音色克隆,预热 1 次后测量 3 次,表中取各指标的中位数。
| 模型 | 合成后端 | 首包延迟 | RTF | 相对实时速度 |
|---|---|---|---|---|
| Qwen3-TTS 0.6B | CUDA | 186 ms | 0.148 | 6.76× |
| Qwen3-TTS 1.7B | CUDA | 187 ms | 0.159 | 6.29× |
| S2-Pro | CUDA | 401 ms | 0.347 | 2.88× |
| VoxCPM2 | CUDA | 113 ms | 0.344 | 2.91× |
| MOSS-TTS-Nano | ONNX CUDA | 83 ms | 0.234 | 4.27× |
| MOSS-TTS-Nano | ONNX CPU | 90 ms | 0.262 | 3.81× |
首包延迟从发起 stream() 到收到第一个音频片段计时,不包含模型加载、参考音频编码和预热。RTF = 完整合成耗时 / 生成音频时长,越小越快;例如 RTF 为 0.2,表示生成 1 秒音频约需 0.2 秒,即约 5 倍实时速度。
CUDA 行使用 CUDA 合成后端,部分模型的参考编码组件仍按模型设计使用 CPU。MOSS 两行使用相同的 seed=42。实际表现会随输入文本、参考音频、后端和硬件变化,完整条件与逐次数据见 性能实测记录。
硬件资源建议
| 模型 | 显存起步 / 推荐 | 内存起步 / 推荐 |
|---|---|---|
| Qwen3-TTS 0.6B | 2 / 3 GB | 3 / 5 GB |
| Qwen3-TTS 1.7B | 3 / 4 GB | 4 / 6 GB |
| S2-Pro | 7 / 8 GB | 6 / 8 GB |
| VoxCPM2 | 7 / 8 GB | 8 / 12 GB |
| MOSS-TTS-Nano | CPU 无需显存;GPU 推荐 2 GB | 3 / 5 GB |
以上为当前模型配置的经验建议,显存列针对 GPU 运行。长文本、较长参考音频及其他程序的资源占用会影响实际需求。VoxCPM2 当前使用 GGUF Q8、LocEnc / LocDiT FP32 和 AudioVAE FP16 组合。
支持模型与选型
| 模型名 | 采样率 | 主要能力与适用场景 | 指南 |
|---|---|---|---|
qwen3-tts-clone-0.6b-gguf |
24000 Hz | 单参考音色克隆,适合优先考虑资源占用的场景 | Qwen3 |
qwen3-tts-clone-1.7b-gguf |
24000 Hz | 单参考音色克隆、多语言生成,适合通用语音应用 | Qwen3 |
s2-pro-4b-gguf |
44100 Hz | 多参考、多说话人和表现控制,适合角色对白与配音 | S2-Pro |
voxcpm2-gguf |
48000 Hz | 音色设计、参考克隆和续写,适合需要声音控制的场景 | VoxCPM2 |
moss-tts-nano-onnx |
48000 Hz | 轻量 ONNX 路线,适合无独显机器与 CPU 部署 | MOSS |
没有独立显卡时,可以先尝试 MOSS-TTS-Nano;需要参考音色克隆时,可从 Qwen3-TTS 入手;需要音色设计与续写时选择 VoxCPM2;多说话人和表现控制需求可以考虑 S2-Pro。
SDK 包不包含模型权重。S2-Pro 转换权重采用 Fish Audio Research License,商业用途需要 Fish Audio 单独书面许可;其余三类当前默认转换权重采用 Apache-2.0。模型能力、来源和许可边界见对应指南及 模型许可表。
安装
Windows 发行包
先安装 uv,创建独立环境:
uv venv --python 3.12 --managed-python
.venv\Scripts\Activate.ps1
从 GitHub Releases v2.0.0 下载 streamvox-2.0.0-cp312-none-win_amd64.whl,按硬件选择安装命令:
| 场景 | 安装命令 |
|---|---|
| CPU | uv pip install "./streamvox-2.0.0-cp312-none-win_amd64.whl[cpu]" |
| AMD / Intel / 核显,或使用 DirectML | uv pip install "./streamvox-2.0.0-cp312-none-win_amd64.whl[directml]" |
| NVIDIA:ONNX 与 llama 都使用 CUDA | uv pip install "./streamvox-2.0.0-cp312-none-win_amd64.whl[onnx-cuda,llama-cuda]" |
| ONNX 使用 DirectML,llama 使用 CUDA | uv pip install "./streamvox-2.0.0-cp312-none-win_amd64.whl[directml,llama-cuda]" |
cpu、directml、onnx-cuda 三者互斥,同一环境只安装一种 ONNX Runtime。llama-cuda 可以与其中任意一组组合,仅补充 llama CUDA 所需的 NVIDIA 运行依赖。CUDA 和 Vulkan 仍需要宿主机安装相应显卡驱动。
检查安装:
python -c "import streamvox; print(streamvox.__version__)"
Linux 源码运行
以下以 Ubuntu 22.04 及以上的 x86_64 CPU 环境为例,其他 Linux 发行版需满足预编译库的系统依赖。直接运行仓库中的 Python 源码,依赖安装到独立虚拟环境;当前 setup.py 的 wheel 构建只接受 Windows,因此 Linux 使用 --no-install-project 跳过项目自身安装,无需执行 pip install .。
1. 准备系统依赖与 Python 环境
先安装 uv,再执行:
sudo apt-get update
sudo apt-get install -y git curl ca-certificates libsndfile1 libgomp1 libstdc++6
git clone https://github.com/RoversCode/StreamVox.git
cd StreamVox
uv sync --locked --python 3.12 --managed-python --extra cpu --group dev --no-install-project
source .venv/bin/activate
python -c "import streamvox; print(streamvox.__version__)"
2. 下载 GGUF 模型使用的预编译动态库
Qwen3-TTS、S2-Pro 和 VoxCPM2 需要 llama.cpp 动态库;仅使用 MOSS-TTS-Nano 时可以跳过。默认从 llama.cpp b8683 发布页 下载已经编译好的 Linux 库,无需本机编译。CPU 与 Vulkan 包均可从该页面取得,版本应与项目固定的 b8683 保持一致。
mkdir -p .artifacts/llama-cpu-b8683 streamvox/bin
curl -fL --retry 3 \
https://github.com/ggml-org/llama.cpp/releases/download/b8683/llama-b8683-bin-ubuntu-x64.tar.gz \
-o .artifacts/llama-b8683-bin-ubuntu-x64.tar.gz
tar -xzf .artifacts/llama-b8683-bin-ubuntu-x64.tar.gz -C .artifacts/llama-cpu-b8683
cp -a .artifacts/llama-cpu-b8683/llama-b8683/lib*.so* streamvox/bin/
export LD_LIBRARY_PATH="$PWD/streamvox/bin${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
复制全部共享库并保留软链接,包括 libllama.so*、libggml.so*、libggml-base.so* 和 libggml-cpu-*.so 等后端库,保持它们来自同一个归档。CPU 预编译包要求 glibc 至少为 2.34,且系统 C++ 运行库提供 GLIBCXX_3.4.29。每次打开新终端,进入仓库根目录后重新激活环境并设置上述 LD_LIBRARY_PATH。streamvox.native_assets 下载的是 Windows DLL,Linux 使用上面的预编译 .so 下载方式。
3. 从源码直接运行
在仓库根目录运行模块入口,使 Python 能找到本地 streamvox 源码:
python -m example.synthesize --help
python -m example.synthesize \
--model qwen3-tts-clone-0.6b-gguf \
--reference-audio /path/to/reference.wav \
--reference-text "参考音频的实际内容。" \
--text "你好,欢迎使用 StreamVox。" \
--device cpu --llama-backend cpu --onnx-provider cpu \
--output output.wav
将参考音频路径与转写替换为自己的素材。首次使用模型名会下载权重;离线运行时,将 --model 替换为已准备好的本地 bundle 目录。使用 MOSS 时,将模型名换成 moss-tts-nano-onnx 即可。若使用 uv run 执行命令,需加 --no-sync,避免自动安装项目并触发 Windows wheel 构建。测试与发行验证见 开发文档。
需要 GPU 时,可按后端选择运行库。切换时先备份并移出旧的 streamvox/bin/,再将选定归档的整套库复制到新目录:
| 场景 | 环境与构建调整 | 运行参数 |
|---|---|---|
| llama Vulkan,ONNX CPU | 保留 --extra cpu;下载 Linux Vulkan 预编译包,将其中全部 lib*.so* 放到 streamvox/bin/;glibc 至少为 2.34,C++ 运行库需提供 GLIBCXX_3.4.30,并安装 libvulkan1 与显卡驱动 |
--device gpu:0 --llama-backend vulkan --onnx-provider cpu |
| llama CUDA,ONNX CPU | 同步依赖时额外加 --extra llama-cuda;准备匹配 b8683 的 Linux CUDA 运行库,或按 可选编译步骤 构建 |
--device gpu:0 --llama-backend cuda --onnx-provider cpu |
| llama 与 ONNX 均使用 CUDA | 将 --extra cpu 换成 --extra onnx-cuda --extra llama-cuda;同样准备 Linux CUDA 运行库 |
--device gpu:0 --llama-backend cuda --onnx-provider cuda |
Vulkan 包需要包含 libggml-vulkan.so,CUDA 包需要包含 libggml-cuda.so,并各自携带匹配的公共库与 CPU 后端。b8683 官方发布页提供 Linux CPU 和 Vulkan 包;需要 CUDA、定制构建或预编译包与系统不兼容时,可使用 原生库自编译说明。CUDA 运行库默认从当前虚拟环境的 NVIDIA 依赖中发现;自行提供时,通过 STREAMVOX_NVIDIA_LIB_DIRS 指定所在目录,多个目录用冒号分隔。DirectML 仅用于 Windows。现有性能记录来自 Windows,Linux 完整模型合成与 GPU 组合仍需在目标环境验证。
快速开始
以下示例使用你自行准备、并有权使用的参考音频。prompt_text 应与音频内容一致。
import numpy as np
import soundfile as sf
from streamvox import TTSEngine
if __name__ == "__main__":
engine = TTSEngine(
model="qwen3-tts-clone-0.6b-gguf",
device="cpu",
llama_backend="cpu",
onnx_provider="cpu",
)
try:
prompt = engine.make_prompt(
role_name="demo",
audio_path="your-reference.wav",
prompt_text="请替换为参考音频中实际说出的内容。",
persist=False,
)
chunks = list(engine.stream(
text="你好,欢迎使用 StreamVox。",
role_name=prompt,
language="chinese",
))
if not chunks:
raise RuntimeError("本次合成没有生成音频。")
audio = np.concatenate(chunks, axis=-1)
sf.write("output.wav", audio, engine.runtime.sample_rate)
finally:
engine.shutdown()
可运行的命令行示例见 example/synthesize.py:
python example/synthesize.py --model qwen3-tts-clone-0.6b-gguf --reference-audio C:/audio/reference.wav --reference-text "参考音频的实际内容。" --text "你好,欢迎使用 StreamVox。" --output output.wav
stream() 逐块返回 float32 的 numpy.ndarray,采样率从 engine.runtime.sample_rate 读取。上面的示例为方便保存 WAV 而汇总所有片段;接入实时播放时,可以在迭代过程中逐块播放或发送音频。
TTSEngine 除 model 外的初始化参数必须按名称传入。模型名可替换为已下载模型的目录;离线部署建议使用本地目录并保留默认哈希校验。Prompt 缓存、长音频写入与更多调用方式见 使用文档。
后端选择
device 表达 CPU/GPU 和设备编号;llama_backend 与 onnx_provider 分别选择 GGUF 和 ONNX 后端。例如,在安装 [directml,llama-cuda] 的 NVIDIA 环境中:
from streamvox import TTSEngine
if __name__ == "__main__":
engine = TTSEngine(
model="voxcpm2-gguf",
device="gpu:0",
llama_backend="cuda",
onnx_provider="directml",
)
try:
print(engine.actual_backends)
finally:
engine.shutdown()
显式请求的后端不可用时会抛出异常。可以用 engine.actual_backends 查看实际选择;多卡配置与各模型的后端说明见 设备说明。
原创文章,作者:云东方,如若转载,请注明出处:https://www.yundongfang.com/Yun1232.html