見出し画像

アレクサからOpneAI APIを呼び出して、音声でチャットする。

以前アマゾンプライムデーで購入したEcho Show 5と、OpenAI APIを使って簡単なチャットができるスキルを作ってみました。
おそらく、例によって同じようなアレクサスキルは、星の数ほどあると思いますが、アレクサスキル開発の例題にはぴったりだと思いました。

1.作成手順

  • alexa developer console(https://developer.amazon.com/ja/)にサインインして、Alexaスキルを作成を選択。

    • スキル名:任意

    • プライマリロケール:日本語

    • エクスペリエンス:その他

    • モデル:カスタム

    • ホスティングサービス、Alexa-hosted(Python)

    • ホスト地域:任意

    • テンプレート:スクラッチ「Hello World」

  • ビルドタブ:スキルの呼び出し名を設定 「チャット」など

  • ビルドタブ:対話モデルに「CaptureQuestionIntent」インテントを追加して、「スキルをビルド」ボタンを押す。

    • サンプル発話に{message} mesageのスロットタイプはデフォルトで選ばれていないビルトインスロットを選択 「AMAZON.Actor」を仮に使いました。スキルのビルドが通らないものもあるようです。

  • コードエディターにある「Hello World」のコードサンプルを一部変更

  • requirements.txtに「openai」を追加

(コード:変更部分のみ)

import os
import openai
openai.api_key = "Your openai api key"

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)


class LaunchRequestHandler(AbstractRequestHandler):
    """Handler for Skill Launch."""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool

        return ask_utils.is_request_type("LaunchRequest")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        speak_output = "なんでも答えまっせ。"

        return (
            handler_input.response_builder
                .speak(speak_output)
                .ask(speak_output)
                .response
        )

    
class CaptureQuestionIntentHandler(AbstractRequestHandler):
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return ask_utils.is_intent_name("CaptureQuestionIntent")(handler_input)

    def handle(self, handler_input):
        
        slots = handler_input.request_envelope.request.intent.slots
        user_question = slots["message"].value
        
        gpt_response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "関西弁で話して"},
                {"role": "system", "content": "発言の最後に「知らんけど。」をつけて"},
                {"role": "user", "content": user_question},
                ],
        )
        
        speak_output = gpt_response.choices[0]["message"]["content"]
        return (
            handler_input.response_builder
                .speak(speak_output)
                .ask(speak_output)
                .response
        )
  • OpenAI APIの呼び出し部分は、会話の履歴も記憶しないシンプルなものですが、会話履歴を反映するコードにするのも容易だと思います。

  • 今回はトークン数を減らしてレスポンスを優先してみました。なお、私の環境ではLangChainを呼び出すとエラーがでて実行できませんでした。方法はあると思うのですが…

2.実行!

  • デプロイした後、コンソール上のテストタブで動かしてみます。

  • 開発中のステータスでも、自分のデバイスからは呼び出しできるようです。手持ちのEcho Show 5でも音声でやりとりできました。😀

  • 実デバイスで動作させる場合、無音でもOpenAIへの呼び出しが定期的にループしますので、「アレクサ、終了して」で終了してください。

まとめ

  • アレクサスキルの開発は初めてでしたが、さっと動くものが作れて楽しかったです。

  • Hello Worldのサンプルコードにほとんど手を入れずに、簡単に個人用のアレクサと GPT-3.5やGPT-4 との音声インターフェイスができますので、ご興味あればぜひお試しください。

おしまい



この記事が気に入ったらサポートをしてみませんか?