OddTTS更新:纯CPU支持11种语言的语音合成!

引言

昨天,大白菜大佬发了一个 Audio8 的TTS 模型,看上去很诱人,尤其是11种语言44.1 kHz采样率 两个指标。

2026 年 8 月 25 日下午,语音 AI 初创公司 Audio8在 Hugging Face 上正式发布其开源模型 Audio8 TTS 0.1B-ONNX-INT8,迅速在 TTS 和语音克隆圈引发轰动,作者 Samuel Zeng 直接宣布:100M 参数、CPU-only、零样本语音克隆、11 种语言、44.1 kHz 采样率,所有功能全部开源,Apache 2.0 许可。

今天周末在家无事,我把 Audio8 的两个模型(Audio8 0.1B ONNX INT8Audio8 0.6B ONNX INT4)给整合了一下到 OddTTS,并在我的笔记本上跑了一下,感觉效果还可以,但是存在两个问题:

  1. 相比于 Kokoro 还是太慢:效果好,但是CPU跑太慢,无法用于像我的 小落同学 这样的实时场景。
  2. 音频需要自己克隆:Audio8 只提供了一个默认的音色,但是支持用户自己克隆音色。

我先把整合好的 OddTTS 递交了一个版本,感兴趣的同学可以试试。也非常感谢大白菜大佬提供的信息。

快速开始使用 OddTTS

OddTTS 是一个功能强大的多引擎语音合成服务,提供统一的API接口和友好的Web界面,一套接口搞定多种主流TTS引擎,包括 EdgeTTSKokoro-82M-v1.1-zhAudio8ChatTTSBert-VITS2GptSovits v2等,同时也支持OpenAI TTS API的调用。

  • 仓库: https://github.com/oddmeta/oddtts
  • 版本: v1.3.21
  • 安装: pip install oddtts
  • 运行: oddtts
  • 演示: http://localhost:9001

Python测试

import openai
client = openai.OpenAI(base_url="http://localhost:9001/v1", api_key="dummy")
response = client.audio.speech.create(input="你好,欢迎使用OddTTS小奥语音合成服务。")

curl测试

curl http://127.0.0.1:9001/v1/audio/speech -H "Content-Type: application/json" -d "{\"input\": \"你好,欢迎使用OddTTS小奥语音合成服务。\"}" --output speech.mp3

直接听合成的效果

oddtts-20260829-kokoro-v1.1.wav
oddtts-20260829-Audio8 0.1B ONNX INT8.wav
oddtts-20260829-Audio8 0.6B ONNX INT4.wav

一、Audio8 ONNX模型概览

1.1 两个模型的基本信息

本次集成的两个模型分别针对不同场景需求:

特性Audio8 0.1B ONNX INT8Audio8 0.6B ONNX INT4
参数量~100M~601M
架构Falcon-H1 (Attention + Mamba)纯Attention
量化方式INT8 (MatMulInteger)Weight-only INT4
采样率44100 Hz44100 Hz
支持语言11种11种
Python要求>= 3.10>= 3.11
内存占用~0.6 GB~1.0 GB

1.2 架构差异详解

0.1B模型采用创新的Falcon-H1混合架构:

  • Slow AR: 24层,宽度512,8个attention heads + 2个KV heads
  • Mamba SSM: d_state=64,d_conv=4,d_ssm=768
  • 缓存机制: 使用batched Mamba缓存(conv_states + ssm_states)

0.6B模型采用传统纯Attention架构:

  • Slow AR: 24层,宽度896,14个attention heads + 2个KV heads
  • 缓存机制: 使用独立的per-layer KV cache
  • 模型大小: 在线模型572 MiB,完整下载968 MiB

1.3 支持的语言

两个模型均支持11种语言:粤语、中文、荷兰语、英语、法语、德语、意大利语、日语、韩语、波兰语、西班牙语。

二、技术挑战与解决方案

2.1 Runtime模块冲突问题

问题: 两个模型使用相同的Python模块名arktts_runtime,但实现完全不同。0.1B使用Mamba缓存,0.6B使用per-layer KV缓存。

解决方案: 强制清理sys.modules缓存

# 在初始化时强制清理可能冲突的模块缓存
stale_keys = [k for k in sys.modules if k.startswith("arktts_runtime")]
for k in stale_keys:
    del sys.modules[k]

2.2 Windows编码问题

问题: 官方Audio8运行时使用pathlib.Path.read_text()不指定编码,在Windows上默认使用GBK,导致JSON文件读取时出现UnicodeDecodeError

解决方案: 运行时Monkey-patch

# 修补pathlib.Path.read_text方法,默认使用UTF-8编码
_original_read_text = pathlib.Path.read_text
def _patched_read_text(self, encoding=None, errors=None):
    if encoding is None:
        encoding = "utf-8"
    return _original_read_text(self, encoding=encoding, errors=errors)
pathlib.Path.read_text = _patched_read_text

2.3 模型下载双源策略

模型下载顺序: ModelScope → HuggingFace

两个模型都支持自动回退下载,考虑到OddTTS都是国内的使用场景,所以统一优先从modelscope下载,确保在国内网络环境下也能正常使用。

2.4 音色克隆初始化

0.1B模型: 自动将reference_codes.npy复制到voices/default_voice/codes.npy,创建默认音色。
0.6B模型: 仅创建meta.json文件,不包含参考音色代码。

三、性能对比测试

3.1 测试环境

  • 测试文本: 55字中文文本
  • 测试条件: 纯CPU,WAV格式,default_voice
  • 硬件环境: 普通PC(无GPU)

3.2 性能数据

引擎采样率文本长度合成耗时音频时长RTF(实时率)
Kokoro v1.124000 Hz55字2.68秒8.18秒0.33
Audio8 0.1B ONNX INT844100 Hz55字27.85秒8.54秒3.26
Audio8 0.6B ONNX INT444100 Hz55字42.34秒8.59秒4.93

测试数据

Kokoro v1.1 合成速度(24000Hz)

2026-08-29 15:27:09 - oddtts - INFO - [请求] TTS文件生成接口
2026-08-29 15:27:09 - oddtts - INFO - [参数] 文本长度: 55, 语音: zf_004, 语速: 0, 音量: 0, 音调: 0, 格式: wav
2026-08-29 15:27:09 - oddtts - DEBUG - [辅助] generate_tts_file调用 - 类型: Oddtts_Kokoro_V1_1, 文本长度: 55, 语音: zf_004, 格式: wav
2026-08-29 15:27:09 - oddtts.models.tts_kokoro_v11 - INFO - 生成语音文件,参数:locale=zh-CN, voice=zf_004, rate=0, volume=0, pitch=0
2026-08-29 15:27:09 - oddtts.models.tts_kokoro_v11 - INFO - 生成语音,参数:locale=zh-CN, voice=zf_004, rate=0, volume=0, pitch=0
2026-08-29 15:27:09 - oddtts.models.tts_kokoro_v11 - INFO - [响应] 模型已加载,无需重新加载
2026-08-29 15:27:09 - oddtts.models.tts_kokoro_v11 - INFO - [响应] 开始加载中文音色:zf_004...
2026-08-29 15:27:09 - oddtts.models.tts_kokoro_v11 - INFO - [响应] 加载中文音色:zf_004完成 - 耗时: 0.005秒
2026-08-29 15:27:09 - oddtts.models.tts_kokoro_v11 - INFO - 开始生成语音...
2026-08-29 15:27:11 - oddtts.models.tts_kokoro_v11 - INFO - 文本长度:55,生成语音耗时:2.671秒, 总耗时:2.676秒,音频时长: 8.18s
2026-08-29 15:27:11 - oddtts - INFO - [响应] TTS文件生成成功 - 文件路径: C:\Users\ADMINI~1\AppData\Local\Temp\e663e71dc3b84a848c9c72cdefc5f5f7.wav, 格式: wav, 耗时: 2.686秒

Audio8 0.1B ONNX INT8合成速度(44100Hz)

2026-08-29 15:12:14 - oddtts - INFO - [请求] TTS文件生成接口
2026-08-29 15:12:14 - oddtts - INFO - [参数] 文本长度: 55, 语音: default_voice, 语速: 0, 音量: 0, 音调: 0, 格式: wav
2026-08-29 15:12:14 - oddtts - DEBUG - [辅助] generate_tts_file调用 - 类型: Oddtts_Audio8_0_1B_Onnx_Int8, 文本长度: 55, 语音: default_voice, 格式: wav
2026-08-29 15:12:14 - oddtts.models.tts_audio8_0_1b_onnx_int8 - INFO - [Audio8] 生成语音文件: voice=default_voice, format=wav
2026-08-29 15:12:42 - oddtts.models.tts_audio8_0_1b_onnx_int8 - INFO - [Audio8] 合成完成,耗时: 27.85s,音频时长: 8.54s
2026-08-29 15:12:42 - oddtts - INFO - [响应] TTS文件生成成功 - 文件路径: C:\Users\ADMINI~1\AppData\Local\Temp\2d98e69bb9b84de7882fffed30702244.wav, 格式: wav, 耗时: 27.867秒

Audio8 0.6B ONNX INT4合成速度(44100Hz)

2026-08-29 15:07:58 - oddtts - INFO - [请求] TTS文件生成接口
2026-08-29 15:07:58 - oddtts - INFO - [参数] 文本长度: 55, 语音: default_voice, 语速: 0, 音量: 0, 音调: 0, 格式: wav
2026-08-29 15:07:58 - oddtts - DEBUG - [辅助] generate_tts_file调用 - 类型: Oddtts_Audio8_0_6B_Onnx_Int4, 文本长度: 55, 语音: default_voice, 格式: wav
2026-08-29 15:07:58 - oddtts.models.tts_audio8_0_6b_onnx_int4 - INFO - [Audio8-0.6B] 生成语音文件: voice=default_voice, format=wav
2026-08-29 15:08:40 - oddtts.models.tts_audio8_0_6b_onnx_int4 - INFO - [Audio8-0.6B] 合成完成,耗时: 42.34s,音频时长: 8.59s
2026-08-29 15:08:40 - oddtts - INFO - [响应] TTS文件生成成功 - 文件路径: C:\Users\ADMINI~1\AppData\Local\Temp\e44a2f95129f4f97904e1889c940b1f3.wav, 格式: wav, 耗时: 42.356秒

3.3 性能分析

Audio8 0.1B ONNX INT8:

  • 合成速度约为Kokoro的10倍慢
  • 但音频采样率更高(44100 vs 24000 Hz)
  • 支持11种语言,多语言支持更强

Audio8 0.6B ONNX INT4:

  • 合成速度最慢,但模型参数量最大(601M vs 100M)
  • 理论上音质更好,但需要更多计算资源
  • 适合对音质要求较高的场景

四、代码实现细节

4.1 引擎注册与调度

oddtts_params.py中新增枚举值:

class ODDTTS_TYPE(Enum):
    ODDTTS_AUDIO8_0_1B_ONNX_INT8 = 8
    ODDTTS_AUDIO8_0_6B_ONNX_INT4 = 9

base_tts_driver.py中注册策略:

def get_strategy(self, tts_type: ODDTTS_TYPE) -> BaseTTS:
    tts = BaseTTS()
    elif tts_type == ODDTTS_TYPE.ODDTTS_AUDIO8_0_1B_ONNX_INT8:
        tts.client = Audio8_0_1b_OnnxInt8_API()
    elif tts_type == ODDTTS_TYPE.ODDTTS_AUDIO8_0_6B_ONNX_INT4:
        tts.client = Audio8_0_6b_OnnxInt4_API()

4.2 合成参数配置

两个引擎使用固定的生成参数(未通过API暴露):

max_new_tokens = 1024
temperature = 0.7
top_p = 0.9
top_k = 50
seed = 42

注意: TTSParams中的ratevolumepitch参数对Audio8引擎无效,仅voiceresponse_format有效。

4.3 流式生成限制

虽然提供了generate_tts_stream()方法,但实际上是先生成完整音频,再作为单个chunk返回:

async def generate_tts_stream(self, text: str, tts_params: TTSParams):
    audio_numpy = self._synthesize(text, tts_params)  # 先完整合成
    audio_data = convert_audio_format(...)
    yield audio_data  # 再返回结果

这是因为底层ArkTtsRuntime.synthesize()返回完整音频数组。

五、实际应用指南

5.1 安装与配置

# 安装OddTTS
pip install oddtts

# 启动服务(首次启动会自动下载模型)
oddtts

5.2 切换引擎

在Web界面或配置文件中切换默认引擎:

# oddtts_config.py
"tts_type": ODDTTS_TYPE.ODDTTS_AUDIO8_0_1B_ONNX_INT8,  # 或0.6B

5.3 API调用示例

import requests

# 生成语音文件
response = requests.post("http://localhost:9001/v1/audio/speech", json={
    "input": "欢迎使用Audio8 TTS语音合成系统",
    "voice": "default_voice",
    "response_format": "wav",
    "model": "oddtts-audio8-0.1b"  # 或"oddtts-audio8-0.6b"
})

# 保存音频文件
with open("output.wav", "wb") as f:
    f.write(response.content)

六、总结与展望

6.1 本次更新的意义

  1. 技术突破: 成功集成Audio8 TTS的两个ONNX模型,解决了Runtime冲突、Windows编码等技术难题
  2. 生态扩展: 为OddTTS增加了新的TTS引擎选择,特别是多语言支持能力
  3. 架构优化: 通过双源下载、模块缓存清理等机制,提升了系统的稳定性和兼容性

6.2 性能权衡

  • Audio8 0.1B ONNX INT8: 适合多语言场景,资源消耗适中
  • Audio8 0.6B ONNX INT4: 适合对音质要求高的场景,但需要更多计算资源
  • Kokoro v1.1: 仍是最轻量级的选择,适合中文场景

6.3 后续优化方向

  1. 性能优化: 探索GPU加速和量化优化,提升Audio8引擎的合成速度
  2. 流式生成: 实现真正的流式生成,减少首字延迟
  3. 参数暴露: 将temperature、top_p等参数通过API暴露,提供更多控制选项
  4. 音色扩展: 支持更多预置音色和自定义音色上传

6.4 社区贡献

欢迎开发者参与OddTTS的开发和优化:

结语

Audio8 ONNX模型的集成标志着OddTTS在多引擎支持方面迈出了重要一步。虽然当前Audio8引擎的合成速度还有提升空间,但其强大的多语言支持和灵活的架构设计为未来的发展奠定了基础。我们期待更多开发者加入,共同推动语音合成技术的发展。


相关资源

Leave a comment

Your email address will not be published. Required fields are marked *