ChatGPT APIを使って電話応答(3)

1142
ChatGPT APIを使って電話応答(3)

はじめに

前回の記事で、ChatGPT APIを使用して電話応答を実現するプログラムを作成しました。

今回は入出力をテキストではなく音声に対応させます。

プログラム

音声に対応したプログラムをChatGPTに作ってもらう

せっかくなので、プログラム自体もChatGPTに作ってもらいましょう。

ChatGPTに下記の質問メッセージを入力しました。

音声の質問をテキストに変換してGhatGPT APIの入力として、ChatGPT APIの出力を音声に変換して回答するpythonプログラムを作ってください。

以下がChatGPTの回答です。


以下は、SpeechRecognitionとGoogle Text-to-Speech(gTTS)を使用して、音声の質問をテキストに変換し、ChatGPT APIを使用してテキストの質問に回答し、回答を音声に変換するPythonプログラムの例です。このプログラムはPython 3で動作します。

まず、必要なパッケージをインストールします。

pip install SpeechRecognition gTTS playsound

次に、以下のPythonコードを使用して質問を行う音声を録音し、テキストに変換し、ChatGPT APIに送信し、応答をテキストとして取得し、音声に変換して再生します。

import speech_recognition as sr
import requests
from playsound import playsound
from gtts import gTTS

# ChatGPT APIのエンドポイントとAPIキー
API_ENDPOINT = "https://api.openai.com/v1/chat/completions"
API_KEY = "YOUR_API_KEY"

# 音声からテキストに変換する関数
def transcribe_speech():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("質問してください...")
        audio = r.listen(source)
        print("音声を受信しました。テキストに変換しています...")
        try:
            text = r.recognize_google(audio, language="ja-JP")
            print("質問: " + text)
            return text
        except sr.UnknownValueError:
            print("音声を解析できませんでした。もう一度お試しください。")
            return ""
        except sr.RequestError as e:
            print("音声の変換に失敗しました。以下のエラーが発生しました: {0}".format(e))
            return ""

# ChatGPT APIに質問を送信して回答を取得する関数
def get_chatbot_response(question):
    headers = {
        "Content-Type": "application/json",
        "Authorization": "Bearer " + API_KEY
    }
    data = {
        "prompt": question,
        "max_tokens": 50
    }
    response = requests.post(API_ENDPOINT, headers=headers, json=data)
    if response.status_code == 200:
        return response.json()["choices"][0]["text"].strip()
    else:
        print("ChatGPT APIへのリクエストが失敗しました。ステータスコード: {0}".format(response.status_code))
        return ""

# テキストを音声に変換して再生する関数
def speak_text(text):
    tts = gTTS(text, lang="ja")
    tts.save("response.mp3")
    playsound("response.mp3")

# メインの処理
def main():
    while True:
        question = transcribe_speech()
        if question:
            response = get_chatbot_response(question)
            if response:
                print("回答: " + response)
                speak_text(response)

if __name__ == "__main__":
    main()

上記のコードを実行すると、質問を音声で行い、ChatGPTが

応答をテキストで返し、そのテキストを音声に変換して再生します。

注意: 上記のコードのAPI_KEYの部分には、OpenAIのChatGPT APIの実際のAPIキーを入力してください。また、APIエンドポイントやリクエストのパラメータは、OpenAIのAPI仕様に合わせて設定する必要があります。


上記のプログラムを実行すると、エラーとなり下記のメッセージが表示されたので、追加でPyObjCもインストールしましたが、それ以外は問題なく実行できました。
タイムラグもそれほどなく、比較的スムーズにやり取りできている印象です。

playsound is relying on a python 2 subprocess. Please use `pip3 install PyObjC` if you want playsound to run more efficiently.

電話応答プログラム

先ほどのプログラムで、transcribe_speechspeak_textを使えば音声を入出力対応させられることがわかったので、これらの関数を使って前回作った電話応答プログラムを音声に対応させました。


import openai
import speech_recognition as sr
from gtts import gTTS
from playsound import playsound

openai.api_key = "ここにAPIキーを貼り付けてください"

messages = [
  {
    "role": "system",
    "content": "あなたは株式会社Jurabiの電話応答係です。"
  },
  {
    "role": "user",
    "content": "Jurabiに在籍している社員全員の氏名を教えてください。"
  },
  {
    "role": "assistant",
    "content": "田岡範昭、西山星児、山口健太郎、林栄治です。"
  },
  {
    "role": "user",
    "content": "今日出社しているのは誰ですか?"
  },
  {
    "role": "assistant",
    "content": "西山と山口です。"
  },
  {
    "role": "user",
    "content": "電話がかかってきたので応答をお願いします。"
  }
]

# テキストを音声に変換して再生する
def speak_text(text):
    tts = gTTS(text, lang='ja')
    tts.save('response.mp3')
    playsound('response.mp3')

# 音声の質問を取得する
def get_audio():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("質問してください...")
        audio = r.listen(source)
        text = ""

        try:
            text = r.recognize_google(audio, language='ja-JP')
            print("質問: " + text)
        except sr.UnknownValueError:
            print("質問を理解できませんでした。もう一度お試しください。")
        except sr.RequestError as e:
            print("Google Speech Recognitionサービスに接続できませんでした。")

        return text

userInput = None

while True:
  res = openai.ChatCompletion.create(
    model = "gpt-3.5-turbo",
    messages = messages,
    temperature = 0
  )

  response = res["choices"][0]["message"]["content"]
  speak_text(response)

  messages.append({
    "role": "assistant",
    "content": response
  })

  userInput = get_audio()

  messages.append({
    "role": "user",
    "content": userInput
  })

まとめ

適切な応答をしてくれるようにもっとチューニングが必要だったり、どうやって実際に電話に組み込むのかといった課題は残っていますが、ChatGPTに電話応答をしてもらう未来を感じることができました。