[初心者向け]Amazon Polly を使って Amazon Q を喋らせてみた #AWSreInvent
こんにちは、森田です。
先日の re:Invent2023 で Amazon Q のプレビュー提供が発表されましたが、みなさん試してみましたか?
本記事では、 Amazon Q をざっくりと試していきますので、ぜひ初めての方はみていってください。
本記事のゴール
Amazon Q を Python(boto3) から呼び出しを行います。
また、せっかくなので、Amazon Polly を使って Amazon Q のテキスト読み上げを行い、会話できるようにしていきます。
音声をテキストに変換する処理については、以下の記事と同様に Whisper を使います。
構成
以下のような構成で作成していきます。
やってみる
事前準備
APIキーの取得
OpenAI社のAPIを利用しますので、API キーの準備を行います。 APIキーの取得については以下の記事をご参考ください。
Amazon Q アプリケーションの作成
AWSマネジメントコンソールから Amazon Q アプリケーションの作成を行います。
基本的にデフォルトの設定値で作成まで進めていきます。
作成完了後、アプリケーションの詳細から、Application ID(アプリケーションID)をメモしておきます。
続いて、Admin controls and guardrailsからRAG以外についても回答できるように設定しておきます。
以下よりEditを選択します。
チェックを外して、Saveを選択します。
Amazon Q ユーザの作成
Amazon Q アプリケーションを実行するためには、ユーザが必要なため AWS CLI から作成を行います。
APPIDには、先ほど作成した Amazon Q アプリケーションID、Mailには作成するユーザのメールアドレスを入力してコマンドの実行を行います。
aws cli create-user --application-id APPID \ --user-id Mail
以上で、前準備は終了です。
今度は、ローカルの実行環境でコードの作成・実行を行なっていきます。
実行環境
以下の環境で行います。
- Python 3.11.6
boto3==1.33.2 playsound==1.3.0 SpeechRecognition==3.10.1 openai==0.28
コードの作成
以下のコードを準備します。
import boto3 import playsound import speech_recognition as sr import openai from contextlib import closing import uuid APIKEY = "" # APIKEYには、発行したAPIキーを記載してください APPID = "" # APPIDには、Amazon Q アプリケーションIDを記載してください USERID = "" # USERIDには、作成したユーザのメールアドレスを記載してください params = { "applicationId":APPID, "userId":USERID, } openai.api_key = APIKEY r = sr.Recognizer() polly = boto3.client("polly") q_client = boto3.client('qbusiness', region_name="us-east-1") def voice_to_text(): with sr.Microphone() as source: print(">なにか話してください") audio = r.listen(source) return r.recognize_whisper_api(audio, api_key=APIKEY) def create_text(messages): print("考え中...") params["userMessage"] = messages response = q_client.chat_sync(**params) # 前の情報を保存 params["conversationId"] = response["conversationId"] params["parentMessageId"] = response['systemMessageId'] return response def text_to_voice(text): mp3_path = "./speech.mp3" response = polly.synthesize_speech( Engine='neural', Text = text, OutputFormat = "mp3", VoiceId = "Tomoko" ) audio_stream = response.get("AudioStream") if audio_stream : with closing(audio_stream) as stream: with open(mp3_path, "wb") as file: file.write(stream.read()) playsound.playsound(mp3_path) messages = [] while True: text = voice_to_text() if text == "": continue print("you:", text) response = create_text(text) response_text = response['systemMessage'] print("Amazon Q:",response_text) text_to_voice(response_text)
コードを変更する箇所
以下の箇所には、前準備で取得した情報を記載してください。
APIKEY = "sk******" # APIKEYには、発行したAPIキーを記載してください APPID = "ab207544-f334-4fcb-b1ae-2ed75e1aea57" # APPIDには、Amazon Q アプリケーションIDを記載してください USERID = "*****" # USERIDには、作成したユーザのメールアドレスを記載してください
Amazon Q へのリクエスト
以下の箇所で Amazon Q との会話処理を行っています。
userMessageは、ユーザから入力されたメッセージを動的に代入しており、2回目以降については、conversationIdを指定することで、以前の会話情報も考慮するようになっています。
def create_text(messages): print("考え中...") params["userMessage"] = messages response = q_client.chat_sync(**params) # 前の情報を保存 params["conversationId"] = response["conversationId"] params["parentMessageId"] = response['systemMessageId'] return response
動作を試してみる
実行すると、以下のように Amazon Q と実際に会話することができます。
さいごに
Python を使って Amazon Q と会話を行ってみました。
当初は、Amazon Transcribeを使って、すべてAWSサービスで実現させるつもりでした。
うまくいかなかったため、OpenAIのWhisperを使うことで、当初やりたかったAmazon Qとの会話は何とか実現できました。
Amazon Qは現在プレビュー中なので、APIの仕様変更が行われる可能性はありますが、ざっくりと Amazon Q に触れることができますので、ぜひお試してください。