鸿蒙开发:文本合成语音
前言
Android开发的同学都知道,在Android当中,实现一段文字合成语音播放,可以使用系统提供的对象TextToSpeech来很快的实现,如果不用系统自带的,也可以使用三方提供的,比如讯飞的语音合成等等,总之,实现起来多种多样,那么,在鸿蒙当中,如何实现根据指定的文本进行合成语音合成播放呢,其实也是非常的简单,因为鸿蒙当中也有textToSpeech。
实现步骤
第一步:创建引擎得到文本转语音类
使用系统自带的Api textToSpeech,调用createEngine方法来创建引擎,接收的参数,用来设置创建引擎实例的相关参数,比如配置的语种、模式、音色和风格等。
private createTextToSpeech() {let extraParam: Record<string, Object> = { "style": 'interaction-broadcast', "locate": 'CN', "name": 'EngineName' };let initParamsInfo: textToSpeech.CreateEngineParams = {language: 'zh-CN',person: 0,online: 1,extraParams: extraParam}// 调用createEngine方法textToSpeech.createEngine(initParamsInfo,(err: BusinessError, textToSpeechEngine: textToSpeech.TextToSpeechEngine) => {if (!err) {console.info('Succeeded in creating engine.');// 接收创建引擎的实例this.ttsEngine = textToSpeechEngine;} else {console.error(`Failed to create engine. Code: ${err.code}, message: ${err.message}.`);}})}
关于参数,需要注重说明一下,首先是language,也就是支持的语言,目前只支持中文,也就是“zh-CN”;online字段是支持的模式,0为在线模式,目前不支持;1为离线,当前仅支持离线模式;person,音色,0为聆小珊女声音色,当前仅支持聆小珊女声音色;extraParams为风格设置,比如设置广播风格,是否支持后台播放等。
可以发现,虽然有很多参数,但是目前都仅仅支持一种,基本上固定就行,extraParams中有一个isBackStage,也就是是否支持后台播放,为true时,支持后台播报。
第二步,语音播放
文字合成语音,我们只需要调用speak方法即可,两个参数,第一个是需要合成语音的文本,要求是不超过10000字符的中文文本,这个是重点,第二个是,合成播报音频的相关参数,用于配置语速、音量、音调、合成类型等,其中有一个参数requestId需要知道,它在同一实例内仅能用一次,重复设置是不起作用的,如果多次调用,建议每次进行更换,比如用时间戳,随机数等等。
// 调用speak播报方法private speak(message:string) {let speakListener: textToSpeech.SpeakListener = {// 开始播报回调onStart(requestId: string, response: textToSpeech.StartResponse) {console.info(`onStart, requestId: ${requestId} response: ${JSON.stringify(response)}`);},// 完成播报回调onComplete(requestId: string, response: textToSpeech.CompleteResponse) {console.info(`onComplete, requestId: ${requestId} response: ${JSON.stringify(response)}`);},// 停止播报完成回调,调用stop方法并完成时会触发此回调onStop(requestId: string, response: textToSpeech.StopResponse) {console.info(`onStop, requestId: ${requestId} response: ${JSON.stringify(response)}`);},// 返回音频流onData(requestId: string, audio: ArrayBuffer, response: textToSpeech.SynthesisResponse) {console.info(`onData, requestId: ${requestId} sequence: ${JSON.stringify(response)} audio: ${JSON.stringify(audio)}`);},// 错误回调,播报过程发生错误时触发此回调onError(requestId: string, errorCode: number, errorMessage: string) {console.error(`onError, requestId: ${requestId} errorCode: ${errorCode} errorMessage: ${errorMessage}`);}};// 设置回调this.ttsEngine?.setListener(speakListener);// 设置播报相关参数let extraParam: Record<string, Object> = {"queueMode": 0,"speed": 1,"volume": 2,"pitch": 1,"languageContext": 'zh-CN',"audioType": "pcm","soundChannel": 3,"playType": 1}let speakParams: textToSpeech.SpeakParams = {requestId: "123456-a", // requestId在同一实例内仅能用一次,请勿重复设置extraParams: extraParam}// 调用speak播报方法this.ttsEngine?.speak(message, speakParams)}
停止播放
直接调用stop即可。
ttsEngine.stop()
关闭引擎,释放引擎资源
// 调用shutdown接口
ttsEngine.shutdown()
语音识别回调
let speakListener: textToSpeech.SpeakListener = {// 开始播报回调onStart(requestId: string, response: textToSpeech.StartResponse) {console.info(`onStart, requestId: ${requestId} response: ${JSON.stringify(response)}`);},// 完成播报回调onComplete(requestId: string, response: textToSpeech.CompleteResponse) {console.info(`onComplete, requestId: ${requestId} response: ${JSON.stringify(response)}`);},// 停止播报完成回调,调用stop方法并完成时会触发此回调onStop(requestId: string, response: textToSpeech.StopResponse) {console.info(`onStop, requestId: ${requestId} response: ${JSON.stringify(response)}`);},// 返回音频流onData(requestId: string, audio: ArrayBuffer, response: textToSpeech.SynthesisResponse) {console.info(`onData, requestId: ${requestId} sequence: ${JSON.stringify(response)} audio: ${JSON.stringify(audio)}`);},// 错误回调,播报过程发生错误时触发此回调onError(requestId: string, errorCode: number, errorMessage: string) {console.error(`onError, requestId: ${requestId} errorCode: ${errorCode} errorMessage: ${errorMessage}`);}};// 设置回调this.ttsEngine?.setListener(speakListener);
播报策略
在不同的场景下,比如停顿,单词连读,数字分开读,等等,不同的场景就会有不同的播放策略。
单词播报方式
文本格式:[hN] (N=0/1/2),首先h是固定的,N可以选择012三个数字,0是智能判断单词播放方式。默认值即为0,1是逐个字母进行播报,2是以单词方式进行播报。
举例:
"hello[h1] world"
hello使用单词发音,world及后续单词将会逐个字母进行发音。
数字播报策略
格式和以上一样,[nN] (N=0/1/2),N可以选择012三个数字,0是智能判断数字处理策略,默认值为0;1是作为号码逐个数字播报,2是作为数值播报,超过18位数字不支持,自动按逐个数字进行播报。
举例:
"[n2]123[n1]456[n0]"
其中,123将会按照数值播报,456则会按照号码播报,而后的文本中的数字,均会自动判断。
插入静音停顿
格式为[pN],N为无符号整数,单位为ms。
举例:
"你好[p1000]程序员一鸣"
以上的语句播报时,将会在“你好”后插入1000ms的静音停顿。
指定汉字发音
汉字声调用后接一位数字1~5分别表示阴平、阳平、上声、去声和轻声5个声调,格式为:[=MN],其中M表示拼音,N表示声调,取值范围为,1表示阴平,2表示阳平,3表示上声,4表示去声,5表示轻声。
举例:
"着[=zhao2]火"
“着”字将读作“zhaó”。
相关总结
文本合成语音的能力目前只能在真机上进行测试,不支持模拟器。
相关文章:
鸿蒙开发:文本合成语音
前言 Android开发的同学都知道,在Android当中,实现一段文字合成语音播放,可以使用系统提供的对象TextToSpeech来很快的实现,如果不用系统自带的,也可以使用三方提供的,比如讯飞的语音合成等等,总…...
雷军:科技传奇的逐梦之旅
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...
LeetCode - 初级算法 数组(删除排序数组中的重复项)
免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 删除排序数组中的重复项 这篇文章讨论如何从一个非严格递增的数组 nums 中删除重复的元素,使每个元素只出现一次,并返回新数组的长度。因为数组是排序的,只要是相同的肯定是挨着的,所以我们需要遍历所有数组,然…...
2024年度培训运维总结
目前带的弟子跟我实战训练运维的总就业率基本可以稳定在 100% 左右(因为我不带小白和没学历和大龄,悟性低都筛掉了还能找我说明条件够了) 以下是弟子私教训练营的最新就业数据(2024年12月25日): 面试辅导…...
java重装小结
一、Java安装 安装路径 https://www.oracle.com/java/technologies/javase/javas e8-archive-downloads.html 具体类型可参考: Java安装配置-CSDN博客 我在这一步主要碰到的问题就是访问官网报404错误,可参考: 在oracle官网下载资源显示…...
ubuntu20.04 中文输入法安装
中文输入法安装指南 在 Ubuntu 20.04 上安装中文输入法,您可以按照以下步骤操作: 打开终端。安装 fcitx 输入法框架和中文输入法模块:sudo apt update sudo apt install fcitx fcitx-pinyin安装中文语言支持:sudo apt install l…...
SQL常用语句(基础)大全
SQL语句的类型 1.DDL 1.库2.表 2.DML 1.插入数据 insert inot2.删除数据 delete / truncate3.修改数据 update set 3.DQL 1.无条件查询2.查询 什么开始 到什么结束3.指定条件查询 1.单个条件 ro in2.多个条件 and4.查询不为NULL值 is not null ,为NULL值 is null5.模糊查询 li…...
计算和可视化相对湿度结果
了解如何确定 CFD 模型中的相对湿度。 了解相对湿度 大气是干燥空气和水蒸气的混合物,每一种的压力之和等于蒸气压。相对湿度是指空气中的水分量与空气在特定温度下可以容纳的最大水分量之比。它通常以百分比表示。它的范围从 0(干燥空气)到…...
uniapp-vue3(下)
关联链接:uniapp-vue3(上) 文章目录 七、咸虾米壁纸项目实战7.1.咸虾米壁纸项目概述7.2.项目初始化公共目录和设计稿尺寸测量工具7.3.banner海报swiper轮播器7.4.使用swiper的纵向轮播做公告区域7.5.每日推荐滑动scroll-view布局7.6.组件具名…...
一起学习Firtran: Fortran中的流程控制与操作符
流程控制语句 在计算机编程中,控制程序流程是算法设计中的一个核心概念,它使得程序能够根据特定条件执行不同的操作或重复执行某段代码。这显著增强了计算机算法相对于简单数学公式的功能和灵活性。 if语句 在单个 if 语句中只有当测试表达式࿰…...
Sonic:开源Go语言开发的高性能博客平台
Sonic:一个用Go语言开发的高性能博客平台 简介 Sonic,一个以其速度如声速般快速而命名的博客平台,是一个用Go语言开发的高性能博客系统。正如其名字所暗示的,Sonic旨在提供一个简单而强大的博客解决方案。这个项目受到了Halo项目…...
SpringBoot教程(十四) SpringBoot之集成Redis
SpringBoot教程(十四) | SpringBoot之集成Redis 一、Redis集成简介二、集成步骤 2.1 添加依赖2.2 添加配置2.3 项目中使用之简单使用 (举例讲解)2.4 项目中使用之工具类封装 (正式用这个)2.5 序列化 &…...
RSI和CCI指标组合:如何评估需求供应区?昂首资本实战指南
在市场分析中,分笔成交点数量提供了一个有价值的视角,帮助我们识别需求和供应区。通过这些数据,我们可以假设供需区域的参数与主要振荡器中的区域参数类似。以RSI和CCI为例,这些指标不仅能够反映市场的超买和超卖情况,…...
PTPVT 插值说明
文章目录 PTPVT 插值说明 PTPVT 插值说明PVT Hermite插值PVT 三次多项式插值PT 插值Sin轨迹测试结果PVT Hermite插值结果PVT 三次多项式插值结果PT 插值结果 用户轨迹测试结果PVT Hermite插值结果PT 插值结果 PTPVT 插值说明 PT模式: 位置-时间路径插值算法。 PVT模…...
Spring MVC和servlet
1.Spring MVC是Spring框架的一个扩展 2.Spring MVC工作流程 1、用户发送请求至前端控制器DispatcherServlet。 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及…...
java下载文件流,不生成中间文件。
java下载文件流,不生成中间文件。 代码设计:代码实现 代码设计: 从前端获取的数据经过后端加工后,生成文件流,并返回前端,(不生成中间文件,注意内存,记得关闭流…...
计算机专业考研 408 学科学习方法
计算机专业考研 408 学科涵盖数据结构、计算机组成原理、操作系统和计算机网络四门核心课程,内容多且难度大。但只要掌握科学的学习方法,便能化繁为简,稳步提升。以下为大家详细介绍 408 学科的学习方法。 一、基础夯实阶段:全面…...
mapper文件的解释
<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.ruoyi.system.mapper.Jianai…...
常见协议的高危软件漏洞信息
HTTP 协议 协议 | 软件 | 漏洞编号 | 漏洞描述 Apache Log4j CVE-2021-45105 | Apache Log4j拒绝服务攻击漏洞 XWiki Platform CVE-2023-26477 | XWiki Platform存在安全漏洞,该漏洞源于可以通过URL请求参数结合其他参数注入任意脚本宏 Microsoft Windows CVE-20…...
Mediatek Android13 ROM定制
目录 1、系统签名 2、默认关闭WIFI 3、默认关闭Bluetooth 4、默认关闭NFC 5、移除物理键盘支持 6、禁止 ANR、崩溃等的对话框显示 7、修改默认壁纸 8、取消USB PTP MTP MIDI等支持 9、设置Screen Lock默认为None 10、设置Data&time自动 11、设置特定时区 12、设…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
