[初心者向け]Amazon Polly を使って Amazon Q を喋らせてみた #AWSreInvent

2023.12.17

こんにちは、森田です。

先日の 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 に触れることができますので、ぜひお試してください。

参考

chat_sync - Boto3