Audio8 预览
实验性引擎,资产不随包分发
Audio8 0.1B 以实验性引擎的形式通过 @optimalai/react-native 加载,但 OptimalAI 不分发三张图、tokenizer 与参考音色提示。原始 iPhone 预研仍保留在 apps/expo-tts-demo。本页所有内容都可能随时变化。
它是什么
第二个端侧引擎,用 Kokoro 的固定音色列表换来了零样本声音克隆。它复用 Beta 已经在用 的同一套 onnxruntime-react-native session API,由三张 ONNX 图组成:
| 图 | 精度 | 体积 |
|---|---|---|
| Slow AR | INT8,FP32 循环状态 | 131.89 MiB |
| Fast AR | INT8 | 35.51 MiB |
| Codec decoder | FP16 权重,FP32 PCM | 249.23 MiB |
| Tokenizer、manifest、参考编码 | — | 5.59 MiB |
| 在线合成合计 | 422.21 MiB | |
| 可选 codec encoder(克隆用) | FP16 | 396.12 MiB |
真正的体积瓶颈是 codec decoder,而不是约 170M 参数的主干。
目前可用的能力
- 可编辑中英文文本,单次最多 150 个字符。
- 31 个可选参考音色 —— 上游默认音色 + 15 个中文 + 15 个英文官方 Demo 录音。 录音可能来自同一位说话人,不代表 31 个已核实的身份。
- 端侧声音克隆:录制 1–15 秒单声道 44.1 kHz Float32 PCM,确认转写文本后在本地 编码,并把可复用的音色模板保存到
Documents/audio8-voices。音频不会上传。 - 输出 44.1 kHz 16-bit 单声道 WAV 到 App 缓存,并在 demo 里播放。
- 贪心解码直到 EOS,最多 512 个 codec frame;触顶会标记为
truncated,不会静默截断。
从 SDK 调用
把 Audio8Model 描述符交给同一个 createTts:
import { createTts } from "@optimalai/react-native";
const tts = createTts({
model: {
engine: "audio8",
modelId: "audio8-0.1b",
modelVersion: "1",
assets: {
slow: require("./models/slow_ar_int8.mobile.onnx"),
fast: require("./models/fast_ar_int8.mobile.onnx"),
decoder: require("./models/codec_decoder_fp16.mobile.onnx"),
encoder: require("./models/codec_encoder.mobile.onnx"), // 可选:声音克隆。
tokenizer: require("./models/tokenizer.json"),
voices: { default: require("./voices/default.prompt.bin") },
},
manifest: {
schemaVersion: 1,
engine: "audio8",
modelId: "audio8-0.1b",
modelVersion: "1",
sampleRate: 44100,
maxTextCodePoints: 150,
maxNewTokens: 512,
contextLength: 2048,
voices: [{ id: "default", label: "Default", language: "zh" }],
},
},
voiceId: "default",
numThreads: 4,
});
await tts.load();
const result = await tts.synthesizeToFile({ text: "你好,Hello world." });
console.log(result.frames, result.truncated, result.fileUri);Audio8 不支持 speed,请用 maxNewTokens 控制生成上限;Kokoro 则拒绝 maxNewTokens。SDK 只提供引擎,不附带模型资产。
代价是什么
Audio8 在 44.1 kHz 下自回归,hop 为 2048,即每秒音频约 21.53 个 frame。每个 frame 要先跑 1 次 Slow AR,再跑 10 次 Fast AR,所以生成一秒音频在进入滑窗 codec decoder 之前就大约需要 237 次 session 调用。SDK 把整个循环放在 JS 里。
目前唯一的实测数据是 Mac 四线程 smoke:32 个 frame、1.486 秒音频、7.251 秒合成, RTF 4.879。这是一个警告信号,不是 iPhone 基准 —— 真机 RTF 与峰值内存仍然待测。
请先降低预期
在真机 iPhone 上稳定做到 RTF 低于 1、且内存探针干净之前,不要围绕这个预览做产品规划。
从源码运行
pnpm install
pnpm audio8:prepare # 3 张在线图,逐文件校验哈希,约 422 MiB
pnpm audio8:voices # 追加 30 个官方 Demo 参考音色
pnpm audio8:clone-prepare # 可选克隆编码器,约 396 MiB
pnpm typecheck
pnpm test
pnpm demo:ios -- --device "你的 iPhone"然后在 demo 顶部选择 Audio8,选择一个参考音色(或克隆自己的声音)、编辑文本, 点击 加载模型 再生成。首次开发加载会从 Metro 传约 417 MiB 资产到 App 缓存,请保持手机连接、Mac 不休眠。
生成资产被刻意排除在 Git 之外。pnpm audio8:prepare 固定 Hugging Face commit 317c12d4e0da83847b594fcf8bd74bf2c76615ec,并校验所有上游哈希。
限制
- 仅 iPhone 17 Pro 原型验证。 没有 Android 证据、没有模拟器方案、没有受支持设备列表。
- 只有文件输出。 上游的滑窗流式路径尚未移植,SDK 也没有流式或取消 API。
- 没有
speed控制。 Audio8 暴露的是 temperature / top-p / top-k / seed,而不是 Kokoro 式的语速标量,不要假装两者语义等价。 - 内存压力尚未测量。 三张图加上约 54 MiB FP32 循环状态,全部由 JS 驱动,是最大的 崩溃风险点。
许可门禁
这就是 OptimalAI 不分发 Audio8 资产的原因:
- 0.1B 基础模型使用 Audio8 Community License v1.0,仅对年营收低于 200 万美元的实体免费商用。
- 0.1B ONNX INT8 模型卡另外声明 Apache-2.0,但 Audio8 没有公布两者的关系。
- 参考音色录音的商业再分发权利尚未核实。
在 Audio8 就转换后的 ONNX 图、tokenizer、参考编码给出书面澄清,且音色权利理清之前, 不要把这些资产打进任何分发构建。
完整的证据链与 go/no-go 规则见仓库里的 AUDIO8_TTS_RESEARCH.md 与 AUDIO8_IPHONE_PROTOTYPE.md。