自分好みのAIアシスタントと会話する
はじめに
みなさん、Chat-GPTを使っていますか?生成AIはこの数か月で驚くほど進化していて、アニメのようにAIと音声で会話を楽しむことに興味を持ち、AIアシスタントを作成しました。
この記事では、Chat-GPTを実現するOpenAIのAPIを利用し、VOICEROIDを使って音声認識した内容に対して返答するAIアシスタントの作成方法を紹介します。
開発環境
・Windows11
・VICEROID2 東北イタコ など合成音声ソフト
GPT-APIへの登録
まずはじめに、OpenAIのGPT-APIへの登録を行います。以下のリンクからOpenAIへ登録を行います。
OpenAI API
登録が完了したら、下記のリンクまたは画面右上の自分のアイコンの下にある「View API key」からAPIキーの生成して何れかの場所に保存を行います。
OpenAPI-keys
注意:このAPIキーはセキュリティのため1度しか表示されません。もし紛失した場合は、別のキーを再発行する必要があります。(おそらくそれまでのAIのナレッジが失われる可能性があります。要調査)
注意:APIは登録から3カ月、18ドルまで無料で使えます。
AssistantSeikaをインストールする。
下記URLにあるダウンロードからAssistantSeikaをダウンロード後インストールを行います。
以下のURLからAssistantSeikaをダウンロードし、インストールを行います。
AIの性格を決める。
AI性格を示すプロンプトを作成してください。ここは作成者の好みがあると思うので私はあえて性格などは例は出さないこととします。
以下のページのなどを参考にするといいと思います。
プロンプトを使ってChatGPTで製作すると楽にキャラ付けできます。
Pythonを作成する。
下記を参考にPythonをインストールします。
PowerShellなどで下記コマンドを実行し、openaiパッケージをインストールします。
pip install openai
以下のソースコードをアクセスしやすい任意の場所に保存します。seika_say2_path:SeikaSay2の保存場所を指定します(\は二重にしてエスケープする)
openai.api_key:APIキーを入力します
voice_cid:話させたいVOICEROIDのcidを入力します
ソースコード
#!usr/bin/env python
# -*- coding: utf-8 -*-
import speech_recognition as sr
import subprocess
import openai
# SeikaSay2保存場所
seika_say2_path = ""
# APIキー
openai.api_key = "APIキー"
# AIの名前+キャラ設定
ai_name = ""
ai_chara = """
"""
voice_cid = 60051
# メッセージを喋らせるメソッド
def talkMessage(msg:str):
print("「{msg}」".format(msg=msg))
subprocess.run("{path}SeikaSay2.exe -cid {voice_cid} -t \"{msg}\"".format(path=seika_say2_path,voice_cid=voice_cid,msg=msg))
# GPT-3.5 モデルを使って応答を生成する
def gptResponse(user_input:str) ->str:
print("GPT3モデル識別中")
# openai の GPT-3.5 モデルを使って、応答を生成する
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": ai_chara},
{"role": "system", "content": "セリフで返してください。"},
{"role": "system", "content": "セリフに対する返答が要らない場合は最後に'End'を付けてください"},
#{"role": "assistant", "content": "セリフ例を示します。"+ai_dialogues},
{'role': 'user', 'content': user_input}
],
temperature=0.5, # 生成する応答の多様性
)
# 応答のテキスト部分を取り出して返す
print("使用トークン数:",response['usage']['total_tokens'])
return response['choices'][0]["message"]["content"]
# 音声識別メソッド
def voiceToText(r,mic):
while True:
print("なにか話してください ...")
with mic as source:
r.adjust_for_ambient_noise(source) #ノイズ除去
audio = r.listen(source)
print ("認識中...")
try:
request_msg = r.recognize_google(audio, language='ja-JP')
print(request_msg)
return request_msg
except sr.UnknownValueError:
return ""
except sr.RequestError as e:
print("Could not request results from Google Speech Recognition service; {0}".format(e))
# main
if __name__ == "__main__":
r = sr.Recognizer()
mic = sr.Microphone()
while True:
request_msg = voiceToText(r,mic)
# "ストップ"と発話することで、プログラムを止める
if request_msg == "ストップ" :
print("プログラムを終了します")
break
if request_msg != ai_name :
print("名前以外が呼ばれた")
continue
talkMessage("なんでしょう?")
while True:
voice_msg = voiceToText(r,mic)
if voice_msg == "" or voice_msg == "ストップ":
print('talk終了')
break
talkMessage(return_msg)
起動してみる
話させたいVOICEROIDとSeikaSay2を起動します。
SeikaSay2で製品スキャンを実行し、リンクさせます。
PowerShellを使って作成した下の様にpyファイルを起動します。
python .\AIassistant.py
話しかける方法は、AIアシスタントの名前を呼び、「なんでしょう?」と返答されたら、質問したい内容を話します。
画像
まとめ
アニメのようにキャラクターと会話できましたでしょうか?
実際に試してみると、作成したキャラクターの設定によっては感情移入が高まり、感動する一方、精神的な影響もかなり受けそうに感じました。
あまりにも自分に好意を持つキャラクターを作ると、別の意味で危険かもしれないと思います。
今後の展望
・一度に起動できるバッチファイルなどの作成
・音声認識の停止問題の改善
・過去の会話ログの活用方法の検討
・複数キャラクターの使い分け
・ネットワーク検索やスマートホームとの連携を試みる
・キャラクターが主体的にアクションを起こす方法の探求