你真想把“语音 + 视觉”的鸿蒙智能交互做成一套能上线的系统吗?

🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
前言
这份“工程化手册”覆盖四件事:系统设计骨架 → 语音识别/合成(ASR/TTS)接口 → 多模态(语音+视觉)编排 → 自定义语音助手落地。我给到可运行的 ArkTS 代码骨架、时序与性能要点,并把“易踩坑—规避方案”写在同页,方便你直接抄作业。
0. 总览:一张图看清架构(端侧优先、可云扩展)
[麦克风/摄像头]
│
AudioCapturer/CameraKit
│
[Core Speech Kit]
├─ speechRecognizer → 文本(ASR)
└─ textToSpeech ← 文本(TTS)
│
[意图层 NLU/规则/LLM]
├─ 设备控制/业务意图解析
└─ 视觉结果融合(Vision Kit / OCR / 自研模型)
│
[跨设备/状态同步(可选)]
└─ DDM(分布式对象/分布式KV)
语音识别与合成使用 Core Speech Kit 的
speechRecognizer与textToSpeech;视觉侧用 Vision Kit 或 Camera + 自研识别;如需“唤醒词”,可接入 智能语音框架(DSP 唤醒)。
1. 语音识别(ASR)与 TTS:API、最小可跑代码与性能要点
1.1 ASR:speechRecognizer(离线中文、支持事件回调)
import { speechRecognizer } from '@kit.CoreSpeechKit';
let asr: speechRecognizer.SpeechRecognitionEngine;
speechRecognizer.createEngine({ /* 可选:资源路径/缓存策略 */ }, (err, engine) => {
if (err) { console.error('ASR create failed', JSON.stringify(err)); return; }
asr = engine;
asr.setListener({
onStart: () => console.info('ASR start'),
onEvent: (ev) => console.info('ASR event', JSON.stringify(ev)),
onResult: (res) => console.info('ASR partial/final', JSON.stringify(res)),
onComplete: () => console.info('ASR complete'),
onError: (e) => console.error('ASR error', JSON.stringify(e)),
});
});
// 拉起识别(内置采集)
asr.startListening({
language: 'zh-CN',
enableIntermediateResult: true,
vad: { enable: true }, // 端侧静音检测
});
speechRecognizer提供createEngine → setListener → startListening/finish/cancel/shutdown的完整链路,官方说明当前支持中文、离线模型;产品上以短语音指令最稳。
1.2 TTS:textToSpeech(多语种/音色、下载与播报)
import { textToSpeech } from '@kit.CoreSpeechKit';
let tts: textToSpeech.TextToSpeechEngine;
textToSpeech.createEngine({}, (err, engine) => {
if (err) return console.error(err);
tts = engine;
tts.setListener({
onStart: (r) => console.info('TTS start', JSON.stringify(r)),
onData: (chunk) => {/* 可选:流式播放/缓存 */},
onComplete: () => console.info('TTS complete'),
onError: (e) => console.error('TTS error', JSON.stringify(e)),
});
});
// 选择音色(若未安装可下载)
const voices = await tts.listVoices({ language: 'zh-CN' });
await tts.speak({
text: '你好,我在呢。',
voice: voices[0], rate: 1.0, pitch: 1.0,
});
textToSpeech支持中文/英文与多种音色,含listVoices / downloadVoice / speak / stop,按需离线缓存音色,降低首次延迟。
工程提示(ASR/TTS 共通)
- 初始化放在 UIAbility.onCreate,避免频繁建销引擎;
- 权限:麦克风录音 & 语音相关能力(申请 user_grant);
- 线程与功耗:监听回调只做“轻逻辑”,重处理丢到
taskpool/Worker; - 时延规划:短指令(<3s)优先;TTS 首包可预热(预下载音色)。
2. 多模态交互(语音 + 视觉):从“看见”到“听懂并反馈”
2.1 视觉侧两条路
- Vision Kit:开箱即用的人脸活体、识图等场景化接口,便于快速集成;适合“人脸在场确认”“物体识别提示”之类场景。
- Camera + 自研算法:用 Camera Kit 做预览/拍照/视频帧采集,送入你自研的 OCR/检测模型。官方相机最佳实践给了 ArkTS 预览/拍照流程。
2.2 示例:相机取帧 + 识别结果语音播报
// 伪代码:相机帧送入 OCR/分类器 → 文本化 → TTS 播报
import camera from '@ohos.multimedia.camera';
async function onFrameAnalyzed(text: string) {
await tts?.speak({ text: `检测到:${text}` });
}
// Camera 预览建立后,在帧回调中调用 onFrameAnalyzed(...)
如果你更偏“纯 SDK 集成”,可以直接用“识图控件/活体检测”等 Vision Kit 组件;实战里也有 ArkTS OCR 双路预览参考。
3. 自定义语音助手:从“唤醒词 → 对话 → 执行动作”的闭环
3.1 唤醒词(可选,硬件/DSP 友好)
- 智能语音框架提供唤醒词建模/唤醒与并发策略,适配 DSP 声学前端(低功耗长待机)。建议:本地唤醒 + 端侧 ASR,失败兜底云端。
3.2 “对话大脑”两段式
- 轻量 NLU(规则/关键词/小模型):响应本地控制(亮度、音量、APP 跳转);
- 复杂问答/多轮:走云端 LLM(可选自建/三方),并在端侧做结果裁剪(安全/隐私)。
3.3 指令到动作:意图映射与权限
type Intent = { name: 'OPEN_APP'|'SET_BRIGHTNESS'|'LOOK_UP'|'OCR_READ'; slots?: Record<string,string> };
function routeIntent(i: Intent) {
switch (i.name) {
case 'SET_BRIGHTNESS': /* 调系统接口 */ break;
case 'OCR_READ': /* 触发相机识别 + TTS */ break;
// ...
}
}
3.4 对话 Loop(最小闭环)
// 1) 唤醒(可选)→ 2) ASR → 3) NLU → 4) 执行 → 5) TTS 反馈
asr.setListener({
onResult: (r) => {
if (!r?.isFinal) return;
const text = r.text;
const intent = nlu(text); // 规则/小模型
routeIntent(intent);
}
});
体验要点
- 打断策略:TTS 播报中如再次唤醒/说话,先
stop()再转听; - 多设备协同:手机/平板/车机可通过 DDM 同步“对话上下文/设置项”,确保跨端一致;
- 离线优先:常用指令(计时器、设置项)设计“纯本地”闭环,弱网不掉链。
4. 端到端“语音读屏 + 视觉辅助”的样例拼装(可直接改造)
目标:用户说“这是什么”,相机取帧识别出文案与品类 → TTS 播报结果;说“朗读屏幕”,则走 OCR 文本识别 → 朗读。
// 伪代码:把语音路由到视觉/朗读
function nlu(q: string): Intent {
if (/这是什么|识别一下/.test(q)) return { name: 'LOOK_UP' }
if (/朗读(屏幕|这个)/.test(q)) return { name: 'OCR_READ' }
return { name: 'LOOK_UP', slots: { query: q } }
}
async function routeIntent(i: Intent) {
if (i.name === 'LOOK_UP') {
const label = await recognizeCurrentFrame(); // Vision/OCR 分类
await tts.speak({ text: `看起来像是:${label}` });
} else if (i.name === 'OCR_READ') {
const text = await ocrCurrentFrame();
await tts.speak({ text });
}
}
识别/朗读这两条链路分别复用 Camera/Vision 与 TTS 能力;Camera 预览/采集请对照官方拍照/预览最佳实践。
5. 工程与体验 Checklist(上线前逐条过)
- ASR/TTS 引擎:应用启动后懒加载 + 失败重试;
shutdown()在退出时清理。 - 麦克风/相机权限:首次拉起弱打断引导,并提供“本地仅处理”说明(隐私)。
- 降噪与回声:播放 TTS 时收音要么停,要么配AEC(设备硬件/声学策略)。
- 打断策略:TTS 正播时再次唤醒→
stop()→ASR;播报队列去重与合并(防刷屏)。 - 弱网处理:NLU 云端失败时回落到本地规则集;TTS 先播“确认词”。
- 唤醒词:尽量走 DSP 路,由智能语音框架实现低功耗常听(若设备支持)。([Gitee][5])
- 视觉性能:优先 NV12/YCbCr → 小模型 → 轻后处理;OCR/检测限帧率避免烫机。
- 多模态协同:当视觉不确定时(低置信度)反问澄清;置信度高则直接 TTS。
- 可观测性:埋点 ASR 时延、识别正确率、TTS 首包时延、用户打断率。
- 可访问性:配合 Accessibility,给“语音读屏/按钮聚焦”留入口。
6. 易踩坑与解法
- ASR 无声/结果为空:检查
canIUse('SystemCapability.AI.SpeechRecognizer')与麦克风授权,回调里看onError错误码;必要时切换到“按下说话”。 - TTS 首次延迟长:提前
listVoices()并downloadVoice(),进入首页先预热引擎。 - 多轮语义丢上下文:把 session 放在 DDM/内存里,超时清理;跨端场景同步最近一轮意图与槽位。
- 相机/语音抢占:建立“资源仲裁层”,TTS 播报中降采样或暂停识别;结束后恢复。
- 唤醒词误触:DSP 侧换词 & 提升门限;前置“二次确认”规则(尤其是敏感动作)。
7. 参考与扩展
- speechRecognizer(ASR)ArkTS API:创建引擎、事件、
startListening/finish/cancel,当前支持中文离线模型。 - textToSpeech(TTS)ArkTS API:列音色、下载、
speak/stop、事件回调;中英与多音色。 - Vision Kit(场景化视觉服务/识图控件/活体等)。
- Camera Kit 最佳实践(拍照/预览):ArkTS 开发流程与代码骨架。
- 智能语音框架(唤醒/并发/驱动):含 DSP 声学链路与服务框架。
- 社区实战:ASR + 录音、OCR 双路预览案例(思路可借鉴;以官方 API 为准)。
8. 结语:把“自然交互”落地的三步曲
- 先小闭环:一句“打开手电筒”,ASR→NLU→系统动作→TTS 确认;
- 再多模态:把相机/识图融入 1–2 个核心场景(识物/读屏);
- 最后扩场景:唤醒词、跨端状态、更多设备协同。
🧧福利赠与你🧧
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」专栏(全网一个名),bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
✨️ Who am I?
我是bug菌(全网一个名),CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主/价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-
- 点赞
- 收藏
- 关注作者
评论(0)