找回密码
 立即注册
首页 业界区 业界 HarmonyOS运动语音开发:如何让运动开始时的语音播报更 ...

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

路逸思 2025-6-8 14:49:55
鸿蒙核心技术##运动开发##Core Speech Kit(基础语音服务)#

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

一、语音合成功能简介
鸿蒙系统提供了强大的语音合成(Text-to-Speech,TTS)功能,可以将文字转换为语音。通过调用鸿蒙的 TTS API,我们可以轻松实现语音播报功能。以下是实现语音播报功能的核心代码:
1.初始化 TTS 引擎
在使用 TTS 功能之前,我们需要初始化 TTS 引擎。以下是初始化 TTS 引擎的代码:
  1. private ttsEngine?: textToSpeech.TextToSpeechEngine;
  2. private async initTtsEngine() {
  3.   try {
  4.     // 设置创建引擎参数
  5.     let extraParam: Record<string, Object> = {"style": 'interaction-broadcast', "locate": 'CN', "name": 'EngineName'};
  6.     let initParamsInfo: textToSpeech.CreateEngineParams = {
  7.       language: 'zh-CN',
  8.       person: 0,
  9.       online: 1,
  10.       extraParams: extraParam
  11.     };
  12.     // 调用createEngine方法
  13.     textToSpeech.createEngine(initParamsInfo, (err: BusinessError, textToSpeechEngine: textToSpeech.TextToSpeechEngine) => {
  14.       if (!err) {
  15.         console.info('Succeeded in creating engine');
  16.         // 接收创建引擎的实例
  17.         this.ttsEngine = textToSpeechEngine;
  18.         // 设置speak的回调信息
  19.         let speakListener: textToSpeech.SpeakListener = {
  20.           // 开始播报回调
  21.           onStart(requestId: string, response: textToSpeech.StartResponse) {
  22.             console.info(`onStart, requestId: ${requestId} response: ${JSON.stringify(response)}`);
  23.           },
  24.           // 合成完成及播报完成回调
  25.           onComplete(requestId: string, response: textToSpeech.CompleteResponse) {
  26.             console.info(`onComplete, requestId: ${requestId} response: ${JSON.stringify(response)}`);
  27.           },
  28.           // 停止播报回调
  29.           onStop(requestId: string, response: textToSpeech.StopResponse) {
  30.             console.info(`onStop, requestId: ${requestId} response: ${JSON.stringify(response)}`);
  31.           },
  32.           // 返回音频流
  33.           onData(requestId: string, audio: ArrayBuffer, response: textToSpeech.SynthesisResponse) {
  34.             console.info(`onData, requestId: ${requestId} sequence: ${JSON.stringify(response)} audio: ${JSON.stringify(audio)}`);
  35.           },
  36.           // 错误回调
  37.           onError(requestId: string, errorCode: number, errorMessage: string) {
  38.             console.error(`onError, requestId: ${requestId} errorCode: ${errorCode} errorMessage: ${errorMessage}`);
  39.           }
  40.         };
  41.         // 设置回调
  42.         this.ttsEngine?.setListener(speakListener);
  43.       } else {
  44.         console.error(`Failed to create engine. Code: ${err.code}, message: ${err.message}.`);
  45.       }
  46.     });
  47.   } catch (error) {
  48.     console.error('Failed to initialize TTS engine:', error);
  49.   }
  50. }
复制代码
2.语音播报
初始化 TTS 引擎后,我们可以使用speak方法进行语音播报。以下是语音播报的代码:
  1. private async speak(text: string) {
  2.   if (!this.ttsEngine) {
  3.     await this.initTtsEngine();
  4.   }
  5.   try {
  6.     let extraParam: Record<string, Object> =
  7.       {"queueMode": 0,
  8.         "speed": 1,
  9.         "volume": 2,
  10.         "pitch": 1,
  11.         "languageContext": 'zh-CN',
  12.         "audioType": "pcm", "soundChannel": 3, "playType": 1 };
  13.     let speakParams: textToSpeech.SpeakParams = {
  14.       requestId: USystem.generateRandomString(5), // requestId在同一实例内仅能用一次,请勿重复设置
  15.       extraParams: extraParam
  16.     };
  17.     // 调用播报方法
  18.     // 开发者可以通过修改speakParams主动设置播报策略
  19.     this.ttsEngine?.speak(text, speakParams);
  20.   } catch (error) {
  21.     console.error('TTS speak error:', error);
  22.   }
  23. }
复制代码
3.调用语音播报
在运动开始时,我们可以通过定时器调用speak方法进行倒计时播报。以下是倒计时播报的代码:
  1. private startCountdown() {
  2.   let timer = setInterval(() => {
  3.     if (this.countdownValue > 0) {
  4.       this.speak(this.countdownValue.toString());
  5.       this.countdownValue--;
  6.     } else {
  7.       clearInterval(timer);
  8.       this.isCountdownFinished = true;
  9.       this.speak('运动开始了');
  10.       this.runTracker.start();
  11.     }
  12.   }, 1000);
  13. }
复制代码
二、代码核心点解析
1.初始化 TTS 引擎
• createEngine:创建 TTS 引擎实例。需要设置语言、发音人、在线模式等参数。
• setListener:设置语音播报的回调监听器,包括开始、完成、停止、错误等回调。
2.语音播报
• speak:调用 TTS 引擎的speak方法进行语音播报。可以通过extraParams设置播报参数,如语速、音量、音调等。
3.倒计时播报
• setInterval:使用定时器实现倒计时功能。
• clearInterval:倒计时结束后,清除定时器,避免资源浪费。
三、优化与改进
1.语音播报参数优化
可以通过调整extraParams中的参数,优化语音播报的效果。例如,调整语速、音量、音调等参数,让语音播报更符合用户需求。
  1. let extraParam: Record<string, Object> =
  2.   {"queueMode": 0,
  3.     "speed": 1.2, // 语速稍快
  4.     "volume": 2, // 音量稍大
  5.     "pitch": 1.1, // 音调稍高
  6.     "languageContext": 'zh-CN',
  7.     "audioType": "pcm", "soundChannel": 3, "playType": 1 };
复制代码
2.语音播报内容优化
可以将倒计时播报内容从简单的数字改为更友好的提示语,提升用户体验。例如:
  1. private startCountdown() {
  2.   let timer = setInterval(() => {
  3.     if (this.countdownValue > 0) {
  4.       this.speak(`倒计时 ${this.countdownValue} 秒`);
  5.       this.countdownValue--;
  6.     } else {
  7.       clearInterval(timer);
  8.       this.isCountdownFinished = true;
  9.       this.speak('运动正式开始,请做好准备');
  10.       this.runTracker.start();
  11.     }
  12.   }, 1000);
  13. }
复制代码
3.语音播报异常处理
在实际开发中,可能会遇到 TTS 引擎初始化失败、语音播报失败等问题。可以通过监听错误回调,及时处理异常情况,提升应用的健壮性。
  1. onError(requestId: string, errorCode: number, errorMessage: string) {
  2.   console.error(`onError, requestId: ${requestId} errorCode: ${errorCode} errorMessage: ${errorMessage}`);
  3.   // 可以在这里处理错误,例如重新初始化 TTS 引擎
  4. }
复制代码
四、总结
通过鸿蒙的 TTS 功能,我们可以轻松实现运动开始时的语音播报功能。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册