流式 ASR 统一事件协议(原生 → H5)

lishihuan大约 3 分钟

流式 ASR 统一事件协议(原生 → H5)

笔记目录:../README.md · 阿里 ../aliyun/ASR语音识别集成.md · 腾讯 ../tencent/ASR语音识别集成.md

约定:映射只在 Android 原生 完成(AsrStreamProtocol.java)。H5 VoiceInput.vue 只根据 JSON 里的 event 分支,不再维护厂商对照表。

换 ASR 厂商时:在 我的 → 语音与 AI 切换阿里/腾讯(localStorage,默认腾讯),或改后端凭证接口、原生 SDK 插件;H5 事件名与 VoiceInput 逻辑不变


前端调用(简化)

  1. VoiceInput:按 getAsrVendor() 选 URL → 拉临时凭证 → 组装 optionsplugin.callPlugin.startStreamVoiceRecognize(options, …)
  2. cordovaPluginstartStreamVoiceRecognize / stopStreamVoiceRecognize 内部按 getAsrVendor()asr_aliyun_*asr_tencent_*
  3. VoiceInput 不拆文件:阿里/腾讯差异仅在「凭证字段」和 Cordova 入参,回调 JSON 已统一,见下文

配置:src/config/asrConfig.jsAsrVendor / 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 映射后推送相同结构

字段说明
code200
eventasr_interim / asr_sentence_end / asr_session_complete / asr_error
text识别正文
displayModeshow / append
vendoraliyun_nui / tencent_asr(仅排障)
vendorEvent厂商原始事件名(仅排障)

H5 只分支 event,不读 vendor。语义对应关系已在原生对齐(如腾讯 onSliceSuccessasr_interimonSegmentSuccessasr_sentence_end)。因此 不必 为阿里/腾讯各写一套 VoiceInput。


后端凭证(密钥不下发前端)

厂商接口服务端配置前缀
阿里云 NLSGET /bus-module/ai/asr/tokenai.nls.*
腾讯云GET /bus-module/ai/asr/tencent/credentialai.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_interimasr_errorH5 只认这个
text识别正文,无则 ""
vendoraliyun_nui / tencent_asr
vendorEvent厂商原始名,仅排障
resultCode厂商回调 code
taskId / rawAsr可选

终态asr_session_completeasr_error


阿里云 NUI 对照表

统一 event阿里云 vendorEvent
asr_session_startEVENT_TRANSCRIBER_STARTED
asr_interimEVENT_ASR_PARTIAL_RESULT
asr_sentence_endEVENT_SENTENCE_END
asr_vad_startEVENT_VAD_START
asr_vad_endEVENT_VAD_END
asr_session_completeEVENT_TRANSCRIBER_COMPLETE
asr_errorEVENT_ASR_ERROR / EVENT_DIALOG_ERROR / EVENT_MIC_ERROR

腾讯云实时 ASR 对照表

统一 event腾讯 vendorEvent
asr_session_startonStartRecord
asr_interimonSliceSuccess
asr_sentence_endonSegmentSuccess
asr_vad_endonStopRecord / onSilentDetectTimeOut
asr_session_completeonSuccess
asr_erroronFailure

腾讯热词(易踩坑,勿忘)

使用控制台热词表时,原生 AudioRecognizeRequest.Builder 必须同时

  1. setHotWordId(热词表ID) — 控制台「热词表」的 HotwordId,非词条文本
  2. setReinforceHotword(1) — 开启热词增强;只设 ID 不生效

说明:

  • 官方 Demo MainActivity 里上述两行多为注释,容易误以为「只传 ID 即可」。
  • SDK v3.1.38 更新日志写「增强热词参数标记废弃」,实测仍依赖 reinforceHotword=1,删后热词静默失效。
  • 实现位置:TencentVoiceRecognizePlugin.java 类顶部常量 ENGINE_MODEL_TYPEHOTWORD_ID,与 setReinforceHotword(1) 写在一起;再从 H5/STS JSON 解析热词。

源码位置

文件职责
AsrStreamProtocol.java常量 + fromAliyunNui() / fromTencent()
VoiceRecognizePlugin.java阿里云 SDK
TencentVoiceRecognizePlugin.java腾讯云 SDK
AiAsrController.java阿里 token + 腾讯 STS
VoiceInput.vueUI + 流式合并(厂商无关)
src/config/asrConfig.jsAsrVendor / VoiceMode、get/set、getAsrTokenUrl
src/views/my/my.vue阿里/腾讯 ASR、点击/松手模式 Switch