從零開始開發純血鴻蒙應用之語音朗讀

從零開始開發純血鴻蒙應用

  • 〇、前言
  • 一、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 這種文本編輯組件,選擇文本后進行播報的功能,需要調整為拷貝文本后進行播報,這是因為當我點擊右上角菜單時,編輯框會自然而然的失去焦點,結果就是原本選中的文本不再被選中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71043.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71043.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71043.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【AGI】DeepSeek開源周:The whale is making waves!

DeepSeek開源周&#xff1a;The whale is making waves&#xff01; 思維火花引言一、DeepSeek模型體系的技術演進1. 通用語言模型&#xff1a;DeepSeek-V3系列2. 推理優化模型&#xff1a;DeepSeek-R1系列3. 多模態模型&#xff1a;Janus系列 二、開源周三大工具庫的技術解析1…

25年前端如何走的更穩

2025年&#xff0c;隨著deepseek引起的AI大模型技術的深度革命&#xff0c;帶來了很多機會和挑戰&#xff0c;前端程序員作為互聯網里一個普通但必不可少的崗位&#xff0c;在當前形勢下&#xff0c;需要主動變革才能走的更穩。本文簡單介紹三個方向&#xff0c;Web3前端、全棧…

DockerでOracle Database 23ai FreeをセットアップしMAX_STRING_SIZEを拡張する手順

DockerでOracle Database 23c FreeをセットアップしMAX_STRING_SIZEを拡張する手順 はじめに環境準備ディレクトリ作成Dockerコンテナ起動 データベース設定変更コンテナ內でSQL*Plus起動PDB操作と文字列サイズ拡張設定検証 管理者ユーザー作成注意事項まとめ はじめに Oracle…

市場加速下跌,但監管「堅冰」正在消融

作者&#xff1a;Techub 熱點速遞 撰文&#xff1a;Yangz&#xff0c;Techub News 與近日氣溫逐步回暖不同&#xff0c;自 2 月 25 日比特幣跌破 9 萬美元以來&#xff0c;加密貨幣市場行情一路下滑。今日 10 時 50 分左右&#xff0c;比特幣更是跌破 8 萬美元大關&#xff0c…

【Android】安卓付款密碼輸入框、支付密碼輸入框

如圖 代碼部分&#xff1a; public class PayPasswordDialog extends AppCompatDialogFragment {private String mPayPass "";private String mTitle, mMoney;private final TextView[] mPayPassTextViewArray new TextView[6];private List<Integer> mPayP…

Java數據結構_一篇文章了解常用排序_8.1

本文所有排序舉例均默認為升序排列。 目錄 1. 常見的排序算法 2. 常見排序算法的實現 2.1 插入排序 2.1.1 基本思想&#xff1a; 2.1.2 直接插入排序 2.1.3 希爾排序&#xff08;縮小增量排序&#xff09; 2.2 選擇排序 2.2.1 基本思想&#xff1a; 2.2.2 直接選擇排…

性能調優篇——索引優化與執行計劃解析

引言 當數據庫表數據突破千萬級時&#xff0c;一個未優化的索引可能讓查詢耗時從毫秒級暴增至分鐘級。某電商平臺曾因商品搜索接口的索引缺失&#xff0c;導致大促期間數據庫CPU飆升至98%&#xff0c;直接引發服務雪崩。本文將深入B樹索引的存儲奧秘&#xff0c;詳解慢查詢日志…

計算機畢業設計SpringBoot+Vue.js人口老齡化社區服務與管理平臺 (源碼+文檔+PPT+講解)

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

C#上位機--三元運算符

引言 在 C# 上位機開發中&#xff0c;我們經常需要根據不同的條件來執行不同的操作。條件判斷是編程中不可或缺的一部分&#xff0c;而三元運算符就是一種簡潔而強大的條件判斷工具。本文將詳細介紹 C# 中的三元運算符&#xff0c;探討其在上位機開發中的應用場景&#xff0c;…

AI時代保護自己的隱私

人工智能最重要的就是數據&#xff0c;讓我們面對現實&#xff0c;大多數人都不知道他們每天要向人工智能提供多少數據。你輸入的每條聊天記錄&#xff0c;你發出的每條語音命令&#xff0c;人工智能生成的每張圖片、電子郵件和文本。我建設了一個網站(haptool.com)&#xff0c…

Hutool - POI:讓 Excel 與 Word 操作變得輕而易舉

各位開發者們&#xff0c;在日常的 Java 開發工作里&#xff0c;處理 Excel 和 Word 文件是相當常見的需求。無論是從 Excel 里讀取數據進行分析&#xff0c;還是將數據寫入 Excel 生成報表&#xff0c;亦或是對 Word 文檔進行內容編輯&#xff0c;傳統的 Apache POI 庫雖然功能…

數據庫操作命令詳解:CREATE、ALTER、DROP 的使用與實踐

引言? 數據庫是存儲和管理數據的核心工具&#xff0c;而 ?DDL&#xff08;Data Definition Language&#xff0c;數據定義語言&#xff09;?? 是構建和調整數據庫結構的基石。本文將通過實際示例&#xff0c;詳細講解 CREATE&#xff08;創建&#xff09;、ALTER&#xff0…

Asp.Net Core WebAPI開發教程(入門)

一、Asp.Net Core WebAPI項目創建 二、Asp.Net Core WebApi/Mvc路由定義 二、Asp.Net Core WebAPI 請求案例 Asp.Net WebApi Get請求整理&#xff08;一&#xff09; Asp.Net WebApi Post請求整理&#xff08;一&#xff09; Asp.Net WebApi Action命名中已‘Get’開頭問題 …

VSCode大的JSON數據不能折疊問題

修改editor.foldingMaximumRegions為10000解決&#xff0c;默認只支持5000 在 VSCode 中&#xff0c;默認的 JSON 文件折疊功能對嵌套層級較深的數據支持有限。以下是幾種解決嵌套 4 層以上數據無法折疊的方法&#xff1a; 1. 使用擴展插件 安裝支持更復雜折疊功能的插件&am…

IPoIB源碼深度解析:如何基于TCP/IP協議棧實現高性能InfiniBand通信

一、IPoIB的核心設計理念 IPoIB(IP over InfiniBand)是一種在InfiniBand網絡上承載IP流量的技術,其核心目標是在不修改上層應用的前提下,利用InfiniBand的高帶寬和低延遲特性。與自定義協議棧不同,IPoIB通過深度集成到Linux內核TCP/IP協議棧中,將InfiniBand設備抽象為標…

Vue學習教程-18Vue單文件組件

文章目錄 前言一、單文件組件的構成二、組件引用三、組件的應用舉例1.組件實例2.顯示結果 前言 Vue 單文件組件&#xff08;又名 *.vue 文件&#xff0c;縮寫為 SFC&#xff09;是一種特殊的文件格式&#xff0c;它允許將 Vue 組件的模板、邏輯 與 樣式封裝在單個文件中。組件…

掌握 findIndex、push 和 splice:打造微信小程序的靈活圖片上傳功能?

文章目錄 ? 掌握 findIndex、push 和 splice&#xff1a;打造微信小程序的靈活圖片上傳功能 &#x1f31f;示例場景&#xff1a;小程序圖片上傳&#x1f33c; 認識 findIndex定義語法在代碼中的應用示例當前行為 &#x1f680; 認識 push定義語法在代碼中的應用示例特點 ?? …

微服務即時通信系統---(七)文件管理子服務

目錄 功能設計 模塊劃分 業務接口/功能示意圖 服務實現流程 服務代碼實現 封裝文件操作模塊(utils.hpp) 獲取唯一標識ID 文件讀操作 文件寫操作 編寫proto文件 文件元信息 文件管理proto 單文件上傳 多文件上傳 單文件下載 多文件下載 RPC調用 服務端創建子…

fluent-ffmpeg 依賴詳解

fluent-ffmpeg 是一個用于在 Node.js 環境中與 FFmpeg 進行交互的強大庫&#xff0c;它提供了流暢的 API 來執行各種音視頻處理任務&#xff0c;如轉碼、剪輯、合并等。 一、安裝 npm install fluent-ffmpeg二、基本使用 要使用 fluent-ffmpeg&#xff0c;首先需要確保系統中…

第16天:C++多線程完全指南 - 從基礎到現代并發編程

第16天&#xff1a;C多線程完全指南 - 從基礎到現代并發編程 一、多線程基礎概念 1. 線程創建與管理&#xff08;C11&#xff09; #include <iostream> #include <thread>void hello() {std::cout << "Hello from thread " << std::this_…