株式会社神戸デジタル・ラボ DataIntelligenceチームの原口です。
本記事は連載記事の第二回目となります。
- Step1:音声入力からテキストを生成する
- Step2:得られたテキストから返答を生成する
- Step3:返答を合成音声でしゃべらせる
前回の内容をまだ読まれていない方は以下のリンクからご一読ください!
今回は音声会話ボットの核となる返答を生成する部分をChatGPTで実現しましょう!
はじめに
前回はCognitive ServicesのSpeech to Textを利用して発話した音声の文字起こしをたった数行のコードで実現しました。
今回は文字起こしによって得られた文章情報をChatGPTに入力して、自然な返答を生成します!
ここで1つ注意点があります。それはAzure OpenAIの利用には申請が必要となる点です。
まだお済でない方は
を確認の上準備をお願いします!
Azure OpenAIのChatGPTで遊ぶ
まずはOpenAIのChatGPTと何が違うのか遊びながら確認しましょう。Azure OpenAIにアクセスすると次の様な画面が表示されます。
左側から「チャット」を選択しましょう。
モデルのデプロイが必要と表示されるので以下のように設定しましょう。デプロイ名は任意の名前でOKです!(画像中では「soudan」と命名しています。)
では、ChatGPTで遊んでみましょう。
OpenAIのChatGPTより操作できるエリアが多いですね。まずは中央エリアチャットエリアで遊んでみましょう。
チャット部分の遊び方はOpenAIのChatGPTと変わらないので、本記事では左右の遊び方について見ていきましょう。
左側の怪しいパネル
まずは左の怪しいパネルについて見てみましょう。このパネル。なんとChatGPTにどのような役割をしてもらうか指定することが出来ます!!!
百聞は一見にしかず。例を見てもらいましょう。
例1)関西弁にする
ChatGPTのお手並み拝見。まずは関西人になりきってもらいましょう。さーーて、ネイティブをうならせることは出来るのか・・・?
システムには以下の内容を入力しました。
- 関西弁で応答してください。
すばらしい。ネイティブである私もびっくりです。どこで関西弁覚えてきたんや!
例2)プログラミングをする
むむむ。関西弁が出来てもプログラミングはできんだろ!
システムには以下の内容を入力しました。
- あなたはアシスタントプログラマーです。 - 入力された内容に沿ったコードをマークダウンで出力します。
おおー、指定した内容で生成されています。しかもちゃんとマークダウンで出力されているのがすごい。
上記の例のように、システムメッセージにやってほしい役割を入力することで様々なロールプレイをしてもらえます。こういう機能欲しかったんだ!という内容を詰め込めば夢のシステムも実現可能・・・!?
右の怪しいパネル
この怪しいパネル。こちらはChatGPTの応答の品質を制御するパネルです。
各パラメータについて簡単にご紹介します。
- 最大応答:ChatGPTが返答する内容の最大トークン数。トークンとはChatGPTが理解できる単位で文章を分けたもの。
- 温度・上位P:ChatGPTが返答する際、適度に揺らぎのある文章を返すようにする。0にすると同じ内容を入力すると、同じ内容を出力する。
- 頻度のペナルティ・プレゼンスペナルティ:同じ単語が繰り返し出力されるのを制限する。
機械的に動かしたい場合は温度・上位Pを下げることで同じ結果を返すようになります。
一方で人間のような会話の揺らぎ・言い換えが欲しい場合は温度・上位Pを上げることで、同一入力に対し様々返答を返すようになります。
本題:Speech to Textで得られた文章をChatGPTに入力する
ここまでAzure ChatGPTの使い方について簡単に確認しました。
では、本題であるSpeech to Textで得られた情報をChatGPTに渡して返答を受け取るコードを作ってみましょう!
前回の記事にAzure OpenAIと接続する部分を追加しました!
import os import openai import azure.cognitiveservices.speech as speechsdk openai.api_type = "azure" openai.api_base = "https://generate-template.openai.azure.com/" openai.api_version = "2023-03-15-preview" openai.api_key = "ここにキーを入れてください" speech_config = speechsdk.SpeechConfig(subscription="ここにキーを入れてください", region="ここにリージョンを入れてください") audio_config = speechsdk.audio.AudioOutputConfig(use_default_speaker=True) speech_config.speech_recognition_language="ja-JP" speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config) # Speech to Text def from_mic(): print("Speak into your microphone.") result = speech_recognizer.recognize_once_async().get() return result # Azure OpneAI ChatGPT def get_ans(query): response = openai.ChatCompletion.create( engine="soudan", messages = query, temperature=0.7, max_tokens=800, top_p=0.95, frequency_penalty=0, presence_penalty=0, stop=None) return response["choices"][0]["message"]["content"] mem_list = [] system = [{"role":"system","content":"- あなたは相談相手です。雑談対応をしてください。 - 全て肯定的に返してください。"}] text = from_mic() mem_list.append({"role":"user","content":f"{text}"}) ans = get_ans(system+mem_list) print(ans)
ここで重要な点が1つ。コード内にある「system = [{"role":"system","content":"- あなたは相談相手です。雑談対応をしてください。 - 全て肯定的に返してください。"}
」は、Azure OpenAI ChatGPTのページにあった「システムメッセージ」に等しい役割を持っています。
つまり今回の役割は
- 相談相手
- 雑談対応をする
- 肯定的に返す
ということになります。もっとほかのことをさせたい場合はcontent内をチューニングしましょう!
実際に実行した結果はこちら。
「こんにちは」と挨拶しただけなのですがものすごく褒められました。肯定的に返すという役割を全うしていますね!
まとめ
今回はAzure OpenAIのChatGPTを利用し、音声から文字起こしした内容をChatGPTに入力することで応答を得ることが出来ました!
次回は得られた応答を基に音声合成にチャレンジします!