Skip to content
CALL ME STUPID
TwittergithubnotezennQiita

Alexa × OpenAI API で自家製アプリを書いた話

Diary5 min read

Alexa × OpenAI API で自家製アプリを書いた話

はじめに

Amazon Echo Show を使っていてずっと感じていたのが,標準の検索機能の精度の悪さだった. 特に以下のようなケースで不満が多かった:

  • 「これって英語でなんて言うの?」と聞いても大体「よくわかりませんでした」
  • 「この言葉,漢字でどう書くの?」と尋ねても「すみません,うまく聞き取れませんでした」
  • たまに成功しても,謎のまとめサイトの情報を朗読されるだけで終わる

なら実利も兼ねて自分で作ってみるか,となった.

システム構成

技術スタック

  • AWS Lambda(Node.js 20)
  • Alexa Developer Console(スキル定義)
  • OpenAI APIgpt-3.5-turbo 使用)
  • Terraform(インフラ構築)
  • lambroll(Lambda のデプロイ)
  • Cursor(コード生成支援)

いずれも比較的ライトな構成で,自宅用スキルとして十分なスケール. Terraform は(仕事で何年も使ってるのに)まともに書けないので,ほとんど Cursor にお任せした.

Alexa スキルと Lambda の接続

Alexa Developer Console 側で Alexa Hosted Skill を使わず,Lambda の ARN を指定するだけで連携できるので,想像以上に簡単だった.Skill としては Custom Type + 日本語言語モデルを使用.

実装上の注意点

スキルの起動名は地獄

Alexa では,スキル起動時の呼びかけ(LaunchRequest)の処理がとにかく鬼門だった.

例えばスキル名を「はるか」にした場合:

  • ユーザーが「アレクサ,はるかを開いて」と言うと,Alexa 側で
    • 「遥か」
    • 「春香」
    • 「遥」 などに変換された上でスキル名と照合される

この際,「はるか」≠「遥か」となり,スキルが起動しないという問題が多発した. 自宅用スキルなので,Publishing 時にあるような追加の Slot 補正も使えず,スキル名そのものを工夫するしかない.

解決策:カタカナ語は強い

最終的にはスキル名を「モンブラン」にした.これはカタカナ語なので,音声からの文字変換でも非常に高精度でヒットする.
結果,「アレクサ,モンブランを開いて」でほぼ確実にスキルが起動するようになった.

OpenAI API の利用

モデル選定と精度

今回はコスト重視で gpt-3.5-turbo を使用した:

  • 単語・短文の翻訳用途では十分
  • API 価格も非常に安い(1k tokens あたり $0.0015)

しかし以下のような限界もある:

「アナハイム・エレクトロニクス」って英語でなんて言うの?

→ 実在の会社として解釈され,現実のエレクトロニクス企業を返す始末.

こういった 固有名詞 + 架空要素 に強くなるには,やはり gpt-4o のような高精度モデルの使用も検討すべきかもしれない.
お金があればね

実際のプロンプト例

スキル内部では,以下のような形で OpenAI API に問い合わせを行っている:

const completion = await openai.chat.completions.create({
model: "gpt-3.5-turbo",
messages: [
{
role: "system",
content:
"あなたは日英翻訳の専門家です。日本語の語句を英語に自然な形で翻訳してください。短く簡潔に、1行の翻訳だけを返してください。",
},
{
role: "user",
content: `${phrase}」は英語で?`,
},
],
max_tokens: 60,
temperature: 0.2,
});

意識したのは以下の点:

  • 1 行の翻訳のみを返させる(Alexa の読み上げとして冗長にしない)
  • temperature を下げてブレを抑える

おわりに

プロトタイプ(AWS console 上で直 js 書いてデプロイ)まで手でやって,ワンパス通ったらあとは全部それを入力に Cursor に全投げした.
ので,かなりあっさりそこそこ動く感じになった.非常に楽でよいですね.
せっかく作ったので,Alexa を日常的に使っているうちの子たちにも使っていただきたい.

リポジトリはここ
https://github.com/youknowcast/montblanc