0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙语音播报懒人“看”书新法到底如何实现?

电子工程师 来源:HarmonyOS开发者 作者:HarmonyOS开发者 2021-05-20 16:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

现代社会节奏较快,人们看书可能不仅仅只用眼睛,有时候也会用耳朵来“听书”,语音播报由此诞生,并通过人工智能语音识别引擎实现。HarmonyOS基于华为智慧引擎(HUAWEI HiAI Engine)中的语音识别引擎,向开发者提供人工智能应用层API,该技术提供将文本转换为语音并进行播报的能力,可应用于以下两种场景:

·实时语音交互

生成音频信息用于语音交互,例如与智能音箱手机智能助手的交互,后台会将回答的信息以音频方式进行语音播报。

·超长文本播报

用于小说、新闻等较长文本的自动朗读。

本期我们就为大家带来超长文本播报场景下的基于AI语音播报能力的Codelab。当用户输入相关文本内容时,点击“语音播放”按钮,程序即对文本进行播报并同步记录语音播报的耗时时长,并呈现在页面上,是不是能满足计时“听书”的需求呢?让我们一起来看看吧。

首先,让我们梳理一遍开发要点:

1)UI页面的构建

2)语音播报接口调用

3)计时器的创建

4)线程间通信处理机制的使用

请注意,由于需要时刻进行观察,在逻辑代码实现中我们会穿插HiLog日志打印,下面我们会逐一指出。

在正式开始敲代码之前,开发者们需要先下载安装Huawei DevEco Studio,如果对这个流程不甚熟悉,可以参照官网的教程来操作。Huawei DevEco Studio安装指南:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/software_install-0000001053582415

【注意】本次Codelab针对的是步骤拆解和重点讲解,限于篇幅原因不会展示完整代码,开发者们可在文末【阅读原文】中获取完整代码哦~

我们打开Huawei DevEco Studio,选择Phone中的Empty Feature Ability(Java)模板工程,本次Codelab我们将在该模板下完成。有如下操作:

1.我们将在entrysrcmain esourcesaselayoutability_main.xml中构建UI页面;

2.我们在entrysrcmain esourcesasegraphic目录下新建background_button.xml文件用于实现“语音播报”按钮的样式优化;

3.文中的逻辑代码我们将在 entrysrcmainjavacomexampleailistenersliceMainAbilitySlice.java文件中实现;让我们马上开始。

25ba4904-b567-11eb-bf61-12bb97331649.png

1)UI界面构建

纵观这个页面,主要分为以下几个部分:

·标题

即“AI语音播报”这几个字,这里我们使用Text组件。

·文本输入框

可供用户输入想要播报的文本内容,最大不超过100,000个字符。为了便于大家理解,这里我们已经给大家准备了一段文本,我们使用TextField组件来完成。

·播报按钮

此处展示的文本是“语音播报”,使用的是Button组件。值得注意的是,这里需要优化按钮样式,如添加阴影及优化其为胶囊按钮,让按钮更为醒目美观。

如前面提到的,我们将在background_button.xml文件中优化按钮样式,通过color 设置按钮背景颜色,通过radius的半径实现圆角, 代码如下:

《?xml version=“1.0” encoding=“utf-8”?》 《shape xmlns:ohos=“http://schemas.huawei.com/res/ohos” ohos:shape=“rectangle”》 《corners ohos:radius=“40”/》 《solid ohos:color=“#e9e9e9”/》 《/shape》

·计时文本

用于显示“播报耗时:0 s”文本,同样使用Text组件完成。

2)语音播报接口调用

构建完了页面,我们来到今天的重头戏之一,也就是使用AI语音播报能力开发程序。语音播报(Text to Speech,以下简称TTS),提供将文本转换为语音并进行播报的能力。

·语音播报官网资料

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ai-tts-overview-0000001050724400

这里我们主要分三个部分实现,创建TTS客户端、TTS客户端的初始化和调用相关方法对文本进行播报。下面我们来详细看看各个接口如何调用。

1. TTS客户端创建

调用void create接口创建TTS客户端。

private void initTtsEngine() { TtsClient.getInstance().create(this, ttsListener); }

2.TTS客户端的初始化

当TTS客户端创建成功,即eventType取值

TtsEvent.CREATE_TTS_CLIENT_SUCCESS时,进行TTS客户端的初始化。

public void onEvent(int eventType, PacMap pacMap) { HiLog.info(LABEL_LOG, “onEvent.。。”); // 定义TTS客户端创建成功的回调函数 if (eventType == TtsEvent.CREATE_TTS_CLIENT_SUCCESS) { TtsParams ttsParams = new TtsParams(); ttsParams.setDeviceId(UUID.randomUUID().toString()); initItsResult = TtsClient.getInstance().init(ttsParams); } }

同时我们引入HiLog日志打印,便于观察相关情况。

3.调用相关方法对文本进行播报

这里我们调用TtsClient.getInstance().speakText()方法对文本进行播报,同样也引入HiLog日志打印用于观察初始化是否成功。

private void readText(Component component) { if (initItsResult) { HiLog.info(LABEL_LOG, “initItsResult is true, speakText”); TtsClient.getInstance().speakText(infoText.getText(), null); } else { HiLog.error(LABEL_LOG, “initItsResult is false”); } }

3)计时器的创建

本Codelab将以秒为单位对AI语音播报速度进行计时,故而我们需要一个计时器。在HarmonyOS中,我们通过计时器Timer和计时器任务TimerTask类来实现。这里使用到的是构建和取消两种方法,比较简单。大家可以通过官网资料进一步了解。

·Timerhttps://developer.harmonyos.com/cn/docs/documentation/doc-references/timer-0000001054358579

·TimerTask

https://developer.harmonyos.com/cn/docs/documentation/doc-references/timertask-0000001054558601

同样我们使用HiLog日志打印来观察文本语音播报的开始和结束。

4)线程间通信处理机制的使用

接下来我们将提到本Codelab另外一个重头戏——线程间通信处理机制的使用。在启动应用时,系统会为该应用创建一个称为“主线程”的执行线程。该线程随着应用创建或消失,是应用的核心线程。具体到本Codelab,UI界面的显示和更新等操作,就是更新播报耗时的界面,是在主线程上进行的,因此主线程也称为UI线程。示例中分配的是9015,如图所示:

然而在实际项目中,开发者可能面临许多耗时的操作,比如说下载文件、查询数据库,具体到本Codelab,就是语音播报功能和计时器功能,这些复杂的操作会阻塞 UI线程,导致界面无响应,带来非常不好的用户体验。

因此,我们需要将这些耗时操作放到子线程中,避免阻塞主线程,比如在示例中,我们把AI语音播报放在子线程9275中执行:

但同时,我们又需要把操作的结果数据反馈给UI线程,这个时候就必须引入线程间通信处理机制。因此,HarmonyOS 给Java应用开发提供了EventHandler机制,可以通过EventRunner创建新线程,将耗时的操作放到新线程上执行。这样既不阻塞原来的线程,任务又可以得到合理的处理。

每一个EventHandler和指定的EventRunner所创建的新线程绑定,并且该新线程内部有一个事件队列。EventHandler可以投递指定的InnerEvent事件或Runnable任务到这个事件队列。

EventRunner从事件队列里循环地取出事件:

1)如果取出的事件是InnerEvent事件,将在EventRunner所在线程执行processEvent回调;

2)如果取出的事件是Runnable任务,将在EventRunner所在线程执行Runnable的run回调。

·线程间通信开发概述

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/inter-thread-overview-0000000000038958

在本例中,开始发音的时候发送EVENT_MSG_TIME_COUNT事件,此时程序开始计时并更新UI页面,示例代码如下所示:

@Override public void onSpeechStart(String utteranceId) { // 开始计时 HiLog.info(LABEL_LOG, “onSpeechStart.。。”); if (timer == null && timerTask == null) { timer = new Timer(); timerTask = new TimerTask() { public void run() { handler.sendEvent(EVENT_MSG_TIME_COUNT); } }; timer.schedule(timerTask, 0, 1000); } }

此时取出的事件是Runnable,需要将Runnable任务投递到新的线程,在EventRunner所在线程执行Runnable的run回调,并按照优先级和延时进行处理,。这里是同步更新UI页面,代码如下所示:

private EventHandler handler = new EventHandler(EventRunner.current()) { @Override protected void processEvent(InnerEvent event) { switch (event.eventId) { case EVENT_MSG_TIME_COUNT: getUITaskDispatcher().delayDispatch(new Runnable() { @Override public void run() { time = time + 1; HiLog.info(LABEL_LOG, “播报耗时:” + Integer.toString(time) + “ s”); timeText.setText(“播报耗时:” + Integer.toString(time) + “ s”); } }, 0); break; default: break; } } };

至此,我们已经完成本次Codelab的所有关键步骤。

通过这个Codelab,大家可以学习到AI语音播报、线程间通信和计时器的使用方法。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    3006

    浏览量

    116828
  • AI
    AI
    +关注

    关注

    91

    文章

    41057

    浏览量

    302561
  • 语音播报
    +关注

    关注

    1

    文章

    40

    浏览量

    15165
  • 鸿蒙
    +关注

    关注

    60

    文章

    3017

    浏览量

    46170
  • HarmonyOS
    +关注

    关注

    80

    文章

    2157

    浏览量

    36284
  • OpenHarmony
    +关注

    关注

    33

    文章

    3974

    浏览量

    21351

原文标题:【Codelab】懒人“看”书新法—鸿蒙语音播报,到底如何实现?

文章出处:【微信号:HarmonyOS_Dev,微信公众号:HarmonyOS开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    思泽远科技语音芯片指南:在嵌入式产品中 融入语音播报

    随着嵌入式技术的不断发展,在产品中加入语音播报功能已成为提升用户体验的重要手段。然而,面对市面上琳琅满目的语音方案,工程师们往往感到无从下手。本文将从实际工程角度出发,结合思泽远科技的产品特点,梳理
    的头像 发表于 04-14 09:17 414次阅读
    思泽远科技<b class='flag-5'>语音</b>芯片指南:在嵌入式产品中 融入<b class='flag-5'>语音</b><b class='flag-5'>播报</b>

    4路TTS语音播报控制器:联动控制,音频定时播放

    4路TTS语音播报控制器是一种能够将文本信息转换为语音并进行播报的电子设备,具备4路相关控制功能。 通过语音合成技术,将输入的文字自动合成为
    的头像 发表于 10-31 15:44 597次阅读

    语音报警器:TTS语音播报,云平台逻辑自控

    TTS语音播报报警器是一种集成了传统报警器和TTS(文本转语音)技术的智能设备。清晰、准确地用人类语言播报报警原因、位置、状态等具体信息。 工作原理 文本
    的头像 发表于 10-29 16:31 962次阅读

    传感类语音提示器语音播报芯片最佳适配方案WT2003H

    在智能安防、节能控制、无障碍设施等领域,人体感应提示器正逐渐成为刚需。WT2003H语音播报芯片凭借低功耗、高集成度、强兼容性的特性,与热释电、微波雷达、红外传感器实现深度协同,为终端设备赋予精准
    的头像 发表于 10-22 17:42 684次阅读
    传感类<b class='flag-5'>语音</b>提示器<b class='flag-5'>语音</b><b class='flag-5'>播报</b>芯片最佳适配方案WT2003H

    语音播报芯片:让产品“开口说话”的秘密

    不知道大家发现没有,在我们的日常生活当中,其实有很多会“说话”的产品,比如我们日常骑行电动自行车,在没电的时候它会通过语音播报提醒你“电量低请及时充电”。在便利店或者很多餐饮商家付款的时候,都会有一
    的头像 发表于 09-28 09:28 721次阅读
    <b class='flag-5'>语音</b><b class='flag-5'>播报</b>芯片:让产品“开口说话”的秘密

    广州唯创电子混音IC播报语音芯片:革新音频应用的新力量

    多音频源智能混音,开启音频交互新纪元在智能化浪潮席卷各行各业的今天,音频处理技术正经历着革命性的变革。传统的单一路径语音播放已无法满足日益复杂的应用场景需求,混音播报语音芯片应运而生,成为推动音频
    的头像 发表于 09-24 09:25 691次阅读
    广州唯创电子混音IC<b class='flag-5'>播报</b><b class='flag-5'>语音</b>芯片:革新音频应用的新力量

    革新电梯语音播报体验:广州唯创WTN6170-8S语音芯片应用解析

    在现代都市生活中,电梯是连接人们与各个楼层的重要工具。其运行的安全性、舒适性与便捷性直接关系到用户的体验。作为电梯系统中的“声音向导”,语音播报器承担着传递运行状态、抵达楼层等关键信息的职责。然而
    的头像 发表于 09-05 09:06 862次阅读
    革新电梯<b class='flag-5'>语音</b><b class='flag-5'>播报</b>体验:广州唯创WTN6170-8S<b class='flag-5'>语音</b>芯片应用解析

    基于开源鸿蒙语音识别及语音合成应用开发样例

    本期内容由AI Model SIG提供,介绍了在开源鸿蒙中,利用sherpa_onnx开源三方库进行ASR语音识别与TTS语音合成应用开发的流程。
    的头像 发表于 08-25 14:26 4441次阅读
    基于开源<b class='flag-5'>鸿蒙</b>的<b class='flag-5'>语音</b>识别及<b class='flag-5'>语音</b>合成应用开发样例

    TTS文字合成语音芯片的使用场景

    TTS文字合成语音播报芯片的使用场景非常广泛,可以适用于各行各业,主要应用于复杂的语音播报场景,下面小编带大家一起来了解一下。 传统的语音
    的头像 发表于 08-22 17:11 1151次阅读

    一颗TTS语音芯给产品增加智能语音播报能力

    一颗TTS语音芯片给产品增加智能语音播报能力 传统语音播报芯片可以设置一些固定的语音片段或者内容
    的头像 发表于 08-14 16:33 865次阅读

    网络语音控制器 智能自控语音播报

    网络语音控制器(NetworkVoiceController)是一种通过有线/无线网络接收指令,实现远程语音播报、对讲或声光告警的智能设备。其应用场景极为广泛,几乎覆盖所有需要“远程声
    的头像 发表于 08-13 15:21 1015次阅读

    语音输出模块是什么?自控语音播报

    语音输出模块(VoiceOutputModule)是一种将数字信号或文本信息转换为人类可听语音的硬件/软件组件。相当于设备的“嘴巴”,让机器能够通过声音与人进行交互。 一、工作原理 1.输入接收
    的头像 发表于 08-13 15:20 1138次阅读

    从开发工程师视角TTS语音合成芯片

    从开发工程师视角TTS语音合成芯片 在语音交互领域,TTS 语音合成芯片作为关键角色,正不断革新着人机对话的体验。从开发工程师角度深入剖析,TTS
    的头像 发表于 08-13 14:52 958次阅读

    芯知识|语音芯片IC技术解析:优化数字组合播报间隔的解决方案

    一、语音芯片的核心作用与应用场景语音芯片作为智能设备交互的重要载体,广泛渗透于工业控制、智能家居、公共服务等领域。广州唯创电子推出的语音芯片系列产品,凭借其高集成度和灵活的可编程特性,在数字
    的头像 发表于 05-12 09:04 826次阅读
    芯知识|<b class='flag-5'>语音</b>芯片IC技术解析:优化数字组合<b class='flag-5'>播报</b>间隔的解决方案

    便携式制氧机语音升级方案:OTP8脚WTN6040芯片实现多语言状态播报

    低功耗语音芯片的制氧机方案,可通过实时语音播报操作指引、状态反馈及异常告警,显著降低使用门槛、提升设备安全性,并支持个性化语音内容定制,从而在家庭护理场景中
    的头像 发表于 04-28 10:45 593次阅读