HarmonyOS AI基础技术赋能之语音播报

开发 OpenHarmony
在实际应用开发中,时不时的会遇到AI领域相关的一些技术,本节主要详细讲述一下语音播报技术,语音播报可能涉及的领域,如:实时语音交互、超长文本播报等。

[[425058]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

引言

在实际应用开发中,时不时的会遇到AI领域相关的一些技术,本节主要详细讲述一下语音播报技术,语音播报可能涉及的领域,如:实时语音交互、超长文本播报等。对于HarmonyOS开发者而言,也需要了解和掌握HarmonyOS AI领域相关技术能力。

功能介绍

语音播报主要是基于华为智慧引擎(HUAWEI HiAI Engine)中的语音播报引擎,向开发者提供人工智能应用层API。该技术提供将文本转换为语音并进行播报的能力。

指南

1、创建与TTS服务的连接。context为应用上下文信息,应为ohos.aafwk.ability.Ability或ohos.aafwk.ability.AbilitySlice的实例或子类实例。

  1. private static final TtsListener ttsListener = new TtsListener() { 
  2.         @Override 
  3.         public void onEvent(int eventType, PacMap pacMap) { 
  4.             // Log.info("onEvent:" + eventType); 
  5.             if (eventType == TtsEvent.CREATE_TTS_CLIENT_SUCCESS) { 
  6.                 // Log.info("TTS Client create success"); 
  7.             } 
  8.         } 
  9.         @Override 
  10.         public void onStart(String utteranceId) { 
  11.             // Log.info(utteranceId + " audio synthesis begins"); 
  12.         } 
  13.         @Override 
  14.         public void onProgress(String utteranceId, byte[] audioData, int progress) { 
  15.             // Log.info(utteranceId + " audio synthesis progress:" + progress); 
  16.         } 
  17.         @Override 
  18.         public void onFinish(String utteranceId) { 
  19.             // Log.info(utteranceId + " audio synthesis completed"); 
  20.         } 
  21.         @Override 
  22.         public void onSpeechStart(String utteranceId) { 
  23.             // Log.info(utteranceId + " begins to speech"); 
  24.         } 
  25.         @Override 
  26.         public void onSpeechProgressChanged(String utteranceId, int progress) { 
  27.             // Log.info(utteranceId + " speech progress:" + progress); 
  28.         } 
  29.         @Override 
  30.         public void onSpeechFinish(String utteranceId) { 
  31.             // Log.info(utteranceId + " speech completed"); 
  32.         } 
  33.         @Override 
  34.         public void onError(String utteranceId, String errorMessage) { 
  35.             // Log.info(utteranceId + " errorMessage: " + errorMessage); 
  36.         } 
  37. }; 
  38. TtsClient.getInstance().create(context, ttsListener); 

2、在TTS接口创建成功后初始化TTS引擎

  1. TtsParams ttsParams = new TtsParams(); 
  2. ttsParams.setDeviceId("deviceId"); 
  3. boolean initResult = TtsClient.getInstance().init(ttsParams); 

3、初始化TTS引擎成功后调用音频转换并播放接口

  1. if (initResult) { 
  2.  TtsClient.getInstance().speakText("欢迎使用语音播报!"null); 

4、使用完成后销毁TTS客户端

  1. TtsClient.getInstance().destroy(); 

示例代码

1、xml布局

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DirectionalLayout 
  3.   xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.   ohos:height="match_parent" 
  5.   ohos:width="match_parent" 
  6.   ohos:orientation="vertical"
  7.     <Text 
  8.       ohos:height="match_content" 
  9.       ohos:width="match_content" 
  10.       ohos:margin="15vp" 
  11.       ohos:text="AI语音播报" 
  12.       ohos:text_size="23fp" 
  13.       ohos:top_margin="40vp"/> 
  14.     <TextField 
  15.       ohos:id="$+id:text" 
  16.       ohos:height="300vp" 
  17.       ohos:width="match_content" 
  18.       ohos:layout_alignment="horizontal_center" 
  19.       ohos:left_margin="20vp" 
  20.       ohos:multiple_lines="true" 
  21.       ohos:right_margin="20vp" 
  22.       ohos:text="某软件公司是中国领先的软件与信息技术服务商,企业数字转型可信赖合作伙伴。公司2001年成立于北京,立足中国,服务全球市场。经过18年发展,目前公司在全球43个城市设有90多个分支机构26个全球交付中心,员工总数近60000人。该软件公司拥有深厚的行业积累和领先的技术实力,可以为客户提供端到端的数字化产品和服务,包括数字化咨询与解决方案、云智能与基础设施、软件与技术服务和数字化运营等;在10余个重要行业服务超过1000家国内外客户,其中世界500强企业客户超过110家,为各领域客户创造价值。" 
  23.       ohos:text_size="50" 
  24.       ohos:top_margin="20vp" 
  25.       /> 
  26.     <DirectionalLayout 
  27.       xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  28.       ohos:height="match_parent" 
  29.       ohos:width="match_parent" 
  30.       ohos:orientation="horizontal"
  31.         <Button 
  32.           ohos:id="$+id:read_btn" 
  33.           ohos:height="35vp" 
  34.           ohos:width="80vp" 
  35.           ohos:background_element="$graphic:background_button" 
  36.           ohos:margin="15vp" 
  37.           ohos:text="语音播报" 
  38.           ohos:text_size="16fp"/> 
  39.         <Text 
  40.           ohos:id="$+id:time" 
  41.           ohos:height="35vp" 
  42.           ohos:width="150vp" 
  43.           ohos:margin="15vp" 
  44.           ohos:text="播报耗时:0 s" 
  45.           ohos:text_size="16fp"/> 
  46.     </DirectionalLayout> 
  47. </DirectionalLayout> 

 2、案例代码

  1. package com.isoftstone.tts.slice; 
  2.  
  3. import com.isoftstone.tts.ResourceTable; 
  4. import ohos.aafwk.ability.AbilitySlice; 
  5. import ohos.aafwk.content.Intent; 
  6. import ohos.agp.components.Button; 
  7. import ohos.agp.components.Component; 
  8. import ohos.agp.components.Text; 
  9. import ohos.agp.components.TextField; 
  10. import ohos.ai.tts.TtsClient; 
  11. import ohos.ai.tts.TtsListener; 
  12. import ohos.ai.tts.TtsParams; 
  13. import ohos.ai.tts.constants.TtsEvent; 
  14. import ohos.eventhandler.EventHandler; 
  15. import ohos.eventhandler.EventRunner; 
  16. import ohos.eventhandler.InnerEvent; 
  17. import ohos.hiviewdfx.HiLog; 
  18. import ohos.hiviewdfx.HiLogLabel; 
  19. import ohos.utils.PacMap; 
  20. import java.util.Timer; 
  21. import java.util.TimerTask; 
  22. import java.util.UUID; 
  23.  
  24. public class MainAbilitySlice extends AbilitySlice { 
  25.     private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "MainAbilitySlice"); 
  26.     private TextField infoText; 
  27.     private Text timeText; 
  28.     private boolean initItsResult; 
  29.     private static final int EVENT_MSG_TIME_COUNT = 0x1000002; 
  30.     private int time = 0; 
  31.     private Timer timer = null
  32.     private TimerTask timerTask = null
  33.  
  34.     private EventHandler handler = new EventHandler(EventRunner.current()) { 
  35.         @Override 
  36.         protected void processEvent(InnerEvent event) { 
  37.             switch (event.eventId) { 
  38.                 case EVENT_MSG_TIME_COUNT: 
  39.                     getUITaskDispatcher().delayDispatch(() -> { 
  40.                         time = time + 1; 
  41.                         HiLog.info(LABEL_LOG, "播报耗时:" + time + " s"); 
  42.                         timeText.setText("播报耗时:" + time + " s"); 
  43.                     }, 0); 
  44.                     break; 
  45.                 default
  46.                     break; 
  47.             } 
  48.         } 
  49.     }; 
  50.  
  51.     @Override 
  52.     public void onStart(Intent intent) { 
  53.         super.onStart(intent); 
  54.         super.setUIContent(ResourceTable.Layout_ability_main); 
  55.         initView(); 
  56.         initTtsEngine(); 
  57.     } 
  58.  
  59.     private void initView() { 
  60.         infoText = (TextField) findComponentById(ResourceTable.Id_text); 
  61.         Button readBtn = (Button) findComponentById(ResourceTable.Id_read_btn); 
  62.         timeText = (Text) findComponentById(ResourceTable.Id_time); 
  63.         readBtn.setClickedListener(this::readText); 
  64.     } 
  65.  
  66.     private void initTtsEngine() { 
  67.         TtsClient.getInstance().create(this, ttsListener); 
  68.     } 
  69.  
  70.     private void readText(Component component) { 
  71.         if (initItsResult) { 
  72.             TtsParams ttsParams = new TtsParams(); 
  73.             ttsParams.setSpeed(0);//语速0~15越大越快 
  74.             TtsClient.getInstance().setParams(ttsParams); 
  75.             HiLog.info(LABEL_LOG, "initItsResult is true, speakText"); 
  76.             TtsClient.getInstance().speakText(infoText.getText(), null); 
  77.         } else { 
  78.             HiLog.error(LABEL_LOG, "initItsResult is false"); 
  79.         } 
  80.     } 
  81.  
  82.     private TtsListener ttsListener = new TtsListener() { 
  83.         @Override 
  84.         public void onEvent(int eventType, PacMap pacMap) { 
  85.             HiLog.info(LABEL_LOG, "onEvent..."); 
  86.             // 定义TTS客户端创建成功的回调函数 
  87.             if (eventType == TtsEvent.CREATE_TTS_CLIENT_SUCCESS) { 
  88.                 TtsParams ttsParams = new TtsParams(); 
  89.                 ttsParams.setDeviceId(UUID.randomUUID().toString()); 
  90.                 initItsResult = TtsClient.getInstance().init(ttsParams); 
  91.             } 
  92.         } 
  93.         @Override 
  94.         public void onStart(String utteranceId) { 
  95.             HiLog.info(LABEL_LOG, "onStart..."); 
  96.         } 
  97.         @Override 
  98.         public void onProgress(String utteranceId, byte[] audioData, int progress) { 
  99.         } 
  100.         @Override 
  101.         public void onFinish(String utteranceId) { 
  102.             HiLog.info(LABEL_LOG, "onFinish..."); 
  103.         } 
  104.         @Override 
  105.         public void onError(String s, String s1) { 
  106.             HiLog.info(LABEL_LOG, "onError..."); 
  107.         } 
  108.         @Override 
  109.         public void onSpeechStart(String utteranceId) { 
  110.             // 开始计时 
  111.             HiLog.info(LABEL_LOG, "onSpeechStart..."); 
  112.             if (timer == null && timerTask == null) { 
  113.                 timer = new Timer(); 
  114.                 timerTask = new TimerTask() { 
  115.                     public void run() { 
  116.                         handler.sendEvent(EVENT_MSG_TIME_COUNT); 
  117.                     } 
  118.                 }; 
  119.                 timer.schedule(timerTask, 0, 1000); 
  120.             } 
  121.         } 
  122.         @Override 
  123.         public void onSpeechProgressChanged(String utteranceId, int progress) { 
  124.         } 
  125.         @Override 
  126.         public void onSpeechFinish(String utteranceId) { 
  127.             // 结束计时 
  128.             HiLog.info(LABEL_LOG, "onSpeechFinish..."); 
  129.             timer.cancel(); 
  130.             time = 0; 
  131.             timer = null
  132.             timerTask = null
  133.         } 
  134.     }; 

实现效果:

HarmonyOS AI基础技术赋能之语音播报-鸿蒙HarmonyOS技术社区

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-08-26 09:50:06

鸿蒙HarmonyOS应用

2021-09-13 15:14:01

鸿蒙HarmonyOS应用

2021-08-31 14:58:52

鸿蒙HarmonyOS应用

2021-09-03 15:27:17

鸿蒙HarmonyOS应用

2021-08-27 09:57:18

鸿蒙HarmonyOS应用

2021-01-14 15:07:33

人工智能游戏网络

2018-09-18 11:47:17

2020-04-27 10:39:19

人工智能技术语音识别

2020-12-14 09:23:16

人工智能教育机器人

2023-05-26 01:01:06

AI幻灯片人工智能

2021-07-14 17:25:59

AI/网络/体验至上

2021-06-24 13:20:29

人工智能AI

2022-08-25 13:19:31

5G人工智能无线技术

2021-12-24 10:34:11

鸿蒙HarmonyOS应用

2023-08-27 22:19:03

AI语义搜索OverflowAI

2022-02-17 17:19:31

鸿蒙语音识别语音播报
点赞
收藏

51CTO技术栈公众号