官网网址:链接

  • 基础使用:
var msg = new SpeechSynthesisUtterance("测试");
         //msg.rate = 4 播放语速
         //msg.pitch = 10 音调高低
         //msg.text = "播放文本"
         //msg.volume = 0.5 播放音量
         window.speechSynthesis.speak(msg);
  • 基础方法:
//播放
window.speechSynthesis.speak();
//暂停
window.speechSynthesis.pause();
//继续
window.speechSynthesis.resume();
//停止
window.speechSynthesis.cancel();
  • demo
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>语音朗读</title>
    <style>
      body{
        padding: 20px;
      }
      textarea{
        width: 100%;
        height: 260px;
      }
    </style>
  </head>
  <body>
    <textarea name=""  cols="30" rows="10" id="sppekContent" placeholder="输入一些内容试试..."></textarea>
    <a href="javascript:;" id="du">朗读</a>
    <a href="javascript:;" id="zanting">暂停</a>
    <a href="javascript:;" id="chongxing">重新开始</a>
    <a href="javascript:;" id="stop">停止</a>
    <script>
      window.onload=function () {
        /**
        * @returns {{start: start, pause: pause, resume: resume, stop: stop}}
        */
        function speek(){
          let speechInstance = new SpeechSynthesisUtterance();
          // console.log(speechInstance);
          // console.log(speechSynthesis.getVoices());
          return {
            /**
            * @param opitions {container:'',Lang:''}
            */
            start:function (opitions) {
              let container=opitions.container;
              let lang=opitions.Lang===undefined||""?"zh-CN":opitions.Lang;
              let content=document.querySelector(container).value;
              if(content!='') {
                speechInstance.text = content;
                speechInstance.lang = lang;
                speechSynthesis.speak(speechInstance);
              }else{
                console.log("请输入内容");
              }
            },
            pause:function () {
              speechSynthesis.pause();//暂停
            },
            resume:function(){
              speechSynthesis.resume();//重新开始
            },
            stop:function () {
              speechSynthesis.cancel();//结束
            }
          }
        }
        
        document.querySelector("#du").onclick=function () {
          speek().start({container:"#sppekContent",Lang:''});
        };
        document.querySelector("#zanting").onclick=function () {
          speek().pause();
        };
        document.querySelector("#chongxing").onclick=function () {
          speek().resume();
        };
        document.querySelector("#stop").onclick=function () {
          speek().stop();
        }
      }
      
    </script>
  </body>
</html>

常见问题:

  • win7 系统无法播放语音,可到控制面板-语音设置播放声音的音色。安装windows7不完整版可能导致tts组件丢失,需要安装语音包或者进行修复。

链接下载

  • 新版Google浏览器无法主动播放声音,可更换浏览器,qq或者360浏览器,可以设置Google开启声音。

js文字转语音(speechSynthesis)_语音播放

  • 在google chrome 89版本之后 默认使用的线上服务来合成语音 所以在国内可能会没有声音

解决办法 : 通过getVoices 获取 localService为true 的字段 (localService = true 表示 使用本地合成服务)

getWindowVoice(){  // 获取浏览器中语音 (中文 + 本地服务)
   return window.speechSynthesis.getVoices().find(item => item.localService && item.lang === 'zh-CN')
}
  • google chrome 播放语音可能会卡住 所以无声音

解决办法 : 在播放语音之前先 调用一下cancel方法

window.speechSynthesis.cancel()

播放和停止函数

// 语音停止
        handleStop(e) {
            if(window.speechSynthesis){
                const synth = window.speechSynthesis;
                const msg = new SpeechSynthesisUtterance();
                msg.text = e;
                msg.lang = "zh-CN";
                synth.cancel(msg);
            }
        },
        // 语音播报的函数
        handleSpeak(text='你好啊!'){
            if(window.speechSynthesis){
                const synth = window.speechSynthesis;
                const msg = new SpeechSynthesisUtterance();
                msg.text = text;     // 文字内容
                msg.lang = "zh-CN";  // 使用的语言:中文
                msg.volume = 1;      // 声音音量:1
                msg.rate = 1;        // 语速:1
                msg.pitch = 1;       // 音高:1
                msg.voice = this.getWindowVoice()  // 使用本地服务合成语音(若是获取不到 请异步获取, 加一个setTimeout)
                synth.speak(msg);    // 播放
            }
        },