前端实现语音合成

HTML5语音Web Speech API

HTML5中和Web Speech相关的API实际上有两类,一类是“语音识别(Speech Recognition)”,另外一个就是“语音合成(Speech Synthesis)”,即“语音转文字”和“文字变语音”。

语音合成

SpeechSynthesisUtterance:主要用来构建语音合成实例
  • 属性

    1. text:要合成的文字内容,string
    2. lang:使用的语言,string, 例如:“zh-CN”
    3. volume:声音的音量,string,范围是0到1,默认是1
    4. rate:语速,number,范围是0.1到10,默认值是1。表示语速的倍数,例如2表示正常语速的两倍
    5. pitch:说话的音高,number,范围从0到2,默认值为1
    6. voice:指定希望使用的声音和服务,object
  • 方法

    1. onstart():语音合成开始时候的回调
    2. onpause():语音合成暂停时候的回调
    3. onresume():语音合成重新开始时候的回调
    4. onend():语音合成结束时候的回调
SpeechSynthesis:主要作用是触发行为,例如读,停,还原等
  • 属性

    1. paused:当SpeechSynthesis处于暂停状态时,Boolean值返回true
    2. pending:当语音播放队列到目前为止保持没有说完的语音时,Boolean值返回true
    3. speaking:当语音谈话正在进行的时候,即使SpeechSynthesis处于暂停状态,Boolean返回 true
  • 方法

    1. cancel():移除所有语音谈话队列中的谈话。
    2. getVoices():返回浏览器支持的语音包列表数组
    3. pause():暂停合成过程
    4. resume():重新开始合成过程
    5. speak():播放合成的话语
    6. stop():立即终止合成过程
  • 事件操作
    onvoiceschanged:当由SpeechSynthesis.getVoices()方法返回的列表改变时触发

语音识别

SpeechRecognition
由于到目前为止,浏览器还没有广泛支持,所以需要webKit的前缀:
var newRecognition = webkitSpeechRecognition();

  • continuous:设置是持续听还是听到声音之后就关闭接收。
    一般聊天沟通使用false属性值,如果是写文章写公众号之类的则可以设置为true,如
    newRecognition.continuous = true;

  • start()stop()方法:控制语音识别的开启和停止。
    开启:newRecognition.start();
    停止:newRecognition.stop();

  • onresult:对识别到的结果进行处理

    newRecognition.onresult = function(event) { 
      console.log(event);
    }
    

除了result事件外,还有其他一些事件,例如,soundstartspeechstarterror等。

  • 语音合成超简单例子
    将下面的代码复制到chrome控制台中体验~

    let msg = new SpeechSynthesisUtterance("欢迎你阅读我的博客");
    window.speechSynthesis.speak(msg);
    
  • SpeechSyntehesisUtteranc
    SpeechSyntehesisUtteranc对象包含了语音服务要读取的内容和一些参数,比如语言,音高和音量等

    let msg = new SpeechSynthesisUtterance();
    msg.text = "how are you"; // 要合成的文本
    msg.lang = "en-US"; // 语言:美式英语发音(默认自动选择)
    msg.rate = 2;  // 语速:二倍速(默认为 1,范围 0.1~10)
    msg.pitch = 2; // 音调:高音调(数字越大越尖锐,默认为 1,范围 0~2 )
    msg.volume = 0.5; // 音量:音量 0.5 倍(默认为1,范围 0~1)
    window.speechSynthesis.speak(msg);
    
    let count = 0; // 词语数量
    let msg = new SpeechSynthesisUtterance();
    let synth = window.speechSynthesis;
    msg.addEventListener('start',()=>{
      // 开始阅读
      console.log(`文本内容: ${msg.text}`);
      console.log("start");
    });
    msg.addEventListener('end',()=>{
      // 阅读结束
      console.log("end");
      console.log(`文本单词(词语)数量:${count}`);
      count = 0;
    });
    msg.addEventListener('boundary',()=>{
      // 统计单词
      count++;
    });
    

百度文字转语音开放API

  <div>
      文本:
      <input name="text" type="text" placeholder="请输入您想合成的语音" />
  </div>
  <div>
      语速:
      <input name="spd" type="range" min="0" max="15" value="5" step="1" />
  </div>
  <div>
      <button onclick="voicePlay()">合成语音</button>
  </div>

  <script>
      const voicePlay = () => {
          let text = encodeURI(document.querySelector('input[name="text"]').value);
          let spd = document.querySelector('input[name="spd"]').value;

          let audio = new Audio();
          audio.autoplay = 'autoplay';

          // lan=zh – 语言是中文,如果改为lan=en,则语言是英文
          // ie=UTF-8 – 文字格式
          audio.src = `http://tts.baidu.com/text2audio?lan=zh&ie=UTF-8&text=${text}&spd=${spd}`;

          document.body.appendChild(audio);
      }
  </script>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容