Expo 与 Metro 配置
需要两处配置改动。都很小,但都是必需的 —— 漏掉任何一处,模型资产在运行时 都无法解析。
1. 注册 Expo 配置插件
在 app.json 的 plugins 数组中加上本包:
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:androidExpo 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 或资产配置上 —— 见 常见问题。