本文へスキップ
CALL ME STUPID
戻る

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

はじめに

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

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

システム構成

技術スタック

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

Alexa スキルと Lambda の接続

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

実装上の注意点

スキルの起動名は地獄

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

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

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

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

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

OpenAI API の利用

モデル選定と精度

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

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

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

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

こういった 固有名詞 + 架空要素 に強くなるには,やはり 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,
});

意識したのは以下の点:

おわりに

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

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



前の記事
作ったもの(2025-04)
次の記事
PRは依頼か