ChatGPT 为我们揭开了人工智能时代的无限可能。 ChatGPT 的采用率让谷歌等巨头感到不安。 在新一代人工智能中,我们将见证范式转变以及人工智能对人类生活几乎所有领域的深远影响。 但这个时代也将使我们能够利用人工智能来改善人类生活。

尽管对某些人来说可能很可怕,但可以通过有趣的新方式利用 ChatGPT。 本文是我们可以利用 ChatGPT、NLP、STT 和 TTS 强大功能的方法之一的实际演示 :)。

本文演示了集成多个 AI 服务以在 Python 中使用 OpenAI 的 ChatGPT 和 Whisper API 执行语音转文本 (STT)、自然语言处理 (NLP) 和文本转语音 (TTS) 的工作流程。

1、OpenAI API

OpenAI 公开了一组 API 以与其 GPT 模型进行交互。 例如,本月早些时候,他们推出了一个 API 端点,用于使用 ChatGPT 模型完成聊天。 这开辟了广泛的应用领域。 例如,我们可以直接调用 ChatGPT 模型并从中获取响应,并将其答案嵌入我们的应用程序中 OpenAI 最近推出了用于将语音转换为文本的 Whisper API。

在本文中,我们将使用 ChatGPT 模型和 Whisper API 来利用聊天完成 API 将语音转换为文本。

2、环境配置

我们的脚本首先声明一些变量,如 openaiurl 和 openai_token,用于使用存储在环境变量 OPENAI_API_TOKEN 中的 API 令牌建立与 OpenAI API 的连接。 之后,如果未设置令牌,脚本将退出并显示错误代码。

API 令牌以 Authorization 标头的形式传递到请求中,如下面的代码所示:

openaiurl = "https://api.openai.com/v1"
openai_token = os.environ.get("OPENAI_API_TOKEN")
if openai_token == "":
    os.exit(1)
headers = { "Authorization" : f"Bearer {openai_token}" }

3、识别语音

目的是利用我们原始计算机器上的麦克风。 我们将口语捕获为 wav 格式的音频文件。

然后该脚本提示用户对着他们的麦克风说话并使用 SpeechRecognition 库录制音频。 最后,音频被保存到 audio 文件夹中的 WAV 文件中。

# obtain the audio from the microphone
r = sr.Recognizer()
with sr.Microphone() as source:
    r.adjust_for_ambient_noise(source)
    print("Say something!")
    audio = r.listen(source)

folder = "./audio"
filename = "microphone-results"
audio_file_path = f"{folder}/{filename}.wav"

if not os.path.exists(folder):
    os.mkdir(folder)

# write audio to a WAV file
print(f"Generating WAV file, saving at location: {audio_file_path}")
with open(audio_file_path, "wb") as f:
    f.write(audio.get_wav_data())

4、使用Whisper

我们打算利用 OpenAI Whisper API 将我们的音频文件转录为文本。 OpenAI 用于执行转录的模型标记为 whisper-1。

我们的脚本将音频文件作为数据发送到 Whisper API 的 POST 请求。 API 对音频执行语音转文本 (STT) 并返回转录的文本。

url = f"{openaiurl}/audio/transcriptions"

data = {
    "model": "whisper-1",
    "file": audio_file_path,
}
files = {
    "file": open(audio_file_path, "rb")
}

response = requests.post(url, files=files, data=data, headers=headers)

print("Status Code", response.status_code)
speech_to_text = response.json()["text"]
print("Response from Whisper API's", speech_to_text)

我们得到一个包含带有转录值的文本键的响应。

5、文本补齐

在这里,我们将使用转录文本调用 OpenAI 聊天完成端点。 要使用 ChatGPT 模型,我们传递模型名称 gpt-3.5-turbo。

该脚本将另一个 POST 请求发送到 OpenAI API,并将转录的文本作为数据。 API 使用 ChatGPT 模型对文本执行 NLP 并返回响应。

url = f"{openaiurl}/chat/completions"

data = {
    "model": "gpt-3.5-turbo",
    "messages": [
        {
            "role": "user",
            "content": speech_to_text
        }
    ]
}

response = requests.post(url, json=data, headers=headers)

print("Status Code", response.status_code)
chatgpt_response = response.json()["choices"][0]["message"]["content"]
print("Response from ChatGPT model ", chatgpt_response)

最后,我们收到了来自 ChatGPT 的回复。

6、播放响应文本

现在我们需要向用户播放响应。 所以,我们就是这样做的。

我们的脚本使用 pyttsx3 库将 NLP 响应转换为语音并通过用户的扬声器播放音频输出。

engine = pyttsx3.init()
engine.setProperty('rate', 175)

print("Converting text to speech...")
engine.say(chatgpt_response)

engine.runAndWait()
engine.stop()

我们都体验过与 ChatGPT 的基于文本的交互。 我们这里的方法更像是一种对话性质,就像 Alexa 一样。 我们可以很容易地扩展我们的脚本,通过提出后续问题来更深入地讨论。

7、流水线

所有复杂的东西都组装起来了。

#!/usr/bin/env python3

import os
import speech_recognition as sr
import requests
import pyttsx3

def main():
    openaiurl = "https://api.openai.com/v1"
    openai_token = os.environ.get("OPENAI_API_TOKEN")
    if openai_token == "":
        os.exit(1)
    headers = { "Authorization" : f"Bearer {openai_token}" }

    ###################################################################
    ###           1. Record using microphone                        ###
    ###################################################################

    print("[-] Record audio using microphone")

    # obtain audio from the microphone
    r = sr.Recognizer()
    with sr.Microphone() as source:
        r.adjust_for_ambient_noise(source)
        print("Say something!")
        audio = r.listen(source)

    folder = "./audio"
    filename = "microphone-results"
    audio_file_path = f"{folder}/{filename}.wav"

    if not os.path.exists(folder):
        os.mkdir(folder)
    
    # write audio to a WAV file
    print(f"Generating WAV file, saving at location: {audio_file_path}")
    with open(audio_file_path, "wb") as f:
        f.write(audio.get_wav_data())

    ###################################################################
    ###      2. Call to Whisper API's and getting result            ###
    ###################################################################

    print("[-] Call to Whisper API's to get the STT response")

    url = f"{openaiurl}/audio/transcriptions"

    data = {
        "model": "whisper-1",
        "file": audio_file_path,
    }
    files = {
        "file": open(audio_file_path, "rb")
    }

    response = requests.post(url, files=files, data=data, headers=headers)

    print("Status Code", response.status_code)
    speech_to_text = response.json()["text"]
    print("Response from Whisper API's", speech_to_text)

    ###################################################################
    ###   3. Query ChatGPT model with the text get the response     ###
    ###################################################################

    print("[-] Querying ChatGPT model with the STT response data")
    url = f"{openaiurl}/chat/completions"

    data = {
        "model": "gpt-3.5-turbo",
        "messages": [
            {
                "role": "user",
                "content": speech_to_text
            }
        ]
    }

    response = requests.post(url, json=data, headers=headers)

    print("Status Code", response.status_code)
    chatgpt_response = response.json()["choices"][0]["message"]["content"]
    print("Response from ChatGPT model ", chatgpt_response)

    ###################################################################
    ###      4. Try to convert TTS from the response                ###
    ###################################################################

    print("[-] Try to convert TTS from the response")

    engine = pyttsx3.init()
    engine.setProperty('rate', 175)

    print("Converting text to speech...")
    engine.say(chatgpt_response)

    engine.runAndWait()
    engine.stop()

if __name__ == "__main__":
    main()

8、安装依赖软件

我在 MacBook Pro 上执行了此设置。 为了让音频工作,我必须安装以下内容:

brew install portaudio

代码中使用了以下库。 使用以下命令安装它们:

pip install SpeechRecognition
pip install pyttsx3

9、使用方法

要使用脚本,我们需要运行它。 所以一定要先安装依赖项。

python main.py

运行脚本后,我们在终端上收到一条消息,“Say Something!”。 当提示打到终端时,我们必须提出问题并说出来。 检测到暂停以停止录制。

python main.py
[-] Record audio using microphone
Say something!
Generating WAV file, saving at location: ./audio/microphone-results.wav

之后,录音将存储为 wav 文件。 然后将音频文件传递给 OpenAI Whisper 转录 API。 最后,API 返回转录响应。

python main.py
...
[-] Call to Whisper APIs to get the STT response
Status Code 200
Response from Whisper API's "Summarise Limitless by Jim Kwik"

转录的响应用于查询利用 ChatGPT 模型的 OpenAI 聊天完成 API。 最后,端点返回带有 ChatGPT 响应的 JSON 响应。

python main.py
...
[-] Querying ChatGPT model with the STT response data
Status Code 200
Response from ChatGPT model

In his book "Limitless," Jim Kwik offers a variety of strategies to help readers unlock their full brain potential. He emphasizes the importance of proper nutrition, exercise, and sleep for optimal brain function, and also provides techniques for improving memory, learning, and problem-solving skills. Kwik argues that the key to achieving personal and professional success is to continually challenge and stretch yourself, with a focus on long-term growth rather than short-term wins. Overall, "Limitless" provides practical and actionable advice for anyone looking to optimize their cognitive abilities and achieve their goals.

最后,此文本响应将转换为文本转语音 (TTS) 音频,您可以从扬声器中听到。

python main.py
...
[-] Try to convert TTS from the response
Converting text to speech...

10、结束语

此代码演示了如何集成多个 AI 服务以创建更复杂的应用程序。 在此示例中,用户的语音输入使用 STT 转录为文本,使用 NLP 进行分析,并使用 TTS 将响应转换为语音。 可以调整和扩展此工作流程,以创建具有许多用例的更复杂的应用程序。 您可以在 GitHub 存储库 The Speaking ChatGPT中找到本文的代码。