在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

一、前言思考

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 内。

五、总结

  1. 语音全链路的端侧化顺序:唤醒 → 识别 → 语义 → 合成,每一环都能独立离线。
  2. 唤醒是功耗与灵敏度的平衡艺术:两级检测 + 低功耗 DSP + 阈值调参。
  3. 声纹必须防重放:随机数字 + 活体检测 + 安全存储,否则形同虚设。
  4. TTS 体验靠延迟:预合成 + 流式合成,让"秒回"成为常态。

一句话记住:唤醒要省电,识别要流式,声纹要防伪,合成要预缓存。


🚀 演示功能优化(随项目同步更新)

本文对应的 ArkTS 演示页面已随项目整体优化,主要改进:

  1. 独立主题风格:午夜紫 · 深色玻璃声波氛围,与其余章节演示页明显区分,不再千篇一律。
  2. 步骤回放动画:点击演示按钮后,结果行按 260~320ms/步 逐步展示,模拟真实推理过程。
  3. 运行态保护:演示过程中按钮置灰防重复触发,页面退出自动清理定时器。
  4. 结果摘要:演示结束后自动给出「一句话结论」,并 Toast 提示完成。
  5. 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 共用)。

  1. AI 语义理解主卡:演示页顶部新增「🤖 AI 语音语义理解」卡片,内置 打车 / 音乐 / 闹钟 三个语音指令,点击「开始 AI 理解并回复」即真实请求 DeepSeek-V4-Flash,流式(打字机)生成「意图分类 + 关键槽位抽取 + 自然回复」三段式理解结果。
  2. 端云协同演示:语音指令以「端侧 ASR 已转写」文案模拟转写结果(本页原有唤醒 / ASR / 声纹 / TTS 步骤回放保留),云端大模型负责意图解析与回复生成 —— 直观展示本篇「端侧语音全链路 + 云端语义增强」的协同形态。
  3. 一行接入:页面通过 AiClient.stream(system, user, { onDelta, onDone, onError }) 发起推理,返回取消函数在 aboutToDisappear 中调用,页面销毁自动断开请求、防止回调泄漏。

说明:main.py 接口仅支持文本生成,本页语音识别走「指令文本 → 云端大模型意图解析」的演示路径;真正的端侧语音能力(唤醒 / ASR / 声纹 / TTS)仍由模拟卡片演示。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐