语音识别:实时语音转文字服务(200)
·
在鸿蒙(HarmonyOS)应用开发中,实时语音转文字服务是提升人机交互效率的核心能力。依托鸿蒙原生的 Core Speech Kit 以及机器学习服务,开发者可以构建低延迟、高隐私、多场景的语音识别应用。
一、 核心架构与识别模式
鸿蒙的语音识别服务支持端侧与云侧协同,满足不同业务场景的需求:
- 端侧离线识别:基于系统内置的轻量化语音大模型,无需联网即可在本地完成音频特征提取与模型推理。该模式隐私安全性高(原始音频不上传服务器),且响应延迟极低(≤300ms),非常适合免提操作和弱网环境。
- 云端实时转写:针对超长语音(不超过5小时)或复杂场景,可通过访问云端接口完成识别。云端服务支持输出标点符号,并能生成带有时间戳的文本信息,广泛应用于会议记录和直播字幕等场景。
// SpeechEngineManager.ets
import { speechRecognizer } from '@kit.CoreSpeechKit';
import { BusinessError } from '@kit.BasicServicesKit';
export class SpeechEngineManager {
private asrEngine: speechRecognizer.SpeechRecognitionEngine | undefined = undefined;
// 1. 端侧离线识别模式(低延迟、高隐私)
public async initOfflineEngine() {
const extraParam: Record<string, Object> = {
"locate": "CN",
"recognizerMode": "short" // 短语音模式,适合指令和短句
};
const initParams: speechRecognizer.CreateEngineParams = {
language: 'zh-CN',
online: 0, // 核心:0 表示纯离线模式
extraParams: extraParam
};
await this.createAndSetEngine(initParams);
}
// 2. 云端实时转写模式(高精度、长文本)
public async initCloudEngine() {
const extraParam: Record<string, Object> = {
"locate": "CN",
"recognizerMode": "long" // 长语音模式,支持长达8小时
};
const initParams: speechRecognizer.CreateEngineParams = {
language: 'zh-CN',
online: 1, // 核心:1 表示在线模式
extraParams: extraParam
};
await this.createAndSetEngine(initParams);
}
private async createAndSetEngine(params: speechRecognizer.CreateEngineParams) {
speechRecognizer.createEngine(params, (err: BusinessError, engine: speechRecognizer.SpeechRecognitionEngine) => {
if (!err) {
this.asrEngine = engine;
console.info('语音识别引擎创建成功');
} else {
console.error(`引擎创建失败: Code=${err.code}, Msg=${err.message}`);
}
});
}
}
二、 核心功能与交互能力
- 自定义唤醒与免提交互:支持开发者自定义唤醒词(如“小鸿蒙”),实现APP后台驻留监听。用户说出唤醒词后,系统自动激活识别能力,支持“打开首页”、“关闭灯光”等高频语音指令,实现动口不动手的交互体验。
- 多方言与多语种适配:除了标准的中文普通话(支持中英文混说),系统还具备实用级的方言识别能力,支持粤语、四川话、东北话等主流方言的实时语音转写。同时,云端服务还支持英语、法语等多语种识别。
- 智能声纹与摘要:在录音转写场景中,系统支持声纹识别,能够自动区分不同发言人的内容并按顺序分段显示。结合AI能力,还能对转写文本进行智能摘要,自动提炼关键信息与待办事项。
// AdvancedSpeechFeatures.ets
import { speechRecognizer } from '@kit.CoreSpeechKit';
export class AdvancedSpeechFeatures {
private asrEngine: speechRecognizer.SpeechRecognitionEngine | undefined = undefined;
constructor(engine: speechRecognizer.SpeechRecognitionEngine) {
this.asrEngine = engine;
}
// 1. 自定义唤醒词与免提交互
public setupWakeupWord() {
// 设置唤醒词(如"小鸿蒙")
this.asrEngine?.setWakeupWord("小鸿蒙");
// 启动后台唤醒监听
this.asrEngine?.startWakeup();
// 监听唤醒成功事件,自动开启后续语音识别
this.asrEngine?.on('wakeup', () => {
console.info('唤醒成功,开始听取指令');
// 此处可触发UI动画,并调用 startListening()
});
}
// 2. 多方言适配(以粤语为例)
public async initDialectEngine() {
const extraParam: Record<string, Object> = {
"locate": "CN",
"dialect": "cantonese", // 核心:切换为粤语识别
"recognizerMode": "auto"
};
const initParams: speechRecognizer.CreateEngineParams = {
language: 'zh-CN',
online: 0,
extraParams: extraParam
};
// 重新创建方言引擎
speechRecognizer.createEngine(initParams, (err, engine) => {
if (!err) {
this.asrEngine = engine;
console.info('粤语识别引擎初始化成功');
}
});
}
}
三、 性能优化与工程实践
- 环境与音频质量要求:语音识别对音频质量要求较高。在嘈杂环境(如菜市场、地铁)中,建议开启“嘈杂环境增强”开关以智能抑制背景噪声;同时,发言者应保持中等语速(每分钟220–260字),避免连续快读或刻意拉长尾音。
- 状态与生命周期管理:实时语音转写服务目前不支持息屏识别,在调测和使用时必须保持设备屏幕常亮。此外,对于长音频的连续识别,建议按议题或时间进行分段处理,以降低长时识别带来的错误累积率。
- 自定义词库优化:针对包含专有名词、行业术语或新词热梗的特定场景,开发者可引导用户提前在“AI字幕词库管理”中添加自定义词条。系统在识别时将优先匹配该词汇,从而显著降低误写率。
四、 语音识别实战:Core Speech Kit 引擎初始化与流式识别
在鸿蒙 ArkTS 开发中,实现实时语音转文字的核心是调用 @kit.CoreSpeechKit 中的 speechRecognizer 模块。
- 权限配置与运行时申请
语音识别强依赖麦克风输入。必须在module.json5中声明ohos.permission.MICROPHONE权限,并在代码中通过abilityAccessCtrl动态向用户申请,确保应用具备录音能力。 - 创建识别引擎与配置参数
通过speechRecognizer.createEngine异步创建识别引擎。在CreateEngineParams中,可配置language(如zh-CN)、online(在线优先或纯离线模式)以及recognizerMode(短语音模式short或长语音模式long)。 - 流式数据写入与回调监听
引擎创建成功后,需注册回调监听器。通过onPartialResult获取实时的中间识别结果(用于 UI 上的动态打字效果),通过onResult获取最终的完整句子。同时,需将麦克风采集到的 PCM 音频流通过recognizer.send(data)持续写入引擎。
// VoiceRecognitionService.ets
import { speechRecognizer } from '@kit.CoreSpeechKit';
import { audio } from '@kit.MediaKit';
export class VoiceRecognitionService {
private asrEngine: speechRecognizer.SpeechRecognitionEngine | null = null;
private audioCapturer: audio.AudioCapturer | null = null;
// 1. 创建识别引擎与配置参数
public async initEngine() {
const extraParam: Record<string, Object> = {
"locate": "CN",
"recognizerMode": "short" // 短语音模式
};
const initParams: speechRecognizer.CreateEngineParams = {
language: 'zh-CN',
online: 1, // 在线优先
extraParams: extraParam
};
this.asrEngine = await speechRecognizer.createEngine(initParams);
this.setupListener();
}
// 2. 注册回调监听器
private setupListener() {
const listener: speechRecognizer.RecognitionListener = {
onStart: (sessionId, eventMessage) => console.log('识别开始'),
onResult: (sessionId, result) => {
console.log(`最终结果: ${result.result}`);
},
onError: (sessionId, errorCode, errorMessage) => {
console.error(`识别错误: ${errorCode}, ${errorMessage}`);
},
onComplete: (sessionId, eventMessage) => console.log('识别完成')
};
this.asrEngine?.setListener(listener);
}
// 3. 启动麦克风采集并流式写入引擎
public async startStreaming() {
// 启动识别会话
this.asrEngine?.startListening({ sessionId: 'session_001' });
// 创建麦克风采集器
const audioStreamInfo: audio.AudioStreamInfo = {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000,
channels: audio.AudioChannel.CHANNEL_1,
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16,
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
};
this.audioCapturer = await audio.createAudioCapturer({
audioStreamInfo,
capturerInfo: { source: audio.SourceType.SOURCE_TYPE_MIC, capturerFlags: 0 }
});
await this.audioCapturer.start();
// 持续读取音频数据并写入引擎
this.audioCapturer.on('readData', (buffer: ArrayBuffer) => {
this.asrEngine?.writeAudio('session_001', new Uint8Array(buffer));
});
}
}
五、 进阶场景:自定义唤醒词与低功耗后台监听
针对智能家居或车载等需要“动口不动手”的场景,鸿蒙提供了基于端侧小模型的免提交互方案。
- 自定义唤醒词配置
在初始化语音引擎时,通过extraParams传入自定义的唤醒词字符串及对应的置信度阈值。系统底层会分配极低功耗的 DSP 核心进行持续监听,而不占用主 CPU 资源。 - 智能休眠与低功耗策略
为避免后台监听导致设备快速耗电,系统内置了智能休眠策略。当环境处于静止且无语音震动时,自动进入低功耗监听模式;一旦检测到有效的人声特征,毫秒级唤醒主识别引擎,实现无感交互。 - 唤醒事件分发
当用户说出唤醒词后,系统会触发onWakeUp回调。应用层可在此回调中执行 UI 提示(如显示波纹动画),并开启后续的指令识别或长语音转写会话。
// WakeupManager.ets
import { speechRecognizer } from '@kit.CoreSpeechKit';
export class WakeupManager {
private asrEngine: speechRecognizer.SpeechRecognitionEngine | null = null;
// 1. 配置自定义唤醒词并启动后台监听
public async startWakeupListening(wakeupWord: string) {
const extraParam: Record<string, Object> = {
"wakeupWord": wakeupWord,
"confidenceThreshold": 0.8 // 置信度阈值
};
this.asrEngine = await speechRecognizer.createEngine({
language: 'zh-CN', online: 0, extraParams: extraParam
});
// 监听唤醒事件
this.asrEngine.setListener({
onWakeup: (sessionId, eventMessage) => {
console.log(`检测到唤醒词: ${wakeupWord}`);
// TODO: 触发 UI 波纹动画,并开启后续指令识别
},
onError: (sessionId, code, msg) => console.error('唤醒监听异常:', code, msg)
} as any); // 注:具体接口依最新 SDK 为准
// 启动后台唤醒监听
this.asrEngine.startWakeup();
}
}
在实际落地语音识别功能时,需特别注意以下工程规范与硬件限制:
- 低配置穿戴设备的内存管理
在智能手表等内存受限的设备上,长语音识别易出现卡顿或 OOM(内存溢出)。必须采用“动态分片推理 + 内存复用机制”,自动截断超长音频并实时释放推理缓存,以适配低算力终端。 - 复杂环境下的降噪增强
在户外或嘈杂环境中,人声识别准确率会显著下降。建议在配置中显式开启noiseSuppression = true,启用系统原生的 AI 降噪算法,结合场景词库加权优化,可将复杂环境下的识别精度提升 15% 以上。 - 严格的引擎生命周期释放
语音识别引擎(SpeechRecognitionEngine)属于重量级资源。在页面销毁(aboutToDisappear)或识别任务结束时,必须严格调用engine.release()释放底层 NPU 和麦克风占用,防止应用切后台后出现内存泄漏或麦克风被持续占用的异常。
// AsrSafetyManager.ets
import { speechRecognizer } from '@kit.CoreSpeechKit';
export class AsrSafetyManager {
// 1. 复杂环境下的降噪增强配置
public static getNoiseSuppressionParams(): Record<string, Object> {
return {
"noiseSuppression": true, // 显式开启 AI 降噪
"vadBegin": 2000, // 语音活动检测起点
"vadEnd": 3000 // 语音活动检测终点
};
}
// 2. 严格的引擎生命周期释放(防止内存泄漏与麦克风占用)
public static async safeReleaseEngine(engine: speechRecognizer.SpeechRecognitionEngine | null) {
if (engine) {
try {
await engine.finish('session_001'); // 结束当前会话
await engine.shutdown(); // 彻底释放引擎资源
console.info('ASR 引擎资源已安全释放');
} catch (err) {
console.error('ASR 引擎释放失败:', err);
}
}
}
}
更多推荐



所有评论(0)