首页 > 其他分享 >文本到语音(tts)

文本到语音(tts)

时间:2024-05-02 18:56:02浏览次数:14  
标签:识别 console log tts 语音 const 文本 recognition

Web Speech API

使你能够将语音数据合并到 Web应用程序中。Web Speech API 有两个部分:SpeechSynthesis 语音合成(文本到语音 TTS)和 SpeechRecognition 语音识别(异步语音识别)

SpeechSynthesis: 语音服务的控制器接口, 获取设备上关于可用的合成声音的信息,开始、暂停语音,或除此之外的其他命令

语音合成通过 SpeechSynthesis 接口进行访问,它提供了文字到语音(TTS)的能力,这使得程序能够读出它们的文字内容(通常使用设备默认的语音合成器)。不同的声音类类型通过 SpeechSynthesisVoice 对象进行表示,不同部分的文字则由 SpeechSynthesisUtterance 对象来表示。你可以将它们传递给 SpeechSynthesis.speak() 方法来产生语音。

SpeechSynthesisUtterance: 语音请求。 它包含语音服务应该阅读的内容以及如何阅读的信息(例如语言,音高和音量)

SpeechRecognition: 语音识别

语音识别通过 SpeechRecognition 接口进行访问,它提供了识别从音频输入(通常是设备默认的语音识别服务)中识别语音情景的能力。一般来说,你将使用该接口的构造函数来构造一个新的 SpeechRecognition 对象,该对象包含了一系列有效的对象处理函数来检测识别设备麦克风中的语音输入。SpeechGrammar 接口则表示了你应用中想要识别的特定文法。文法则通过 JSpeech Grammar Format (JSGF.) 来定义。

SpeechGrammar: 语音识别对象服务想要识别的一系列词语或模式


  • 文字到语音
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Web Speech API</title>
  </head>
  <body>
    <strong>Web Speech API</strong>
    <hr />
    <select class="select-voice"></select>
    <textarea class="text" cols="50" rows="10"></textarea><br /><br />
    <button type="button" class="btn-play">文字语音播放</button>
    <button type="button" class="btn-pause">暂停播放</button>
    <button type="button" class="btn-resume">恢复播放</button>
    <button type="button" class="btn-end">停止播放</button>

    <script>
      // Web Speech API

      const playBtn = document.querySelector('.btn-play');
      const pauseBtn = document.querySelector('.btn-pause');
      const resumeBtn = document.querySelector('.btn-resume');
      const endBtn = document.querySelector('.btn-end');

      // 文字转语音

      // 创建 SpeechSynthesisUtterance 对象
      const synth = globalThis.speechSynthesis;
      // console.log("synth => ", synth)

      const text = document.querySelector('.text');
      text.value = 'hellow world, this is a test for web speech api.';

      // 选择语音声音
      const selectVoice = document.querySelector('.select-voice');
      const fragment = document.createDocumentFragment();
      const voiceList = [];
      synth.addEventListener('voiceschanged', () => {
        if (voiceList.length === 0) {
          synth.getVoices().forEach((voice) => {
            if (voice.lang.includes('zh')) {
              const option = document.createElement('option');
              option.dataset.lang = voice.lang;
              option.value = voice.name;
              option.textContent = voice.name;
              fragment.appendChild(option);
              voiceList.push(voice);
            }
          });
          selectVoice.appendChild(fragment);
        }
        // 选择语音声音
        handleSelectVoice();

        playBtn.removeAttribute('disabled');
      });

      selectVoice.addEventListener('change', handleSelectVoice);

      // 切换语音声音
      function handleSelectVoice() {
        /** @type {SpeechSynthesisVoice} */
        const selectedVoice = voiceList.at(selectVoice.selectedIndex);
        utterance.voice = selectedVoice;
        // console.log('selectedVoice => ', selectedVoice.name);
      }

      const utterance = new SpeechSynthesisUtterance();
      // 设置文本内容
      utterance.text = text.value;
      const info = {
        start: 0,
        end: 0,
        elapsedTime: 0,
        paused: false,
      };
      playBtn.addEventListener('click', () => {
        // 移除所有语音谈话队列中的谈话
        synth.pending && synth.cancel();
        // 添加一个 utterance 到语音谈话队列;它将会在其他语音谈话播放完之后播放。
        synth.speak(utterance);
      });
      // 暂停播放
      pauseBtn.addEventListener('click', () => {
        synth.pause();
      });
      // 恢复播放
      resumeBtn.addEventListener('click', () => {
        synth.cancel();
        const sliceText = utterance.text.slice(info.end);
        // console.log('sliceText => ', sliceText);
        utterance.text = sliceText;
        synth.speak(utterance);
      });
      // 结束播放
      endBtn.addEventListener('click', () => {
        synth.cancel();
        info.paused = false;
      });

      utterance.addEventListener('boundary', (e) => {
        const {
          charIndex,
          charLength,
          elapsedTime,
          utterance: { text },
        } = e;
        // name: `word` 所语音的字符,`sentence` 完整句的边界

        // 保存正在语音的字符索引和已读时间
        // const char = text.slice(charIndex, charIndex + charLength);
        info.start = charIndex;
        info.end = charIndex + charLength;
        info.elapsedTime = elapsedTime;
      });
      utterance.addEventListener('pause', (e) => {
        console.log('pause');
      });
      utterance.addEventListener('resume', (e) => {
        console.log('resume');
      });
      utterance.addEventListener('end', (e) => {
        console.log('end');
      });

      window.addEventListener('beforeunload', () => {
        // 停止播放
        synth.pause();
        synth.cancel();
      });
    </script>
  </body>
</html>
  • 语音识别
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Web Speech API</title>
  </head>
  <body>
    <strong>Web Speech API</strong>
    <hr />
    <audio src="./music.m4a" controls></audio>
    <textarea class="text" cols="50" rows="10"></textarea><br /><br />
    <button type="button" class="btn-speech">语音转文字</button>

    <script>
      // Web Speech API

      const text = document.querySelector('.text');

      // 按钮控制
      const speechBtn = document.querySelector('.btn-speech');

      // 语音识别

      // 创建 SpeechRecognition 对象
      /** @type {SpeechRecognition} */
      const recognition = new webkitSpeechRecognition();
      // console.log('recognition => ', recognition);

      // 是否连续识别
      recognition.continuous = true;
      // 识别结果是否包含中间结果
      recognition.interimResults = true;
      // 识别语言
      recognition.lang = 'zh-CN'; // zh-CN, en-US

      speechBtn.addEventListener('click', () => {
        // 开始识别
        recognition.start();
      });

      recognition.onstart = (e) => {
        console.log('开始', e);
      };
      recognition.onaudiostart = (e) => {
        console.log('开始录音');
      };
      recognition.onspeechstart = (e) => {
        console.log('开始说话');
      };
      // 识别结束
      recognition.onspeechend = (e) => {
        console.log('语音识别结束');
        recognition.stop();
      };
      recognition.onaudioend = (e) => {
        console.log('结束录音');
      };
      recognition.onend = (e) => {
        console.log('结束');
        // 结束后,重新开始识别
        recognition.start();
      };

      // 识别结果
      recognition.onresult = (e) => {
        const resultList = Object.values(e.results);
        let str = '';
        resultList.forEach((result) => {
          str += result[0].transcript + '\n';
        });

        text.value = str;
        console.log('识别结果: ',e.resultIndex, str);
      };

      // 未识别出结果
      recognition.onnomatch = (e) => {
        console.log('No match', e);
      };

      // 识别错误
      recognition.onerror = (e) => {
        // not-allowed:用户禁止访问麦克风权限 audio-capture: 麦克风未开启 no-speech: 没有检测到语音 network: 网络连接问题
        console.log('识别错误原因: ', e.error);
        if (e.error === 'not-speech') {
          recognition.stop();
        }
      };
    </script>
  </body>
</html>

标签:识别,console,log,tts,语音,const,文本,recognition
From: https://www.cnblogs.com/chlai/p/18170377

相关文章

  • 文本格式化
    #!/bin/bash#读取result.txt文件内容whileIFS=read-rlinedoif[[$line==*"ORACLEDB"*]];thenORACLEDB_line="$line"#保存ORACLEDB行else#提取POSTGRES行的表名和列值table=$(echo"$line"|cut-d':'-f2)......
  • jenkins学习转载文本
    基于Docker容器DevOps应用方案企业业务代码发布系统一、企业业务代码发布方式1.1传统方式以物理机或虚拟机为颗粒度部署部署环境比较复杂,需要有先进的自动化运维手段出现问题后重新部署成本大,一般采用集群方式部署部署后以静态方式展现1.2容器化方式以容器为颗粒度......
  • MFC文本设置字体发虚的问题
    MFC文本设置字体发虚的问题最近在做一项目中,发现默认的字体比较正常,字体如下:字体比较清晰,在代码加入如下设置字体项后,反而显示发虚,模糊CFont*m_font=newCFont;m_font->CreatePointFont(120,_T("Arial"));GetDlgItem(IDC_EDIT_CONTENT)->SetFont(m_font);可能是需要某......
  • uniapp+vue3聊天室|uni-app+vite4+uv-ui跨端仿微信app聊天语音/朋友圈
    原创研发uniapp+vue3+pinia2跨三端仿微信app聊天模板Uniapp-Wechat。uni-vue3-wchat基于uni-app+vue3+pinia2+uni-ui+uv-ui等技术跨端仿制微信App界面聊天项目,支持编译到H5+小程序端+App端。实现编辑框多行消息/emoj混合、长按触摸式仿微信语音面板、图片/视频预览、红包/朋友圈......
  • 右键新建txt文本文档不见了
    右键菜单中缺失“新建文本文档”的选项,可以通过调整注册表的方法找回该功能:1、"WIN+R"快捷键,弹出“运行”窗口,输入“regedit"回车,打开注册表编辑器; 2、在“HKEY_CLASSES_ROOT”找“ShellNew”的项,如果找到,在“ShellNew”下创建一个新的字符串值,名为“NullFile”,并将其设置为......
  • C语音数据类型
    1、基本数据类型 整数类型 浮点类型 字符类型 ......
  • JMeter响应文本输出为文档
      背景:当我们做压测时,需要模拟多用户访问操作,提前需要通过登录接口,批量生成TOKEN。在压测时,经常会遇到类似上面的这种情况,我们需要把接口响应的内容,输出到文件中,那么本文,就是来解决这个问题; 1、第一步,需要先准备好用户数据,比如登录用户需要的手机号,需要为txt文档,或者CSV(逗......
  • windows系统,大文本文件打开工具
    在Windows系统中,打开大文本文件的工具有多种选择。以下是一些推荐的软件:LogView:这是一款能够快速打开大文件的工具,对于300MB以上的文件,它基本上能在一分钟内打开。虽然打开大文件时可能会占用较多的内存,但它的处理速度相对较快,使得它成为处理大文本文件的理想选择。EditPlus:Edi......
  • 【转】[WPF] 复制文本到剪贴板
    来自:阿里的通义灵码以下是几种常见的复制数据类型到剪切板的方法:复制文本到剪切板usingSystem.Windows.Forms;//对于WindowsForms应用//或者usingSystem.Windows;//对于WPF应用publicvoidCopyTextToClipboard(stringtext){//确保在UI线程中操作剪切板......
  • Excel文本转公式
    FunctionEval(RefAsString)Application.VolatileEval=Evaluate(Ref)EndFunctionSUBSTITUTE函数在Excel中用于将文本字符串中的一部分替换为其他字符串。它的语法如下:SUBSTITUTE(text,old_text,new_text,[instance_num])其中:text是要进行替换操作的原......