ChatGPTとVOICEVOXで音声回答するプログラムをChatGPTに作ってもらおうとした結果
ChatGPT APIとVOICEVOX APIを使用して、質問の回答内容を合成音声で再生するプログラムを「ChatGPTに作ってもらおう」とした実験メモです。
2023/3/24 追記:この時のバージョンはGPT-3です。今はGPT-4でさらに進化してます。(AIの進化が早すぎて情報の陳腐化の速度がすさまじい…)
結果
最終的に完成して動かしたものが以下になります。(応答待ちはカットしてます。)
とりあえず結論としては、簡単なプログラムはざっくりできる。完全に全て作らせるのは無理(だと思う)。今のところはパーツをChatGPTに作ってもらって、それを人間が修正しつつ組み合わせるような使い方ができると思います。それでもめちゃくちゃすごい。
あとはUIをきれいにしつつ、クライアント、サーバーで分けたり、機能を追加すればいい感じになりそうです。
作成風景
まずChatGPTにどんなスクリプトが欲しいか日本語で伝えます。そして応答されたスクリプトを見て修正を加え、さらに必要なパーツをまた日本語で伝えて生成してもらい、それを追加する・・・という感じで作成しました。(リクエストは英語のほうがいいらしいです。)
入力した内容は『pythonでPySimpleGUIを使用して文字列の入力を受け付けて、送信ボタンを押すと入力された文字列をopenaiを使用したAPIのリクエストに組み込むスクリプトを作成してください。入力した文字列とレスポンスの文字列は画面に表示してください。また、キャンセルボタンを押すと入力がクリアされるようにして下さい。』です。
完成したスクリプト
ということで、パーツをChatGPTに作ってもらって、修正+組み合わせで作成したPythonのスクリプトが以下になります。
import threading
import json
import requests
import wave
# pip install playsound==1.2.2を使用する
from playsound import playsound
import openai
import PySimpleGUI as sg
def create_synthesis(text, speaker=1, output_path="./output.wav"):
# 音声合成用のクエリを作成
endpoint_query = "http://localhost:50021/audio_query"
params = {
"text": text,
"speaker": speaker
}
response_query = requests.post(
endpoint_query, params=params)
# 音声合成用のクエリを使用して音声合成する
endpoint_synth = "http://localhost:50021/synthesis"
headers = {
"Content-Type": "application/json"
}
response_synth = requests.post(endpoint_synth, params=params, data=json.dumps(
response_query.json()), headers=headers)
# レスポンスから音声データを取得
audio_data = response_synth.content
# wavファイルとして保存
f = wave.open(output_path, 'wb')
f.setnchannels(1)
f.setsampwidth(2)
f.setframerate(24000)
f.writeframes(audio_data)
f.close()
# 音声再生
playsound(output_path)
# カウンター
count = 0
# OpenAI APIキーとエンジンID
openai.api_key = "API-KEY"
engine_id = "gpt-3.5-turbo"
# ウィンドウのレイアウトを定義
sg.theme('DarkTeal12')
layout = [
[sg.Text("質問を入力してください:")],
[sg.InputText(key="input", size=(100, 20))],
[sg.Button("送信"), sg.Button("キャンセル")],
[sg.Text(size=(80, 20), key="output", font=("Helvetica", 12))]
]
# ウィンドウを作成
window = sg.Window("ChatGPT 質問&回答 音声合成テスト", layout)
# イベントループを開始
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED:
break
if event == "送信":
# 入力されたテキストを取得して、APIにリクエストを送信する
input_text = values["input"]
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "あなたは賢いAIとして簡潔に答えてください"},
{"role": "user", "content": input_text}
]
)
# APIのレスポンスから回答を取得して、出力欄に表示する
count += 1
response_text = response.choices[0]["message"]["content"]
response_token = response["usage"]["total_tokens"]
window["output"].update(
f"質問: {input_text}\n\n 回答: {response_text}\n\n 合計トークン: {response_token} \n\n")
window.read(timeout=1)
# 回答の音声を合成し、再生する
output_path = "./output_" + str(count) + ".wav"
thread = threading.Thread(
target=lambda: create_synthesis(response_text, 2, output_path))
thread.start()
elif event == "キャンセル":
# 入力をクリアする
window["input"].update("")
# ウィンドウを閉じる
window.close()
解説は省きますが、コピーしてPythonコマンドで実行すれば動作します。
※API-KEYの変更が必要。実行時にVOICEVOXの起動も必要。
新しいChatGPT APIは昨日発表されたばかりなので、"gpt-3.5-turbo"を使ったスクリプトは出力できませんでした。ただ、いつかは出力できるようになると思います。
上記スクリプトの日本語コメントも自分で書いたのは2,3個だけで、あとはChatGPTが出力したままの状態です。
VOICEVOX APIはニッチすぎたのか、手動での修正が多めになってます。ただ、VOICEVOXでも以下の文章とともに近いものが出力されました。
『このスクリプトを実行する前に、VOICEVOXがインストールされ、APIサーバーが起動している必要があります。また、VOICEVOXのAPIサーバーのURLが上記のスクリプトに指定されているURLと一致していることを確認してください。』
実行
実行するとPySimpleGUI での簡単なUIが表示されます。
質問を入力するとChatGPTにリクエストを投げて応答のメッセージを受け取ります。受け取ったメッセージをローカルに立ち上げたのVOICEVOXサーバーへリクエストを投げます。VOICEVOXでは合成音声を作成して返します。最後に受け取った合成音声をWAV形式で保存し、再生して終了です。
簡単なプログラムならAIを使えばさらっと作れる時代になったようです。
さらにAIが進化すれば"従来の"プログラマーは要らなくなるのかもしれません。これからはAIに要求を上手に伝えるのも1つのスキルになっていく気がしました。
以上、ちょっとした実験結果でした。
AIを使用して生成したイラストのフリー素材サイトも作成したので興味があれば是非↓
この記事が気に入ったらサポートをしてみませんか?