vue使用WEB自带TTS实现语音文字互转

打印 上一主题 下一主题

主题 831|帖子 831|积分 2493

媒介

时隔多日,自己已经好久没更新文章了;今年不停跟随公司的政策[BEI YA ZHA]中,做了一个又一个的需求,反而没有多少自己的时间,更别说突破自己

˚‧º·(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )‧º·˚(雾)

然后最近,我朋友忽然和我说有没有做过TTS,我第一反应是???
ʕ •ᴥ•ʔ……
一脸无辜
于是就出现我们本日主题的
什么是TTS?
   去调查了一番,简单的说就是一种语音文本互转的技能
  

  • 这里涉及到语音合成的概念.语音合成是通过机械的、电子的方法产生人造语音的技能。TTS技能(又称文语转换技能)隶属于语音合成
  • 而WEB,也就是我们的欣赏器,已经给我们封装好了TTS,能够很方便的调用API,基本上,我们能够使用原生的前端元素直接实现文本转语音,语音转文字
    因此任何前端框架都可以使用该套逻辑实现TTS
  WEB自带TTS

它是有自己的官方文档的,我们可以很容易的就通过该API文档来找到我们需要的实现的逻辑
WEB自带TTS官方中文文档API
基础变乱

文字转语音基础变乱

这里给大家列出几个常用的基础变乱,更多可访问上面的API文档
  1. // 创建 SpeechSynthesisUtterance 对象
  2. var speechUtterance = new SpeechSynthesisUtterance('Hello, how are you?');
  3. // 创建 SpeechSynthesis 对象
  4. var synthesis = window.speechSynthesis;
  5. // 设置语音合成的事件处理函数
  6. // 开始语音合成
  7. speechUtterance.onstart = function(event) {
  8.   console.log('Speech synthesis started.');
  9. };
  10. // 结束语音合成
  11. speechUtterance.onend = function(event) {
  12.   console.log('Speech synthesis ended.');
  13. };
  14. // 暂停语音合成
  15. speechUtterance.onpause = function(event) {
  16.   console.log('Speech synthesis paused.');
  17. };
  18. // 恢复语音合成
  19. speechUtterance.onresume = function(event) {
  20.   console.log('Speech synthesis resumed.');
  21. };
  22. // 分段语音合成
  23. speechUtterance.onboundary = function(event) {
  24.   console.log('Speech boundary reached at character index ' + event.charIndex + '.');
  25. };
  26. // 启动语音合成
  27. var btn = document.querySelector('button');
  28. btn.addEventListener('click', function() {
  29.   synthesis.speak(speechUtterance);
  30. });
复制代码
语音转文字基础变乱

  1. // 创建 SpeechRecognition 对象
  2. var recognition = new window.SpeechRecognition();
  3. // 设置语音识别的事件处理函数
  4. // 开始语音识别
  5. recognition.onstart = function(event) {
  6.   console.log('Speech recognition started.');
  7. };
  8. // 结束语音识别
  9. recognition.onend = function(event) {
  10.   console.log('Speech recognition ended.');
  11. };
  12. // 识别到语音结果
  13. recognition.onresult = function(event) {
  14.   var transcript = event.results[0][0].transcript;
  15.   console.log('Recognized speech: ' + transcript);
  16. };
  17. // 启动语音识别
  18. var btn = document.querySelector('button');
  19. btn.addEventListener('click', function() {
  20.   recognition.start();
  21. });
复制代码
VUE项目

   我有将本次研究的结果放到我的git上,以下为我项目中的截图
  



   另有一个文本跟随朗读变色的现实上是我朋友需要的研究的功能,其实界面是差不多的,末端我会放出我项目的git链接,以供大家参考
  语音转文字

在我的项目中,vue实现语音转文字的代码如下:


  • 界面
  1. <template>
  2.   <div>
  3.     <el-page-header @back="goBack" content="语音转文字"/>
  4.     <div class="bank"></div>
  5.     <el-card header="语音转文字">
  6.       <el-card>
  7.         <el-input :readonly="true" id="word" v-model="word"></el-input>
  8.       </el-card>
  9.       <el-card>
  10.         <el-button type="primary" @click="audioCHangeWord"><span v-if="isListening">语音识别中...</span><span v-else>语音识别</span></el-button>
  11.       </el-card>
  12.     </el-card>
  13.   </div>
  14. </template>
复制代码


  • 逻辑
  1. <script>
  2. export default {
  3.   name: "AudioToWord",
  4.   data() {
  5.     return {
  6.       word: "",
  7.       isListening: false, // 判断是否在语音监听中
  8.     }
  9.   },
  10.   methods: {
  11.     audioCHangeWord() {
  12.       var that = this;
  13.       that.word = "";
  14.       // 创建SpeechRecognition对象
  15.       // eslint-disable-next-line no-undef
  16.       var recognition = new webkitSpeechRecognition();
  17.       if (!recognition) {
  18.         // eslint-disable-next-line no-undef
  19.         recognition = new SpeechRecognition();
  20.       }
  21.       // 设置语言
  22.       recognition.lang = 'zh-CN';
  23.       // 开始语音识别
  24.       recognition.start();
  25.       that.isListening = true;
  26.       // 监听识别结果
  27.       recognition.onresult = function (event) {
  28.         var result = event.results[0][0].transcript;
  29.         that.word = result;
  30.       };
  31.       // 监听错误事件
  32.       recognition.onerror = function (event) {
  33.         that.isListening = false;
  34.         that.$message("监听语音失败:"+event.error);
  35.         console.error(event.error);
  36.       };
  37.       // 监听结束事件(包括识别成功、识别错误和用户停止)
  38.       recognition.onend = function () {
  39.         that.isListening = false;
  40.         console.log("语音识别停止");
  41.       };
  42.     },
  43.     goBack() {
  44.       this.$router.push({ path: "/entry" })
  45.     }
  46.   }
  47. }
  48. </script>
复制代码
文字转语音



  • 界面
  1. <template>
  2.   <div>
  3.     <el-page-header @back="goBack" content="文字转语音"/>
  4.     <div class="bank"></div>
  5.     <el-card header="文字转语音">
  6.       <el-input
  7.         id="word"
  8.         type="textarea"
  9.         placeholder="请输入文本"
  10.         v-model="word"
  11.         maxlength="300"
  12.         rows="4"
  13.         show-word-limit
  14.       >
  15.       </el-input>
  16.       <div class="bank"></div>
  17.       <el-card>
  18.         <el-button @click="changeToAudio" type="primary">转为语音</el-button>
  19.       </el-card>
  20.       <div class="bank"></div>
  21.       <el-card>
  22.           <el-button @click="pause" type="warning">暂停</el-button>
  23.           <el-button @click="resume" type="success">继续</el-button>
  24.           <el-button @click="cancel" type="info">取消</el-button>
  25.       </el-card>
  26.       <div class="bank"></div>
  27.       <el-card>
  28.         <el-button @click="getvoice" type="primary">获取语音合成数据(F12)</el-button>
  29.       </el-card>
  30.     </el-card>
  31.   </div>
  32. </template>
复制代码


  • 逻辑
  1. <script>
  2. export default {
  3.   name: "WordToAudio",
  4.   data() {
  5.     return {
  6.       word: "",
  7.       isPaused: false, // 判断是否暂停
  8.     }
  9.   },
  10.   methods: {
  11.     // 选
  12.     changeToAudio() {
  13.       if (!this.word) {
  14.         this.$message("请输入文本");
  15.         return;
  16.       }
  17.       if (this.isPaused) {
  18.         this.$message("当前语音已暂停,请点击继续!");
  19.         return;
  20.       } else if (window.speechSynthesis.speaking) {
  21.         this.$message("当前已有正在播放的语音!");
  22.         return;
  23.       }
  24.       // 为了防止在暂停状态下转语音,调用前设置继续播放
  25.       window.speechSynthesis.resume();
  26.       // 设置播放
  27.       var textArea = document.getElementById('word');
  28.       var range = document.createRange();
  29.       range.selectNodeContents(textArea);
  30.       var speech = new SpeechSynthesisUtterance();
  31.       speech.text = this.word; // 内容
  32.       speech.lang = "zh-cn"; // 语言
  33.       speech.voiceURI = "Microsoft Huihui - Chinese (Simplified, PRC)"; // 声音和服务
  34.       // eslint-disable-next-line no-irregular-whitespace
  35.       speech.volume = 0.7; // 声音的音量区间范围是​​0​​​到​​1默认是​​1​​
  36.       // eslint-disable-next-line no-irregular-whitespace
  37.       speech.rate = 1; // 语速,数值,默认值是​​1​​​,范围是​​0.1​​​到​​10​​​,表示语速的倍数,例如​​2​​表示正常语速的两倍
  38.       // eslint-disable-next-line no-irregular-whitespace
  39.       speech.pitch = 1; // 表示说话的音高,数值,范围从​​0​​​(最小)到​​2​​​(最大)。默认值为​​1​​。
  40.       window.speechSynthesis.speak(speech);
  41.       var highlight = document.createElement('span');
  42.       highlight.style.backgroundColor = 'red';
  43.       range.surroundContents(highlight);
  44.     },
  45.     // 暂停
  46.     pause() {
  47.       this.isPaused = true;
  48.       window.speechSynthesis.pause();
  49.     },
  50.     // 继续
  51.     resume() {
  52.       this.isPaused = false;
  53.       window.speechSynthesis.resume();
  54.     },
  55.     // 取消
  56.     cancel() {
  57.       window.speechSynthesis.cancel();
  58.     },
  59.     getvoice() {
  60.       console.log(window.speechSynthesis.getVoices());
  61.     },
  62.     goBack() {
  63.       this.$router.push({path: "/entry"})
  64.     }
  65.   }
  66. }
  67. </script>
  68. <style>
  69. .bank {
  70.   padding: 10px;
  71. }
  72. </style>
复制代码
git链接

WEB自带TTS实现语音文字互转git
结语

以上为我用vue实现WEB自带TTS来实现语音文字互转的过程,如有更多内容会在本文章更新

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表