鸿蒙 Next 文本转语音与语音转文字实用场景教程

鸿蒙 Next 文本转语音与语音转文字实用场景教程

在数字化快速发展的今天,语音技术在提升交互体验和辅助特殊人群方面发挥着重要作用。鸿蒙 Next 的 Core Speech Kit 提供了文本转语音(TTS)和语音识别(ASR)功能,为开发者打造无障碍交互应用提供了有力支持,本文将深入探讨其实用场景。

语音技术演进与鸿蒙实现优势

核心能力升级

鸿蒙 Core Speech Kit 提供 双引擎驱动模式

在线模式:依托华为云语音服务实现高精度识别与自然语音合成(支持 15+ 语种)离线模式:内置轻量级引擎保障无网环境基础功能(需下载 200MB 语音包

性能优化策略端侧计算加速:利用 NPU 芯片实现 200ms 级低延迟响应多模态融合:结合设备传感器数据(如运动状态)动态调整拾音策略

一、文本转语音(TTS)应用场景

(一)无障碍辅助

视障人士阅读 :视障人士在使用手机、平板等设备时,难以通过视觉获取屏幕信息。借助 TTS 功能,系统应用可实现屏幕朗读,如阅读新闻、浏览社交动态、查看消息提醒等,让视障人士 “听” 到文字内容,畅享信息获取的便利。长辈模式 :部分长辈对小字体阅读感到困难,TTS 能将文章、电子书等内容转化为语音播报,方便长辈收听新闻资讯、小说故事等,丰富他们的精神生活。

(二)智能语音助手

智能家居控制 :在智能家居场景中,用户可通过语音指令控制设备,如 “打开窗帘”“开启空调”。TTS 可用于确认指令和反馈设备状态,如 “窗帘已打开”,提升交互自然度。智能客服 :在应用内客服场景,TTS 可将常见问题解答、操作指南等文本内容转化为语音,为用户提供更便捷的咨询方式,尤其适用于驾驶等不便阅读的场景。

二、语音转文字(ASR)应用场景

(一)听障人士辅助

音频内容获取 :听障人士难以通过听觉获取音频信息,ASR 可将语音会议、讲座、广播等内容转为文字,方便他们获取关键信息,提升学习和工作效率。社交互动 :在社交聊天中,ASR 可将语音消息转为文字,让听障人士更好地参与对话,增进与他人的情感交流。

(二)高效办公与学习

会议记录 :在会议中,ASR 可实时将发言转为文字,生成会议纪要,节省人工记录时间,提高办公效率。课堂笔记 :学生可利用 ASR 将老师讲课内容转为文字,方便课后复习,尤其适用于大量信息需要记录的场景。

三、开发语音交互

(一)开发环境准备

确保已安装鸿蒙开发工具,并创建 HarmonyOS 项目,添加 Core Speech Kit 相关依赖。

(二)文本转语音开发步骤

引入模块 :在代码文件中引入 textToSpeech 模块。

import { textToSpeech } from '@kit.CoreSpeechKit';

import { BusinessError } from '@kit.BasicServicesKit';

创建引擎 :调用 createEngine 接口创建 TextToSpeechEngine 实例,设置语言、音色等参数。

let ttsEngine: textToSpeech.TextToSpeechEngine;

let extraParam: Record = {"style": 'interaction-broadcast', "locate": 'CN', "name": 'EngineName'};

let initParamsInfo: textToSpeech.CreateEngineParams = { language: 'zh-CN', person: 0, online: 1, extraParams: extraParam };

textToSpeech.createEngine(initParamsInfo, (err: BusinessError, textToSpeechEngine: textToSpeech.TextToSpeechEngine) => {

if (!err) {

ttsEngine = textToSpeechEngine;

} else {

console.error(`Failed to create engine. Code: ${err.code}, message: ${err.message}.`);

}

});

设置播报参数与监听器 :实例化 SpeakParams 对象和 SpeakListener 对象,设置播报策略、音量、语速等参数,并监听播报事件。

let speakListener: textToSpeech.SpeakListener = { /* 监听器方法实现 */ };

ttsEngine.setListener(speakListener);

let originalText: string = 'Hello HarmonyOS';

let extraParam: Record = {"queueMode": 0, "speed": 1, "volume": 2, "pitch": 1, "languageContext": 'zh-CN', "audioType": "pcm", "soundChannel": 3, "playType": 1 };

let speakParams: textToSpeech.SpeakParams = { requestId: '123456', extraParams: extraParam };

ttsEngine.speak(originalText, speakParams);

(三)语音转文字开发步骤

引入模块 :引入 speechRecognizer 模块。

import { speechRecognizer } from '@kit.CoreSpeechKit';

import { BusinessError } from '@kit.BasicServicesKit';

创建引擎 :调用 createEngine 方法创建 SpeechRecognitionEngine 实例,设置语言、识别模式等参数。

let asrEngine: speechRecognizer.SpeechRecognitionEngine;

let sessionId: string = '123456';

let extraParam: Record = {"locate": "CN", "recognizerMode": "short"};

let initParamsInfo: speechRecognizer.CreateEngineParams = { language: 'zh-CN', online: 1, extraParams: extraParam };

speechRecognizer.createEngine(initParamsInfo, (err: BusinessError, speechRecognitionEngine: speechRecognizer.SpeechRecognitionEngine) => {

if (!err) {

asrEngine = speechRecognitionEngine;

} else {

console.error(`Failed to create engine. Code: ${err.code}, message: ${err.message}.`);

}

});

设置监听器 :实例化 RecognitionListener 对象,设置回调方法,接收语音识别结果等信息。

let setListener: speechRecognizer.RecognitionListener = { /* 回调方法实现 */ };

asrEngine.setListener(setListener);

开始识别 :根据音频来源(文件或麦克风),设置识别参数,调用 startListening 方法开始识别。

private startListeningForWriteAudio() {

let recognizerParams: speechRecognizer.StartParams = { sessionId: this.sessionId, audioInfo: { audioType: 'pcm', sampleRate: 16000, soundChannel: 1, sampleBit: 16 } };

asrEngine.startListening(recognizerParams);

}

写入音频流 :对于音频文件识别,读取文件并写入音频流;对于麦克风识别,获取音频流后写入。

let uint8Array: Uint8Array = new Uint8Array();

asrEngine.writeAudio(sessionId, uint8Array);

四、注意事项

权限配置 :使用语音识别功能时,需在 module.json5 配置文件中添加 ohos.permission.MICROPHONE 权限。

音频格式要求 :确保音频文件格式符合要求,如 pcm 格式、采样率等参数设置正确。网络状态 :部分功能可能依赖网络,在无网环境下可能无法使用,需根据实际需求进行处理。

五、实战案例

(一)文本转语音

import { textToSpeech } from '@kit.CoreSpeechKit';

import { BusinessError } from '@kit.BasicServicesKit';

let ttsEngine: textToSpeech.TextToSpeechEngine;

function createEngine() {

let extraParam: Record = {"style": 'interaction-broadcast', "locate": 'CN', "name": 'EngineName'};

let initParamsInfo: textToSpeech.CreateEngineParams = { language: 'zh-CN', person: 0, online: 1, extraParams: extraParam };

textToSpeech.createEngine(initParamsInfo, (err: BusinessError, textToSpeechEngine: textToSpeech.TextToSpeechEngine) => {

if (!err) {

ttsEngine = textToSpeechEngine;

} else {

console.error(`Failed to create engine. Code: ${err.code}, message: ${err.message}.`);

}

});

}

function speak(text: string) {

let speakListener: textToSpeech.SpeakListener = { /* 监听器方法实现 */ };

ttsEngine.setListener(speakListener);

let extraParam: Record = {"queueMode": 0, "speed": 1, "volume": 2, "pitch": 1, "languageContext": 'zh-CN', "audioType": "pcm", "soundChannel": 3, "playType": 1 };

let speakParams: textToSpeech.SpeakParams = { requestId: '123456', extraParams: extraParam };

ttsEngine.speak(text, speakParams);

}

(二)语音转文字

import { speechRecognizer } from '@kit.CoreSpeechKit';

import { BusinessError } from '@kit.BasicServicesKit';

let asrEngine: speechRecognizer.SpeechRecognitionEngine;

let sessionId: string = '123456';

function createEngine() {

let extraParam: Record = {"locate": "CN", "recognizerMode": "short"};

let initParamsInfo: speechRecognizer.CreateEngineParams = { language: 'zh-CN', online: 1, extraParams: extraParam };

speechRecognizer.createEngine(initParamsInfo, (err: BusinessError, speechRecognitionEngine: speechRecognizer.SpeechRecognitionEngine) => {

if (!err) {

asrEngine = speechRecognitionEngine;

} else {

console.error(`Failed to create engine. Code: ${err.code}, message: ${err.message}.`);

}

});

}

function startRecognition() {

let setListener: speechRecognizer.RecognitionListener = { /* 回调方法实现 */ };

asrEngine.setListener(setListener);

let recognizerParams: speechRecognizer.StartParams = { sessionId: sessionId, audioInfo: { audioType: 'pcm', sampleRate: 16000, soundChannel: 1, sampleBit: 16 } };

asrEngine.startListening(recognizerParams);

}

function writeAudio(audioData: Uint8Array) {

asrEngine.writeAudio(sessionId, audioData);

}

相关推荐

拼多多的水果为什么那么便宜?运费是怎么计算的?
365bet体育在线怎么样

拼多多的水果为什么那么便宜?运费是怎么计算的?

📅 10-13 👁️ 1811
现金巴士只能借1000了 ?
0755 36553288

现金巴士只能借1000了 ?

📅 08-10 👁️ 3666
忘记电脑开机密码怎么办?六种方法教你解决
365bet体育在线怎么样

忘记电脑开机密码怎么办?六种方法教你解决

📅 06-27 👁️ 6292