GUIアプリ上で動く対話型AIメイドとその分析というコンセプトで開発しました。
今回はAmiVoiceで提供されている音声ファイルを使用し、音声認識から対話の確認・分析まで実装
マイクから音声を拾い対話する形は今後実装していきたいと思います。
おおまかな流れ
起動後右側にある再生ボタンを押すと、音声データを音声認識API「AmiVoiceAPI」に投げるようになっています。
その結果をChatGPTに投げ、返答の取得をします。
同時にMeCabによる語群化をし、word2Vecで分析、表示まで行います。
完成物
APIシーケンス図
解説
メイドの画像はStable Diffusionで生成しました。
画像の下の枠はCHatGPTからのレスポンス表示先になっています。プロンプトは下記のようにしました。
{"role": "system", "content": "You are the maid. Your answers will always be returned in Japanese. You will return in the first person as “私”."},
真ん中は音声データを元に得られたAmiVoiceAPIからのレスポンスになっています。
今回はサンプルにあったtest.wavを使用したのですが、今後はマイクから音声を拾って実際にAIメイドと対話していくような形を想定しています。
右の解析結果はレスポンスのテキストデータを分析した結果になっています。MeCabで語群化しWord2Vecでベクトル分析してます。まずテキストデータの分析結果を「音声の類似語」として表示。次に分析結果のベクトルを平均し、その結果を「平均化した類似語」として表示しています。
def analyze_response(response_text, window):
# 形態素解析して単語に分割
words = tokenize(response_text)
# Word2Vecモデルの学習
model = Word2Vec([words], vector_size=100, window=5, min_count=1, workers=4)
# 類似語を取得
similar_words = model.wv.most_similar(words[0])
# 類似語毎に改行して表示
similar_words_text = '\n'.join([f"{word}: {similarity}" for word, similarity in similar_words])
# ユーザのテキストデータのベクトル表現を取得
user_vectors = [model.wv[word] for word in words]
# ベクトルの平均化
average_vector = sum(user_vectors) / len(user_vectors)
# 平均ベクトルから類似する単語を取得
average_similar_words = model.wv.most_similar([average_vector])
# 解析ログを更新(平均化した類似語の一番上だけ表示)
average_similar_word_text = f"{average_similar_words[0][0]}: {average_similar_words[0][1]}"
window['-analyze_LOG-'].update(value=f"音声の類似語:\n{similar_words_text}\n\n平均化した類似語:\n{average_similar_word_text}\n")
感想
AmiVoiceAPIやAI含め新しいサービス・技術に触れ、少しだけ知見が深まった気がしました。