【开源项目】用 Rust 重构中文 TTS!kokoroi-rs 高性能语音合成引擎介绍

用 Rust 重构中文 TTS!kokoroi-rs 高性能语音合成引擎介绍

摘要:kokoroi-rs 是基于 Rust 和 ONNX Runtime 重构的高性能中文 TTS 引擎,支持 CLI 和 HTTP API 两种使用方式,提供 50+ 种多语言发音人,实现零依赖静态编译部署,实时率可达 5-10 倍,是生产级语音合成场景的理想选择。
关键词:Rust TTS、中文语音合成、Kokoro、ONNX Runtime、高性能语音引擎、静态编译、零依赖部署、流式语音合成

写在前面

如果你关注过开源语音合成(TTS)领域,大概对 Kokoro 这个名字不陌生。作为一个轻量级、多语言的 TTS 模型,Kokoro 凭借 82M 参数量和 Apache-2.0 开源协议,在社区里收获了不少关注。不过,Kokoro 的原生实现主要是 Python 生态,依赖 PyTorch 和大量的 Python 运行时——这在生产环境中往往会带来部署体积大、启动慢、并发能力受限等问题。

那么问题来了:能不能把 Kokoro 搬到 Rust 里,跑出更高的效率?

答案就是今天要聊的主角——kokoroi-rs

kokoroi-rs 是 Kokoro TTS 的 Rust 实现,基于 ONNX Runtime 进行推理,提供 CLI 工具和 HTTP API 服务两种使用方式。

简单来说,它把 Kokoro 的 Python 实现用 Rust 重写了一遍,并且通过 ONNX 格式的模型文件来驱动推理。这样做的好处非常直接:更小的部署体积、更快的启动速度、更高的并发吞吐——对于想把 TTS 能力集成到后端服务里的开发者来说,这些优势几乎都是刚需。

为什么是 Rust + ONNX?

在深入介绍功能之前,先聊聊技术选型背后的逻辑。

Kokoro 原生是 Python + PyTorch 的实现,而 kokoroi-rs 选择了 Rust + ONNX Runtime 的组合。这个选择带来了几个核心优势:

  • 零运行时依赖:Rust 编译成静态二进制,不需要装 Python 环境、不需要装 PyTorch、不需要担心版本冲突。尤其是 Linux 下采用 musl 全静态编译,拷过去就能跑。
  • 高性能推理:ONNX Runtime 本身针对 CPU/GPU 推理做了大量优化,配合 Rust 的多线程流水线架构,实时率可以达到 5-10 倍。
  • 内存安全:Rust 的所有权模型保证了在多线程场景下不会出现数据竞争,这对于需要并行处理多个 TTS 请求的服务端来说尤为重要。

核心功能一览

kokoroi-rs 目前提供了两种主要的使用方式:CLI 命令行工具HTTP API 服务

CLI 工具:简单直接的语音合成

如果你只是想快速把一段文字转成语音,CLI 工具是最直接的方式:

# 基本用法
./koko --text "你好,欢迎使用 Kokoro 语音合成系统。" -o output.wav

# 从文件读取文本
./koko -i input.txt -o output.wav

# 指定发音人风格
./koko --text "今天天气真好" --style zf_xiaobei -o output.wav

# 调整语速和线程数
./koko --text "大家好" --speed 1.2 --threads 4 -o output.wav

# 直接播放音频(需要 aplay 或 ffplay)
./koko --text "播放测试" --play

对于批量处理、脚本集成等场景,CLI 工具已经足够好用。

HTTP API 服务:为生产环境而生

对于需要把 TTS 能力集成到 Web 应用、小程序、智能助手等场景的开发者来说,HTTP API 服务才是重头戏。

启动服务只需要一行命令:

./kokoros-server

默认监听 0.0.0.0:3000,打开浏览器就能看到 Web 演示界面。

服务提供了几个核心 API 端点:

方法 路径 说明
GET / Web 演示页面
GET /health 健康检查
GET /voices 获取所有可用发音人
POST /tts 文本转语音(返回 WAV Base64)
POST /tts/stream 流式文本转语音(SSE)

其中 SSE 流式接口是一个很有意思的设计——音频可以边生成边推送给客户端,特别适合 Web 端低延迟交互场景,比如 AI 对话助手的实时语音回复。

系统架构

下面是 kokoroi-rs 的整体架构图:

flowchart TB subgraph Input["输入层"] CLI["CLI 命令行"] HTTP["HTTP API 服务"] SSE["SSE 流式接口"] end subgraph Core["核心处理层"] direction TB Router["路由分发"] TTS["TTS 引擎核心"] G2P["G2P 字素转音素"] Splitter["智能文本分片"] end subgraph Inference["推理层"] ORT["ONNX Runtime"] Model["Kokoro ONNX 模型"] Voices["发音人数据"] end subgraph Output["输出层"] WAV["WAV 音频"] Stream["流式音频"] end CLI --> Router HTTP --> Router SSE --> Router Router --> TTS TTS --> G2P TTS --> Splitter TTS --> ORT ORT --> Model ORT --> Voices ORT --> WAV ORT --> Stream

整个架构分为四层:

  1. 输入层:支持 CLI、HTTP REST API 和 SSE 流式三种接入方式,覆盖从脚本调用到 Web 集成的各种场景。
  2. 核心处理层:包含路由分发、TTS 引擎、G2P(字素转音素)引擎和智能文本分片模块。其中智能分片策略基于音素限制,能在生成速度和自然度之间取得平衡。
  3. 推理层:基于 ONNX Runtime 加载 Kokoro 模型和发音人数据进行推理。多线程流水线架构支持并行生成。
  4. 输出层:支持标准 WAV 格式输出和 SSE 流式输出。

发音人支持:50+ 种选择

kokoroi-rs 继承了 Kokoro 的多语言、多风格发音人体系,总共支持 50+ 种发音人

前缀 语言 示例
zf_, zm_ 中文 zf_xiaobei, zm_yunyang
af_, am_ 英文 af_bella, am_adam
jf_, jm_ 日文 jf_alpha, jm_kumo
bf_, bm_ 英式英文 bf_alice, bm_daniel
ef_, em_ 西班牙文 ef_dora, em_alex
ff_ 法文 ff_siwis
hf_, hm_ 印地文 hf_alpha, hm_omega

中文发音人包括 zf_xiaobeizm_yunyang 等,覆盖了不同的音色风格。对于需要多语言混读的场景(比如中英混输),kokoroi-rs 内置的 G2P 引擎也能较好地处理。

部署友好:多平台静态编译

对于后端开发者来说,部署的便利性往往决定了是否愿意采用某个工具。kokoroi-rs 在这方面做得相当到位:

Linux 平台:采用 musl 全静态编译,生成的可执行文件不依赖任何外部动态库。无论是 x86_64 还是 ARM64 架构,拷过去就能直接运行。

Windows 平台:采用 MSVC 编译,onnxruntime.dll 已打包在压缩包内,解压即用。

这意味着什么?意味着你不需要在服务器上装 Python、不需要配 PyTorch 环境、不需要担心 CUDA 版本兼容性——一个二进制文件 + 一个模型文件,就搞定了整套 TTS 服务

性能表现

根据项目文档,kokoroi-rs 的多线程流水线架构支持并行生成,实时率可达 5-10 倍。简单来说,生成 1 秒钟的音频,实际耗时只有 0.1-0.2 秒。

这个性能水平意味着:

  • 对于 Web 应用,用户几乎感觉不到等待延迟
  • 对于批量处理任务,可以大幅缩短总耗时
  • 对于流式场景,音频可以边生成边播放,体验更流畅

快速上手

1. 下载二进制文件

从项目的 Releases 页面下载对应平台的编译产物:

平台 文件
x86_64 Linux kokoro-x86_64-unknown-linux-musl.tar.gz
ARM64 Linux kokoro-aarch64-unknown-linux-musl.tar.gz
x86_64 Windows kokoro-x86_64-pc-windows-msvc.zip

2. 下载模型文件

需要准备三个文件:

  • models/kokoro-v1.0.onnx(约 80MB)
  • data/voices-v1.0.bin(约 150MB)
  • config.toml(项目根目录已提供)

模型可以从 Kokoro 官方项目下载,或者运行项目自带的 ./scripts/download_models.sh 脚本自动获取。

3. 开始使用

CLI 模式:

./koko --text "你好世界" -o output.wav

实战示例:使用 curl 调用 HTTP API 生成语音并保存为文件。先确保 kokoros-server 已在后台运行,然后执行以下脚本:

#!/bin/bash
# 调用 /tts 接口生成语音并保存为 WAV 文件
curl -X POST http://localhost:3000/tts \
  -H "Content-Type: application/json" \
  -d '{"text": "你好,欢迎使用 kokoroi-rs 语音合成引擎。", "voice": "zf_xiaobei"}' \
  -o response.json

# 从返回的 JSON 中提取 Base64 音频数据并解码为 WAV 文件
python3 -c "
import json, base64
data = json.load(open('response.json'))
wav_bytes = base64.b64decode(data['audio'])
with open('output.wav', 'wb') as f:
    f.write(wav_bytes)
print('语音已保存为 output.wav')
"

服务模式:

./kokoros-server
# 访问 http://localhost:3000 即可体验 Web 界面

实战示例:使用 Python requests 库调用 /tts/tts/stream 接口,展示同步和流式两种调用方式。

import requests
import base64
import json

# 服务地址
BASE_URL = "http://localhost:3000"

# 1. 同步调用 /tts 接口
def tts_sync(text: str, voice: str = "zf_xiaobei", output_file: str = "sync_output.wav"):
    """调用 /tts 接口生成语音并保存为 WAV 文件"""
    resp = requests.post(
        f"{BASE_URL}/tts",
        json={"text": text, "voice": voice}
    )
    resp.raise_for_status()
    data = resp.json()
    wav_bytes = base64.b64decode(data["audio"])
    with open(output_file, "wb") as f:
        f.write(wav_bytes)
    print(f"同步合成完成,语音已保存至 {output_file}")

# 2. 流式调用 /tts/stream 接口
def tts_stream(text: str, voice: str = "zf_xiaobei", output_file: str = "stream_output.wav"):
    """通过 SSE 流式接口逐块接收音频数据并合并保存"""
    resp = requests.post(
        f"{BASE_URL}/tts/stream",
        json={"text": text, "voice": voice},
        stream=True
    )
    resp.raise_for_status()
    audio_chunks = []
    for line in resp.iter_lines():
        if line:
            decoded = line.decode("utf-8")
            if decoded.startswith("data: "):
                chunk = decoded[6:]  # 去掉 "data: " 前缀
                if chunk == "[DONE]":
                    break
                audio_chunks.append(base64.b64decode(chunk))
    with open(output_file, "wb") as f:
        for chunk in audio_chunks:
            f.write(chunk)
    print(f"流式合成完成,语音已保存至 {output_file}")

# 使用示例
if __name__ == "__main__":
    # 同步合成
    tts_sync("今天天气真好,适合出去走走。", voice="zm_yunyang")

    # 流式合成(适合实时播放场景)
    tts_stream("这是一段流式合成的语音,可以边生成边播放。", voice="zf_xiaobei")

说明

  • 同步接口 /tts 适合一次性生成完整音频,返回 Base64 编码的 WAV 数据。
  • 流式接口 /tts/stream 通过 SSE(Server-Sent Events)逐块推送音频数据,适合需要低延迟播放的场景,如 AI 对话助手的实时语音回复。
  • 运行前请确保 kokoros-server 已在 localhost:3000 启动。

谁适合关注这个项目?

  • 后端开发者:想在服务端集成轻量级 TTS 能力,又不想被 Python 生态的部署问题困扰
  • Rust 爱好者:想看看 Rust 在 AI 推理场景下的实际应用案例
  • AI 应用开发者:需要为智能助手、聊天机器人、有声内容生成等场景添加语音能力
  • 边缘计算/嵌入式开发者:需要小体积、低依赖的 TTS 解决方案

一点思考

kokoroi-rs 这个项目有意思的地方在于,它不仅仅是对 Kokoro 的简单搬运,而是用 Rust 的思维重新思考了 TTS 系统的工程实现——静态编译、零依赖部署、多线程流水线、SSE 流式输出,这些都是生产级服务才会认真考虑的问题。

当然,项目还在持续迭代中。如果你对 Rust + TTS 这个方向感兴趣,不妨去 GitHub 上看看,试试跑起来的效果,也欢迎提交 Issue 和 PR 一起参与共建。

项目地址:https://github.com/doiito/kokoroi-rs

posted @ 2026-07-14 20:42  doiito  阅读(75)  评论(0)    收藏  举报