三文带你轻松上手鸿蒙的AI语音03-文本合成声音

2024-09-07 11:36

本文主要是介绍三文带你轻松上手鸿蒙的AI语音03-文本合成声音,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

三文带你轻松上手鸿蒙的AI语音03-文本合成声音

前言

接上文 三文带你轻松上手鸿蒙的AI语音02-声音文件转文本

HarmonyOS NEXT 提供的AI 文本合并语音功能,可以将一段不超过10000字符的文本合成为语音并进行播报。

场景举例

  • 手机在无网状态下,系统应用无障碍(屏幕朗读)接入文本转语音能力,为视障人士提供播报能力。
  • 类似微信读书,可以实现将文章内容通过语音朗读,可以在无法不方便阅读文章时提供帮助,如一边送外卖一边听书。

实现效果

image-20240829175251444

使用流程

  1. 创建文本合成语音引擎
  2. 设置监听回调
  3. 开始合成

image-20240829173019521

创建文本合成语音引擎

文末会提供封装后的代码

创建文本合成语音引擎需要先引入 textToSpeech,然后调用其 createEngine 方法时,需要准备 初始化引擎的参数

image-20240829173614612

设置监听回调

调用完createEngine 时会返回相应实例,此时可以设置监听回调。

  1. onStart 播报开始时回调
  2. onStop 播报结束时回调
  3. onComplete 合成或播报结束后分别回调此接口,返回请求ID,完成播报相关信息
  4. onData 合成播报过程中回调此接口,返回请求ID,音频流信息,音频附加信息如格式、时长等。若需要返回音频流信息,请实现此接口。
  5. onError 合成播报过程中,出现错误时回调,返回请求ID、错误码及错误描述。

image-20240829174815936

开始合成

完成上面的实例创建和设置监听后,便可以调用 speak方法开始合成了。但是在调用speak时,也需要传递相应的参数。

image-20240829175108921

封装好的代码

import { textToSpeech } from '@kit.CoreSpeechKit';class TextToSpeechManager {/** 语音转文本引擎 */private ttsEngine: textToSpeech.TextToSpeechEngine | null = null/** 创建引擎的配置参数 */private static extraParam: Record<string, Object> ={// 风格 interaction-broadcast:广播风格"style": 'interaction-broadcast',// 区域信息。 可选,不设置时默认为“CN”,当前仅支持“CN”。"locate": 'CN',// 引擎名称。 可选,引擎名称,不设置是默认为空,当前仅支持单应用、单实例"name": 'EngineName'}/** 创建引擎的配置参数 */private static initParamsInfo: textToSpeech.CreateEngineParams = {// 语种, 当前仅支持“zh-CN”中文。language: 'zh-CN',// 音色。 0为聆小珊女声音色,当前仅支持聆小珊女声音色。person: 0,// 模式。 0为在线,目前不支持;1为离线,当前仅支持离线模式。online: 1,extraParams: TextToSpeechManager.extraParam}/** 会话ID,一个实例只能使用一次 */private requestId: stringconstructor() {this.requestId = `tts` + Date.now()}/** 创建引擎 */async createEngine() {return this.ttsEngine = await textToSpeech.createEngine(TextToSpeechManager.initParamsInfo)}/** 设置回调监听 */async setListener(callback?: (res: textToSpeech.CompleteResponse) => void) {// 设置speak的回调信息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)}`);callback && callback(response)},// 停止播报回调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);}/** 开始转换 */async speak(originalText: string) {// 设置播报相关参数let extraParam: Record<string, Object> = {"queueMode": 0,// 语速。可选,支持范围[0.5-2],不传参时默认为1。"speed": 1,// 音量。 可选,支持范围[0-2],不传参时默认为1"volume": 2,// 音调。// 可选,支持范围[0.5-2],不传参时默认为1"pitch": 1,// 语境,播放阿拉伯数字用的语种。 可选,当前仅支持“zh-CN”中文,不传参时默认“zh-CN”。"languageContext": 'zh-CN',// 音频类型,当前仅支持“pcm”"audioType": "pcm",//  通道。 可选,参数范围0-16,整数类型,可参考音频流使用来选择适合自己的音频场景。  不传参时默认为3,语音助手通道"soundChannel": 3,// 合成类型。 可选,不传参时默认为1。 0:仅合成不播报,返回音频流。 1:合成与播报不返回音频流。"playType": 1};let speakParams: textToSpeech.SpeakParams = {requestId: this.requestId, // requestId在同一实例内仅能用一次,请勿重复设置extraParams: extraParam};// 调用播报方法this.ttsEngine?.speak(originalText, speakParams);}/** 停止转换 */async stop() {this.ttsEngine?.stop()}
}export default TextToSpeechManager

页面中使用

Index.ets

image-20240829175251444

import { PermissionManager } from '../utils/permissionMananger'
import { Permissions } from '@kit.AbilityKit'
import SpeechRecognizerManager from '../utils/SpeechRecognizerManager'
import { AudioCapturerManager } from '../utils/AudioCapturerManager'
import TextToSpeechManager from '../utils/TextToSpeechManager'@Entry
@Component
struct Index {@Statetext: string = ""fileName: string = ""// 1 申请权限fn1 = async () => {// 准备好需要申请的权限 麦克风权限const permissions: Permissions[] = ["ohos.permission.MICROPHONE"]// 检查是否拥有权限const isPermission = await PermissionManager.checkPermission(permissions)if (!isPermission) {//   如果没权限,就主动申请PermissionManager.requestPermission(permissions)}}// 2 实时语音识别fn2 = () => {SpeechRecognizerManager.init(res => {console.log("实时语音识别", JSON.stringify(res))this.text = res.result})}// 3 开始录音fn3 = () => {this.fileName = Date.now().toString()AudioCapturerManager.startRecord(this.fileName)}// 4 接收录音fn4 = () => {AudioCapturerManager.stopRecord()}// 5 声音文件转换文本fn5 = () => {SpeechRecognizerManager.init2(res => {this.text = res.resultconsole.log("声音文件转换文本", JSON.stringify(res))}, this.fileName)}// 6 文本合成声音fn6 = async () => {const tts = new TextToSpeechManager()await tts.createEngine()tts.setListener((res) => {console.log("res", JSON.stringify(res))})tts.speak("我送你离开 千里之外")}build() {Column({ space: 10 }) {Text(this.text)Button("申请权限").onClick(this.fn1)Button("实时语音识别").onClick(this.fn2)Button("开始录音").onClick(this.fn3)Button("结束录音").onClick(this.fn4)Button("声音文件转换文本").onClick(this.fn5)Button("文本合成声音").onClick(this.fn6)}.width("100%").height("100%").justifyContent(FlexAlign.Center)}
}

总结

HarmonyOS NEXT 提供的AI 文本合并语音功能,可以将一段不超过10000字符的文本合成为语音并进行播报

使用的步骤为3步

  1. 创建文本合成语音引擎
  2. 设置监听回调
  3. 开始合成

这篇关于三文带你轻松上手鸿蒙的AI语音03-文本合成声音的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144950

相关文章

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

轻松掌握python的dataclass让你的代码更简洁优雅

《轻松掌握python的dataclass让你的代码更简洁优雅》本文总结了几个我在使用Python的dataclass时常用的技巧,dataclass装饰器可以帮助我们简化数据类的定义过程,包括设置默... 目录1. 传统的类定义方式2. dataclass装饰器定义类2.1. 默认值2.2. 隐藏敏感信息

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript