Skip to content

Expo 与 Metro 配置

需要两处配置改动。都很小,但都是必需的 —— 漏掉任何一处,模型资产在运行时 都无法解析。

1. 注册 Expo 配置插件

app.jsonplugins 数组中加上本包:

json
{
  "expo": {
    "plugins": ["@optimalai/react-native"]
  }
}

该插件会转发给 ONNX Runtime 的 app plugin,在 prebuild 阶段把原生模块接进你的 iOS 与 Android 工程。

2. 包裹 Metro 配置

模型文件使用了 Metro 默认不当作资产处理的扩展名(.onnx.bin.txt)。 withOptimalAI 负责注册它们:

js
const { getDefaultConfig } = require("expo/metro-config");
const { withOptimalAI } = require("@optimalai/react-native/metro");

module.exports = withOptimalAI(getDefaultConfig(__dirname));

请保持 withOptimalAI(...) 在最外层,确保它拿到的是最终配置。如果你已经叠加了 其他 wrapper,把它们嵌在里面:

js
module.exports = withOptimalAI(withSomethingElse(getDefaultConfig(__dirname)));

3. 让 Metro 打包模型资产

model-tools 生成的 optimalai-models.ts 使用静态 require(...)。Metro 会把 它们解析成数字资产 ID,createTts 在加载时再把这些 ID 换成真实文件 URI。要让 它在 release 构建里也成立,请确保模型目录被 assetBundlePatterns 覆盖:

json
{
  "expo": {
    "assetBundlePatterns": ["**/*"]
  }
}

安装包会显著变大

Kokoro INT8 模型约 114 MB,voices.bin 约 54 MB。开发和发布产物的体积都会相应 增长。在对 App 体积做出承诺之前先把它算进去。

4. 重新构建 Development Build

bash
npx expo run:ios
npx expo run:android

Expo Go 无法加载本 SDK,因为它无法承载原生 ONNX Runtime 模块。任何原生依赖的 改动都需要重新构建。

验证配置

构建成功后,createTts({ ... }) 加上 await tts.load() 应当能到达 ready

ts
const tts = createTts({ model: kokoroZhInt8, voiceId: "zf_001" });
await tts.load();
console.log(tts.status()); // "ready"

如果 load()MODEL_NOT_FOUND,通常问题出在 Metro 或资产配置上 —— 见 常见问题