【Python】ChatGPTと会話するアプリを作ってみた

アイキャッチ画像
  • ChatGPTと会話するアプリを作るには?
  • PythonでChatGPT APIを扱うには?
  • Pythonで音声入出力をするには?

本記事ではこのような疑問を解決します。


今、超絶トレンドであるChatGPT。

2023年3月1日にChatGPT APIが一般公開されました。
※音声認識サービスであるWhisperのAPIも一緒に

これによってChatGPTの機能を取り入れたアプリ等がどんどん開発されています。

そこで私もChatGPT APIをいじってみようと思い、
PythonでChatGPTと会話するアプリを簡易的に作ってみました。


そこで今回はサクッと作れる、PythonによるChatGPTと会話するアプリの作り方を解説していきます。

あわせて読みたい

エンジニアが副業を始めるには?エンジニアの副業にはどんな種類がある? 本記事ではこのような疑問を解決します。副業がブームになっている昨今、エンジニアほど副業をやりやすい職業はないでしょう。副業に関心があったり、副業をしてみたいと思っ[…]

アイキャッチ画像

ChatGPT APIを扱うための準備をする

最初にChatGPT APIを扱うために、OpenAIの公式サイトで操作を行なっていきます。

なお、ChatGPT APIを扱うには料金が発生します。

ただ、公式サイトによると、
1000トークン当たり0.002ドルという激安価格であるため、心配はいらないでしょう。

例えば、1日それなりにChatGPT APIを扱ったとしても数十円で済んでしまうほどです。

OpenAIのアカウントを作成する

まずはChatGPTの開発元であるOpenAIのアカウントを作成します。

OpenAI公式サイトから[Try ChatGPT↗︎]をクリックしてアカウントの作成を進めましょう。

アカウントの作成にはメールアドレスと電話番号が必要になります。

OpenAIのAPIキーを取得する

OpenAIのアカウントを作成できたら、APIキーを取得しましょう。

OpenAIアカウントページからログインをします。


ログインが完了してアカウントページが表示されたら、
「USER」→「API Keys」の中で、[+ Create new secret key]をクリックします。

ここでAPIキーが表示されますが、忘れずにコピーをしましょう。

コピーを忘れると、(たぶん)二度とAPIキーがわからなくなります。
(作り直せばいい話ですが)


そして、コピーしたAPIキーをどこかにメモっておけば、
ChatGPT APIを扱うための準備は完了です。

あわせて読みたい

フリーランスエンジニアが案件獲得方法とは?自ら営業せずに案件を獲得するには?実務経験1年未満でも大丈夫なの? 本記事ではこのような疑問を解決します。これからフリーランスエンジニアとして独立したい方は、兎にも角にも案件の獲得が急務です[…]

アイキャッチ画像

PythonでChatGPTと会話するアプリを作る

それではChatGPT API扱うための準備が整ったところで、
実際にアプリを作っていきましょう!

コードをどのような流れで書いていくかは様々ですが、
今回は概ね機能ごとにコードの説明をしていきます。

そして、最後にコードをまとめて1つのスクリプトファイルにしたいと思います。

なお、開発環境は以下の通りです。

python = “^3.10”
openai = “^0.27.0”
pyttsx3 = “^2.90”
SpeechRecognition = “^3.9.0”

必要ライブラリをインストールする

最初に必要なライブラリをインストールしておきましょう。

$ pip install openai pyttsx3 SpeechRecognition

OpenAIのAPIにAPIキーを設定する

まずは先ほど取得したAPIキーをOpenAIのAPIに設定します。
※APIキーについて、本来は設定ファイル等で管理するべきですが、
ここでは簡便的にコード中にベタ書きします。

import openai


# OpenAI APIキー
OPENAI_API_KEY = "自分のOpenAI APIキー"

# OpenAI APIにAPIキーを設定
openai.api_key = OPENAI_API_KEY

音声を取り込む

次にユーザが発した音声を取り込んでいきます。

・使用ライブラリ:SpeechRecognition

import speech_recognition as sr


# 音声の取り込み時間(秒)
PHRASE_TIME_LIMIT = 3

# Recognizerオブジェクト生成
recognizer = sr.Recognizer()

def get_voice():
    with sr.Microphone() as source:
        print("音声取り込み中・・・")
        voice = recognizer.listen(source=source, phrase_time_limit=PHRASE_TIME_LIMIT)
    return voice

取り込んだ音声を文字起こしする

音声を取り込んだら、音声内容をChatGPTに送れるように文字起こししていきます。

・使用ライブラリ:SpeechRecognition

# 取り込む音声の言語
VOICE_LANGUAGE = "ja"

def transcribe_voice(voice):
    try:
        # 音声を文字起こしする
        text = recognizer.recognize_google(voice, language=VOICE_LANGUAGE)
        print("あなた: {}".format(text))
        return text
    except Exception as e:
        print("音声を認識できませんでした。")
        return ""

ChatGPTに文字起こししたテキストを送る

発した音声をテキストにできたら、そのテキストをChatGPTに送ります。

# 自然言語処理モデル(現時点でgpt-3.5-turboが最新)
MODEL = "gpt-3.5-turbo"

def get_chatgpt_answer(text):
    # ChatGPT APIにテキストを送る
    response = openai.ChatCompletion.create(
                    model=MODEL,
                    messages=[{"role": "user", "content": text}],
                    temperature=0.0,
    )

    # ChatGPTの応答を取得する
    answer = response["choices"][0]["message"]["content"]
    print(answer)
    return answer

ChatGPTからの返答を読み上げる

最後にChatGPTからの返答を読み上げていきます。

・使用ライブラリ:pyttsx3

# 読み上げ速度
RATE = 200

# 読み上げ音量(0~1.0)
VOLUME = 1.0

# 読み上げ音声の性別(男性: 0, 女性: 1)
VOICE = 0

# pyttsx3オブジェクト生成
engine = pyttsx3.init()

def read_text(text):
    # 読み上げ速度を設定する
    engine.setProperty('rate', RATE)

    # 音量を設定する
    engine.setProperty('volume', VOLUME)

    # 音声の性別を設定する
    engine.setProperty('voice', VOICE)

    engine.say(text)
    engine.runAndWait()

完成したコード

import openai
import pyttsx3
import speech_recognition as sr


# OpenAI APIキー
OPENAI_API_KEY = "自分のOpenAI APIキー"

# 音声の取り込み時間(秒)
PHRASE_TIME_LIMIT = 3

# 取り込む音声の言語
VOICE_LANGUAGE = "ja"

# 自然言語処理モデル(現時点でgpt-3.5-turboが最新)
MODEL = "gpt-3.5-turbo"

# 読み上げ速度
RATE = 200

# 読み上げ音量(0~1.0)
VOLUME = 1.0

# 読み上げ音声の性別(男性: 0, 女性: 1)
VOICE = 0


# OpenAIのAPIにAPIキーを設定
openai.api_key = OPENAI_API_KEY

# Recognizerオブジェクト生成
recognizer = sr.Recognizer()

# pyttsx3オブジェクト生成
engine = pyttsx3.init()


def get_voice():
    with sr.Microphone() as source:
        print("音声取り込み中・・・")
        voice = recognizer.listen(source=source, phrase_time_limit=PHRASE_TIME_LIMIT)
    return voice


def transcribe_voice(voice):
    try:
        # 音声を文字起こしする
        text = recognizer.recognize_google(voice, language=VOICE_LANGUAGE)
        print("あなた: {}".format(text))
        return text
    except Exception as e:
        print("音声を認識できませんでした。")
        return ""


def get_chatgpt_answer(text):
    # ChatGPT APIにテキストを送る
    response = openai.ChatCompletion.create(
                    model=MODEL,
                    messages=[{"role": "user", "content": text}],
                    temperature=0.0,
    )

    # ChatGPTの応答を取得する
    answer = response["choices"][0]["message"]["content"]
    print(answer)
    return answer


def read_text(text):
    # 読み上げ速度を設定する
    engine.setProperty('rate', RATE)

    # 音量を設定する
    engine.setProperty('volume', VOLUME)

    # 音声の性別を設定する
    engine.setProperty('voice', VOICE)

    engine.say(text)
    engine.runAndWait()

if __name__ == "__main__":

    while True:
        # 音声を取得する
        voice = get_voice()

        # 取得した音声を文字起こしする
        voice_text = transcribe_voice(voice=voice)

        if voice_text:
            # ChatGPTのAPIを実行する
            answer = get_chatgpt_answer(text=voice_text)

            # ChatGPTの返答を読み上げる
            read_text(text=answer)

まとめ

以上、PythonでChatGPTと会話するアプリを作ってみた流れをツラツラ書いてきました。

実際に作ったプログラムを実行して使ってみると、以下の点に課題を感じます。

・音声取り込みのタイミング

・ChatGPTから返答が来るまでの時間

・テキスト読み上げの不自然さ

今回は簡易的に作ってみましたが、
上記の課題を解決すると、よりリアルな会話を実現できそうです。

具体的には別のライブラリ(何かある?)を使ってみたり、
並行処理や予測処理を取り入れてみたりといった感じでしょうか。


まあとにかく、PythonでChatGPTと会話する基本的な処理の実装方法は押さえれたかと思います。

ぜひ本記事を参考にいろいろな形にカスタマイズしてみてください!