从零开始开发纯血鸿蒙应用之语音朗读
从零开始开发纯血鸿蒙应用
- 〇、前言
- 一、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 这种文本编辑组件,选择文本后进行播报的功能,需要调整为拷贝文本后进行播报,这是因为当我点击右上角菜单时,编辑框会自然而然的失去焦点,结果就是原本选中的文本不再被选中。
相关文章:
从零开始开发纯血鸿蒙应用之语音朗读
从零开始开发纯血鸿蒙应用 〇、前言一、API 选型1、基本情况2、认识TextToSpeechEngine 二、功能集成实践1、改造右上角菜单2、实现语音播报功能2.1、语音引擎的获取和关闭2.2、设置待播报文本2.3、speak 目标文本2.4、设置语音回调 三、总结 〇、前言 中华汉字洋洋洒洒何其多…...
物联网小范围高精度GPS使用
在园区内实现小范围高精度GPS(全球定位系统)定位,通常需要结合多种技术来弥补传统GPS在精度和覆盖范围上的不足。以下是实现小范围高精度GPS定位的解决方案,包括技术选择、系统设计和应用场景。 一、技术选择 在园区内实现高精度…...
一次有趣的前后端跨越排查
进行前后端代码联调的时候,使用axios调用后端请求,因为都是本地进行联调,所以没有考虑跨域的问题,写了一个get的请求接口,请求后端时,突然跳出下面的问题: 错误的信息一看很像就是跨域的问题&…...
大语言模型(LLM)如何赋能时间序列分析?
引言 近年来,大语言模型(LLM)在文本生成、推理和跨模态任务中展现了惊人能力。与此同时,时间序列分析作为工业、金融、物联网等领域的核心技术,长期依赖传统统计模型(如ARIMA)或深度学习模型&a…...
Kubernetes (K8S) 核心原理深度剖析:从架构设计到运行机制
Kubernetes(K8S)作为容器编排领域的“操作系统”,其设计和实现原理是开发者进阶的必修课。本文将从架构设计、核心组件协作、关键机制实现三个维度,结合源码逻辑与实战场景,分享 K8S 的底层运行原理。 一、Kubernetes 架构设计 1. 声明式 API 与控制器模式 K8S 的核心设…...
Excel 豆知识 - XLOOKUP 为啥会出 #N/A 错误
XLOOKUP有的时候会出 #VALUE! 这个错误。 因为这个XLOOUP有个参数叫 找不到时的返回值,那么为啥还会返回 #VALUE! 呢? 可能还有别的原因,但是主要原因应该就是 检索范围 和 返回范围 不同。 比如这里检索范围在 B列,是 4-21&…...
【深度学习】Hopfield网络:模拟联想记忆
Hopfield网络是一种经典的循环神经网络,由物理学家John Hopfield在1982年提出。它的核心功能是模拟联想记忆,类似于人类大脑通过部分信息回忆完整记忆的能力。以下是通俗易懂的解释: 1. 核心思想 想象你看到一张模糊的老照片,虽然…...
Python可视化大框架的研究与应用
## 摘要 随着数据科学和人工智能的快速发展,数据可视化成为了数据分析中不可或缺的一部分。Python作为一种功能强大且易于学习的编程语言,提供了多种可视化工具和库。本文旨在探讨Python可视化的主要框架,分析其特点、应用场景以及未来发展趋…...
Java 泛型(Generics)详解与使用
一、什么是 Java 泛型? 泛型(Generics)是 Java 1.5 引入的一项重要特性,主要用于 类型参数化,允许在类、接口和方法定义时使用 类型参数(Type Parameter),从而提高代码的复用性、类…...
七、Three.jsPBR材质与纹理贴图
1、PBR材质金属度和粗糙度 1、金属度metalness 金属度属性.metalness表示材质像金属的程度, 非金属材料,如木材或石材,使用0.0,金属使用1.0。 threejs的PBR材质,.metalness默认是0.5,0.0到1.0之间的值可用于生锈的金属外观 new THREE.MeshStandardMaterial({met…...
2024 ChatGPT大模型技术场景与商业应用视频精讲合集(45课).zip
2024ChatGPT大模型技术场景与商业应用视频精讲合集,共十三章,45课。 01. 第一章 ChatGPT:通用人工智能的典范 1.1 ChatGPT概述 .mp4 1.2 通用能力 .mp4 1.3 通用人工智能风口 .mp4 02. 第二章 大模型:ChatGPT的核心支撑 2.1 底层…...
Pytest之parametrize参数化
文章目录 1.前言2.单参数3.多参数4.字典形式5.parametrize 结合 ids 参数 1.前言 在 pytest 中,parametrize 是一个非常实用的装饰器,它允许你对测试函数进行参数化,即使用不同的参数组合多次运行同一个测试函数,从而更高效地进行…...
Python面试(八股)
1. 可变对象和不可变对象 (1). 不可变对象( Immutable Objects ) 不可变对象指的是那些一旦创建后其内容就不能被修改的对象。如果尝试修改不可变对象的内容,将会创建一个新的对象而不是修改原来的对象。常见的不可变类型包括: …...
2024年第十五届蓝桥杯大赛软件赛省赛Python大学A组真题解析《更新中》
文章目录 试题A: 拼正方形(本题总分:5 分)解析答案试题B: 召唤数学精灵(本题总分:5 分)解析答案试题C: 数字诗意解析答案试题D:回文数组试题A: 拼正方形(本题总分:5 分) 【问题描述】 小蓝正在玩拼图游戏,他有7385137888721 个2 2 的方块和10470245 个1 1 的方块,他需…...
湖仓一体概述
湖仓一体之前,数据分析经历了数据库、数据仓库和数据湖分析三个时代。 首先是数据库,它是一个最基础的概念,主要负责联机事务处理,也提供基本的数据分析能力。 随着数据量的增长,出现了数据仓库,它存储的是…...
【行政区划获取】
行政区划获取 获取2023年的行政区划,并以 编码: 省市区 格式保存为字典方便后续调用 注:网址可能会更新,根据最新的来 # 获取并保存行政区划代码 import requests from lxml import etree import jsondef fetch_html(url):""&quo…...
【深入剖析:机器学习、深度学习与人工智能的关系】
深入剖析:机器学习、深度学习与人工智能的关系 在当今数字化时代,人工智能(AI)、机器学习(ML)和深度学习(DL)这些术语频繁出现在各种科技报道和讨论中,它们相互关联又各…...
Docker 学习(一)
一、Docker 核心概念 Docker 是一个开源的容器化平台,允许开发者将应用及其所有依赖(代码、运行时、系统工具、库等)打包成一个轻量级、可移植的“容器”,实现 “一次构建,随处运行”。 1、容器(Container…...
flink web ui未授权漏洞处理
本文通过nginx代理的方式来处理未授权漏洞问题。 1.安装nginx 通过yum install nginx 2.添加账号和密码 安装htpasswd工具,yum install httpd-tools sudo htpasswd -c /etc/nginx/conf.d/.passwd flink # 需安装httpd-tools:ml-citation{ref"1,4" dat…...
【vue-echarts】——03.配置项---tooltip
文章目录 一、tooltip提示框组件二、显示结果一、tooltip提示框组件 提示框组件,用于配置鼠标滑过或点击图表时的显示框 代码如下 Demo3View.vue <template><div class="about">...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
