Alexa × OpenAI API で自家製アプリを書いた話
— Diary — 5 min read
Alexa × OpenAI API で自家製アプリを書いた話
はじめに
Amazon Echo Show を使っていてずっと感じていたのが,標準の検索機能の精度の悪さだった. 特に以下のようなケースで不満が多かった:
- 「これって英語でなんて言うの?」と聞いても大体「よくわかりませんでした」
- 「この言葉,漢字でどう書くの?」と尋ねても「すみません,うまく聞き取れませんでした」
- たまに成功しても,謎のまとめサイトの情報を朗読されるだけで終わる
なら実利も兼ねて自分で作ってみるか,となった.
システム構成
技術スタック
- AWS Lambda(Node.js 20)
- Alexa Developer Console(スキル定義)
- OpenAI API(
gpt-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 を日常的に使っているうちの子たちにも使っていただきたい.