华为官方开发者文档过于庞大,所以非常多基础说明的文档是复用的
如果你是第一次接触接入华为的能力很容易被相互引用的链接跳转绕晕
所以我整理了一下从基础配置准备到,真正接入实时语音识别完整的过程
每一节也附上了官方链接,如果下面没有讲清的,跳转官方文档再次查看即可
一、华为后台准备
1. 创建或选择 AGC 应用
官方文档: https://developer.huawei.com/consumer/cn/doc/app/agc-help-createapk-0000001912873100
进入 AppGallery Connect,选择对应的项目,如果还没有则新创建一个。
创建完项目进入,选择【常规】选项卡,点击添加应用,然后最重要的填写你将要接入的项目的包名到【应用包名】
2. 开通服务
在我的项目,找到顶部【API 管理】选项卡,在列表里找到机器学习服务勾选
在 AGC 或华为开发者控制台中确认机器学习服务、实时语音识别相关能力已经开通。
3. 获取 API key
在项目设置页面,找到顶部【常规】选项卡,找到项目,复制 apikey
使用同一个 AGC 应用对应的 API key。API key 必须与applicationId和agconnect-services.json属于同一个应用身份。签名证书指纹按官方流程建议配置,但当前 ASR 调试链路没有验证为强制项。(但是我看这个 key 又是在【项目】的类别,我感觉像是多个应用共用一个 key)
4. 下载 agconnect-services.json
官方文档:https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-Guides/agc-get-started-android-0000001058210705#section113292017144
从同一个 AGC 应用下载agconnect-services.json,放到 app 模块目录:
app/agconnect-services.json下载后可以用下面命令确认 JSON 包名:
jq-r'.client.package_name'app/agconnect-services.json输出必须是和你项目包名一直
二、Android 工程配置
官方文档:https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-Guides/agc-get-started-android-0000001058210705#section113292017144
1. 华为 Maven 仓库
settings.gradle需要包含华为 Maven 仓库:
pluginManagement{repositories{google()mavenCentral()gradlePluginPortal()maven{url'https://developer.huawei.com/repo/'}}}dependencyResolutionManagement{repositories{google()mavenCentral()maven{url'https://developer.huawei.com/repo/'}}}2. AGC Gradle 插件
根 build.gradle声明 AGC 插件:
buildscript{repositories{google()mavenCentral()maven{url'https://developer.huawei.com/repo/'}}dependencies{classpath'com.huawei.agconnect:agcp:1.9.6.300'}}当前工程使用 AGP 9.2.1,旧 AGC 插件可能依赖已移除的AppExtension/applicationVariantsAPI,因此这里使用1.9.6.300。
app 模块应用 AGC 插件:
apply plugin:'com.huawei.agconnect'构建时应能看到类似日志:
Using the AGConnect-Config file: .../app/agconnect-services.json processDebugAGCPlugin3. SDK 依赖
官方文档:https://developer.huawei.com/consumer/cn/doc/hiai-Guides/asr-sdk-0000001050124643
插件:
dependencies{ // 引入实时语音识别服务插件 implementation 'com.huawei.hms:ml-computer-voice-asr-plugin:3.15.1.301' }sdk 集成:
dependencies{ // 引入实时语音识别服务SDK implementation (com.huawei.hms:ml-computer-voice-asr:3.15.1.301') { exclude group : "com.huawei.hms", module: "network-embedded" } implementation 'com.huawei.hms:network-embedded:7.0.3.300' }4. Android 权限
ASR lib manifest 需要声明:
<uses-permissionandroid:name="android.permission.INTERNET"/><uses-permissionandroid:name="android.permission.RECORD_AUDIO"/><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>RECORD_AUDIO是运行时权限,本 Demo 由:asr内部申请。
三、运行时初始化和设置监听
初始化华为 SDK,这里主要是设置 key
参考文档:https://developer.huawei.com/consumer/cn/doc/hiai-Guides/sdk-data-security-0000001229909424#section2688102310166
MLApplication.initialize(appContext)MLApplication.getInstance().setUserRegion(MLApplication.REGION_DR_CHINA)MLApplication.getInstance().apiKey=apiKey设置语音识别监听:
参考文档:https://developer.huawei.com/consumer/cn/doc/hiai-Guides/ml-asr-0000001050066212#section699935381711
// 1. context为应用上下文信息。MLAsrRecognizermSpeechRecognizer=MLAsrRecognizer.createAsrRecognizer(context);// 2.设置回调mSpeechRecognizer.setAsrListener(newSpeechRecognitionListener());// 3.实现回调,实现MLAsrListener接口,实现接口中的方法。protectedclassSpeechRecognitionListenerimplementsMLAsrListener{@OverridepublicvoidonStartListening(){// 录音器开始接收声音。}@OverridepublicvoidonStartingOfSpeech(){// 用户开始讲话,即语音识别器检测到用户开始讲话。}@OverridepublicvoidonVoiceDataReceived(byte[]data,floatenergy,Bundlebundle){// 返回给用户原始的PCM音频流和音频能量,该接口并非运行在主线程中,返回结果需要在子线程中处理。}@OverridepublicvoidonRecognizingResults(BundlepartialResults){// 从MLAsrRecognizer接收到持续语音识别的文本,该接口并非运行在主线程中,返回结果需要在子线程中处理。}@OverridepublicvoidonResults(Bundleresults){// 语音识别的文本数据,该接口并非运行在主线程中,返回结果需要在子线程中处理。}@OverridepublicvoidonError(interror,StringerrorMessage){// 识别发生错误后调用该接口,该接口并非运行在主线程中,返回结果需要在子线程中处理。}@OverridepublicvoidonState(intstate,Bundleparams){// 通知应用状态发生改变,该接口并非运行在主线程中,返回结果需要在子线程中处理。}}语法识别参数配置:
// 新建Intent,用于配置语音识别参数。IntentmSpeechRecognizerIntent=newIntent(MLAsrConstants.ACTION_HMS_ASR_SPEECH);// 通过Intent进行语音识别参数设置。mSpeechRecognizerIntent// 设置识别语言为英语,若不设置,则默认识别英语。支持设置:"zh-CN":中文;"en-US":英语;"fr-FR":法语;"es-ES":西班牙语;"de-DE":德语;"it-IT":意大利语;"ar": 阿拉伯语;"ru-RU":俄语;"th=TH":泰语;"ms-MY":马来语;"fil-PH":菲律宾语;"tr-TR":土耳其语。.putExtra(MLAsrConstants.LANGUAGE,"en-US")// 设置识别文本返回模式为边识别边出字,若不设置,默认为边识别边出字。支持设置:// MLAsrConstants.FEATURE_WORDFLUX:通过onRecognizingResults接口,识别同时返回文字;// MLAsrConstants.FEATURE_ALLINONE:识别完成后通过onResults接口返回文字。.putExtra(MLAsrConstants.FEATURE,MLAsrConstants.FEATURE_WORDFLUX)// 静音检测时长(发音前,可设置3000到60000毫秒)(毫秒).putExtra(MLAsrConstants.VAD_START_MUTE_DURATION,6000)// 静音检测时长(发音后)(毫秒).putExtra(MLAsrConstants.VAD_END_MUTE_DURATION,700)// 是否设置标点.putExtra(MLAsrConstants.PUNCTUATION_ENABLE,true)// 设置使用场景,MLAsrConstants.SCENES_SHOPPING:表示购物,仅支持中文,该场景对华为商品名识别进行了优化。.putExtra(MLAsrConstants.SCENES,MLAsrConstants.SCENES_SHOPPING);// 启动语音识别。mSpeechRecognizer.startRecognizing(mSpeechRecognizerIntent);四、常见问题
1. Manifest merger placeholder 报错
现象:
requires a placeholder substitution but no value for <...> is provided原因通常是把真实 key 写成了${真实key}。正确做法是 manifest 保留${asrApiKey},真实 key 通过local.properties或 Gradle 参数注入。
2. 11203/3002 Service unavailable
优先检查应用身份是否一致:
applicationId是否等于agconnect-services.json.client.package_name。- API key 是否来自同一个 AGC 应用。
- AGC 上机器学习服务/实时语音识别是否已开通。
- 构建日志是否执行了
processDebugAGCPlugin。 - 设备网络是否能访问华为服务。
3. API key 为空
现象: Demo 会在启动 provider 时返回ProviderUnavailable,日志中会有api key is empty。
检查:
grep-E'^(asr\.apiKey|asrApiKey)='local.properties gradle.properties4. AGC 插件不兼容
如果使用旧版本 AGC 插件,在 AGP 9 上可能出现AppExtension或applicationVariants不存在。使用新版插件:
classpath'com.huawei.agconnect:agcp:1.9.6.300'5. JSON 放错位置
agconnect-services.json必须放在 app 模块根目录:
app/agconnect-services.json不是项目根目录,也不是:asr模块目录。