wordpress网络验证码/重庆seo论坛

wordpress网络验证码,重庆seo论坛,网站单页在线制作,昆明做网站需要多少钱从零开始开发纯血鸿蒙应用 〇、前言一、API 选型1、基本情况2、认识TextToSpeechEngine 二、功能集成实践1、改造右上角菜单2、实现语音播报功能2.1、语音引擎的获取和关闭2.2、设置待播报文本2.3、speak 目标文本2.4、设置语音回调 三、总结 〇、前言 中华汉字洋洋洒洒何其多…

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

  • 〇、前言
  • 一、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.mzph.cn/web/71043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

25年前端如何走的更稳

2025年&#xff0c;随着deepseek引起的AI大模型技术的深度革命&#xff0c;带来了很多机会和挑战&#xff0c;前端程序员作为互联网里一个普通但必不可少的岗位&#xff0c;在当前形势下&#xff0c;需要主动变革才能走的更稳。本文简单介绍三个方向&#xff0c;Web3前端、全栈…

市场加速下跌,但监管「坚冰」正在消融

作者&#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 直接选择排…

计算机毕业设计SpringBoot+Vue.js人口老龄化社区服务与管理平台 (源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

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调用 服务端创建子…

ES的简单讲解

功能 &#xff1a; 文档存储 与 文档搜索 特点&#xff1a;比如有一个文档名 “你好” 可以用‘你‘&#xff0c;好&#xff0c;你好都可以搜索到这个文档 ES核心概念 类似于数据库中表的概念&#xff0c;在表的概念下又对数据集合进行了细分 ​ ES_Client查询接口 cpr::R…

宝塔安装向量数据库-Milvus

注&#xff1a;宝塔需要安装好docker容器组件&#xff01; 1、纯血宝塔安装 1.1 在线上镜像中&#xff0c;拉取milvus镜像&#xff0c;创建milvus容器 1.2 安装milvus管理工具ATTU&#xff1b;同样方式拉取线上镜像创建attu容器 2、自定义安装 2.1修改配置 {"registry-…

【K8S】Kubernetes 基本架构、节点类型及运行流程详解(附架构图及流程图)

Kubernetes 架构 k8s 集群 多个 master node 多个 work nodeMaster 节点&#xff08;主节点&#xff09;&#xff1a;负责集群的管理任务&#xff0c;包括调度容器、维护集群状态、监控集群、管理服务发现等。Worker 节点&#xff08;工作节点&#xff09;&#xff1a;实际运…

数据库MySQL,在终端输入后,提示不是内部命令等

【解决问题】mysql提示不是内部或外部命令&#xff0c;也不是可运行的程序 一般这种问题是因为没有在系统变量里面添加MySQL的可执行路径 以下是添加可执行路径的方法&#xff1a; 第一步&#xff1a;winR输入services.msc 然后找到MySQL&#xff0c;右击属性并复制MySQL的可执…

PhotoShop学习01

了解Photoshop 这里省略了Photoshop的软件安装&#xff0c;请自行查找资源下载。 1.打开图片 下图为启动photoshop后出现的界面&#xff0c;我们可以通过创建新文件或打开已有文件来启用photoshop的工作界面。 可以通过左边的按钮进行新文件的创建或打开已有文件。 也可以点…

GitCode 助力 python-office:开启 Python 自动化办公新生态

项目仓库&#xff1a;https://gitcode.com/CoderWanFeng1/python-office 源于需求洞察&#xff0c;打造 Python 办公神器 项目作者程序员晚枫在运营拥有 14w 粉丝的 B 站账号 “Python 自动化办公社区” 时&#xff0c;敏锐察觉到非程序员群体对 Python 学习的强烈需求。在数字…

javaweb + AI day03

一、web基础 二、分层解耦 注意&#xff1a;bean的名字默认是类名的首字母小写&#xff01;&#xff01;&#xff01; 三、Mysql count不参与null值统计 四、JDBC 五、MyBatis 数据库连接池

运行程序时出现加载配置文件时出错,对路径****的访问被拒绝

问题&#xff1a;最近给客户用c#语言编写进销存项目&#xff0c;在用vs2022自带的打包工具Microsoft visual studio installer projects 打包生成了安装文件&#xff0c;顺利安装后&#xff0c;点击桌面快捷方式后出现如下错误 经过查询相关资料发现是桌面快捷方式的权限问题&a…

基于C#的CANoe CLR Adapter开发指南

一、引言 CANoe 是一款广泛应用于汽车电子开发和测试的工具&#xff0c;它支持多种编程接口&#xff0c;方便开发者进行自定义扩展。CANoe CLR Adapter 允许我们使用 C# 语言与 CANoe 进行交互&#xff0c;充分利用 C# 的强大功能和丰富的类库。本文将详细介绍如何基于 C# 进行…

【三维分割】LangSplat: 3D Language Gaussian Splatting(CVPR 2024 highlight)

论文&#xff1a;https://arxiv.org/pdf/2312.16084 代码&#xff1a;https://github.com/minghanqin/LangSplat 文章目录 一、3D language field二、回顾 Language Fields的挑战三、使用SAM学习层次结构语义四、Language Fields 的 3DGS五、开放词汇查询&#xff08;Open-voca…

haclon固定相机位标定

什么是标定&#xff1f; 工业应用中相机拍到一个mark点的坐标为C1&#xff08;Cx,Cy&#xff09;&#xff0c;C1点对应的龙门架/机械手等执行端对应的坐标是多少&#xff1f; 标定就是解决这个问题&#xff0c;如相机拍到一个点坐标C1&#xff08;Cx,Cy&#xff09;&#xff0c…

【通俗讲解电子电路】——从零开始理解生活中的电路(二)

电路分析&#xff1a;看懂简单的“电路图” ——从“路线图”到“工具箱”&#xff0c;掌握电路的底层逻辑 1. 欧姆定律&#xff1a;电的“交通规则” 公式解析&#xff1a;V I R 电压&#xff08;V&#xff09;&#xff1a;推动电流的动力&#xff08;如电池电压&#xff…