引言
昨天,大白菜大佬发了一个 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 INT8,Audio8 0.6B ONNX INT4)给整合了一下到 OddTTS,并在我的笔记本上跑了一下,感觉效果还可以,但是存在两个问题:
- 相比于 Kokoro 还是太慢:效果好,但是CPU跑太慢,无法用于像我的 小落同学 这样的实时场景。
- 音频需要自己克隆:Audio8 只提供了一个默认的音色,但是支持用户自己克隆音色。
我先把整合好的 OddTTS 递交了一个版本,感兴趣的同学可以试试。也非常感谢大白菜大佬提供的信息。
快速开始使用 OddTTS
OddTTS 是一个功能强大的多引擎语音合成服务,提供统一的API接口和友好的Web界面,一套接口搞定多种主流TTS引擎,包括 EdgeTTS、Kokoro-82M-v1.1-zh、Audio8、ChatTTS、Bert-VITS2、GptSovits 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中的rate、volume、pitch参数对Audio8引擎无效,仅voice和response_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 本次更新的意义
- 技术突破: 成功集成Audio8 TTS的两个ONNX模型,解决了Runtime冲突、Windows编码等技术难题
- 生态扩展: 为OddTTS增加了新的TTS引擎选择,特别是多语言支持能力
- 架构优化: 通过双源下载、模块缓存清理等机制,提升了系统的稳定性和兼容性
6.2 性能权衡
- Audio8 0.1B ONNX INT8: 适合多语言场景,资源消耗适中
- Audio8 0.6B ONNX INT4: 适合对音质要求高的场景,但需要更多计算资源
- Kokoro v1.1: 仍是最轻量级的选择,适合中文场景
6.3 后续优化方向
- 性能优化: 探索GPU加速和量化优化,提升Audio8引擎的合成速度
- 流式生成: 实现真正的流式生成,减少首字延迟
- 参数暴露: 将temperature、top_p等参数通过API暴露,提供更多控制选项
- 音色扩展: 支持更多预置音色和自定义音色上传
6.4 社区贡献
欢迎开发者参与OddTTS的开发和优化:
- GitHub: https://github.com/oddmeta/oddtts
- 问题反馈: 提交Issue或Pull Request
- 功能建议: 在GitHub Discussions中讨论
结语
Audio8 ONNX模型的集成标志着OddTTS在多引擎支持方面迈出了重要一步。虽然当前Audio8引擎的合成速度还有提升空间,但其强大的多语言支持和灵活的架构设计为未来的发展奠定了基础。我们期待更多开发者加入,共同推动语音合成技术的发展。
相关资源: