华为创新赛获奖复盘:告别“傻瓜式”问答,基于 Core Speech Kit 打造媲美真人的全双工语音交互
前言:上一篇我们介绍了适合长文本朗读的
TextReader。但在《智伴》的体感游戏场景中,我们需要的是低延迟、高响应的短语音反馈(例如击中怪兽时喊出“太棒了!”),以及能够听懂孩子指令的语音识别功能。这时,Speech Kit就显得“太重”了,我们需要深入到底层的Core Speech Kit,直接调用 TTS (Text-to-Speech) 和 ASR (Automatic Speech Recognition) 引擎。
一、 TTS 进阶:打造低延迟游戏语音引擎
在游戏中,声音反馈的及时性至关重要。如果玩家击中怪兽后,过了 1 秒才听到反馈,沉浸感会大打折扣。为此,我们在 entry/src/main/ets/common/speech/TTSEngine.ets 中封装了一个单例的 TTS 引擎。
1. 引擎创建与配置
textToSpeech.createEngine 允许我们深度定制 TTS 的行为,包括语速、音调、音量以及在线/离线模式。
import { textToSpeech } from '@kit.CoreSpeechKit';
export class TTSEngine {
private engine?: textToSpeech.TextToSpeechEngine;
async createEngine() {
// 配置参数
let extraParam: Record<string, Object> = {
"style": 'interaction-broadcast', // 交互式广播风格,更生动
"locate": 'CN',
"name": 'ZhiBanTTS'
};
let initParams: textToSpeech.CreateEngineParams = {
language: 'zh-CN',
person: 0, // 0 通常代表标准女声,可以通过 listVoices 查询更多音色
online: 1, // 1 表示优先使用在线模式(音质更好),0 为离线
extraParams: extraParam
};
// 创建引擎实例
this.engine = await textToSpeech.createEngine(initParams);
// 设置监听器
this.engine.setListener({
onStart: (requestId) => { /* 播放开始 */ },
onComplete: (requestId) => { /* 播放结束 */ },
onError: (requestId, errorCode, errorMessage) => {
console.error(`TTS Error: ${errorMessage}`);
}
});
}
}
2. 实现“抢断式”播报
在激烈的游戏中,新的语音指令往往需要打断旧的指令(例如连续击中怪兽)。我们可以通过 SpeakParams 中的 queueMode 来控制这一行为。
speak(text: string) {
if (!this.engine) return;
let speakParams: textToSpeech.SpeakParams = {
requestId: Date.now().toString(), // 唯一请求ID
extraParams: {
"speed": 1.2, // 稍微加快语速,提升游戏节奏感
"volume": 1.0,
"queueMode": 0 // 0: 排队模式(默认),1: 抢断模式
}
};
// 在《智伴》中,对于连击音效,我们可能希望它不要重叠,而是快速连续播放
// 或者对于重要通知,使用抢断模式打断背景音
this.engine.speak(text, speakParams);
}
二、 ASR 实战:让应用听懂孩子的指令
除了“说”,《智伴》还能“听”。在 entry/src/main/ets/common/stotext/core/SpeechRecognizer.ets 中,我们利用 speechRecognizer 实现了端侧语音识别。
1. 初始化识别引擎
import { speechRecognizer } from '@kit.CoreSpeechKit';
export class SpeechRecognizer {
private engine?: speechRecognizer.SpeechRecognitionEngine;
async createEngine() {
let initParams: speechRecognizer.CreateEngineParams = {
language: 'zh-CN',
online: 1, // 支持在线识别,准确率更高
extraParams: {
"locate": "CN",
"recognizerMode": "short" // 短语音模式,适合指令识别
}
};
// 创建识别引擎
this.engine = await speechRecognizer.createEngine(initParams);
}
}
2. 核心流程:录音与写入
HarmonyOS 的 ASR 引擎需要开发者主动将音频数据(PCM 格式)“喂”给它。这就涉及到了 AudioCapturer(音频采集器)的配合。
// 1. 开始监听
startListening() {
let startParams: speechRecognizer.StartParams = {
sessionId: 'session_cmd',
audioInfo: {
audioType: 'pcm',
sampleRate: 16000, // 16k 采样率是 ASR 的标准
soundChannel: 1, // 单声道
sampleBit: 16 // 16位深
}
};
this.engine?.startListening(startParams);
}
// 2. 采集音频并写入引擎
async startRecording() {
this.startListening();
// 假设 audioCapturer 已经初始化
this.audioCapturer.on('read', (buffer: ArrayBuffer) => {
// 将采集到的 PCM 数据写入 ASR 引擎
let uint8Array = new Uint8Array(buffer);
this.engine?.writeAudio('session_cmd', uint8Array);
});
this.audioCapturer.start();
}
3. 处理识别结果
通过 setListener 获取识别结果。ASR 会返回中间结果(isFinal=false)和最终结果(isFinal=true)。
this.engine.setListener({
onResult: (sessionId, result) => {
console.info(`识别文本: ${result.result}, 是否最终结果: ${result.isFinal}`);
if (result.isFinal) {
// 处理最终指令,例如 "开始游戏"、"退出"
this.handleCommand(result.result);
}
}
});
三、 性能与体验优化
在开发《智伴》的语音交互功能时,我们总结了以下几点经验:
- 音色选择:
Core Speech Kit提供了多种音色(男声、女声、童声)。针对儿童应用,选择亲切的童声或温柔的女声能显著提升亲和力。 - VAD(语音活动检测):在 ASR 参数中配置
vadBegin和vadEnd,可以让引擎自动判断说话的开始和结束,避免长时间录制静音数据,节省电量。 - 音频焦点管理:当 ASR 开始录音时,建议暂时降低游戏背景音乐的音量(Duck),识别结束后恢复,以提高识别准确率。
四、 总结
通过 Core Speech Kit,《智伴》实现了高度定制化的语音交互体验。TTS 为游戏注入了活力,ASR 让操作变得更加直观。这些原子化的能力,让开发者可以像搭积木一样,自由构建出各种充满想象力的语音应用。
解决了“听”和“说”的问题,接下来我们将进入《智伴》最硬核的部分——视觉智能。下一篇,我们将揭秘如何利用 objectDetection 实现“智能看护”。
1万+



被折叠的 条评论
为什么被折叠?



