Skip to content

Audio8 预览

实验性引擎,资产不随包分发

Audio8 0.1B 以实验性引擎的形式通过 @optimalai/react-native 加载,但 OptimalAI 不分发三张图、tokenizer 与参考音色提示。原始 iPhone 预研仍保留在 apps/expo-tts-demo。本页所有内容都可能随时变化。

它是什么

第二个端侧引擎,用 Kokoro 的固定音色列表换来了零样本声音克隆。它复用 Beta 已经在用 的同一套 onnxruntime-react-native session API,由三张 ONNX 图组成:

精度体积
Slow ARINT8,FP32 循环状态131.89 MiB
Fast ARINT835.51 MiB
Codec decoderFP16 权重,FP32 PCM249.23 MiB
Tokenizer、manifest、参考编码5.59 MiB
在线合成合计422.21 MiB
可选 codec encoder(克隆用)FP16396.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

ts
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、且内存探针干净之前,不要围绕这个预览做产品规划。

从源码运行

bash
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.mdAUDIO8_IPHONE_PROTOTYPE.md