首页
未知分类正文内容

如何使用GPT4开发语音助手

2023年09月21日
阅读时长 2 分钟
阅读量 39
如何使用GPT4开发语音助手


作为一个青少年,我梦想创建应用。我有很多想法,但是在编程方面遇到了困难。

后来,我让自己身边围绕着专家,这对我有了很大的帮助。在一个团队中,你可以借助所有成员的专业知识来构建庞大且强大的应用程序。但是,这仍然是一个缓慢而繁琐的过程。

直到 GPT-4 出现!

有了 GPT-4,就好像在 WhatsApp 上拥有一个专家团队一样。现在,你可以在几个小时内原型化简单的应用程序,即使只具备基本的编程技能。

在本文中,我想带你走过我创建一个语音助手应用程序(我称之为 Jarvis)的过程,该应用程序能够:

  • 捕捉激活关键词(就像是“嘿 Siri!”)

  • 理解我的问题

  • 给我一个答案

让我们开始吧!(00:00)

为了省下一两个小时的研究时间,我决定问问 AI 这个过程,于是我问道:

这已经是相当不错的步骤了。我们知道我们需要做什么,AI 提出了一些我们稍后可以使用的库和工具,那么让我们动手吧!

请记住,如果你对 AI 提到的内容不确定,你可以随时请求更多细节或下一步的指导。

步骤 1 和 2:选择编程语言(04:36)

Python 是我唯一略懂一点的编程语言,并且我已经在我的电脑上安装了 Pycharm。所以它是我的首选。

如果你是一个完全的初学者,我也推荐使用 Python。它是一门非常适合初学者的语言,有着良好的编写文档、许多教程、庞大的社区,而且它相当通用。

步骤 3:语音激活关键词(11:52)

类似于“嘿 Siri”或“好谷歌”,我希望 Jarvis 能够识别自己的激活短语。

最开始,我试图按照 AI 的指导,并检查了 Kitty-AI Snowboy 库 以达到这个目的,但我发现这个库已经不再维护了。

因此,我请 AI 给我一些替代方案,并且没有进行过多的研究,我就选择了它的第一个选项 PicoVoice.ai

  • 基本用例免费

  • 支持 Python

  • 有很好的文档

  • 还包括语音转文本的 API(我们稍后需要用到)

我尝试生成 API 密钥(需要注册)并将 快速入门 代码粘贴到我的 JarvisAI python 文件中:

import pvporcupine

porcupine = pvporcupine.create(
  access_key='在这里输入你的访问密钥',
  keywords=['picovoice', 'bumblebee']
)

def get_next_audio_frame():
  pass

while True:
  audio_frame = get_next_audio_frame()
  keyword_index = porcupine.process(audio_frame)
  if keyword_index == 0:
      print(0)
  elif keyword_index == 1:
      print(1)

但是它没有工作。😪 为什么呢?错误消息说它缺少语音输入。你可以看到 get_next_audio_frame() 方法获取音频文件的代码为空...

让我们将这段代码提供给 AI 并要求添加记录音频的逻辑:

GPT-4 不仅为我写了代码:

import pvporcupine
import pyaudio
import struct

porcupine = pvporcupine.create(
    access_key='你的 API 密钥',
    keywords=['picovoice', 'bumblebee']
)

# 初始化 PyAudio
audio = pyaudio.PyAudio()
stream = audio.open(
    rate=porcupine.sample_rate,
    channels=1,
    format=pyaudio.paInt16,
    input=True,
    frames_per_buffer=porcupine.frame_length,
)

# 主循环
print("Listening for keywords...")
try:
    while True:
        # 从麦克风读取音频数据
        audio_data = stream.read(porcupine.frame_length)
        audio_frame = struct.unpack_from("h" * porcupine.frame_length, audio_data)

        # 使用 Porcupine 处理音频帧
        keyword_index = porcupine.process(audio_frame)

        if keyword_index == 0:
            print("检测到关键词 0!")
        elif keyword_index == 1:
            print("检测到关键词 1!")
finally:
    # 清理资源
    stream.stop_stream()
    stream.close()
    audio.terminate()
    porcupine.delete()

它还给了我以下解释和安装所需库的指导:

我测试了一下这段代码,它工作正常!🎉 该应用程序正确地检测到了语音中的关键词。让我们将这个触发词更改为 "Jarvis"(我们的 AI 助手的名字)并继续进行!

步骤 4:语音转文本(27:09)

我们已经实现了触发词的检测,但现在我们还需要录制用户的声音并将其转换为文本。PicoVoice.ai 通过他们的 API 为此提供了支持。

首先,我试图自己将这个功能加入到现有的代码中,但不幸的是,我第一次尝试并不成功。幸运的是,我的 AI 伙伴不会对我进行评判。😅

第一次尝试在这里没有成功。代码报了一些关于录制音频的异常错误。所以我简单地将消息复制粘贴给 AI,再次询问:

AI 礼貌地为犯了一个错误向我道歉,并提供了一个实际工作的更新代码供我使用!🎉

通过评论,我们可以更好地了解正在发生的事情并理解代码。

import os
import pvleopard as pvleopard
import pvporcupine
import pyaudio
import struct
import wave

porcupine = pvporcupine.create(
    access_key='你的 API 密钥',
    keywords=['jarvis']
)

leopard = pvleopard.create(access_key='你的 API 密钥')

# 初始化 PyAudio
audio = pyaudio.PyAudio()
stream = audio.open(
    rate=porcupine.sample_rate,
    channels=1,
    format=pyaudio.paInt16,
    input=True,
    frames_per_buffer=porcupine.frame_length * 2,
)

def record_audio(filename, duration):
    frames = []

    for _ in range(0, int(porcupine.sample_rate / porcupine.frame_length * duration)):
        audio_data = stream.read(porcupine.frame_length, exception_on_overflow=False)
        audio_frame = struct.unpack_from("h" * porcupine.frame_length, audio_data)
        frames.append(audio_data)

    with wave.open(filename, 'wb') as wf:
        wf.setnchannels(1)
        wf.setsampwidth(audio.get_sample_size(pyaudio.paInt16))
        wf.setframerate(porcupine.sample_rate)
        wf.writeframes(b''.join(frames))

# 主循环
print("Listening for keywords...")
try:
    while True:
        # 从麦克风读取音频数据
        audio_data = stream.read(porcupine.frame_length, exception_on_overflow=False)
        audio_frame = struct.unpack_from("h" * porcupine.frame_length, audio_data)

        # 使用 Porcupine 处理音频帧
        keyword_index = porcupine.process(audio_frame)

        if keyword_index == 0:
            print("检测到关键词!正在录制语音...")

            # 录制固定时间的语音
            duration_seconds = 5
            audio_file = "recorded_audio.wav"
            record_audio(audio_file, duration_seconds)

            # 使用 Leopard 转录录制的语音
            print("正在转录语音...")
            transcript, words = leopard.process_file(os.path.abspath(audio_file))
            print("转录结果:", transcript)

            # 删除音频文件(如果你不需要它)
            os.remove(audio_file)

finally:
    # 清理资源
    stream.stop_stream()
    stream.close()
    audio.terminate()
    porcupine.delete()

步骤 5:让 Jarvis 变得聪明起来(39:13)

现在是时候给 Jarvis 注入智慧,使它变得智能了。为此,我们将使用 chatGPT,由于我对如何进行下一步不了解,所以再次向 AI 寻求帮助:

太棒了!现在我有明确的步骤要遵循。

如果我在复制粘贴代码时遇到麻烦,我可以直接向 AI 寻求帮助,比如说:“这是我的代码 <<<粘贴代码>>> - 你可以帮我做出所描述的更改吗?”然后,AI 将给我完整的代码来使用。

注意:在查看 OpenAI 文档后,我决定使用 chatGPT 模型而不是 davinci,因为它更好且更便宜。如果你需要更多帮助,不要犹豫向 AI 寻求帮助。

以下是更新后的代码:

import os
import pvleopard as pvleopard
import pvporcupine
import pyaudio
import struct
import wave
import openai

porcupine = pvporcupine.create(
    access_key='你的 API 密钥',
    keywords=['jarvis']
)

leopard = pvleopard.create(access_key='你的 API 密钥')

openai.api_key = '你的 API 密钥'

# 初始化 chatGPT
engine = pyttsx3.init()

# 使用一些有趣的欢迎消息和用户操作说明
engine.say("你好,我是 Jarvis,你的个人助手。说出我的名字并向我提问:")
engine.runAndWait()

# 初始化 PyAudio
audio = pyaudio.PyAudio()
stream = audio.open(
    rate=porcupine.sample_rate,
    channels=1,
    format=pyaudio.paInt16,
    input=True,
    frames_per_buffer=porcupine.frame_length * 2,
)

def record_audio(filename, duration):
    frames = []

    for _ in range(0, int(porcupine.sample_rate / porcupine.frame_length * duration)):
        audio_data = stream.read(porcupine.frame_length, exception_on_overflow=False)
        audio_frame = struct.unpack_from("h" * porcupine.frame_length, audio_data)
        frames.append(audio_data)

    with wave.open(filename, 'wb') as wf:
        wf.setnchannels(1)
        wf.setsampwidth(audio.get_sample_size(pyaudio.paInt16))
        wf.setframerate(porcupine.sample_rate)
        wf.writeframes(b''.join(frames))

# 主循环
print("Listening for keywords...")
try:
    while True:
        # 从麦克风读取音频数据
        audio_data = stream.read(porcupine.frame_length, exception_on_overflow=False)
        audio_frame = struct.unpack_from("h" * porcupine.frame_length, audio_data)

        # 使用 Porcupine 处理音频帧
        keyword_index = porcupine.process(audio_frame)

        if keyword_index == 0:
            print("检测到关键词!正在录制语音...")

            # 录制固定时间的语音
            duration_seconds = 5
            audio_file = "recorded_audio.wav"
            record_audio(audio_file, duration_seconds)

            # 使用 Leopard 转录录制的语音
            print("正在转录语音...")
            transcript, words = leopard.process_file(os.path.abspath(audio_file))
            print("转录结果:", transcript)

            response = openai.ChatCompletion.create(

                model="gpt-3.5-turbo",
                messages=[{"role": "assistant",
                           "content": ("Formulate a very short reply for the question. Here is the question:"+transcript)}],

                temperature=0.6,
            )

            print(response.choices[0].message.content)

            # 这一行代码朗读 openAI 的回答
            pyttsx3.speak(response.choices[0].message.content)

            # 删除音频文件(如果你不需要它)
            os.remove(audio_file)

finally:
    # 清理资源
    stream.stop_stream()
    stream.close()
    audio.terminate()
    porcupine.delete()

你可以尝试运行这段代码并像平常一样向 chatGPT 提问。它正常工作!

让我们回顾一下:

  • Jarvis 在你说出触发词后被激活 ✅

  • 它理解你说的话并将其转录为文本 ✅

  • 它有回答你问题的能力 ✅

  • 它很安静。它不能说话。 😢 好吧,让我们来解决这个问题。

步骤 6:Jarvis 说话!(51:32)

我猜你已经知道了过程... 这是我问的问题:

GPT-4 为我提供了易于使用和有效的库,并给出了我要如何调整代码以使语音工作的具体步骤。🤯

这是 Jarvis 个人语音助手的最终工作代码:

import os
import pvleopard as pvleopard
import pvporcupine
import pyaudio
import struct
import wave
import openai
import pyttsx3

porcupine = pvporcupine.create(
    access_key='你的 API 密钥',
    keywords=['jarvis']
)

leopard = pvleopard.create(access_key='你的 API 密钥')

openai.api_key = '你的 API 密钥'

# 初始化语音库
engine = pyttsx3.init()

# 使用一些有趣的欢迎消息和用户操作说明
engine.say("你好,我是 Jarvis,你的个人助手。说出我的名字并向我提问:")
engine.runAndWait()

# 初始化 PyAudio
audio = pyaudio.PyAudio()
stream = audio.open(
    rate=porcupine.sample_rate,
    channels=1,
    format=pyaudio.paInt16,
    input=True,
    frames_per_buffer=porcupine.frame_length * 2,
)

def record_audio(filename, duration):
    frames = []

    for _ in range(0, int(porcupine.sample_rate / porcupine.frame_length * duration)):
        audio_data = stream.read(porcupine.frame_length, exception_on_overflow=False)
        audio_frame = struct.unpack_from("h" * porcupine.frame_length, audio_data)
        frames.append(audio_data)

    with wave.open(filename, 'wb') as wf:
        wf.setnchannels(1)
        wf.setsampwidth(audio.get_sample_size(pyaudio.paInt16))
        wf.setframerate(porcupine.sample_rate)
        wf.writeframes(b''.join(frames))

# 主循环
print("Listening for keywords...")
try:
    while True:
        # 从麦克风读取音频数据
        audio_data = stream.read(porcupine.frame_length, exception_on_overflow=False)
        audio_frame = struct.unpack_from("h" * porcupine.frame_length, audio_data)

        # 使用 Porcupine 处理音频帧
        keyword_index = porcupine.process(audio_frame)

        if keyword_index == 0:
            print("检测到关键词!正在录制语音...")

            # 录制固定时间的语音
            duration_seconds = 5
            audio_file = "recorded_audio.wav"
            record_audio(audio_file, duration_seconds)

            # 使用 Leopard 转录录制的语音
            print("正在转录语音...")
            transcript, words = leopard.process_file(os.path.abspath(audio_file))
            print("转录结果:", transcript)

            response = openai.ChatCompletion.create(

                model="gpt-3.5-turbo",
                messages=[{"role": "assistant",
                           "content": ("Formulate a very short reply for the question. Here is the question:"+transcript)}],

                temperature=0.6,
            )

            print(response.choices[0].message.content)

            # 这一行代码朗读 openAI 回答的文本
            pyttsx3.speak(response.choices[0].message.content)

            # 删除音频文件(如果你不需要它)
            os.remove(audio_file)

finally:
    # 清理资源
    stream.stop_stream()
    stream.close()
    audio.terminate()
    porcupine.delete()

最后,总结一下... (57:01)

完成了!观看演示视频:

不再花费 2-3 小时编写我所需的文档,不再请求开发人员分配,并等待几天才能得到结果,我在午餐时间结束时就已经有一个可用的 MVP。

不到 1 小时的时间内,我们就有了一个工作的 AI 语音助手的原型,我们甚至可以将其转化为网站或 iOS 应用程序,只需多问几个问题,开始与用户测试,收集反馈,并根据开发需求持续改进。

看来我们正式进入了人工智能的时代! (https://www.twitter.com/michallangmajer)**_

免责声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。