iOS端训练CoreML声音分类器的报错及音频处理问题咨询
CoreML声音分类器端侧训练问题排查
一、模型加载报错解决方案
1. 通用核心错误点
MLUpdateTask仅支持加载已编译的CoreML模型(.mlmodelc目录),你当前代码直接传入未编译的.mlmodel文件路径是报错的根本原因。
2. Playground场景报错修复
你调用了MLModel.compileModel(at:)但没有使用它返回的编译后模型临时路径,修改如下:
// 替换原有的编译和modelDir赋值逻辑 let rawModelURL = URL(fileURLWithPath: "/Users/...../Playgrounds/MLPlayground.playground/Resources/UpdateableML.mlmodel") let compiledModelURL = try! MLModel.compileModel(at: rawModelURL) // 后续updateModel传入compiledModelURL即可
3. 正式iOS项目场景报错修复
Xcode会自动将项目中引入的.mlmodel编译为.mlmodelc目录并打包到App Bundle中,不要手动指向源码路径,用以下方式获取编译后模型路径:
guard let compiledModelURL = Bundle.main.url(forResource: "UpdateableML", withExtension: "mlmodelc") else { fatalError("未找到编译后的模型文件") }
同时注意:如果要保存更新后的模型,不能存到Bundle目录(仅可读),需要存到App沙盒的Documents/Library目录下。
二、音频输入长度不匹配问题修复
你当前直接读取.m4a压缩文件的二进制内容作为音频输入的逻辑完全错误:m4a是压缩编码格式,二进制内容包含文件头、编码帧等信息,不是模型要求的原始音频采样/音频特征数据。
需要按以下步骤处理音频输入:
- 用
AVFoundation的AVAudioFile解码m4a文件为原始PCM采样数据 - 按照你训练基模型时的预处理逻辑,将PCM转换为对应特征(比如梅尔频谱、MFCC等),将特征长度处理为模型要求的15600
- 再将处理后的特征填充到
MLMultiArray中
另外注意:你当前的分类标签用的是文件名,而你的需求是输出「匹配/不匹配」两类,需要将传入classLabel的值统一改为对应分类标签,不要传文件名。
内容的提问来源于stack exchange,提问作者Brandon Kynoch
相关产品推荐
相关产品推荐

