现象:
开始语音唤醒有下面的报错
{"error":11,"desc":"Wakeup engine model file invalid","sub_error":11005}
过程:
官方的错误码描述是
模型文件不可用 -- 11005 ( https://ai.baidu.com/ai-doc/SPEECH/qk38lxh1q )
但是模型bin文件不论是自己生成的WakeUp.bin,还是Demo里的WakeUp.bin ,按照Demo的方式放到 src/main/assets/ 下还是会报一样的错。
帖子 https://ai.baidu.com/forum/topic/show/497055 里描述的 so文件 都已经放入 jniLibs 内,但是 getApplicationContext().getApplicationInfo().nativeLibraryDir 拿到的路径下,确实没有任何 so
nativeLibraryDir 下没有so的原因和 Gradle Android plugin 有关。 com.android.tools.build:gradle:[版本号] ,版本号大于等于 3.6.0 的都会有类似问题
Android Gradle Plugin Version 版本在 项目根目录 build.gradle 内,或 Open Module Settings 的 Project 标签内
改成 3.5.0 之后 nativeLibraryDir 下就可以看到所有 jniLibs 下的so库,并且唤醒功能不再报错。
导致 so 库消失的原因是 Android Gradle Plugin 在 3.6.0 上默认关闭了 extractNativeLibs,目的是可以降低对存储空间的消耗,具体参考:https://developer.android.google.cn/studio/releases/gradle-plugin 并搜索 extractNativeLibs。
(规避)解决方案是,
在WakeUp.bin 没问题,语音so正确预置,并且 Gradle Android Plugin Version >= 3.6.0的前提下,修改你App的 AndroidManifest.xml ,在 application 标签内加上 android:extractNativeLibs="true"。
现在看下来更像是 语音 API 没有完全兼容 APK uncompressed native library 的场景,并且报的错误不是 jni库加载的问题,而是 11005-模型文件不可用 ,这应该会让开发者非常疑惑。
结论:
请百度语音SDK的工程师们处理以下两个问题
1. 文档中声明,在 Android Gradle Plugin Version 大于等于 3.6.0 的项目上,要在 App 的 AndroidManifest.xml 的 application标签额外增加 android:extractNativeLibs="true" 以解决初始化失败问题
2. 正向处理掉库加载的问题,适配有 extractNativeLibs="false" 需求的应用
试了,可行。谢谢楼主
用的什么手机,Android什么版本, 只有当下面的方法输出是 "Files in nativeDir: []" 的时候才能复现。
Log.d("test", "Files in nativeDir: " +
Arrays.asList(new File(getApplicationContext().getApplicationInfo().nativeLibraryDir).listFiles()));
检查你们工程师自己的工程是不是已经设置了 android:extractNativeLibrary="true" 。
我这边的两个Huawei手机 Honor V10 Android 9.0 和 Huawei Play4T pro Android 9.0,都不行。
你好,目前工程师这边验证gradle:4.0.1 运行没有报错。能否提供下复现的具体步骤。