写点什么

HarmonyOS 运动语音开发:如何让运动开始时的语音播报更温暖

  • 2025-06-08
    北京
  • 本文字数:2899 字

    阅读完需:约 10 分钟

##鸿蒙核心技术 ##运动开发 ##Core Speech Kit(基础语音服务)#


前言


在运动类应用中,语音播报功能不仅可以提升用户体验,还能让运动过程更加生动有趣。想象一下,当你准备开始运动时,一个温暖的声音提醒你“3,2,1,运动开始了”,是不是比冷冰冰的文字提示更有动力呢?本文将结合鸿蒙(HarmonyOS)开发实战经验,深入解析如何实现运动开始时的语音播报功能,让每一次运动都充满活力。



一、语音合成功能简介


鸿蒙系统提供了强大的语音合成(Text-to-Speech,TTS)功能,可以将文字转换为语音。通过调用鸿蒙的 TTS API,我们可以轻松实现语音播报功能。以下是实现语音播报功能的核心代码:


1.初始化 TTS 引擎


在使用 TTS 功能之前,我们需要初始化 TTS 引擎。以下是初始化 TTS 引擎的代码:


private ttsEngine?: textToSpeech.TextToSpeechEngine;
private async initTtsEngine() { try { // 设置创建引擎参数 let extraParam: Record<string, Object> = {"style": 'interaction-broadcast', "locate": 'CN', "name": 'EngineName'}; let initParamsInfo: textToSpeech.CreateEngineParams = { language: 'zh-CN', person: 0, online: 1, extraParams: extraParam };
// 调用createEngine方法 textToSpeech.createEngine(initParamsInfo, (err: BusinessError, textToSpeechEngine: textToSpeech.TextToSpeechEngine) => { if (!err) { console.info('Succeeded in creating engine'); // 接收创建引擎的实例 this.ttsEngine = textToSpeechEngine; // 设置speak的回调信息 let speakListener: textToSpeech.SpeakListener = { // 开始播报回调 onStart(requestId: string, response: textToSpeech.StartResponse) { console.info(`onStart, requestId: ${requestId} response: ${JSON.stringify(response)}`); }, // 合成完成及播报完成回调 onComplete(requestId: string, response: textToSpeech.CompleteResponse) { console.info(`onComplete, requestId: ${requestId} response: ${JSON.stringify(response)}`); }, // 停止播报回调 onStop(requestId: string, response: textToSpeech.StopResponse) { console.info(`onStop, requestId: ${requestId} response: ${JSON.stringify(response)}`); }, // 返回音频流 onData(requestId: string, audio: ArrayBuffer, response: textToSpeech.SynthesisResponse) { console.info(`onData, requestId: ${requestId} sequence: ${JSON.stringify(response)} audio: ${JSON.stringify(audio)}`); }, // 错误回调 onError(requestId: string, errorCode: number, errorMessage: string) { console.error(`onError, requestId: ${requestId} errorCode: ${errorCode} errorMessage: ${errorMessage}`); } }; // 设置回调 this.ttsEngine?.setListener(speakListener); } else { console.error(`Failed to create engine. Code: ${err.code}, message: ${err.message}.`); } });
} catch (error) { console.error('Failed to initialize TTS engine:', error); }}
复制代码


2.语音播报


初始化 TTS 引擎后,我们可以使用speak方法进行语音播报。以下是语音播报的代码:


private async speak(text: string) {  if (!this.ttsEngine) {    await this.initTtsEngine();  }  try {    let extraParam: Record<string, Object> =      {"queueMode": 0,        "speed": 1,        "volume": 2,        "pitch": 1,        "languageContext": 'zh-CN',        "audioType": "pcm", "soundChannel": 3, "playType": 1 };    let speakParams: textToSpeech.SpeakParams = {      requestId: USystem.generateRandomString(5), // requestId在同一实例内仅能用一次,请勿重复设置      extraParams: extraParam    };    // 调用播报方法    // 开发者可以通过修改speakParams主动设置播报策略    this.ttsEngine?.speak(text, speakParams);  } catch (error) {    console.error('TTS speak error:', error);  }}
复制代码


3.调用语音播报


在运动开始时,我们可以通过定时器调用speak方法进行倒计时播报。以下是倒计时播报的代码:


private startCountdown() {  let timer = setInterval(() => {    if (this.countdownValue > 0) {      this.speak(this.countdownValue.toString());      this.countdownValue--;    } else {      clearInterval(timer);      this.isCountdownFinished = true;      this.speak('运动开始了');      this.runTracker.start();    }  }, 1000);}
复制代码


二、代码核心点解析


1.初始化 TTS 引擎


createEngine:创建 TTS 引擎实例。需要设置语言、发音人、在线模式等参数。


setListener:设置语音播报的回调监听器,包括开始、完成、停止、错误等回调。


2.语音播报


speak:调用 TTS 引擎的speak方法进行语音播报。可以通过extraParams设置播报参数,如语速、音量、音调等。


3.倒计时播报


setInterval:使用定时器实现倒计时功能。


clearInterval:倒计时结束后,清除定时器,避免资源浪费。


三、优化与改进


1.语音播报参数优化


可以通过调整extraParams中的参数,优化语音播报的效果。例如,调整语速、音量、音调等参数,让语音播报更符合用户需求。


let extraParam: Record<string, Object> =  {"queueMode": 0,    "speed": 1.2, // 语速稍快    "volume": 2, // 音量稍大    "pitch": 1.1, // 音调稍高    "languageContext": 'zh-CN',    "audioType": "pcm", "soundChannel": 3, "playType": 1 };
复制代码


2.语音播报内容优化


可以将倒计时播报内容从简单的数字改为更友好的提示语,提升用户体验。例如:


private startCountdown() {  let timer = setInterval(() => {    if (this.countdownValue > 0) {      this.speak(`倒计时 ${this.countdownValue} 秒`);      this.countdownValue--;    } else {      clearInterval(timer);      this.isCountdownFinished = true;      this.speak('运动正式开始,请做好准备');      this.runTracker.start();    }  }, 1000);}
复制代码


3.语音播报异常处理


在实际开发中,可能会遇到 TTS 引擎初始化失败、语音播报失败等问题。可以通过监听错误回调,及时处理异常情况,提升应用的健壮性。


onError(requestId: string, errorCode: number, errorMessage: string) {  console.error(`onError, requestId: ${requestId} errorCode: ${errorCode} errorMessage: ${errorMessage}`);  // 可以在这里处理错误,例如重新初始化 TTS 引擎}
复制代码


四、总结


通过鸿蒙的 TTS 功能,我们可以轻松实现运动开始时的语音播报功能。

发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2021-11-19 加入

还未添加个人简介

评论

发布
暂无评论
HarmonyOS运动语音开发:如何让运动开始时的语音播报更温暖_鸿蒙_王二蛋和他的张大花_InfoQ写作社区