当前位置: 首页 > news >正文

从零开始开发纯血鸿蒙应用之语音朗读

从零开始开发纯血鸿蒙应用

  • 〇、前言
  • 一、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&#xff08;全球定位系统&#xff09;定位&#xff0c;通常需要结合多种技术来弥补传统GPS在精度和覆盖范围上的不足。以下是实现小范围高精度GPS定位的解决方案&#xff0c;包括技术选择、系统设计和应用场景。 一、技术选择 在园区内实现高精度…...

一次有趣的前后端跨越排查

进行前后端代码联调的时候&#xff0c;使用axios调用后端请求&#xff0c;因为都是本地进行联调&#xff0c;所以没有考虑跨域的问题&#xff0c;写了一个get的请求接口&#xff0c;请求后端时&#xff0c;突然跳出下面的问题&#xff1a; 错误的信息一看很像就是跨域的问题&…...

大语言模型(LLM)如何赋能时间序列分析?

引言 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;在文本生成、推理和跨模态任务中展现了惊人能力。与此同时&#xff0c;时间序列分析作为工业、金融、物联网等领域的核心技术&#xff0c;长期依赖传统统计模型&#xff08;如ARIMA&#xff09;或深度学习模型&a…...

Kubernetes (K8S) 核心原理深度剖析:从架构设计到运行机制

Kubernetes(K8S)作为容器编排领域的“操作系统”,其设计和实现原理是开发者进阶的必修课。本文将从架构设计、核心组件协作、关键机制实现三个维度,结合源码逻辑与实战场景,分享 K8S 的底层运行原理。 一、Kubernetes 架构设计 1. 声明式 API 与控制器模式 K8S 的核心设…...

Excel 豆知识 - XLOOKUP 为啥会出 #N/A 错误

XLOOKUP有的时候会出 #VALUE! 这个错误。 因为这个XLOOUP有个参数叫 找不到时的返回值&#xff0c;那么为啥还会返回 #VALUE! 呢&#xff1f; 可能还有别的原因&#xff0c;但是主要原因应该就是 检索范围 和 返回范围 不同。 比如这里检索范围在 B列&#xff0c;是 4-21&…...

【深度学习】Hopfield网络:模拟联想记忆

Hopfield网络是一种经典的循环神经网络&#xff0c;由物理学家John Hopfield在1982年提出。它的核心功能是模拟联想记忆&#xff0c;类似于人类大脑通过部分信息回忆完整记忆的能力。以下是通俗易懂的解释&#xff1a; 1. 核心思想 想象你看到一张模糊的老照片&#xff0c;虽然…...

Python可视化大框架的研究与应用

## 摘要 随着数据科学和人工智能的快速发展&#xff0c;数据可视化成为了数据分析中不可或缺的一部分。Python作为一种功能强大且易于学习的编程语言&#xff0c;提供了多种可视化工具和库。本文旨在探讨Python可视化的主要框架&#xff0c;分析其特点、应用场景以及未来发展趋…...

Java 泛型(Generics)详解与使用

一、什么是 Java 泛型&#xff1f; 泛型&#xff08;Generics&#xff09;是 Java 1.5 引入的一项重要特性&#xff0c;主要用于 类型参数化&#xff0c;允许在类、接口和方法定义时使用 类型参数&#xff08;Type Parameter&#xff09;&#xff0c;从而提高代码的复用性、类…...

七、Three.jsPBR材质与纹理贴图

1、PBR材质金属度和粗糙度 1、金属度metalness 金属度属性.metalness表示材质像金属的程度, 非金属材料,如木材或石材,使用0.0,金属使用1.0。 threejs的PBR材质&#xff0c;.metalness默认是0.5,0.0到1.0之间的值可用于生锈的金属外观 new THREE.MeshStandardMaterial({met…...

2024 ChatGPT大模型技术场景与商业应用视频精讲合集(45课).zip

2024ChatGPT大模型技术场景与商业应用视频精讲合集&#xff0c;共十三章&#xff0c;45课。 01. 第一章 ChatGPT&#xff1a;通用人工智能的典范 1.1 ChatGPT概述 .mp4 1.2 通用能力 .mp4 1.3 通用人工智能风口 .mp4 02. 第二章 大模型&#xff1a;ChatGPT的核心支撑 2.1 底层…...

Pytest之parametrize参数化

文章目录 1.前言2.单参数3.多参数4.字典形式5.parametrize 结合 ids 参数 1.前言 在 pytest 中&#xff0c;parametrize 是一个非常实用的装饰器&#xff0c;它允许你对测试函数进行参数化&#xff0c;即使用不同的参数组合多次运行同一个测试函数&#xff0c;从而更高效地进行…...

Python面试(八股)

1. 可变对象和不可变对象 (1). 不可变对象&#xff08; Immutable Objects &#xff09; 不可变对象指的是那些一旦创建后其内容就不能被修改的对象。如果尝试修改不可变对象的内容&#xff0c;将会创建一个新的对象而不是修改原来的对象。常见的不可变类型包括&#xff1a; …...

2024年第十五届蓝桥杯大赛软件赛省赛Python大学A组真题解析《更新中》

文章目录 试题A: 拼正方形(本题总分:5 分)解析答案试题B: 召唤数学精灵(本题总分:5 分)解析答案试题C: 数字诗意解析答案试题D:回文数组试题A: 拼正方形(本题总分:5 分) 【问题描述】 小蓝正在玩拼图游戏,他有7385137888721 个2 2 的方块和10470245 个1 1 的方块,他需…...

湖仓一体概述

湖仓一体之前&#xff0c;数据分析经历了数据库、数据仓库和数据湖分析三个时代。 首先是数据库&#xff0c;它是一个最基础的概念&#xff0c;主要负责联机事务处理&#xff0c;也提供基本的数据分析能力。 随着数据量的增长&#xff0c;出现了数据仓库&#xff0c;它存储的是…...

【行政区划获取】

行政区划获取 获取2023年的行政区划&#xff0c;并以 编码: 省市区 格式保存为字典方便后续调用 注&#xff1a;网址可能会更新&#xff0c;根据最新的来 # 获取并保存行政区划代码 import requests from lxml import etree import jsondef fetch_html(url):""&quo…...

【深入剖析:机器学习、深度学习与人工智能的关系】

深入剖析&#xff1a;机器学习、深度学习与人工智能的关系 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;和深度学习&#xff08;DL&#xff09;这些术语频繁出现在各种科技报道和讨论中&#xff0c;它们相互关联又各…...

Docker 学习(一)

一、Docker 核心概念 Docker 是一个开源的容器化平台&#xff0c;允许开发者将应用及其所有依赖&#xff08;代码、运行时、系统工具、库等&#xff09;打包成一个轻量级、可移植的“容器”&#xff0c;实现 “一次构建&#xff0c;随处运行”。 1、容器&#xff08;Container…...

flink web ui未授权漏洞处理

本文通过nginx代理的方式来处理未授权漏洞问题。 1.安装nginx 通过yum install nginx 2.添加账号和密码 安装htpasswd工具&#xff0c;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">...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...