音声でChatGPTと疑似会話する環境を構築①【Python】
ChatGPTの登場以降、試してみたかった音声で ChatGPT と疑似会話するというアイデアを実行してみましたので、その備忘メモとなります。
ChatGPTは、こちらの問いかけに対して極めて自然に感じる返答をしてくれるため、ChatGPTの返答を音声で喋らせるプログラムを作れば良い感じになりそうです。(今回は喋らせるシステムとして Voicevox を利用)
また、OpenAI は ChatGPT の他にも、音声を解析して文章に書き起こす Whisper というサービスを APIで利用できるようにしているため、この API を利用するプログラムを作れば良さそうですね。
以上から、必要になる機能を以下の3段階に分割してプログラムを書いてみようと思います。
- ①文章を Voicevox に喋らせるプログラム
- ②文章を ChatGPT API へ投げて、文章の返答を得るプログラム
- ③自分が喋った音声を Whisper API へ投げて、文書に書き起こすプログラム
本記事では、まず①の部分を作成していきます。
なお、今回はローカル環境で Python (3.10.6) を用いた環境構築を前提としています。
Voicevox のダウンロード
まずは、音声で喋らせる部分の機能を担当する Voicevox をダウンロードします。
Voicevox は『ずんだもん』のキャラクターで有名な音声エンジンですが、キャラクターが付属する製品版と、キャラクターが付属しないオープンソース版が存在しています。
参考のリンクによれば、製品版とオープンソース版は中身の違いは無さそうです。
今回は上記図のうち、真ん中の音声合成エンジン部分だけを用いたいため、こちらからオープンソース版をダウンロードしてローカル環境で準備しておきます。
ダウンロードしたフォルダ内にある run.exe を起動してHTTPサーバーが立ち上がる事を確認したら、Voicevox に喋らせる準備は完了です。
Voicevox に喋らせるプログラム
Voicevox を喋らせる準備が出来たら、Python で以下のプログラムを実行します。
中身としては Voicevox への送り先情報の定義と、Voicevox に喋らせる関数を含めた『Voicevox』というクラスを定義しているのみで、以下のみを実行すると main()内に入力した文字列を音声で再生することができます。
import requests, json
import io
import wave
import pyaudio
import time
class Voicevox:
def __init__(self, host="127.0.0.1", port=50021):
self.host = host
self.port = port
def speak(self, text=None, speaker=4):
# 話し手を変える場合はspeakerのidを変更
params = (
("text", text),
("speaker", speaker)
)
# VOICEVOX API ドキュメント
# https://voicevox.github.io/voicevox_engine/api/
# http://localhost:50021/docs
init_q = requests.post(
f"http://{self.host}:{self.port}/audio_query",
params = params
)
res = requests.post(
f"http://{self.host}:{self.port}/synthesis",
headers = {"Content-Type": "application/json"},
params = params,
data = json.dumps(init_q.json())
)
# メモリ上で展開
audio = io.BytesIO(res.content)
with wave.open(audio, 'rb') as f:
# 以下は再生処理
p = pyaudio.PyAudio()
def _callback(in_data, frame_count, time_info, status):
data = f.readframes(frame_count)
return (data, pyaudio.paContinue)
stream = p.open(format = p.get_format_from_width(width = f.getsampwidth()),
channels = f.getnchannels(),
rate = f.getframerate(),
output = True,
stream_callback = _callback)
# Voice再生
stream.start_stream()
while stream.is_active():
time.sleep(0.1)
stream.stop_stream()
stream.close()
p.terminate()
def main():
vv = Voicevox()
vv.speak(text = "こんにちは")
if __name__ == "__main__":
main()
Voicevox では音声のキャラクター毎にid が振られており、音声を変更したい場合は以下で変更できます。
四国めたん
ノーマル 2
あまあま 0
ツンツン 6
セクシー 4
ささやき 36
ヒソヒソ 37
ずんだもん
ノーマル 3
あまあま 1
ツンツン 7
セクシー 5
ささやき 22
ヒソヒソ 38
春日部つむぎ
ノーマル 8
雨晴はう
ノーマル 10
波音リツ
ノーマル 9
玄野武宏
ノーマル 11
喜び 39
ツンギレ 40
悲しみ 41
白上虎太郎
ふつう 12
わーい 32
びくびく 33
おこ 34
びえーん 35
青山龍星
ノーマル 13
冥鳴ひまり
ノーマル 14
九州そら
ノーマル 16
あまあま 15
ツンツン 18
セクシー 17
ささやき 19
もち子さん
ノーマル 20
剣崎雌雄
ノーマル 21
WhiteCUL
ノーマル 23
たのしい 24
かなしい 25
びえーん 26
後鬼
人間ver. 27
ぬいぐるみver. 28
No.7
ノーマル 29
アナウンス 30
読み聞かせ 31
ちび式じい
ノーマル 42
櫻歌ミコ
ノーマル 43
第二形態 44
ロリ 45
小夜/SAYO
ノーマル 46
ナースロボ_タイプT
ノーマル 47
楽々 48
恐怖 49
内緒話 50
以上、今回は Voicevox のダウンロードと、入力した文章をVoicevox に喋らせるプログラムを作成してみました。
次回の記事はこちらから。
珈琲1杯でもおごるつもりでご支援して頂けたら大変喜びます😊