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

news2024/9/28 11:35:06

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; // 声音音量:1
          instance.rate = 1.5; // 语速:1
          instance.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', // 音频编码格式,这里使用mp3
          token: accessToken,
        };

        // 发送请求到百度TTS API
        const 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.coloradmin.cn/o/2173340.html

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

相关文章

Cocos Creator 剪裁精灵图片方法记录(7)

Cocos Creator 剪裁精灵图片方法记录 start 最近拿到一些图片资源&#xff0c;但是都需要自己手动切割。类似unity的话有专门点击精灵工具自动帮你切割了&#xff0c;但是目前没有找到cocos中有这种工具。所以记录一下相关方法、 解决方案-Photoshop 最好的方式就是直接用 …

计算机毕业设计 在线项目管理与任务分配系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

[Redis][集群][上]详细讲解

目录 0.前言1.基本概念2.数据分片算法0.前言1.哈希求余2.一致性哈希算法3.哈希槽分区算法(Redis使用) 0.前言 说明&#xff1a;该章节相关操作不需要记忆&#xff0c;理解流程和原理即可&#xff0c;用的时候能自主查到即可 1.基本概念 哨兵模式提高了系统的可用性&#xff0…

数据交易知多少?从零到一的数据交易指南

在数字经济浪潮汹涌的今天&#xff0c;数据已成为推动社会进步和经济发展的关键生产要素。从政府决策到企业运营&#xff0c;从城市管理到个人生活&#xff0c;数据的价值日益凸显。那么数据流通交易机制及公共数据在各个领域的应用你都知道吗&#xff1f; 一、数据要素 数字经…

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…

react 常用hooks封装--useReactive

概述 一种具备响应式的useState 我们知道用useState可以定义变量格式为&#xff1a; const [count, setCount] useState(0) 通过 setCount 来进行设置&#xff0c;count 来获取&#xff0c;使用这种方式才能够渲染视图 来看看正常的操作&#xff0c;像这样 let count 0;…

open-resty 服务安装redis插件

从github下载 作者&#xff1a;程序那点事儿 日期&#xff1a;2023/11/16 22:04 lua-resty-redis-cluster cd /usr/local/openresty/modules #进入到modules目录git clone https://github.com/cuiweixie/lua-resty-redis-cluster.git #下载插件mv lua-resty-redis-cluster/ …

数据结构编程实践20讲(Python版)—03栈

本文目录 03 栈 StackS1 说明S2 示例基于列表的实现基于链表的实现 S3 问题&#xff1a;复杂嵌套结构的括号匹配问题求解思路Python3程序 S4 问题&#xff1a;基于栈的阶乘计算VS递归实现求解思路Python3程序 S5 问题&#xff1a;逆波兰表示法(后缀表达式)求值求解思路Python3程…

unix中父进程如何获取子进程的终止状态

一、前言 本文将介绍在unix系统中&#xff0c;父进程如何获取子进程的终止状态。本文主要围绕如下函数展开&#xff1a; 1.wait 2.waitpid 3.waitid 4.wait3、wait4 在讨论这些函数前&#xff0c;先介绍一个进程从创建到释放子进程的过程。 二、子进程的创建以及终止 在unix…

【Java】单元测试【主线学习笔记】

文章目录 前言测试分类JUnit单元测试介绍编写单元测试方法的条件IDEA中简易使用JUnit 前言 Java是一门功能强大且广泛应用的编程语言&#xff0c;具有跨平台性和高效的执行速度&#xff0c;广受开发者喜爱。在接下来的学习过程中&#xff0c;我将记录学习过程中的基础语法、框架…

大联大友尚集团推出基于炬芯科技产品的蓝牙音箱方案

大联大控股宣布&#xff0c;其旗下友尚推出基于炬芯科技&#xff08;Actions&#xff09;ATS2835P蓝牙音频SoC的蓝牙音箱方案。 图示1-大联大友尚基于炬芯科技产品的蓝牙音箱方案的展示板图 在智能音频设备市场持续升温的浪潮中&#xff0c;蓝牙音箱凭借音质卓越、操作简便等…

[Linux] Linux操作系统 进程的优先级 环境变量(一)

标题&#xff1a;[Linux] Linux操作系统 进程的优先级 个人主页水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 一、进程优先级 1.PRI and NI 2.PRI vs NI 的补充理解 二、命令行参数和环境变量 正文开始&#xff1a; 一、进程优先级 基本概念 进程的调用需要CP…

Study--Oracle-09--部署Openfiler存储服务器

免费的存储服务器软件有FreeNAS 和 Openfiler。 其中Freenas的网站上只有i386及amd64的版本&#xff0c;也就是说Freenas不能支持64位版本的Intel CPU&#xff0c;而Openfiler则提供更全面的版本支持&#xff0c;在其网站上可以看到支持多网卡、多CPU&#xff0c;以及硬件Raid的…

manim中获取并定位不规则页面的中心位置

介绍中心点 找到中心点非常重要&#xff0c;因为它在多个领域中都有重要的应用和意义。中心点可以指一个几何形状的中心、数据集的平均值中心、或是特定情境下的关键焦点。以下是一些中心点重要性的具体解释&#xff1a; 数学与几何&#xff1a;在几何中&#xff0c;中心点&…

jinaai/jina-embeddings-v2-base-zh向量模型报错解决

报错信息 OSError: We couldn’t connect to ‘https://huggingface.co’ to load this file, couldn’t find it in the cached files and it looks like jinaai/jina-bert-implementation is not the path to a directory containing a file named configuration_bert.py. 报…

C++ | Leetcode C++题解之第441题排列硬币

题目&#xff1a; 题解&#xff1a; class Solution { public:int arrangeCoins(int n) {return (int) ((sqrt((long long) 8 * n 1) - 1) / 2);} };

探索Python新境界:funboost库揭秘

文章目录 探索Python新境界&#xff1a;funboost库揭秘背景&#xff1a;为什么选择funboost&#xff1f;funboost是什么&#xff1f;如何安装funboost&#xff1f;简单的库函数使用方法场景应用常见Bug及解决方案总结 探索Python新境界&#xff1a;funboost库揭秘 背景&#x…

什么是前缀索引?

什么是前缀索引&#xff1f; 1、什么是前缀索引&#xff1f;2、为什么要使用前缀索引&#xff1f;3、如何选择前缀长度&#xff1f;4、创建前缀索引的SQL语法5、示例 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在处理包含长字符串的数据…

yolo自动化项目实例解析(七)自建UI--工具栏选项

在上一章我们基本实现了关于预览窗口的显示&#xff0c;现在我们主要完善一下工具栏菜单按键 一、添加工具栏ui 1、配置文件读取 我们后面要改的东西越来越多了&#xff0c;先加个变量文件方便我们后面调用 下面我们使用的config.get意思是从./datas/setting.ini文件中读取关键…

RedisBoost Web缓存加速平台

1.产品介绍 产品名称:RedisBoost Web缓存加速平台 主要功能: 智能缓存策略配置 功能描述:RedisBoost提供了一套直观易用的缓存策略配置界面,允许用户根据业务场景自定义缓存策略,包括缓存时间(TTL)、缓存淘汰算法(如LRU、LFU)、数据分区与分片策略等。支持动态调整策…