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 INT8 Audio8 0.6B ONNX INT4
参数量 ~100M ~601M
架构 Falcon-H1 (Attention + Mamba) 纯Attention
量化方式 INT8 (MatMulInteger) Weight-only INT4
采样率 44100 Hz 44100 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.1 24000 Hz 55字 2.68秒 8.18秒 0.33
Audio8 0.1B ONNX INT8 44100 Hz 55字 27.85秒 8.54秒 3.26
Audio8 0.6B ONNX INT4 44100 Hz 55字 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引擎的合成速度还有提升空间,但其强大的多语言支持和灵活的架构设计为未来的发展奠定了基础。我们期待更多开发者加入,共同推动语音合成技术的发展。


相关资源

posted @ 2026-08-29 19:13  程序员老奥  阅读(16)  评论(0)    收藏  举报