鸿蒙AI语音交互高级:离线语音唤醒/语音识别/声纹识别/语音合成端侧全链路高阶方案
·



一、前言思考
1.1 语音交互的"全离线"需求
智能音箱、车载语音、无障碍辅助,都要求语音交互全链路离线可用:
- 唤醒词:"小艺小艺"必须在本地实时识别,不能等网络;
- 识别(ASR):会议纪要、语音输入需要低延迟、隐私安全;
- 声纹:手机解锁、支付验证要求本地比对,杜绝伪造与泄露;
- 合成(TTS):读屏、导航播报要即时发音,网络波动不能打断。
全离线的意义:隐私不出设备 + 零延迟 + 无网可用。
1.2 语音全链路
麦克风 → 唤醒词检测(随时监听) → 语音识别ASR → 语义理解 → 服务执行
│
TTS语音合成(反馈) ◀──┘
二、底层原理
2.1 离线唤醒词检测
唤醒词检测是一个"永远在听的二分类器",功耗是核心约束:
| 方案 | 原理 | 功耗 | 延迟 |
|---|---|---|---|
| 连续语音识别 | 全量 ASR 常驻 | 高 | 快 |
| 关键词检测 | 小模型在 DSP/NPU 上跑 | 极低 | ~200ms |
| 两级检测 | 粗检(VAD) + 细检(关键词模型) | 最低 | ~300ms |
工程标准做法是两级唤醒:
麦克风帧 → VAD(声音活动检测, 极低功耗) → 有声音? → 关键词检测模型 → 命中? → 唤醒
│ │
└── 无声音: 丢弃, 继续监听 ◀────────────────────┘
VAD 功耗可低至几 mW(在低功耗 DSP 常驻),关键词模型只在有声音时才激活。
2.2 语音识别 ASR
端侧 ASR 采用流式架构:边说边出结果,而不是等整句说完。
音频帧流 ──▶ 声学模型(CNN/Transformer) ──▶ 帧级概率
│
解码器(CTC/注意力) ──▶ 字符/词序列(流式输出)
│
语言模型(浅融合) ──▶ 纠错与候选重排
流式识别三要素:
- 声学模型:把 10ms 音频帧映射为音素概率;
- 解码器:把概率序列转为文字(CTC 对齐或注意力机制);
- 语言模型:提高同音字/同音词的准确率(“山西” vs “陕西”)。
2.3 声纹识别
声纹 = 从语音中提取"说话人身份"特征向量(embedding):
语音 → 帧级特征(FBank) → 声纹模型(ECAPA-TDNN) → 512维说话人向量
│
余弦相似度 vs 注册向量 → 判定
- 注册阶段:用户录 3~5 句,提取向量入库;
- 验证阶段:新语音提取向量,与注册向量算相似度,阈值 0.8 判定;
- 防伪造:结合活体检测(要求读随机数字,防止录音重放)。
2.4 语音合成 TTS
端侧 TTS 的现代方案是端到端 + 声码器:
文本 → 音素/字序列 → 声学模型(Tacotron/VITS) → 声学特征(Mel谱) → 声码器(HiFiGAN) → 波形
| 方案 | 音质 | 延迟 | 体积 |
|---|---|---|---|
| 拼接合成 | 中 | 快 | 大(音库) |
| 统计参数 | 低 | 快 | 小 |
| 端到端神经网络 | 高 | 中 | 中 |
| HiFiGAN 声码器 | 极高 | 中 | 中 |
三、实战落地
3.1 离线唤醒词
import { voiceRecognition } from '@kit.CoreSpeechKit';
// 1. 初始化唤醒词引擎
const wakeup = await voiceRecognition.createWakeup({
keywords: ['小艺小艺'],
threshold: 0.85, // 命中阈值
onWakeup: () => {
// 唤醒成功,启动识别
startListening();
speak('我在,有什么可以帮你?');
}
});
// 2. 开始监听(低功耗)
wakeup.startListen();
// 3. 业务结束后继续监听
function startListening() {
// 启动 ASR 会话...
}
3.2 流式语音识别
import { speechRecognizer } from '@kit.CoreSpeechKit';
const asr = await speechRecognizer.createRecognizer({
language: 'zh-CN',
offline: true, // 离线模式
onResult: (partial: string, isFinal: boolean) => {
this.text = partial; // 实时显示中间结果
if (isFinal) {
this.text = partial; // 最终结果
handleCommand(partial); // 交给业务
}
},
onError: (code) => { /* 容错处理 */ }
});
asr.start(); // 开始录音识别
asr.stop(); // 结束并输出最终结果
3.3 声纹注册与验证
import { voiceprint } from '@kit.CoreSpeechKit';
// 1. 注册(需要用户念3次随机数字,兼顾活体)
let enrolled = await voiceprint.enroll({
sessionId: 'user_1001',
text: '3204675189',
times: 3
});
const vector = enrolled.embedding; // 512维向量
saveToSecureStorage(vector); // 存 HUKS 安全存储
// 2. 验证
const verify = await voiceprint.verify({
vector: vector,
text: '3204675189' // 随机数字防录音重放
});
if (verify.score > 0.8) {
unlock(); // 声纹匹配,解锁
}
3.4 语音合成
import { textToSpeech } from '@kit.CoreSpeechKit';
const tts = await textToSpeech.createSpeaker({
voiceType: 'xiaoyi_female', // 音色
speed: 1.0,
offline: true
});
// 合成并播放
await tts.speak('导航开始,前方 200 米右转');
四、性能排查与优化
| 问题 | 表现 | 优化手段 |
|---|---|---|
| 唤醒不灵敏 | 喊好几遍没反应 | 降阈值、增训练样本、多麦克风增强 |
| 误唤醒 | 电视声音误触发 | 升阈值、加环境噪声过滤、二次校验 |
| 识别错误率高 | 同音字错 | 领域语言模型、热词注入、用户词典 |
| 合成卡顿 | TTS 断断续续 | 预合成缓存、增量合成、声码器批处理 |
| 唤醒功耗高 | 待机掉电快 | VAD 前置、NPU/DSP 常驻、采样率降为 8k |
4.1 唤醒功耗优化
- 麦克风采样率降到 8kHz(语音内容 4kHz 带宽足够);
- 唤醒模型跑在 DSP(几 mW),只有命中才唤醒主 CPU;
- 静音时段 VAD 直接丢弃,不喂给关键词模型。
4.2 识别热词注入
// 业务相关词汇注入,大幅提升准确率
asr.addHotWords(['鸿蒙', '原子化服务', '端侧推理', '我司产品名']);
4.3 TTS 预合成策略
高频语句(“请再说一遍”“好的”)启动时预合成缓存,响应时间从 300ms 降到 5ms;长文本边合成边播,首包延迟控制在 200ms 内。
五、总结
- 语音全链路的端侧化顺序:唤醒 → 识别 → 语义 → 合成,每一环都能独立离线。
- 唤醒是功耗与灵敏度的平衡艺术:两级检测 + 低功耗 DSP + 阈值调参。
- 声纹必须防重放:随机数字 + 活体检测 + 安全存储,否则形同虚设。
- TTS 体验靠延迟:预合成 + 流式合成,让"秒回"成为常态。
一句话记住:唤醒要省电,识别要流式,声纹要防伪,合成要预缓存。
🚀 演示功能优化(随项目同步更新)
本文对应的 ArkTS 演示页面已随项目整体优化,主要改进:
- 独立主题风格:午夜紫 · 深色玻璃声波氛围,与其余章节演示页明显区分,不再千篇一律。
- 步骤回放动画:点击演示按钮后,结果行按 260~320ms/步 逐步展示,模拟真实推理过程。
- 运行态保护:演示过程中按钮置灰防重复触发,页面退出自动清理定时器。
- 结果摘要:演示结束后自动给出「一句话结论」,并 Toast 提示完成。
- AI 对话演示:新增 AiChatDemo(根目录 main.py 的 ArkTS 移植),真实 SSE 流式大模型请求,首页「★ AI Chat 流式对话演示」可进入。
对应页面:entry/src/main/ets/pages/VoiceAiDemo.ets
🤖 AI 推理接入(v2 更新)
演示页已接入真实大模型推理:复用 main.py 的 GitCode Chat Completions SSE 流式接口(已封装为公共工具
utils/AiClient.ets,AiChatDemo / ImageAiDemo / VoiceAiDemo 共用)。
- AI 语义理解主卡:演示页顶部新增「🤖 AI 语音语义理解」卡片,内置 打车 / 音乐 / 闹钟 三个语音指令,点击「开始 AI 理解并回复」即真实请求 DeepSeek-V4-Flash,流式(打字机)生成「意图分类 + 关键槽位抽取 + 自然回复」三段式理解结果。
- 端云协同演示:语音指令以「端侧 ASR 已转写」文案模拟转写结果(本页原有唤醒 / ASR / 声纹 / TTS 步骤回放保留),云端大模型负责意图解析与回复生成 —— 直观展示本篇「端侧语音全链路 + 云端语义增强」的协同形态。
- 一行接入:页面通过
AiClient.stream(system, user, { onDelta, onDone, onError })发起推理,返回取消函数在aboutToDisappear中调用,页面销毁自动断开请求、防止回调泄漏。
说明:main.py 接口仅支持文本生成,本页语音识别走「指令文本 → 云端大模型意图解析」的演示路径;真正的端侧语音能力(唤醒 / ASR / 声纹 / TTS)仍由模拟卡片演示。
更多推荐



所有评论(0)