こんにちは、森田です。
先日の 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
コードの作成
以下のコードを準備します。
hello-q.py
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 に触れることができますので、ぜひお試してください。