使用 Web Speech API 和 ChatGPT API 开发一个智能语音机器人

sxkk20082年前知识分享148

前言

随着 AI 的不断发展,我们前端工程师也可以开发出一个智能语音机器人,下面是我开发的一个简单示例,大家可以访问这个视频地址查看效果。

原理

首先说一下这个 demo 的实现原理和步骤

  1. 我们使用 Web Speech API 获得输入的文本
  2. 将获得的文本作文 ChatGPT API 的 prompt 的输入
  3. 使用语音合成或者 微软的文字转语音服务,将文字作为语音输入

语音识别的功能在百度搜索页面就有,使用的是 Web Speech API

我们可以在 MDN 中查看这个 API 的使用

下面代码是一个简单示例

DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Web Speech API Demotitle>
  head>
  <body>
    <h1>Web Speech API Demoh1>
    <p>请说出一些文字:p>
    <textarea id="input" cols="50" rows="5">textarea>
    <br />
    <button id="speakBtn">语言合成button>
    <button id="transcribeBtn">语音识别button>
    <br />
    <p id="transcription">p>

    <script>
      const recognition = new webkitSpeechRecognition() // 实例化语音识别对象
      recognition.continuous = true // 连续识别,直到 stop() 被调用

      const transcribeBtn = document.getElementById('transcribeBtn')
      transcribeBtn.addEventListener('click', function () {
        recognition.start() // 开始语音识别
      })

      recognition.onresult = function (event) {
        let result = ''
        for (let i = event.resultIndex; i < event.results.length; i++) {
          result += event.results[i][0].transcript
        }
        const transcript = document.getElementById('transcription')
        transcript.innerHTML = result // 显示语音识别结果
      }

      const speakBtn = document.getElementById('speakBtn')
      speakBtn.addEventListener('click', function () {
        const text = document.getElementById('input').value // 获取文本框中的文本
        const msg = new SpeechSynthesisUtterance(text) // 实例化语音合成对象
        window.speechSynthesis.speak(msg) // 开始语音合成
      })
    script>
  body>
html>

这个例子很简单,点击语音识别可以将文字识别再文本框中。输入文字,电脑可以合成语音, 但是电脑合成的声音比较机械,不够逼真,因此我们可以使用微软的语音合成,大家可以访问这个地址体验。

https://speech.microsoft.com/audiocontentcreation

如果没有登录的话,只能试听,注册登录后就可以免费使用官方的 api 了

注册的话,大家只需要按照步骤注册就可以了,并且需要准备一张境外使用信用卡,注册后每月可以免费 50w 字的使用权限。

创建资源的时候选择 F0,创建完成后,就会有一个秘钥。

有了秘钥我们就可以将 chatGPT 返回的文字转成真人语音了,在 Github 上有代码示例

完整代码

DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Web Speech API Demotitle>
  head>
  <body>
    <h1>Web Speech API + ChatGPT APIh1>
    <button id="transcribeBtn">按住说话button>
    <br />
    <p id="transcription">p>
    <script src="https://aka.ms/csspeech/jsbrowserpackageraw">script>

    <script>
      async function requestOpenAI(content) {
        const BASE_URL = ``
        const OPENAI_API_KEY = 'sk-xxxxx'
        const messages = [
          {
            role: 'system',
            content: 'You are a helpful assistant',
          },
          { role: 'user', content },
        ]
        const res = await fetch(`${BASE_URL || 'https://api.openai.com'}/v1/chat/completions`, {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
            authorization: `Bearer ${OPENAI_API_KEY}`,
          },
          body: JSON.stringify({
            model: 'gpt-3.5-turbo',
            messages,
            temperature: 0.7,
            top_p: 1,
            frequency_penalty: 0,
            presence_penalty: 0,
          }),
        })
        const response = await res.json()

        const result = response.choices[0].message.content
        console.log(result)
        return result
      }
      // 下载 mp3 文件
      function download(result) {
        const blob = new Blob([result.audioData])
        const url = URL.createObjectURL(blob)
        const link = document.createElement('a')
        link.href = url
        link.download = 'filename.mp3' // set the filename here
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
        URL.revokeObjectURL(url)
      }

      function synthesizeSpeech(text) {
        const sdk = SpeechSDK
        const speechConfig = sdk.SpeechConfig.fromSubscription('TTS_KEY', 'TTS_REGION')
        const audioConfig = sdk.AudioConfig.fromDefaultSpeakerOutput()

        const speechSynthesizer = new SpeechSDK.SpeechSynthesizer(speechConfig, audioConfig)
        // 可以更改 Ssml 来改变声音
        speechSynthesizer.speakSsmlAsync(
          `${text}`,
          (result) => {
            if (result) {
              speechSynthesizer.close()

              return result.audioData
            }
          },
          (error) => {
            console.log(error)
            speechSynthesizer.close()
          }
        )
      }

      const SpeechRecognition = window.SpeechRecognition || webkitSpeechRecognition

      const recognition = new SpeechRecognition() // 实例化语音识别对象
      recognition.continuous = true // 连续识别,直到 stop() 被调用
      recognition.lang = 'cmn-Hans-CN' // 普通话 (中国大陆)

      const transcribeBtn = document.getElementById('transcribeBtn')

      let record = false
      transcribeBtn.addEventListener('mousedown', function () {
        record = true
        recognition.start() // 开始语音识别
        console.log('开始语音识别')
        transcribeBtn.textContent = '正在录音...'
      })
      transcribeBtn.addEventListener('mouseup', function () {
        transcribeBtn.textContent = '按住说话'
        record = false

        recognition.stop()
      })
      recognition.onend = () => {
        console.log('停止语音识别')
        transcribeBtn.textContent = '开始'
        record = false
      }

      recognition.onerror = function (event) {
        console.log(event.error)
      }

      recognition.onresult = function (event) {
        console.log(event)
        let result = ''
        for (let i = event.resultIndex; i < event.results.length; i++) {
          result += event.results[i][0].transcript
        }
        console.log(result)
        const transcript = document.getElementById('transcription')
        const p = document.createElement('p')
        p.textContent = result
        transcript.appendChild(p) // 显示语音识别结果
        requestOpenAI(result).then((res) => {
          const p = document.createElement('p')
          p.textContent = res
          transcript.appendChild(p)
          synthesizeSpeech(res)
        })
      }
    script>
  body>
html>

上面代码中

以上就是本文的全部内容,如果对你有帮助,记得给个三连,感谢你的阅读。

本文正在参加「金石计划」

相关文章

上海招聘网

上海招聘网

上海人才招聘网为传爱网络(易职邦)旗下门户网站,秉承服务于天下有发展需求的人!让用户在上海没有难找的工作。人才招聘网,全国有26个门户网站,遍布全国大江南北;科技赋能数字化改造,促进产教融合,必将创...

https://retor.hr/

https://sedeblockchain.com/

https://dnaprojecten.nl/

web design trend 2023 example 1 https://nationalstudentshow.com/

https://anakaric.com/

https://yaremenko.design/

https://www.landa.as/es/

web design trend 2023 example https://selectedbase.com/

CSS First

在过去,我们通常依靠 JavaScript 来创造网站的视觉效果。但从那时起,CSS 已经发展到可以做很多复杂的事情,而这些事情是 JavaScript 无法做到的。三维变换、过滤器和新的 CSS 功能,如:选择器(has)、容器查询(@container)和层叠层(@layer),将使许多有趣的网页设计纯粹依靠 CSS 来实现。

因此,从今年开始,我们将看到网站减少对 JavaScript 的依赖来创造视觉效果。

https://redstapler.co/cool-css-text-light-effect-5-minutes-tutorial/

https://redstapler.co/3d-infinity-effect-css-tutorial/

https://codepen.io/seyedi/pen/zYoeLEv

3d transparent video https://redstapler.co/create-3d-effect-on-website-using-transparent-video-background/

2023 web 设计趋势

翻译一篇文章原文链接:https://redstapler.co/web-design-trends-2023/作者:TK在过去的一年里,我们在网页设计领域看到了很多令人兴奋的发展。而在这篇文章中,我...

AI人工智能:未来智能科技的无限潜能与挑战

AI人工智能:未来智能科技的无限潜能与挑战

  随着科技的迅猛发展,AI人工智能成为了现代社会最为热门的话题之一。人们对AI的应用和未来潜力产生了极大的兴趣和期待。AI人工智能凭借其强大的计算能力和学习能力,正逐渐渗透到各行各业,为人类带来了巨...

AI时代:探索新媒体风格下的人工智能创新

AI时代:探索新媒体风格下的人工智能创新

  在AI时代的到来下,新媒体行业正面临着巨大的创新。人工智能(AI)作为新媒体风格的核心,正在与各行各业紧密结合,为传统媒体注入了新的活力。AI的发展为新媒体带来了巨大的机...

使用 Vitest 和 React Testing Library 给 Next.js 应用单元测试

highlight: monokai theme: vuepress文章为稀土掘金技术社区首发签约文章,14 天内禁止转载,14 天后未获授权禁止转载,侵权必究!前言在前面的文章中我们使用了 Next...

有个非常大的缺点,就是需要一个安静的环境,声音必须外放,后来因为代码压缩,下架了。

现在推荐一款大神开发的,界面是这样的

Azure Speech Download

不必先播放,就可以直接下载音频文件,相信对一些视频制作者有很大帮助,我的几个视频就是通过这个插件获得的音频,再配上制作 keynote 动画导出视频,剪辑实现,可以说是非常好用。

2. copy-helper

网址:https://greasyfork.org/zh-CN/scripts/439663-copy-helper

文章拷贝助手,掘金、简书、微信文章、知乎专栏、思否、CSDN 文章一键拷贝 markdown。

文章拷贝助手

我还写了篇文章介绍如何实现这个脚本,无论对个人知识整理和收集,还是公众号主运营,都很有帮助。

3. 壹伴排版 Plus

网址: https://greasyfork.org/zh-CN/scripts/439551-壹伴排版-plus

公众号运营者福利,可以在微信公众平台可直接插入壹伴的模板,免开 vip

壹伴排版 Plus

这款插件也是笔者开发的,关于如何实现,有一篇文章介绍

4. 屏蔽广告

网址:https://greasyfork.org/zh-CN/scripts/439420

屏蔽谷歌广告、百度广告、知乎广告、隐藏谷歌和百度搜索增强百度搜索结果的各种广告等等(过滤所有采用谷歌联盟和百度联盟等广告联盟的广告)

屏蔽广告设置

安装好脚本之后,可以点击油猴,去脚本【广告管理设置】,在设置里也能看见这个脚本都支持哪些网站,还支持 CSDN 外链优化。

5. 稿定去水印

网址:https://greasyfork.org/zh-CN/scripts/454511

有些同学问我的博客首图是怎么设计的?我用的就是这款插件,稿定提供了大量免费设计素材和免费设计和视频模板、在线抠图和电商海报设计模板等,一键搞定设计需求。

稿定去水印

安装完成后,在右上角会有一个去水印按钮,设置完成后,使用 QQ 微信登截屏工具,截图即可。

6. iconfontr

网址:https://greasyfork.org/zh-CN/scripts/447288-iconfontr

前端开发者福利,在 Iconfont 可以直接复制 React component

iconfontr

推荐6款油猴脚本,不看错亿!

本文视频地址推荐 6 款贼好用的油猴脚本,其中有 4 个是笔者开发的,看完了文章,要是对这几款脚本感兴趣的话,赶紧去试试看,且用且珍惜!1. Azure Speech Download网址:https...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。