阿里云 NUI ASR 语音识别集成说明

lishihuan大约 4 分钟

阿里云 NUI ASR 语音识别集成说明

厂商分支:仅描述阿里云 NUI。腾讯见 ../tencent/ASR语音识别集成.md;双厂商总览 ../README.md

历史:原笔记目录名「ZUI」为笔误,实际为 NUI。统一 asr_* 协议见 ../common/ASR流式协议.md

相关笔记

文档内容
../common/ASR流式协议.md统一 asr_* + 阿里/腾讯对照
../common/语音输入-VoiceInput实现链路.mdhold-send、静音停录、长按改字
TTS流式播报集成.md阿里 TTS 与 ASR 争用
backup/README.md阿里原生插件备份
../common/backup/README.md协议映射、H5、凭证 Controller

一、整体架构

asrConfig:getAsrVendor() === aliyun 时走本分支
    ↓ VoiceInput → GET /bus-module/ai/asr/token(appKey + token)
    ↓ cordovaPlugin → asr_aliyun_start(兼容 type 30/31)
Android FirstPlugin
    ↓ 若正在流式 TTS,先静默停止 TTS
    ↓ VoiceRecognizePlugin + AsrStreamProtocol.fromAliyunNui
    ↓ vendor=aliyun_nui,event=asr_*

重要:H5 不再依赖 JSON 字段 isEnd;是否终态只看 event === asr_session_complete | asr_error


二、统一事件协议(原生 → H5)

映射仅在 AsrStreamProtocol.java 完成;H5 只认 event 字符串(如 asr_error),换厂商时改原生 fromXxx() 即可。

统一 event含义(简)
asr_interim当前句中间结果
asr_sentence_end一句话定稿(会话可继续)
asr_vad_end有声结束,可启静音停录
asr_session_complete本轮成功结束(Cordova 关流)
asr_error失败终态(含 ASR/DIALOG/MIC 错误)

JSON 另带 vendor(如 aliyun_nui)、vendorEvent(原 EVENT_*,仅排障)。

完整对照表见 ../common/ASR流式协议.md


三、Android 端要点

1. 类与路径(LegacyApp)

路径
AsrStreamProtocoligw-cordova-app/.../plugin/AsrStreamProtocol.java
VoiceRecognizePluginigw-cordova-app/.../plugin/VoiceRecognizePlugin.java
FirstPluginasr_aliyun_start / asr_aliyun_stop30/31 兼容旧版)

离线全文见 aliyun/backup/android/;协议类见 common/backup/android/AsrStreamProtocol.java

2. 推送给 H5 的 JSON(当前)

{
  "code": 200,
  "event": "asr_interim",
  "text": "识别正文",
  "vendor": "aliyun_nui",
  "vendorEvent": "EVENT_ASR_PARTIAL_RESULT",
  "displayMode": "show",
  "resultCode": 0,
  "taskId": "",
  "rawAsr": ""
}
  • text 仅来自 payload.result;解析失败为 ""禁止把整段 SDK JSON 写入输入框。
  • isEnd 不再写入 JSON;关流由原生 pushStreamEvent(..., isEnd=true) 内部控制。

3. nls_config 与采集(概要)

  • enable_intermediate_result=true:实时中间结果。
  • enable_semantic_sentence_detectiondisfluency 等可按现场通过 args[2] / H5 asrOptions 微调。
  • 麦克风 VOICE_RECOGNITION、缓冲区 getMinBufferSize 等见当前 VoiceRecognizePlugin

排障:

adb logcat -s ALI_ASR

H5 控制台:[ASR] event displayMode text


四、后端 Token 接口

  • cn.semdo.busModule.jxbzh.controller.AiAsrController
  • 路径GET /bus-module/ai/asr/token
  • 返回tokenappKeyexpireTime

配置 application.ymlai.nls.access-key-id / access-key-secret / app-key

备份:backup/java/AiAsrController.java


五、前端组件

1. 文件

文件职责
src/components/voice/VoiceInput.vueASR 核心:token、原生回调、interim/committed、终稿规则
src/components/ChatInput.vue输入条封装、voiceMode、hold-send UI
src/plugin/cordovaPlugin.jsCordova 桥,回调统一为 object
src/views/.../aiPlanDayChat.vue智能填单:voice-mode="hold-send"

2. ChatInput voiceMode

模式交互
text(默认)多行输入 + 侧边麦克风(点击说话,流式写入输入框,silence-timeout=3000)+ 发送
hold-send点麦克风 → 输入区变为「按住 说话」;按住录音、松手识别并直接 emit('send')上滑约 72px 取消;录音中不展示识别文字

3. VoiceInput 要点

说明
展示display = merge(merge(anchor, committed), interim);interim 为整段覆盖,非 diff
防回退_shouldAcceptInterimPartial:挡住「你好」→「你,」等同长回退
句末asr_sentence_endcommitted,清空 interim
静音停录silenceTimeout(聊天 3000ms):句末/VAD/有效 interim 后 3s 无活动 → _stopRecording
发送竞态ChatInput.onSendabortStreamSync(),避免迟到 ASR 写回已清空输入框
按住streamToInput=false + beginHold/endHold/cancelHoldcancelHold 上滑丢弃终稿

4. Props / 事件(VoiceInput 摘录)

Prop默认说明
silenceTimeout0父组件传入,如 ChatInput text 模式 3000
streamToInputtruehold-send 为 false
hideTriggerfalsehold-send 为 true
toastOnEmptytruehold-send 可 false,由 ChatInput toast
事件说明
update:text流式写入输入框(text 模式)
done一轮终稿文本(含规则替换后)
start / stop / error生命周期

5. 使用示例

文字 + 点击说话(其它页面)

<chat-input @send="onSend" />

智能填单 · 按住说话

<chat-input voice-mode="hold-send" @send="onSendMessage" />

六、Gradle 与常见错误

  • 240003 等:查 token/appKey/url、aar 版本、权限与网络。
  • 输入框偶现 JSON:查原生 parseResultText 是否仍回退整段 asrResult(当前应已修)。
  • 说完不自动停:确认 silence-timeout 非 0,且已收 asr_sentence_end / asr_vad_end
  • 发送后框里又有字:确认已调 abortStreamSync 且原生已推 asr_*

七、迁移 / 自检清单


八、离线源码备份

目录说明
backup/VoiceRecognizePluginStreamInputTtsPlugin
../common/backup/AsrStreamProtocol、VoiceInput、cordovaPlugin、AiAsrController

九、变更摘要(v2)

  1. 协议AsrStreamProtocol + 原生映射;废弃 H5 解析 isEnd / 魔法字符串 EVENT_*
  2. 展示:committed + interim 整段覆盖;句末 asr_sentence_end 担保准确。
  3. 静音:3s 自动停录(有效 interim 重置计时);asr_session_complete 立即收尾。
  4. 发送abortStreamSync 防止迟到包回填。
  5. hold-send:豆包式按住松手发送;上滑取消;按住过程不展示识别字、不写输入框。

与 TTS 联动说明仍见 TTS流式播报集成.md