阿里云 NUI ASR 语音识别集成说明
大约 4 分钟
阿里云 NUI ASR 语音识别集成说明
厂商分支:仅描述阿里云 NUI。腾讯见 ../tencent/ASR语音识别集成.md;双厂商总览 ../README.md。
历史:原笔记目录名「ZUI」为笔误,实际为 NUI。统一
asr_*协议见 ../common/ASR流式协议.md。
相关笔记
| 文档 | 内容 |
|---|---|
| ../common/ASR流式协议.md | 统一 asr_* + 阿里/腾讯对照 |
| ../common/语音输入-VoiceInput实现链路.md | hold-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)
| 类 | 路径 |
|---|---|
AsrStreamProtocol | igw-cordova-app/.../plugin/AsrStreamProtocol.java |
VoiceRecognizePlugin | igw-cordova-app/.../plugin/VoiceRecognizePlugin.java |
FirstPlugin | asr_aliyun_start / asr_aliyun_stop(30/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_detection、disfluency等可按现场通过args[2]/ H5asrOptions微调。- 麦克风
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 - 返回:
token、appKey、expireTime
配置 application.yml:ai.nls.access-key-id / access-key-secret / app-key。
备份:backup/java/AiAsrController.java。
五、前端组件
1. 文件
| 文件 | 职责 |
|---|---|
src/components/voice/VoiceInput.vue | ASR 核心:token、原生回调、interim/committed、终稿规则 |
src/components/ChatInput.vue | 输入条封装、voiceMode、hold-send UI |
src/plugin/cordovaPlugin.js | Cordova 桥,回调统一为 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_end → committed,清空 interim |
| 静音停录 | silenceTimeout(聊天 3000ms):句末/VAD/有效 interim 后 3s 无活动 → _stopRecording |
| 发送竞态 | ChatInput.onSend 先 abortStreamSync(),避免迟到 ASR 写回已清空输入框 |
| 按住 | streamToInput=false + beginHold/endHold/cancelHold;cancelHold 上滑丢弃终稿 |
4. Props / 事件(VoiceInput 摘录)
| Prop | 默认 | 说明 |
|---|---|---|
silenceTimeout | 0 | 父组件传入,如 ChatInput text 模式 3000 |
streamToInput | true | hold-send 为 false |
hideTrigger | false | hold-send 为 true |
toastOnEmpty | true | hold-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/ | VoiceRecognizePlugin、StreamInputTtsPlugin |
| ../common/backup/ | AsrStreamProtocol、VoiceInput、cordovaPlugin、AiAsrController |
九、变更摘要(v2)
- 协议:
AsrStreamProtocol+ 原生映射;废弃 H5 解析isEnd/ 魔法字符串EVENT_*。 - 展示:committed + interim 整段覆盖;句末
asr_sentence_end担保准确。 - 静音:3s 自动停录(有效 interim 重置计时);
asr_session_complete立即收尾。 - 发送:
abortStreamSync防止迟到包回填。 - hold-send:豆包式按住松手发送;上滑取消;按住过程不展示识别字、不写输入框。
与 TTS 联动说明仍见 TTS流式播报集成.md。