0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙語(yǔ)音播報(bào)懶人“看”書(shū)新法到底如何實(shí)現(xiàn)?

電子工程師 ? 來(lái)源:HarmonyOS開(kāi)發(fā)者 ? 作者:HarmonyOS開(kāi)發(fā)者 ? 2021-05-20 16:41 ? 次閱讀

現(xiàn)代社會(huì)節(jié)奏較快,人們看書(shū)可能不僅僅只用眼睛,有時(shí)候也會(huì)用耳朵來(lái)“聽(tīng)書(shū)”,語(yǔ)音播報(bào)由此誕生,并通過(guò)人工智能語(yǔ)音識(shí)別引擎實(shí)現(xiàn)。HarmonyOS基于華為智慧引擎(HUAWEI HiAI Engine)中的語(yǔ)音識(shí)別引擎,向開(kāi)發(fā)者提供人工智能應(yīng)用層API,該技術(shù)提供將文本轉(zhuǎn)換為語(yǔ)音并進(jìn)行播報(bào)的能力,可應(yīng)用于以下兩種場(chǎng)景:

·實(shí)時(shí)語(yǔ)音交互

生成音頻信息用于語(yǔ)音交互,例如與智能音箱手機(jī)智能助手的交互,后臺(tái)會(huì)將回答的信息以音頻方式進(jìn)行語(yǔ)音播報(bào)。

·超長(zhǎng)文本播報(bào)

用于小說(shuō)、新聞等較長(zhǎng)文本的自動(dòng)朗讀。

本期我們就為大家?guī)?lái)超長(zhǎng)文本播報(bào)場(chǎng)景下的基于A(yíng)I語(yǔ)音播報(bào)能力的Codelab。當(dāng)用戶(hù)輸入相關(guān)文本內(nèi)容時(shí),點(diǎn)擊“語(yǔ)音播放”按鈕,程序即對(duì)文本進(jìn)行播報(bào)并同步記錄語(yǔ)音播報(bào)的耗時(shí)時(shí)長(zhǎng),并呈現(xiàn)在頁(yè)面上,是不是能滿(mǎn)足計(jì)時(shí)“聽(tīng)書(shū)”的需求呢?讓我們一起來(lái)看看吧。

首先,讓我們梳理一遍開(kāi)發(fā)要點(diǎn):

1)UI頁(yè)面的構(gòu)建

2)語(yǔ)音播報(bào)接口調(diào)用

3)計(jì)時(shí)器的創(chuàng)建

4)線(xiàn)程間通信處理機(jī)制的使用

請(qǐng)注意,由于需要時(shí)刻進(jìn)行觀(guān)察,在邏輯代碼實(shí)現(xiàn)中我們會(huì)穿插HiLog日志打印,下面我們會(huì)逐一指出。

在正式開(kāi)始敲代碼之前,開(kāi)發(fā)者們需要先下載安裝Huawei DevEco Studio,如果對(duì)這個(gè)流程不甚熟悉,可以參照官網(wǎng)的教程來(lái)操作。Huawei DevEco Studio安裝指南:

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

【注意】本次Codelab針對(duì)的是步驟拆解和重點(diǎn)講解,限于篇幅原因不會(huì)展示完整代碼,開(kāi)發(fā)者們可在文末【閱讀原文】中獲取完整代碼哦~

我們打開(kāi)Huawei DevEco Studio,選擇Phone中的Empty Feature Ability(Java)模板工程,本次Codelab我們將在該模板下完成。有如下操作:

1.我們將在entrysrcmain esourcesaselayoutability_main.xml中構(gòu)建UI頁(yè)面;

2.我們?cè)趀ntrysrcmain esourcesasegraphic目錄下新建background_button.xml文件用于實(shí)現(xiàn)“語(yǔ)音播報(bào)”按鈕的樣式優(yōu)化;

3.文中的邏輯代碼我們將在 entrysrcmainjavacomexampleailistenersliceMainAbilitySlice.java文件中實(shí)現(xiàn);讓我們馬上開(kāi)始。

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

1)UI界面構(gòu)建

縱觀(guān)這個(gè)頁(yè)面,主要分為以下幾個(gè)部分:

·標(biāo)題

即“AI語(yǔ)音播報(bào)”這幾個(gè)字,這里我們使用Text組件。

·文本輸入框

可供用戶(hù)輸入想要播報(bào)的文本內(nèi)容,最大不超過(guò)100,000個(gè)字符。為了便于大家理解,這里我們已經(jīng)給大家準(zhǔn)備了一段文本,我們使用TextField組件來(lái)完成。

·播報(bào)按鈕

此處展示的文本是“語(yǔ)音播報(bào)”,使用的是Button組件。值得注意的是,這里需要優(yōu)化按鈕樣式,如添加陰影及優(yōu)化其為膠囊按鈕,讓按鈕更為醒目美觀(guān)。

如前面提到的,我們將在background_button.xml文件中優(yōu)化按鈕樣式,通過(guò)color 設(shè)置按鈕背景顏色,通過(guò)radius的半徑實(shí)現(xiàn)圓角, 代碼如下:

《?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》

·計(jì)時(shí)文本

用于顯示“播報(bào)耗時(shí):0 s”文本,同樣使用Text組件完成。

2)語(yǔ)音播報(bào)接口調(diào)用

構(gòu)建完了頁(yè)面,我們來(lái)到今天的重頭戲之一,也就是使用AI語(yǔ)音播報(bào)能力開(kāi)發(fā)程序。語(yǔ)音播報(bào)(Text to Speech,以下簡(jiǎn)稱(chēng)TTS),提供將文本轉(zhuǎn)換為語(yǔ)音并進(jìn)行播報(bào)的能力。

·語(yǔ)音播報(bào)官網(wǎng)資料

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

這里我們主要分三個(gè)部分實(shí)現(xiàn),創(chuàng)建TTS客戶(hù)端、TTS客戶(hù)端的初始化和調(diào)用相關(guān)方法對(duì)文本進(jìn)行播報(bào)。下面我們來(lái)詳細(xì)看看各個(gè)接口如何調(diào)用。

1. TTS客戶(hù)端創(chuàng)建

調(diào)用void create接口創(chuàng)建TTS客戶(hù)端。

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

2.TTS客戶(hù)端的初始化

當(dāng)TTS客戶(hù)端創(chuàng)建成功,即eventType取值

TtsEvent.CREATE_TTS_CLIENT_SUCCESS時(shí),進(jìn)行TTS客戶(hù)端的初始化。

public void onEvent(int eventType, PacMap pacMap) { HiLog.info(LABEL_LOG, “onEvent.。?!保? // 定義TTS客戶(hù)端創(chuàng)建成功的回調(diào)函數(shù) if (eventType == TtsEvent.CREATE_TTS_CLIENT_SUCCESS) { TtsParams ttsParams = new TtsParams(); ttsParams.setDeviceId(UUID.randomUUID().toString()); initItsResult = TtsClient.getInstance().init(ttsParams); } }

同時(shí)我們引入HiLog日志打印,便于觀(guān)察相關(guān)情況。

3.調(diào)用相關(guān)方法對(duì)文本進(jìn)行播報(bào)

這里我們調(diào)用TtsClient.getInstance().speakText()方法對(duì)文本進(jìn)行播報(bào),同樣也引入HiLog日志打印用于觀(guān)察初始化是否成功。

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)計(jì)時(shí)器的創(chuàng)建

本Codelab將以秒為單位對(duì)AI語(yǔ)音播報(bào)速度進(jìn)行計(jì)時(shí),故而我們需要一個(gè)計(jì)時(shí)器。在HarmonyOS中,我們通過(guò)計(jì)時(shí)器Timer和計(jì)時(shí)器任務(wù)TimerTask類(lèi)來(lái)實(shí)現(xiàn)。這里使用到的是構(gòu)建和取消兩種方法,比較簡(jiǎn)單。大家可以通過(guò)官網(wǎng)資料進(jìn)一步了解。

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

·TimerTask

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

同樣我們使用HiLog日志打印來(lái)觀(guān)察文本語(yǔ)音播報(bào)的開(kāi)始和結(jié)束。

4)線(xiàn)程間通信處理機(jī)制的使用

接下來(lái)我們將提到本Codelab另外一個(gè)重頭戲——線(xiàn)程間通信處理機(jī)制的使用。在啟動(dòng)應(yīng)用時(shí),系統(tǒng)會(huì)為該應(yīng)用創(chuàng)建一個(gè)稱(chēng)為“主線(xiàn)程”的執(zhí)行線(xiàn)程。該線(xiàn)程隨著應(yīng)用創(chuàng)建或消失,是應(yīng)用的核心線(xiàn)程。具體到本Codelab,UI界面的顯示和更新等操作,就是更新播報(bào)耗時(shí)的界面,是在主線(xiàn)程上進(jìn)行的,因此主線(xiàn)程也稱(chēng)為UI線(xiàn)程。示例中分配的是9015,如圖所示:

然而在實(shí)際項(xiàng)目中,開(kāi)發(fā)者可能面臨許多耗時(shí)的操作,比如說(shuō)下載文件、查詢(xún)數(shù)據(jù)庫(kù),具體到本Codelab,就是語(yǔ)音播報(bào)功能和計(jì)時(shí)器功能,這些復(fù)雜的操作會(huì)阻塞 UI線(xiàn)程,導(dǎo)致界面無(wú)響應(yīng),帶來(lái)非常不好的用戶(hù)體驗(yàn)。

因此,我們需要將這些耗時(shí)操作放到子線(xiàn)程中,避免阻塞主線(xiàn)程,比如在示例中,我們把AI語(yǔ)音播報(bào)放在子線(xiàn)程9275中執(zhí)行:

但同時(shí),我們又需要把操作的結(jié)果數(shù)據(jù)反饋給UI線(xiàn)程,這個(gè)時(shí)候就必須引入線(xiàn)程間通信處理機(jī)制。因此,HarmonyOS 給Java應(yīng)用開(kāi)發(fā)提供了EventHandler機(jī)制,可以通過(guò)EventRunner創(chuàng)建新線(xiàn)程,將耗時(shí)的操作放到新線(xiàn)程上執(zhí)行。這樣既不阻塞原來(lái)的線(xiàn)程,任務(wù)又可以得到合理的處理。

每一個(gè)EventHandler和指定的EventRunner所創(chuàng)建的新線(xiàn)程綁定,并且該新線(xiàn)程內(nèi)部有一個(gè)事件隊(duì)列。EventHandler可以投遞指定的InnerEvent事件或Runnable任務(wù)到這個(gè)事件隊(duì)列。

EventRunner從事件隊(duì)列里循環(huán)地取出事件:

1)如果取出的事件是InnerEvent事件,將在EventRunner所在線(xiàn)程執(zhí)行processEvent回調(diào);

2)如果取出的事件是Runnable任務(wù),將在EventRunner所在線(xiàn)程執(zhí)行Runnable的run回調(diào)。

·線(xiàn)程間通信開(kāi)發(fā)概述

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

在本例中,開(kāi)始發(fā)音的時(shí)候發(fā)送EVENT_MSG_TIME_COUNT事件,此時(shí)程序開(kāi)始計(jì)時(shí)并更新UI頁(yè)面,示例代碼如下所示:

@Override public void onSpeechStart(String utteranceId) { // 開(kāi)始計(jì)時(shí) 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); } }

此時(shí)取出的事件是Runnable,需要將Runnable任務(wù)投遞到新的線(xiàn)程,在EventRunner所在線(xiàn)程執(zhí)行Runnable的run回調(diào),并按照優(yōu)先級(jí)和延時(shí)進(jìn)行處理,。這里是同步更新UI頁(yè)面,代碼如下所示:

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, “播報(bào)耗時(shí):” + Integer.toString(time) + “ s”); timeText.setText(“播報(bào)耗時(shí):” + Integer.toString(time) + “ s”); } }, 0); break; default: break; } } };

至此,我們已經(jīng)完成本次Codelab的所有關(guān)鍵步驟。

通過(guò)這個(gè)Codelab,大家可以學(xué)習(xí)到AI語(yǔ)音播報(bào)、線(xiàn)程間通信和計(jì)時(shí)器的使用方法。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2947

    瀏覽量

    104373
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    29411

    瀏覽量

    267707
  • 語(yǔ)音播報(bào)
    +關(guān)注

    關(guān)注

    1

    文章

    25

    瀏覽量

    14501
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2294

    瀏覽量

    42634
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1958

    瀏覽量

    29912
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3612

    瀏覽量

    15973

原文標(biāo)題:【Codelab】懶人“看”書(shū)新法—鴻蒙語(yǔ)音播報(bào),到底如何實(shí)現(xiàn)?

文章出處:【微信號(hào):HarmonyOS_Dev,微信公眾號(hào):HarmonyOS開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    電動(dòng)輪椅語(yǔ)音播報(bào)方案開(kāi)發(fā)

    按鍵或旋鈕操作,用戶(hù)在使用過(guò)程中需要時(shí)刻關(guān)注顯示屏或指示燈來(lái)了解輪椅的狀態(tài),這不僅增加了操作的復(fù)雜性,還可能導(dǎo)致安全隱患。為了提升用戶(hù)體驗(yàn),我們引入了WT588F02B-8S-B2語(yǔ)音播報(bào)方案,通過(guò)
    的頭像 發(fā)表于 10-15 15:27 ?88次閱讀

    輸入文字轉(zhuǎn)化語(yǔ)音

    一、介紹 基于鴻蒙Next模擬一個(gè)輸入用戶(hù)文字,轉(zhuǎn)化成語(yǔ)音播報(bào)效果二、場(chǎng)景需求 輔助功能:為視障人士提供幫助:將文字內(nèi)容轉(zhuǎn)化為語(yǔ)音,使視覺(jué)障礙用戶(hù)能夠獲取信息。 教育與學(xué)習(xí):語(yǔ)言學(xué)習(xí):
    發(fā)表于 08-28 10:54

    歡創(chuàng)播報(bào) 華為宣布鴻蒙內(nèi)核已超越Linux內(nèi)核

    兼容安卓,成為“純血”鴻蒙。 余承東稱(chēng),“純血”鴻蒙從內(nèi)到外實(shí)現(xiàn)全棧自研,“鴻蒙是基于OpenHarmony打造的全場(chǎng)景智
    的頭像 發(fā)表于 06-27 11:30 ?690次閱讀

    收款機(jī)TTS語(yǔ)音芯片新方案:WT3000T8,雙語(yǔ)合成流暢,字庫(kù)解碼多樣!

    不同播報(bào)要求下語(yǔ)音占用大量資源空間的問(wèn)題。可以實(shí)現(xiàn)低成本低功耗的文本轉(zhuǎn)語(yǔ)音,支持中英文兩種功能,實(shí)現(xiàn)播報(bào)
    的頭像 發(fā)表于 06-26 11:17 ?512次閱讀
    收款機(jī)TTS<b class='flag-5'>語(yǔ)音</b>芯片新方案:WT3000T8,雙語(yǔ)合成流暢,字庫(kù)解碼多樣!

    基于STM32單片機(jī)的語(yǔ)音播報(bào)體溫計(jì)設(shè)計(jì)

    語(yǔ)音播報(bào)體溫計(jì)系統(tǒng)包括溫度采集模塊,語(yǔ)音播放模塊,顯示模塊,其中核心 CPU采用單片機(jī) STM32,STM32在電子行業(yè)運(yùn)用廣泛。溫度采集模塊使用 MLX90614紅外傳感器采集體溫?cái)?shù)據(jù),語(yǔ)音
    的頭像 發(fā)表于 06-24 14:31 ?997次閱讀
    基于STM32單片機(jī)的<b class='flag-5'>語(yǔ)音</b><b class='flag-5'>播報(bào)</b>體溫計(jì)設(shè)計(jì)

    鴻蒙開(kāi)發(fā)就業(yè)前景到底怎么樣?

    鴻蒙, 作為華為自主研發(fā)的基于微內(nèi)核的下一代操作系統(tǒng),正在逐漸走進(jìn)人們的視野 。隨著鴻蒙系統(tǒng)的不斷發(fā)展和完善,越來(lái)越多的人開(kāi)始關(guān)注鴻蒙開(kāi)發(fā)這一領(lǐng)域,想要了解學(xué)習(xí)鴻蒙開(kāi)發(fā)的就業(yè)前景如何。
    發(fā)表于 05-09 17:37

    環(huán)境監(jiān)測(cè)系統(tǒng)置入WT588F02B-8s語(yǔ)音芯片:實(shí)現(xiàn)智能語(yǔ)音播報(bào),共創(chuàng)綠色生態(tài)環(huán)境

    隨著科技的飛速發(fā)展,環(huán)境監(jiān)測(cè)系統(tǒng)已經(jīng)成為守護(hù)綠水青山的重要工具。而在這個(gè)系統(tǒng)中,WT588F02B-8s語(yǔ)音芯片的加入,更為我們帶來(lái)了前所未有的智能語(yǔ)音播報(bào)體驗(yàn)。今天,就讓我們一起探討一下這一創(chuàng)新設(shè)計(jì)的功能需求,優(yōu)勢(shì),及
    的頭像 發(fā)表于 05-09 10:12 ?258次閱讀
    環(huán)境監(jiān)測(cè)系統(tǒng)置入WT588F02B-8s<b class='flag-5'>語(yǔ)音</b>芯片:<b class='flag-5'>實(shí)現(xiàn)</b>智能<b class='flag-5'>語(yǔ)音</b><b class='flag-5'>播報(bào)</b>,共創(chuàng)綠色生態(tài)環(huán)境

    基于唯創(chuàng)語(yǔ)音芯片的三大煙霧報(bào)警器語(yǔ)音方案

    在智能設(shè)備與物聯(lián)網(wǎng)(IoT)技術(shù)的飛速發(fā)展中,語(yǔ)音播報(bào)功能的重要性日益凸顯,已成為提升用戶(hù)體驗(yàn)、實(shí)現(xiàn)人機(jī)交互的關(guān)鍵一環(huán)。本文將深入探討三種創(chuàng)新性語(yǔ)音
    的頭像 發(fā)表于 04-12 15:08 ?344次閱讀
    基于唯創(chuàng)<b class='flag-5'>語(yǔ)音</b>芯片的三大煙霧報(bào)警器<b class='flag-5'>語(yǔ)音</b>方案

    WT588FM04語(yǔ)音芯片:融合鍵盤(pán)掃描與LED驅(qū)動(dòng),打造智能化語(yǔ)音播報(bào)解決方案

    隨著科技的飛速發(fā)展,人機(jī)交互已經(jīng)成為了電子產(chǎn)品不可或缺的一部分。為了滿(mǎn)足這一需求,一款名為WT588FM04的語(yǔ)音芯片應(yīng)運(yùn)而生。這款芯片不僅集成了鍵盤(pán)掃描接口和LED驅(qū)動(dòng)控制,還具備強(qiáng)大的語(yǔ)音播報(bào)
    的頭像 發(fā)表于 12-02 09:47 ?346次閱讀
    WT588FM04<b class='flag-5'>語(yǔ)音</b>芯片:融合鍵盤(pán)掃描與LED驅(qū)動(dòng),打造智能化<b class='flag-5'>語(yǔ)音</b><b class='flag-5'>播報(bào)</b>解決方案

    芯知識(shí) | 混音播報(bào)語(yǔ)音芯片的優(yōu)勢(shì):革新音頻應(yīng)用的新力量

    。一、混音播報(bào)語(yǔ)音芯片概述混音播報(bào)語(yǔ)音芯片是一種高度集成的音頻處理芯片,它具備混音和播報(bào)兩大核心功能。該芯片能夠同時(shí)處理多個(gè)音頻源,
    的頭像 發(fā)表于 11-23 14:38 ?470次閱讀
    芯知識(shí) | 混音<b class='flag-5'>播報(bào)</b><b class='flag-5'>語(yǔ)音</b>芯片的優(yōu)勢(shì):革新音頻應(yīng)用的新力量

    芯知識(shí)|混音播報(bào)語(yǔ)音芯片的優(yōu)勢(shì):革新音頻應(yīng)用的新力量

    隨著科技的進(jìn)步,語(yǔ)音芯片在各個(gè)領(lǐng)域的應(yīng)用越來(lái)越廣泛。而在眾多語(yǔ)音芯片中,混音播報(bào)語(yǔ)音芯片以其獨(dú)特的優(yōu)勢(shì),正逐漸成為音頻應(yīng)用領(lǐng)域的翹楚。本文將重點(diǎn)探討混音
    的頭像 發(fā)表于 11-23 11:50 ?546次閱讀

    WT588F系列語(yǔ)音芯片應(yīng)用在制氧機(jī)語(yǔ)音播報(bào)

    語(yǔ)音芯片語(yǔ)音播報(bào)
    WT-深圳唯創(chuàng)知音電子有限公司
    發(fā)布于 :2023年11月22日 17:24:58

    語(yǔ)音芯片用于語(yǔ)音循環(huán)扇語(yǔ)音播報(bào)演示2

    語(yǔ)音芯片
    WT-深圳唯創(chuàng)知音電子有限公司
    發(fā)布于 :2023年11月16日 10:34:28

    WT588F系列語(yǔ)音芯片用在近視治療儀語(yǔ)音播報(bào)

    語(yǔ)音芯片語(yǔ)音播報(bào)
    WT-深圳唯創(chuàng)知音電子有限公司
    發(fā)布于 :2023年11月03日 13:56:34