流式 ASR 统一事件协议(原生 → H5)
流式 ASR 统一事件协议(原生 → H5)
笔记目录:../README.md · 阿里 ../aliyun/ASR语音识别集成.md · 腾讯 ../tencent/ASR语音识别集成.md
约定:映射只在 Android 原生 完成(AsrStreamProtocol.java)。H5 VoiceInput.vue 只根据 JSON 里的 event 分支,不再维护厂商对照表。
换 ASR 厂商时:在 我的 → 语音与 AI 切换阿里/腾讯(localStorage,默认腾讯),或改后端凭证接口、原生 SDK 插件;H5 事件名与 VoiceInput 逻辑不变。
前端调用(简化)
- VoiceInput:按
getAsrVendor()选 URL → 拉临时凭证 → 组装options→plugin.callPlugin.startStreamVoiceRecognize(options, …) - cordovaPlugin:
startStreamVoiceRecognize/stopStreamVoiceRecognize内部按getAsrVendor()走asr_aliyun_*或asr_tencent_* - VoiceInput 不拆文件:阿里/腾讯差异仅在「凭证字段」和 Cordova 入参,回调 JSON 已统一,见下文
配置:src/config/asrConfig.js(AsrVendor / VoiceMode + get/set);UI:src/views/my/my.vue § 语音与 AI
Cordova Action
| Action | 说明 |
|---|---|
asr_aliyun_start | 开始阿里云 NUI 流式识别 |
asr_aliyun_stop | 停止阿里云 |
asr_tencent_start | 开始腾讯云实时 ASR(arg2=STS 凭证 JSON) |
asr_tencent_stop | 停止腾讯云 |
兼容:30/31 仍映射为阿里云启停。
原生回调 JSON 是否统一?(结论:已统一,VoiceInput 无需按厂商拆分)
阿里 VoiceRecognizePlugin 与腾讯 TencentVoiceRecognizePlugin 均经 AsrStreamProtocol 映射后推送相同结构:
| 字段 | 说明 |
|---|---|
code | 200 |
event | asr_interim / asr_sentence_end / asr_session_complete / asr_error 等 |
text | 识别正文 |
displayMode | show / append |
vendor | aliyun_nui / tencent_asr(仅排障) |
vendorEvent | 厂商原始事件名(仅排障) |
H5 只分支 event,不读 vendor。语义对应关系已在原生对齐(如腾讯 onSliceSuccess→asr_interim,onSegmentSuccess→asr_sentence_end)。因此 不必 为阿里/腾讯各写一套 VoiceInput。
后端凭证(密钥不下发前端)
| 厂商 | 接口 | 服务端配置前缀 |
|---|---|---|
| 阿里云 NLS | GET /bus-module/ai/asr/token | ai.nls.* |
| 腾讯云 | GET /bus-module/ai/asr/tencent/credential | ai.tencent.* |
配置说明(application.yml / Nacos)
与阿里 ai.nls 对称,腾讯统一在 ai.tencent 下(本模块当前用于实时语音识别 STS):
ai:
nls: # 阿里云 NLS
access-key-id: xxx
access-key-secret: xxx
app-key: xxx
tencent: # 腾讯云(与 nls 同级)
secret-id: xxx
secret-key: xxx
app-id: 1234567890
engine-model-type: 16k_zh
sts-duration-seconds: 7200
# sts-region: ap-guangzhou # 可选,见下
sts-region(可选):STS 开放接口接入地域,不是识别引擎参数;默认 ap-guangzhou,一般不用配。
JSON 字段(原生 → H5)
| 字段 | 说明 |
|---|---|
event | 统一名,如 asr_interim、asr_error(H5 只认这个) |
text | 识别正文,无则 "" |
vendor | aliyun_nui / tencent_asr |
vendorEvent | 厂商原始名,仅排障 |
resultCode | 厂商回调 code |
taskId / rawAsr | 可选 |
终态:asr_session_complete、asr_error。
阿里云 NUI 对照表
统一 event | 阿里云 vendorEvent |
|---|---|
asr_session_start | EVENT_TRANSCRIBER_STARTED |
asr_interim | EVENT_ASR_PARTIAL_RESULT |
asr_sentence_end | EVENT_SENTENCE_END |
asr_vad_start | EVENT_VAD_START |
asr_vad_end | EVENT_VAD_END |
asr_session_complete | EVENT_TRANSCRIBER_COMPLETE |
asr_error | EVENT_ASR_ERROR / EVENT_DIALOG_ERROR / EVENT_MIC_ERROR |
腾讯云实时 ASR 对照表
统一 event | 腾讯 vendorEvent |
|---|---|
asr_session_start | onStartRecord |
asr_interim | onSliceSuccess |
asr_sentence_end | onSegmentSuccess |
asr_vad_end | onStopRecord / onSilentDetectTimeOut |
asr_session_complete | onSuccess |
asr_error | onFailure |
腾讯热词(易踩坑,勿忘)
使用控制台热词表时,原生 AudioRecognizeRequest.Builder 必须同时:
setHotWordId(热词表ID)— 控制台「热词表」的 HotwordId,非词条文本setReinforceHotword(1)— 开启热词增强;只设 ID 不生效
说明:
- 官方 Demo
MainActivity里上述两行多为注释,容易误以为「只传 ID 即可」。 - SDK v3.1.38 更新日志写「增强热词参数标记废弃」,实测仍依赖
reinforceHotword=1,删后热词静默失效。 - 实现位置:
TencentVoiceRecognizePlugin.java类顶部常量ENGINE_MODEL_TYPE、HOTWORD_ID,与setReinforceHotword(1)写在一起;勿再从 H5/STS JSON 解析热词。
源码位置
| 文件 | 职责 |
|---|---|
AsrStreamProtocol.java | 常量 + fromAliyunNui() / fromTencent() |
VoiceRecognizePlugin.java | 阿里云 SDK |
TencentVoiceRecognizePlugin.java | 腾讯云 SDK |
AiAsrController.java | 阿里 token + 腾讯 STS |
VoiceInput.vue | UI + 流式合并(厂商无关) |
src/config/asrConfig.js | AsrVendor / VoiceMode、get/set、getAsrTokenUrl |
src/views/my/my.vue | 阿里/腾讯 ASR、点击/松手模式 Switch |