在鸿蒙(HarmonyOS)应用开发中,实时语音转文字服务是提升人机交互效率的核心能力。依托鸿蒙原生的 Core Speech Kit 以及机器学习服务,开发者可以构建低延迟、高隐私、多场景的语音识别应用。

一、 核心架构与识别模式

鸿蒙的语音识别服务支持端侧与云侧协同,满足不同业务场景的需求:

  1. 端侧离线识别:基于系统内置的轻量化语音大模型,无需联网即可在本地完成音频特征提取与模型推理。该模式隐私安全性高(原始音频不上传服务器),且响应延迟极低(≤300ms),非常适合免提操作和弱网环境。
  2. 云端实时转写:针对超长语音(不超过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}`);
            }
        });
    }
}

二、 核心功能与交互能力

  1. 自定义唤醒与免提交互:支持开发者自定义唤醒词(如“小鸿蒙”),实现APP后台驻留监听。用户说出唤醒词后,系统自动激活识别能力,支持“打开首页”、“关闭灯光”等高频语音指令,实现动口不动手的交互体验。
  2. 多方言与多语种适配:除了标准的中文普通话(支持中英文混说),系统还具备实用级的方言识别能力,支持粤语、四川话、东北话等主流方言的实时语音转写。同时,云端服务还支持英语、法语等多语种识别。
  3. 智能声纹与摘要:在录音转写场景中,系统支持声纹识别,能够自动区分不同发言人的内容并按顺序分段显示。结合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('粤语识别引擎初始化成功');
            }
        });
    }
}

三、 性能优化与工程实践

  1. 环境与音频质量要求:语音识别对音频质量要求较高。在嘈杂环境(如菜市场、地铁)中,建议开启“嘈杂环境增强”开关以智能抑制背景噪声;同时,发言者应保持中等语速(每分钟220–260字),避免连续快读或刻意拉长尾音。
  2. 状态与生命周期管理:实时语音转写服务目前不支持息屏识别,在调测和使用时必须保持设备屏幕常亮。此外,对于长音频的连续识别,建议按议题或时间进行分段处理,以降低长时识别带来的错误累积率。
  3. 自定义词库优化:针对包含专有名词、行业术语或新词热梗的特定场景,开发者可引导用户提前在“AI字幕词库管理”中添加自定义词条。系统在识别时将优先匹配该词汇,从而显著降低误写率。

四、 语音识别实战:Core Speech Kit 引擎初始化与流式识别

在鸿蒙 ArkTS 开发中,实现实时语音转文字的核心是调用 @kit.CoreSpeechKit 中的 speechRecognizer 模块。

  1. 权限配置与运行时申请
    语音识别强依赖麦克风输入。必须在 module.json5 中声明 ohos.permission.MICROPHONE 权限,并在代码中通过 abilityAccessCtrl 动态向用户申请,确保应用具备录音能力。
  2. 创建识别引擎与配置参数
    通过 speechRecognizer.createEngine 异步创建识别引擎。在 CreateEngineParams 中,可配置 language(如 zh-CN)、online(在线优先或纯离线模式)以及 recognizerMode(短语音模式 short 或长语音模式 long)。
  3. 流式数据写入与回调监听
    引擎创建成功后,需注册回调监听器。通过 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));
        });
    }
}

五、 进阶场景:自定义唤醒词与低功耗后台监听

针对智能家居或车载等需要“动口不动手”的场景,鸿蒙提供了基于端侧小模型的免提交互方案。

  1. 自定义唤醒词配置
    在初始化语音引擎时,通过 extraParams 传入自定义的唤醒词字符串及对应的置信度阈值。系统底层会分配极低功耗的 DSP 核心进行持续监听,而不占用主 CPU 资源。
  2. 智能休眠与低功耗策略
    为避免后台监听导致设备快速耗电,系统内置了智能休眠策略。当环境处于静止且无语音震动时,自动进入低功耗监听模式;一旦检测到有效的人声特征,毫秒级唤醒主识别引擎,实现无感交互。
  3. 唤醒事件分发
    当用户说出唤醒词后,系统会触发 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();
    }
}

 

在实际落地语音识别功能时,需特别注意以下工程规范与硬件限制:

  1. 低配置穿戴设备的内存管理
    在智能手表等内存受限的设备上,长语音识别易出现卡顿或 OOM(内存溢出)。必须采用“动态分片推理 + 内存复用机制”,自动截断超长音频并实时释放推理缓存,以适配低算力终端。
  2. 复杂环境下的降噪增强
    在户外或嘈杂环境中,人声识别准确率会显著下降。建议在配置中显式开启 noiseSuppression = true,启用系统原生的 AI 降噪算法,结合场景词库加权优化,可将复杂环境下的识别精度提升 15% 以上。
  3. 严格的引擎生命周期释放
    语音识别引擎(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);
            }
        }
    }
}

 

 

Logo

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

更多推荐