從零開始開發純血鴻蒙應用
- 〇、前言
- 一、API 選型
- 1、基本情況
- 2、認識TextToSpeechEngine
- 二、功能集成實踐
- 1、改造右上角菜單
- 2、實現語音播報功能
- 2.1、語音引擎的獲取和關閉
- 2.2、設置待播報文本
- 2.3、speak 目標文本
- 2.4、設置語音回調
- 三、總結
〇、前言
中華漢字洋洋灑灑何其多,難免會遇到不知怎么讀的字,這時候,如果應用本身就能夠進行文本朗讀,那么就可以快速知道對應的發音,而不用跑到瀏覽器上搜索相關資料。
再者,眾多用戶之中,難免有喜歡聽書而不喜歡讀書,或者限于自身經歷而不識字的,總而言之,作為文本文件瀏覽和編輯的軟件,TxtEdit 有必要提供語音朗讀的功能,這一點,在鴻蒙NEXT API 的自身 AI 功能助力下,實現起來并不是很困難,下面就為大家介紹,如何在自己的純血鴻蒙應用中,集成語音朗讀文本的功能。
一、API 選型
1、基本情況
我相信,任何一個有認真閱讀華為開發者平臺上的鴻蒙API參考文檔的人,都應該知道鴻蒙 NEXT API 里面有專門提供 AI 能力的,而其中,就有一個Core Speech Kit(基礎語音服務)
模塊,而這就是實現我們的目標所需的;畢竟只是簡單的文本轉語音,所以,無需太高級的AI能力的,基礎的就已經足夠了。
2、認識TextToSpeechEngine
Core Speech Kit ,有兩大能力,一是文本轉語音,二是語音轉文本即語音識別。文本轉語音 API,名為 textToSpeech
,它包含了 TextToSpeechEngine 在內的眾多與文本轉語音相關的方法或功能類。
TextToSpeechEngine,顧名思義,是一個語音引擎,獲取引擎實例需要用對應的構建方法,而不是直接 new 出來。有了引擎實例之后,就可以用它將目標文本轉換成語音信息,并播放出來,也就是 speak
出來。
當我們不在需要語音引擎了,出于節約資源的考量,我們應該及時 shutdown
,這個關閉動作,可以放在生命周期函數,如 aboutToDisappear
里面。
speak 的方法原型如下:
如圖所示,speak 一共有兩個參數,第一個參數就是待進行語音播報的文本內容,第二個則是進行語音播報所必須設置的參數,該參數一共包含兩個設置項:
1)請求 ID,要求每次都不同,最好全局唯一
2)語音參數,主要包括語速、音量、音調、合成類型等,使用 Record<string, Object>
結構封裝:
- <‘speed’, number> 語速。可選,支持范圍[0.5-2],不傳參時默認為1,使用一倍語速合成音頻流。
- <‘volume’, number> 音量。可選,支持范圍[0-2],不傳參時默認為1,使用一倍音量合成音頻流。
- <‘pitch’, number> 音調。可選,支持范圍[0.5-2],不傳參時默認為1,使用正常音調合成音頻流。
- <‘languageContext’, string> 語境,播放阿拉伯數字用的語種。可選,
當前僅支持“zh-CN”中文
,不傳參時默認“zh-CN”。設置為zh-CN時,也可對英語進行語音播報 - <‘audioType’, string> 音頻類型。可選,
當前僅支持“pcm”
,不傳參時默認為“pcm”(PCM 即脈沖編碼調制 (Pulse Code Modulation))。 - <‘playType’, number> 合成類型。可選,不傳參時默認為1。0,僅合成不播報,返回音頻流。1,合成與播報不返回音頻流。
- <‘soundChannel’, number> 播報通道。可選,參數范圍請參考音頻流使用來選擇適合自己的音頻場景,范圍之外會播報異常。不傳參時默認為3,語音助手通道。
- <‘queueMode’, number> 播報模式。可選,不傳參時默認為0。0:排隊模式播報。1:搶占模式播報。
通常,只需要對語速、音量、音調、語境和音頻類型進行設置即可。
二、功能集成實踐
下面,開始將 TextToSpeechEngine 集成到 TxtEdit 中,
1、改造右上角菜單
我將語音播報功能的觸發入口,放在之前的右上角菜單中:
相對應的,PageTitleBar 里新增一個字段作為功能載入通道:
2、實現語音播報功能
在使用 PageTitleBar 的 ViewFilePage 中,編寫實現語言播報功能的相關代碼,并載入到 PageTitleBar 中。
2.1、語音引擎的獲取和關閉
首先,在 ViewFilePage 中聲明一個字段用于持有語音引擎實例,不放就將該字段取名為 textSpeechEngine
,為了關閉語音引擎后進行內存釋放,該字段的類型需要聲明為 textToSpeech.TextToSpeechEngine|null。
語音引擎的關閉動作,由 aboutToDisappear 完成:
那么,語音引擎的實例創建,就自然地由 aboutToAppear 來完成:
語音引擎實例的創建,同樣需要初始化參數:
2.2、設置待播報文本
在使用語音引擎進行文本播報之前,需要將目標文本進行確定,我采用的處理邏輯如下:
1)當用戶有進行文本選擇時,只播報選擇的那些文本;
2)當用戶沒有進行文本選擇時,播報整個文件內容;
3)如果文件內容為空,則固定播報“沒有可以播報的內容”。
針對第一種情況,需要利用 Text 組件的 onTextSelectionChange
事件處理函數:
onTextSelectionChange((start, end) => {this.copyStart = start;this.copyEnd = end;if (this.fileContent) {this.selectedText = this.fileContent.slice(this.copyStart, this.copyEnd);}
})
2.3、speak 目標文本
最后,在 PageTitleBar 的使用處,新增如下的一段代碼:
為了保證請求ID的唯一性,我使用了 NANOID 方法,對應的實現代碼如下:
function nanoid(size = 21) {let id = '';const urlAlphabet = 'ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW';const mask = urlAlphabet.length - 1;const step = Math.log(urlAlphabet.length) / Math.log(256);const random = () => Math.random() * 256;while (size--) {id += urlAlphabet[Math.floor(random() * step) & mask];}return id;
}export default nanoid;
這個 NANOID 的實現代碼,我是放在了 lib_util 模塊中,所以,想要其他模塊中也可以使用,還必須在 lib_util 模塊的 index.ets 文件中,更新一句代碼:export { default as NANOID } from "./src/main/ets/NANOID"
。
2.4、設置語音回調
TextToSpeechEngine 還提供了一個 setListener
設置語音回調,通過語音回調方法,可以監測語音播報的狀態,比如播報開始、播報結束。語音回調不是必須的,如果想要實現,可以參考如下代碼:
我這里是直接將語音播報的相關狀態,簡單地記錄到日志當中。
三、總結
經過上面的學習,我相信屏幕前的你,已經懂得如何在自己的鴻蒙應用中,集成語音播報內容,不過,我還想多說一點,對于 TextArea 這種文本編輯組件,選擇文本后進行播報的功能,需要調整為拷貝文本后進行播報,這是因為當我點擊右上角菜單時,編輯框會自然而然的失去焦點,結果就是原本選中的文本不再被選中。