实现语音合成的三种方法:HTML5 Web Speech 、speak-tts、百度语音合成

1. 使用HTML5 Web Speech API

1.1 使用方法

window.speechSynthesis 是HTML5 Web Speech API的一部分,是浏览器原生提供的文本转语音功能。它允许开发者在网页上通过JavaScript调用,将文本转换为语音进行播放。
https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Speech_API

示例代码

<template>
<div><button @click="speakVoice('测试语音播放')">播放语音</button>
</div>
</template>
<script setup lang="ts">
const voices = ref<SpeechSynthesisVoice[]>([]);
//语音播报
const speakVoice = (msg:any) => {window.speechSynthesis.cancel();try {initVoices().then(()=>{//实例化播报内容var instance = new SpeechSynthesisUtterance(); instance.text = msg; // 文字内容: 测试内容instance.lang = "zh-CN"; // 使用的语言:中文instance.volume = 1; // 声音音量:1instance.rate = 1.5; // 语速:1instance.pitch = 1; // 音高:1//instance.voice = null; // 某人的声音//let voices = window.speechSynthesis.getVoices();instance.voice = voices.value.filter(function (voice) {return voice.localService == true && voice.lang == 'zh-CN'})[0]// instance.voice = window.speechSynthesis.getVoices()[0];//选中第一个语音包instance.addEventListener("end", () => {});// 监听播报完成状态,播完可以做些其它处理console.log(instance)window.speechSynthesis.speak(instance)})} catch (error) {console.log(error)}
}// 初始化语音列表async function initVoices() {if (!window.speechSynthesis) {console.error('Speech synthesis is not supported in this browser.');return;}// 获取当前的声音列表voices.value = window.speechSynthesis.getVoices();// 监听语音变化 Chrome允许使用远程服务器进行语音合成,而SpeechSynthesis向谷歌服务器请求语音列表。要解决此问题,您需要等待语音将被加载,然后再次请求它们。speechSynthesis.onvoiceschanged = () => {voices.value = window.speechSynthesis.getVoices();};// 等待语音列表加载完成await new Promise<void>((resolve) => {if (voices.value.length > 0) {resolve();} else {const intervalId = setInterval(() => {const newVoices = window.speechSynthesis.getVoices();if (newVoices.length > 0) {voices.value = newVoices;clearInterval(intervalId);resolve();}}, 1000);}});}//语音暂停const beQuiet = () => {console.log('语音播报停止')window.speechSynthesis.cancel();}onMounted(()=>{
//初始化initVoices();
})
</script>

1.2 优缺点

优点

  • 原生支持:无需安装任何外部库或插件,主流现代浏览器均支持。
  • 功能丰富:支持多种语言和音频设置,可以自定义语音风格、发音调整、语速、音量等。
  • 应用广泛:适用于网站辅助阅读、语音导航、语音消息提示等多种场景。

缺点

  • 浏览器兼容性:不完全兼容IE浏览器,需要额外的兼容处理。
  • 语音包限制:语音包的选择和质量可能受到浏览器和操作系统的限制。

在这里插入图片描述

2. 使用speak-tts

speak-tts是一个基于浏览器SpeechSynthesis API的封装库,它提供了更加丰富的功能和更好的兼容性处理。

2.1使用方法

步骤 1: 安装speak-tts

首先,你需要在你的Vue 3项目中安装speak-tts。在你的项目根目录下,通过npm或yarn来安装:

npm install speak-tts
# 或者
yarn add speak-tts
步骤 2: 在Vue组件中引入speak-tts

然后,在你的Vue组件中引入speak-tts并使用它。以下是一个Vue 3组件的示例,展示了如何设置并使用speak-tts

<template><div><textarea v-model="textToSpeak" placeholder="Enter text to speak"></textarea><button @click="speakText">Speak Text</button></div>
</template><script lang="ts">
import { defineComponent, ref } from 'vue';
import SpeakTTS from 'speak-tts';export default defineComponent({setup() {const textToSpeak = ref('');let speech: SpeakTTS | null = null;const initSpeech = async () => {try {speech = new SpeakTTS();await speech.init({volume: 1,lang: 'en-US',rate: 1,pitch: 1,splitSentences: true,});} catch (error) {console.error('Failed to initialize SpeakTTS:', error);}};const speakText = async () => {if (!speech) {await initSpeech();}try {await speech.speak({text: textToSpeak.value,queue: true,listeners: {onstart: () => console.log('Start speaking'),onend: () => console.log('End speaking'),onerror: (error) => console.error('Error during speaking:', error),},});} catch (error) {console.error('Failed to speak text:', error);}};return { textToSpeak, speakText };},
});
</script><style scoped>
/* Add your styles here */
</style>
解释
  1. 模板部分:包含一个文本域用于输入要转换的文字,和一个按钮来触发语音播放。

  2. 设置部分

    • 使用ref来响应式地存储文本和SpeakTTS实例。
    • initSpeech函数用于初始化SpeakTTS实例,设置默认的音量、语言、语速和音调等。
    • speakText函数用于播放文本。如果SpeakTTS实例未初始化,则先调用initSpeech。然后使用speak方法播放文本,并附加了一些监听器来处理开始、结束和错误事件。

3. 使用百度语音合成API

百度语音合成(Text-to-Speech, TTS)是一项强大的服务,它能够将文本转换成流畅的语音输出。

3.1使用方法

步骤 1: 注册百度AI开放平台账号并获取API Key

首先,你需要在百度AI开放平台注册一个账号,并创建应用以获取API Key和Secret Key。这些密钥将用于认证你的请求,从而使用百度语音合成服务。

步骤 2: 安装必要的库

在Vue 3项目中,你可能需要使用axiosfetch来发送HTTP请求。这里我们使用axios作为示例。首先,你需要安装axios

npm install axios
# 或者
yarn add axios

步骤 3: 创建Vue 3组件

在你的Vue 3项目中,创建一个新的组件用于处理语音合成的逻辑。

组件模板

<template><div><textarea v-model="textToSynthesize" placeholder="Enter text to synthesize"></textarea><button @click="synthesizeText">Synthesize Text</button><audio ref="audioElement" controls></audio></div>
</template>

组件脚本

<script>标签中,使用TypeScript定义组件的逻辑。

<script lang="ts">
import { defineComponent, ref, onMounted } from 'vue';
import axios from 'axios';export default defineComponent({setup() {const textToSynthesize = ref('');const audioElement = ref<HTMLAudioElement | null>(null);const synthesizeText = async () => {if (!textToSynthesize.value.trim()) {alert('Please enter some text to synthesize.');return;}try {// 配置API请求参数const accessToken = 'YOUR_ACCESS_TOKEN'; // 从百度AI开放平台获取const baseUrl = 'https://aip.baidubce.com/oauth/2.0/token';const ttsUrl = 'https://aip.baidubce.com/rest/2.0/tts/v1/text_to_speech';// 这一步通常是先获取access token,但为简化示例,我们假设已经拥有// 在实际应用中,你需要请求一个token接口,并在请求TTS时使用它// 构造TTS请求体const params = {text: textToSynthesize.value,lan: 'zh', // 语言,这里使用中文spd: 5, // 语速,可以是1-9,数字越大语速越快pit: 5, // 音调,可以是0-9,数字越大声音越尖vol: 5, // 音量,可以是0-15,数字越大音量越大per: 4, // 发音人选择, 0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫cue_text: '', // 提示音文本,用于在合成语音前给用户一个提示aue: 'mp3', // 音频编码格式,这里使用mp3token: accessToken,};// 发送请求到百度TTS APIconst response = await axios.post(ttsUrl, params, {headers: {'Content-Type': 'application/x-www-form-urlencoded',},paramsSerializer: params => {return Object.keys(params).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`).join('&');},responseType: 'blob', // 响应类型为blob,用于下载音频文件});// 处理响应并播放音频const url = URL.createObjectURL(new Blob([response.data]));if (audioElement.value) {audioElement.value.src = url;audioElement.value.play();}} catch (error) {console.error('Error during synthesizing text:', error);alert('Failed to synthesize text.');}};return { textToSynthesize, audioElement, synthesizeText };},
});
</script>

注意:上述代码示例中,YOUR_ACCESS_TOKEN应替换为你从百度AI开放平台获取的实际API Key。在实际应用中,你还需要处理token的获取和刷新逻辑,因为token有一定的有效期。

3.2优缺点

优点:
  1. 专业性强:百度语音合成API基于百度强大的语音识别和语音合成技术,提供了高质量的语音合成服务。其音色自然、语速可调、发音准确,适用于多种场景。
  2. 丰富的功能:百度语音合成API支持多种语言、音色选择、语速调节等功能,可以满足不同用户的需求。同时,它还提供了API接口和SDK等多种接入方式,方便开发者集成和使用。
  3. 稳定性高:作为专业的语音合成服务,百度语音合成API具有较高的稳定性和可靠性。它可以在高并发、大流量的场景下保持稳定的性能表现。
  4. 文档和支持完善:百度为开发者提供了详细的API文档和技术支持,帮助开发者快速上手并解决问题。
缺点:
  1. 依赖外部服务:使用百度语音合成API需要依赖百度的服务器进行语音合成处理。这可能导致在网络状况不佳或百度服务器出现故障时无法使用或功能受限。
  2. 成本考虑:虽然百度语音合成API提供了免费试用和付费服务两种模式,但对于需要高频次、大量使用的场景来说,成本可能会成为一个考虑因素。
  3. 集成复杂度:与Web Speech API相比,集成百度语音合成API可能需要更多的配置和代码编写工作。这可能会增加开发者的工作量和时间成本。

综上所述,HTML5 Web Speech API和百度语音合成API在实现语音合成方面各有其优缺点。在选择时需要根据自己的具体需求和场景来综合考虑。如果需要快速、简便地实现基本的语音合成功能,并且不特别关注语音质量和音色选择等方面的问题,那么可以选择HTML5 Web Speech API;如果需要更高质量的语音合成服务、丰富的功能选项以及更好的稳定性和可靠性,那么可以考虑使用百度语音合成API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1548830.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

渗透测试--文件上传常用绕过方式

文件上传常用绕过方式 1.前端代码&#xff0c;限制只允许上传图片。修改png为php即可绕过前端校验。 2.后端校验Content-Type 校验文件格式 前端修改&#xff0c;抓取上传数据包&#xff0c;并且修改 Content-Type 3.服务端检测&#xff08;目录路径检测&#xff09; 对目…

LMDeploy 量化部署实践

任务 使用结合W4A16量化与kv cache量化的internlm2_5-1_8b-chat模型封装本地API并与大模型进行一次对话 复现过程 按照教材安装环境。https://github.com/InternLM/Tutorial/blob/camp3/docs/L2/LMDeploy/readme.md 使用LMDeploy部署原版的1.8b大模型&#xff0c;占用显存2…

Centos怎么执行脚本

方法一&#xff1a;切换到shell脚本所在的目录&#xff08;此时&#xff0c;称为工作目录&#xff09;执行shell脚本 cd /data/shell ./hello.sh 方法二&#xff1a;以绝对路径的方式去执行bash shell脚本 /data/shell/hello.sh 方法三&#xff1a;直接使用bash 或sh 来执行…

Kubernetes深入详解(一)

目录 第一部分 K8s概念和架构 1、k8s概述和特性 2、K8s架构组件 3、k8s核心概念 第二部分 从零搭建k8s集群 1、搭建k8s环境平台规划 2、服务器硬件配置要求 3、搭建k8s集群部署方式 (1) 基于客户端工具kubeadm 1、安装Docker 2、添加阿里云YUM软件源 3、安 装kubea…

代码随想录Day 58|拓扑排序、dijkstra算法精讲,题目:软件构建、参加科学大会

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 图论part08**拓扑排序精讲**题目&#xff1a;117. 软件构建拓扑排序的背景解题思路&#xff1a;模拟过程 **dijkstra&#xff08;朴素版&#xff09;精讲**题目&#xff1a;47. 参加科学大会解题思…

腾讯特效 SDK

腾讯云视立方腾讯特效 SDK&#xff08;Tencent Effect&#xff09;是音视频终端 SDK &#xff08;腾讯云视立方&#xff09;的子产品 SDK 之一&#xff0c;提供美颜特效功能。基于优图精准的 AI 能力和天天 P 图丰富的实时特效处理&#xff0c;为各类视频处理场景提供丰富的产品…

SpringCloud-Netflix第一代微服务快速入门

1.springCloud常用组件 Netflix Eureka 当我们的微服务过多的时候&#xff0c;管理服务的通信地址是一个非常麻烦的事情&#xff0c;Eureka就是用来管理微服务的通信地址清单的&#xff0c;有了Eureka之后我们通过服务的名字就能实现服务的调用。 Netflix Ribbon\Feign : 客…

卫星导航定位原理学习(三)

GNSS信号体制及其性能分析 GNSS信号体制直接影响卫星导航系统的性能&#xff0c;是卫星导航系统设计的重要内容。卫星导航信号体制主要包括信号频率、信号结构、导航电文3部分。其中信号结构又包括调制波形、频率带宽、扩频码码长、码速率、码结构、信号功率等内容。导航电文设…

8086介绍

内部结构 执行部件EU&#xff08;Execution Unit&#xff09; 包含运算器、通用寄存器组、EU控制单元。 只负责控制&#xff0c;不和外部总线打交道 总线接口部件BIU&#xff08;Bus Interface Unit&#xff09; 包含指令队列缓冲器、16位指令指针寄存器IP、16位段寄存器&am…

【L波段差分干涉SAR卫星(陆地探测一号01组)】

L波段差分干涉SAR卫星&#xff08;陆地探测一号01组&#xff09; L波段差分干涉SAR卫星&#xff08;陆地探测一号01组&#xff09;是我国自主研发的重要卫星系统&#xff0c;以下是对该卫星的详细介绍&#xff1a; 一、基本信息 卫星组成&#xff1a;陆地探测一号01组由A星…

全网最适合入门的面向对象编程教程:53 Python字符串与序列化-字符串与字符编码

全网最适合入门的面向对象编程教程&#xff1a;53 Python 字符串与序列化-字符串与字符编码 摘要&#xff1a; 在 Python 中&#xff0c;字符串是文本的表示&#xff0c;默认使用 Unicode 编码&#xff0c;这允许你处理各种字符集&#xff0c;字符编码是将字符转换为字节的规则…

一文上手SpringSecurity【三】

一、认证流程分析 上篇文章当中,我们一步一步查阅源码方式对认证流程有了一些认证,本章节梳理一下整个流程,最后形成一张图,以更直观的方式来理解认证的整个流程. 1.1 认证当中步及的接口和类 1.1.1 【抽象类】AbstractAuthenticationProcessingFilter 实现了GenericFilter…

OFDM通信系统发射端需要做ifftshift的原因分析

对频率为15Hz的正弦波信号进行FFT分析&#xff0c;并且直接画图&#xff0c;matlab代码如下&#xff1a; fs 100; % sampling frequency t 0:(1/fs):(10-1/fs); % time vector S cos(2*pi*15*t); n length(S); X fft(S); f (0:n-1)*(fs/n); %frequenc…

使用canvas截取web camera指定区域,并生成图片

目标&#xff0c;截取红色色块背后的视频区域。 代码结构如下&#xff1a; <div id"p1"><video id"v1" autoplay playsinline></video><div id"mrz"></div><canvas id"captureCanvas"></can…

优化|深入解读DeepOPF:一种用于安全约束直流最优潮流问题的深度神经网络方法

原文信息&#xff08;包括题目、发表期刊、原文链接等&#xff09;&#xff1a; DeepOPF: A Deep Neural Network Approach for Security-Constrained DC Optimal Power Flow https://ieeexplore.ieee.org/document/9205647 原文作者&#xff1a;Xiang Pan; Tianyu Zhao; Ming…

机器学习-聚类

http://en.wikipedia.org/wiki/Multispectral_pattern_recognition 聚类基础知识 凝层次聚类 K-means 聚类 基于EM算法的聚类 聚类基础知识 聚类&#xff1a;将数据划分到不同的类里&#xff0c;使相似的数据在同一类里&#xff0c;不相似的数据在不同的类里&#xff08;物…

芝法酱学习笔记(0.5)——使用jenkins做自动打包

前言 上节讲了SpringBoot上的打包。但这些过程都是手动的&#xff0c;在实际的开发测试时&#xff0c;自动化的打包部署&#xff0c;可以大大提升团队开发的效率 一、去官网下载 1.1 官网安装命令 对于如何安装的问题&#xff0c;我向来推荐官网 wget -O /usr/share/keyri…

ThreeJs绘制圆柱体

上一章节实现了圆锥体的绘制&#xff0c;这节来绘制圆柱体&#xff0c;圆柱体就是矩形旋转获得&#xff0c;如上文一样&#xff0c;先要创建出基础的组件&#xff0c;包括场景&#xff0c;相机&#xff0c;灯光&#xff0c;渲染器。代码如下&#xff1a; initScene() {this.sce…

【vue-router】用meta.keepAlive做缓存

网上大家都说按下面的写法 <keep-alive><router-view v-if"route.meta.keepAlive"></router-view> </keep-alive> <router-view v-if"!route.meta.keepAlive"></router-view>但是会报错 解决方法也没找到 最后换一…

Java项目实战II基于Java+Spring Boot+MySQL的学院班级回忆录(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 在时光的长河中&#xff0c;班级的记忆如同璀璨星辰&#xff0c;照亮了我们共同的青春岁月。为了珍藏…