Appearance
警报提示文字太单薄了!3种前端TTS实现方案,附可直接运行源码,覆盖90%朗读场景
之前开发的鸡场科技大屏项目已经增加了雷达扫描和扩撒墙效果,但是还缺一个强有力的提示信息效果。
其实屏幕闪烁那种效果挺不错的,类似于游戏界面残血时候的效果,但是时间关系没做上去,回头做一下。
今天先搞一下语音提示效果。
实现方案
一般语音提示方案基本上两种:
- 提前录制语音包
- TTS文字转语音
这里简单探索了一下前端文字转语音(TTS),整理三套最实用的前端TTS实现方案。
前两种直接附完整可运行Demo代码,复制到HTML文件打开就能用,第三种适合追求高音质、定制化音色的场景,全程干货,新手也能快速上手。
浏览器原生 Speech API
Web Speech API 是浏览器内置的标准语音合成接口,属于W3C标准规范,纯前端本地运行。
无需依赖任何第三方库、无需联网、不调用后端接口,也不需要申请任何密钥。
核心原理是通过浏览器自带的语音合成引擎,将文本字符串转化为语音流,直接调用设备扬声器播放,全程在本地完成,不产生任何网络请求,隐私性和安全性拉满。
兼容性方面 Chrome、Edge、Safari、Firefox等现代主流浏览器全面支持,移动端浏览器也基本都适配。
并且支持调节语速、音调、音量、语言类型,适配中英文等多语种。
实现代码
html
<!DOCTYPE html>
<html lang="zh-CN">
<body>
<h3>浏览器原生TTS朗读</h3>
<textarea id="ttsText" rows="5" placeholder="请输入要朗读的文字内容">
你好,这是浏览器原生Web Speech API实现的文字转语音功能,全程本地运行,无需联网,支持中英文朗读,还能调节语速和音调,非常适合轻量级前端项目使用。
</textarea>
<br/>
<button onclick="startSpeak()">开始朗读</button>
<button onclick="stopSpeak()">停止朗读</button>
<script>
// 获取语音合成实例
const synth = window.speechSynthesis;
// 防止重复朗读
let currentUtter;
function startSpeak() {
const text = document.getElementById('ttsText').value.trim();
if(!text) return alert('请输入朗读内容');
// 终止当前正在朗读的语音
if(synth.speaking) {
synth.cancel();
}
// 创建朗读实例
currentUtter = new SpeechSynthesisUtterance(text);
// 配置参数
currentUtter.lang = 'zh-CN'; // 语言:中文
currentUtter.rate = 1; // 语速 0.1-10,数值越大语速越快
currentUtter.pitch = 1; // 音调 0-2
currentUtter.volume = 1; // 音量 0-1
// 启动朗读
synth.speak(currentUtter);
}
// 停止朗读
function stopSpeak() {
if(synth.speaking) {
synth.cancel();
}
}
</script>
</body>
</html>开源前端 TTS 库
这类开源前端TTS库,本质是对浏览器原生Web Speech API的深度封装,同时兼容部分浏览器的语音差异,优化了中文发音效果和调用逻辑,免去原生API的繁琐配置步骤。
以最常用的ResponsiveVoice.js为例,通过CDN引入库文件后,一行代码即可实现文本朗读,底层还是调用浏览器本地语音引擎,部分扩展版本也支持对接云端语音接口,兼顾了易用性和兼容性。
相比原生API,开源库做了音色分类、语言适配、异常处理等优化,中文朗读的流畅度和清晰度更优,还预设了男女声、粤语等多种音色,调用逻辑更简洁,适合快速开发。
实现代码
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<!-- 引入开源库CDN(备用镜像,防止原链接失效) -->
<script src="https://cdn.jsdelivr.net/npm/responsivevoice@1.0.0/responsivevoice.min.js"></script>
</head>
<body>
<h3>开源TTS库 文字转语音</h3>
<textarea id="voiceText" rows="5" placeholder="请输入要朗读的文字内容">
这是基于ResponsiveVoice开源库实现的文字转语音功能,发音更自然,支持中文女声,调用方式超级简单,适合快速开发各类需要语音朗读的前端页面。
</textarea>
<br/>
<button onclick="playVoice()">播放朗读</button>
<button onclick="stopVoice()">停止朗读</button>
<script>
// 先判断库是否加载完成,防止未初始化就调用
function checkResponsiveVoiceLoaded() {
return typeof responsiveVoice !== 'undefined' && responsiveVoice.available;
}
// 播放语音
function playVoice() {
// 第一步:校验库是否加载成功
if(!checkResponsiveVoiceLoaded()) {
alert('ResponsiveVoice库加载失败,请检查网络或更换CDN链接');
return;
}
const text = document.getElementById('voiceText').value.trim();
if(!text) return alert('请输入朗读内容');
// 核心朗读代码,支持自定义语速、音量、音调
responsiveVoice.speak(
text,
"Chinese Female", // 音色:中文女声,可切换Chinese Male/US English Female
{
rate: 1, // 语速
volume: 1, // 音量
pitch: 1, // 音调
onstart: () => console.log('开始朗读'),
onend: () => console.log('朗读完成'),
onerror: (err) => console.error('朗读报错:', err)
}
);
}
// 停止语音
function stopVoice() {
if(checkResponsiveVoiceLoaded() && responsiveVoice.isPlaying()) {
responsiveVoice.cancel();
}
}
</script>
</body>
</html>第三方TTS接口(前端+后端联动)
第三方TTS接口属于云端语音合成方案,主流服务商有阿里云智能语音、腾讯云语音合成、百度AI、科大讯飞等。
实现上分为前后端联动两种模式:
后端对接:后端接收前端传递的文本内容,携带服务商提供的API密钥请求云端TTS接口,云端服务器将文本合成为MP3、WAV等音频文件,返回音频URL或二进制流,后端再将音频地址返回给前端,前端通过audio标签播放。
前端直连(需跨域配置):前端直接请求第三方TTS接口,获取音频流后播放,适合轻量级项目,但安全性较低,一般推荐后端对接模式,隐藏密钥更安全。
调用第三方音质极致自然,接近真人发音:支持情感朗读、多风格音色、方言、童声等,远超本地浏览器引擎效果。
并且功能丰富,支持语速、停顿、多音字矫正、背景音乐合成、语音转字幕等高级功能。
缺点就是花钱!
总结
追求零成本、离线使用、轻量级项目:选原生Web Speech API。
追求易用性、中文发音更优、快速开发:选开源TTS库。
追求真人音质、高级功能、企业级项目:选第三方TTS接口。
不过第三方TTS接口大多有免费调用额度,超出后按量计费,适合对音质有高要求、正式商用的项目。
我还是建议个人轻量级项目优先选前两种免费方案。
