js纯前端实现语音播报,朗读功能(2024-04-15)

本文详细介绍了如何使用JavaScript的window.speechSynthesis和SpeechSynthesisUtterance原生API在项目中实现语音播报功能,包括初始化、实例化语音、获取语音包、控制播放、以及浏览器兼容注意事项。

实现语音播报要有两个原生API

分别是【window.speechSynthesis】【SpeechSynthesisUtterance】

项目代码

// 执行函数
initVoice({
  text: '项目介绍',
  vol: 1,
  rate: 1
})

// 函数
export function initVoice(config) {
  window.speechSynthesis.cancel();//播报前建议调用取消的函数,如有正在播报的话音,播报会任务被塞进入队列,只有等上一个语音结束才会执行下一个语音
  //获取语音包
  let listArr = window.speechSynthesis.getVoices();
  listArr = listArr.filter(item => item.lang.indexOf('zh-') > -1);
  if (listArr.length == 0) {
    console.error('没有可用的中文语音!');
  }
  //实例化播报内容
  let instance = new SpeechSynthesisUtterance();
  instance.text = config.text || '轻轻敲醒沉睡的心灵,慢慢张开你的眼睛,看看忙碌的世界,是否依然孤独的转个不停!'; // 文字内容
  instance.lang = config.lang || "zh-CN"; // 使用的语言:中文
  instance.volume = config.vol || 1; // 声音音量:1
  instance.rate = config.rate || 1; // 语速:1
  instance.pitch = 1; // 音高:1
  window.speechSynthesis.speak(instance); // 播放
  instance.addEventListener("end", () => {});// 监听播报完成状态,播完可以做些其它处理    
}

将函数拷贝到项目中,执行函数即可实现。

下面列出一些常用的执行方法

//获取可用的语音包,如果返回数组是空,则没有可用的语音包。不同浏览器的语音包数量是不一样的。
window.speechSynthesis.getVoices();

//instance是SpeechSynthesisUtterance的实例,绑定了语音包。将话语添加到话语队列中;当任何其他话语在它被说出之前排队时,它将被说出。
window.speechSynthesis.speak(instance); 

// 取消语音
window.speechSynthesis.cancel();

//暂停语音
// window.speechSynthesis.pause();

//恢复语音
 window.SpeechSynthesis.resume();

注意:在某些浏览器,必须先提前调用【window.speechSynthesis.getVoices();】方法,再异步执行上面【完整语音播报】再能播报语音。

原因是第一次【window.speechSynthesis.getVoices();】获取的数据是空数组。

第二次异步调用【window.speechSynthesis.getVoices();】才返回非空数组。

<think>我们正在React应用中实现语音播报功能。根据引用,有几种方法: 1. 使用HTML5的Web Speech API(如引用5所示),它提供了SpeechSynthesisUtterance接口。 2. 使用第三方库或服务(如引用2、3、4提到的),包括百度语音合成、阿里云等。 3. 使用音频标签(audio tag)预加载音频文件并播放(如引用2和4所示)。 但是,需要注意的是浏览器的自动播放策略(引用4提到),特别是Chrome不允许自动播放,需要用户交互触发。 根据用户需求,我们选择一种简单且无需第三方服务的方法:使用Web Speech API(因为它不需要预加载音频文件,且直接支持文本转语音)。 步骤: 1. 创建一个函数,用于将文本转换为语音并播放。 2. 由于浏览器的安全策略,我们需要在用户交互(如点击按钮)后调用语音播报。 示例代码: 我们将创建一个React组件,包含一个按钮和一个输入框(或需要播报的文本)。点击按钮时,播报文本。 注意:检查浏览器是否支持Web Speech API。 代码实现: 首先,我们创建一个名为TextToSpeech的组件。</think>在 React 应用中实现语音播报功能,主要有以下几种实现方式: ### 方法 1:使用 Web Speech API(原生浏览器支持) ```jsx import React, { useState } from 'react'; const SpeechComponent = () => { const [text, setText] = useState('欢迎使用语音播报功能'); const speak = () => { // 检查浏览器支持 if ('speechSynthesis' in window) { const utterance = new SpeechSynthesisUtterance(text); utterance.lang = 'zh-CN'; // 设置中文语音 window.speechSynthesis.speak(utterance); } else { alert('您的浏览器不支持语音合成功能'); } }; return ( <div> <textarea value={text} onChange={(e) => setText(e.target.value)} rows={3} /> <button onClick={speak}>播放语音</button> </div> ); }; ``` **优点**:无需外部依赖,轻量级实现 **缺点**:浏览器兼容性有限(不支持IE),语音质量取决于浏览器实现[^5] ### 方法 2:使用第三方语音服务(如百度语音合成) ```jsx import React, { useRef } from 'react'; const BaiduSpeech = () => { const audioRef = useRef(null); const playSpeech = () => { // 获取百度语音API生成的音频URL(需自行实现API调用) const audioUrl = 'https://your-baidu-api.com/tts?text=订单支付成功'; if (audioRef.current) { audioRef.current.src = audioUrl; audioRef.current.play().catch(e => { console.error('播放失败:', e); // 处理Chrome自动播放限制[^4] }); } }; return ( <div> <button onClick={playSpeech}>播放订单提醒</button> <audio ref={audioRef} style={{ display: 'none' }} /> </div> ); }; ``` **优点**:跨浏览器兼容性好,语音质量高 **缺点**:需要API密钥,可能有调用限制[^3] ### 方法 3:使用 React 语音库(如 react-speech-kit) ```bash npm install react-speech-kit ``` ```jsx import { useSpeechSynthesis } from 'react-speech-kit'; const VoiceNotification = () => { const { speak } = useSpeechSynthesis(); const handlePayment = () => { // 支付逻辑... speak({ text: '支付成功,金额100元', lang: 'zh-CN' }); }; return <button onClick={handlePayment}>确认支付</button>; }; ``` **优点**:封装完善,支持SSR **缺点**:依赖外部包,增加bundle体积 --- ### 关键注意事项 1. **浏览器自动播放策略**:Chrome等浏览器要求语音播放必须由用户交互触发(如点击事件)[^4] 2. **移动端适配**:iOS需要特殊处理,建议使用`<audio>`标签而非Web Speech API 3. **语音队列**:使用`speechSynthesis.cancel()`清除语音队列避免重叠播放 4. **语音反馈**:添加视觉状态指示(如播放中图标) ```jsx // 语音队列管理示例 const playSequential = (messages) => { window.speechSynthesis.cancel(); messages.forEach((msg, i) => { const utterance = new SpeechSynthesisUtterance(msg); utterance.lang = 'zh-CN'; // 设置延迟避免重叠 utterance.onend = i < messages.length -1 ? () => window.speechSynthesis.speak(messages[i+1]) : null; window.speechSynthesis.speak(utterance); }); }; ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值