5.0 KiB
5.0 KiB
模型文件路径修复方案
🎯 问题分析
您遇到的"初始化失败,检查模型文件是否存在"问题是因为:
- 应用尝试从项目的
assets/models路径加载模型 - 但模型文件实际在库内部的
packages/yx_asr/assets/models路径
✅ 已完成的修复
1. 更新库的初始化逻辑
修改了 lib/src/yx_asr_service.dart 中的路径处理:
// 修改前
final modelPath = config['modelPath'] as String? ?? 'assets/models';
// 修改后
final modelPath = config['modelPath'] as String? ?? 'packages/yx_asr/assets/models';
2. 更新便捷初始化方法
// 修改前
Future<bool> initializeWithDefaultModel([String modelPath = 'assets/models'])
// 修改后
Future<bool> initializeWithDefaultModel([String? modelPath]) async {
final defaultPath = modelPath ?? 'packages/yx_asr/assets/models';
return await initialize({'modelPath': defaultPath});
}
3. 简化 example 项目配置
- ✅ 移除了
example/pubspec.yaml中的 assets 配置 - ✅ 更新了
example/lib/main.dart使用initializeWithDefaultModel()
🚀 使用方法
方法 1:使用默认模型(推荐)
final service = YxAsrService();
final initialized = await service.initializeWithDefaultModel();
方法 2:显式指定库内模型路径
final service = YxAsrService();
final initialized = await service.initialize({
'modelPath': 'packages/yx_asr/assets/models'
});
方法 3:使用自定义模型路径(如果项目有自己的模型)
final service = YxAsrService();
final initialized = await service.initialize({
'modelPath': 'assets/my_custom_models'
});
📁 文件结构说明
库内模型文件位置
yx_asr/
├── assets/models/
│ ├── encoder-epoch-99-avg-1.int8.onnx
│ ├── decoder-epoch-99-avg-1.int8.onnx
│ ├── joiner-epoch-99-avg-1.int8.onnx
│ └── tokens.txt
└── pubspec.yaml (配置了 assets)
运行时访问路径
packages/yx_asr/assets/models/encoder-epoch-99-avg-1.int8.onnx
packages/yx_asr/assets/models/decoder-epoch-99-avg-1.int8.onnx
packages/yx_asr/assets/models/joiner-epoch-99-avg-1.int8.onnx
packages/yx_asr/assets/models/tokens.txt
🔧 验证修复
1. 重新构建应用
cd example
flutter clean
flutter pub get
flutter build ios --no-codesign
2. 运行应用测试
flutter run -d "iPhone 15 Pro"
3. 检查初始化状态
应用启动后应该显示:
- ✅ 初始化成功
- ✅ 录音按钮可用
- ✅ 无"检查模型文件是否存在"错误
🐛 故障排除
如果仍然提示模型文件不存在
检查 1:确认库的 pubspec.yaml 配置
flutter:
assets:
- assets/models/
检查 2:确认模型文件存在
ls -la assets/models/
# 应该看到:
# encoder-epoch-99-avg-1.int8.onnx
# decoder-epoch-99-avg-1.int8.onnx
# joiner-epoch-99-avg-1.int8.onnx
# tokens.txt
检查 3:验证初始化代码
// 确保使用正确的初始化方法
final service = YxAsrService();
final initialized = await service.initializeWithDefaultModel();
if (!initialized) {
print('初始化失败');
} else {
print('初始化成功');
}
如果需要调试路径问题
添加调试日志
Future<bool> initializeWithModel(String modelPath, {int sampleRate = 16000}) async {
print('🔍 尝试加载模型路径: $modelPath');
print('🔍 完整文件路径:');
print(' - encoder: $modelPath/encoder-epoch-99-avg-1.int8.onnx');
print(' - decoder: $modelPath/decoder-epoch-99-avg-1.int8.onnx');
print(' - joiner: $modelPath/joiner-epoch-99-avg-1.int8.onnx');
print(' - tokens: $modelPath/tokens.txt');
// 原有的初始化代码...
}
📱 测试清单
基础功能测试
- 应用启动无错误
- 初始化成功(无模型文件错误)
- 录音按钮可点击
- 权限申请正常
语音识别测试
- 点击录音按钮开始录音
- 说话时有实时反馈
- 停止录音后显示最终结果
- 多次录音测试稳定性
🎉 预期结果
修复后,您应该看到:
- ✅ 应用启动时初始化成功
- ✅ 无"检查模型文件是否存在"错误
- ✅ 录音功能正常工作
- ✅ 语音识别结果正确显示
💡 最佳实践
对于库开发者
- 内置模型 - 将常用模型打包在库内
- 灵活配置 - 支持自定义模型路径
- 清晰文档 - 说明模型文件的使用方法
对于应用开发者
- 使用默认模型 - 优先使用库内置模型
- 错误处理 - 添加初始化失败的处理逻辑
- 用户反馈 - 提供清晰的状态提示
🔄 版本兼容性
这个修复保持了向后兼容性:
- ✅ 现有的自定义路径仍然有效
- ✅ 新的默认行为使用库内模型
- ✅ 不需要修改现有的应用代码
修复完成!现在您的应用应该能够正确加载库内置的模型文件了。 🎊