Skip to content

JS原生根据文本生成语音播报

前提

最近一个需求需要根据一些字段拼接组合成文本并实时通过语音播放,而且需要前端实现,在不依靠第三方服务的情况下,调研到 Speech API 可以支持文本语音合成。

SpeechSynthesis

该对象作为Window下的静态成员无需实例化,主要用于语音播放、暂停、语音切换

属性

paused

布尔值,当前是否处于暂停播放状态

pending

布尔值,当前是否还有未播放的语音

speaking

布尔值,当前是否正在播放语音

方法

cancel

无参,从当前还未播放的语音全部移除

getVoices

无参,返回SpeechSynthesisVoice对象列表,用于SpeechSynthesisUtterance语音合成对象切换内置的预设声音对象

pause

无参,暂停播放

resume

无参,暂停或者播放,根据当前状态取反

speak

参数为SpeechSynthesisUtterance实例对象, 核心方法,用于播放语音

SpeechSynthesisUtterance

该对象是语音合成对象,也是文本合成语音的主要API

实例属性

lang

播放语音时语言选择,默认按照 html标签的lang属性,中文设置为 zh-CN

pitch

数值,控制语调,

rate

数值,控制语速,0-10

text

要播放的文本

voice

要播放的声音对象,取值于之前提到的getVoices方法的返回对象列表

使用参考

播放一个声音

javascript
if ('speechSynthesis' in window) {
  // 文本转语音
  const synth = window.speechSynthesis
  const text = '你好,这是一个测试。';
  const utterance = new SpeechSynthesisUtterance(text);
  utterance.lang = 'zh-CN'; // 设置语言

  // 播放音频
  synth.speak(utterance);
} else {
  console.log('浏览器不支持 Web Speech API');
}

切换声音类型

javascript

if ('speechSynthesis' in window) {
  const synth = window.speechSynthesis
  // 获取所有语音声音类型,包含英语 粤语...
  const voices = synth.getVoices(); // 请根据需要自定展开对象列表查看对象描述
  // 文本转语音
  const text = '你好,这是一个测试。';
  const utterance = new SpeechSynthesisUtterance(text);
  utterance.lang = 'zh-CN'; // 设置语言
  utterance.voice = voices[0] // 使用中文 

  // 播放音频
  synth.speak(utterance);
} else {
  console.log('浏览器不支持 Web Speech API');
}