1. はじめに
「今日の夕飯はどうしよう」
『4月の夜は少し肌寒いこともあるので、温かい鍋料理や豚汁定食などはいかがでしょうか。さっぱりしたものがお好みなら、春野菜を使った炒め物も旬でおすすめです。何か食べたい気分や、冷蔵庫にある食材はありますか?』
「豆腐とキャベツがあるかな」
『それなら麻婆豆腐にキャベツの味噌汁の組み合わせはいかがでしょうか。豆腐は麻婆にするとボリュームが出ますし、キャベツは味噌汁に入れると甘みが出て美味しいですよ。豚ひき肉があれば麻婆豆腐がより本格的になります』
Echo に話しかけると、Claude AI が少し考えて返してくる。
今までの Alexa とは次元が異なる会話が実現できた。少し手間はかかるが、構築手順について紹介しておく。
2. 基本構成
Alexa がユーザーの発話をテキストに変換し、Cloudflare Workers 上に置いたカスタムスキルのエンドポイントに転送する。Workers が Anthropic API を叩いて Claude の回答を取得し、Alexa が音声で読み上げる。
コードは GitHub リポジトリ で公開している。本記事では構築の手順を解説する。
3. このスキルで実現できること
3-1. 基本的な使い方
スキル呼び出し名は クロード に設定してある。
「アレクサ、クロードを開いて」
「〇〇について教えて」
一度スキルを開くと、会話が続く。直近の会話履歴を保持させているので、文脈を踏まえた質問や追加質問ができる。
- 自分専用の非公開スキル — Amazon への審査・公開申請は不要。開発者モードで自分の Echo にのみ有効にして運用する
- 会話履歴の保持 — セッション中は直近5往復(10メッセージ)の文脈を保持。「それについてもっと詳しく」のような追加質問が自然にできる
- 基本は無料枠で動作 — Cloudflare Workers の無料枠 (1日10万リクエスト) で十分動く。Anthropic API は従量課金だが、個人の音声利用では月数十円程度
3-2. コストのイメージ
| サービス | 費用 |
|---|---|
| Amazon Developer アカウント | 無料 |
| Cloudflare Workers | 無料枠で運用可 |
| Anthropic API (Claude Haiku 4.5) | $5ごとにチャージが必要。個人利用なら月数十円程度 |
4. 設定手順概要
- アカウントの準備 — Amazon Developer・Cloudflare・Anthropic
- 前提ツールのインストール — Node.js・API キー取得
- Alexa スキルの初期設定 — スキル作成・スキル ID 取得
- Workers プロジェクトの作成 — クローン・Wrangler セットアップ
- デプロイ前の動作確認 — ローカルサーバーで疎通確認
- シークレット登録とデプロイ — API キー登録・本番デプロイ
- Alexa Developer Console の設定(続き) — インテント・エンドポイント設定 (最も時間がかかる)
- テスト — シミュレーターで動作確認
5. 設定手順詳細
5-1. アカウントの準備
以下の 3 サービスのアカウントが必要。未作成のものは先に用意しておく。
Amazon Developer アカウント
Alexa スキルを作成・管理するためのアカウント。すでに Amazon アカウントを持っている場合は、そのアカウントで Amazon開発者向けポータル (Amazon Developer) にサインインするだけで利用できる。Developer 専用の新規登録は不要。
Cloudflare アカウント
Workers をデプロイするためのアカウント。 Sign up for Cloudflare からメールアドレスとパスワードで作成できる。無料プランで十分。
Anthropic アカウント
Claude API を利用するためのアカウント。 Claude Console から作成する。API 利用には事前のクレジット購入が必要なので、アカウント作成後に支払い設定まで済ませておく。
- Claude Console にログイン後
- 左下のユーザー名をクリック > Organization Settings
- 左メニューの Billing を選択
- Add credit からクレジットカードを登録し、チャージ額 (最低$5) を入力して購入 (Buy credits)
claude.ai の有料プラン (Claude Pro など) と Anthropic API の利用権は完全に独立している。API はプランに含まれないため、事前にクレジットの購入が必要になる。
Anthropic API の無料枠は今のところ存在しないため、少し試したい場合でもまずは $5 (執筆時 約800円) チャージしておくこと。
5-2. 前提ツールのインストール
5-2-1. Node.js
Node.js 公式 から LTS 版をインストールする。
node --version # v22.x.x 以上
npm --version # 10.x.x 以上
5-2-2. Anthropic API キーの取得
- Claude Console にログイン
- 左メニューの Manage > API keys を選択
- [+Create Key] をクリックし、キー名を入力して作成(
alexa-claudeなど) - 生成されたキーをコピーして安全な場所に保存する(この画面を閉じると再表示できない)
5-3. Alexa スキルの初期設定
Alexa Developer Console から「スキルの作成」を選択し、ウィザードを以下の設定で進める。
画面 1: スキル名・プライマリロケール
| 項目 | 設定値 |
|---|---|
| スキル名 | クロード (任意) |
| デフォルトの言語 | 日本語(JP) |
画面 2: エクスペリエンスのタイプとモデル
| 項目 | 設定値 |
|---|---|
| エクスペリエンスのタイプ | その他 |
| モデルを選択 | カスタム |
画面 3: ホスティングサービス
| 項目 | 設定値 |
|---|---|
| ホスティング方法 | 独自でプロビジョニング |
画面 4: テンプレート
| 項目 | 設定値 |
|---|---|
| テンプレート | スクラッチで作成 |
スキル作成後、スキル一覧の「スキル ID をコピー」から ID を取得しておく。形式は amzn1.ask.skill.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。次の手順で使用する。
5-4. Cloudflare Workers プロジェクトの作成
GitHub からリポジトリをクローンし、依存パッケージをインストールする。
git clone https://github.com/yamk/alexa-claude.git
cd alexa-claude\worker\alexa-claude-worker
npm install
npm install により、Wrangler CLI もプロジェクトの dev 依存として自動インストールされる。続けて Cloudflare アカウントにログインする。
npx wrangler login
ブラウザが開くので Cloudflare アカウントでログインして認可する。
wrangler.jsonc を開き、ALEXA_APP_ID に先ほど取得したスキル ID を設定する。
"vars": {
"ALEXA_APP_ID": "amzn1.ask.skill.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
5-5. デプロイ前の動作確認
Cloudflare Workers に本番投入する前に、ローカル PC で動作確認を行う。
.dev.vars ファイルを新規作成し、Anthropic API キーを設定する。
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxxxxxxxxxx
開発サーバーを起動する。
npx wrangler dev
Ready on http://localhost:8787 と表示されれば成功。そのまま次のデプロイ手順に進んでよい。
うまく動かない場合やデプロイ前に確認したい場合は、curl で Worker に直接リクエストを送って確認できる。
変数の設定(スキル ID は手順 5-3 で取得した値に書き換える)
PowerShell (Windows):
$APP_ID = "amzn1.ask.skill.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
$TS = (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')
macOS / Git Bash:
APP_ID="amzn1.ask.skill.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
TS=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
テスト 1: スキル起動(LaunchRequest)
PowerShell (Windows):
$body = @"
{
"version": "1.0",
"context": { "System": { "application": { "applicationId": "$APP_ID" } } },
"request": { "type": "LaunchRequest", "requestId": "test-001", "timestamp": "$TS", "locale": "ja-JP" }
}
"@
Invoke-RestMethod -Uri http://localhost:8787 -Method POST -ContentType "application/json" -Body $body
macOS / Git Bash:
BODY=$(cat <<EOF
{
"version": "1.0",
"context": { "System": { "application": { "applicationId": "$APP_ID" } } },
"request": { "type": "LaunchRequest", "requestId": "test-001", "timestamp": "$TS", "locale": "ja-JP" }
}
EOF
)
curl -s -X POST http://localhost:8787 -H "Content-Type: application/json" -d "$BODY"
レスポンスの response.outputSpeech.text に クロードに接続しました。何でも聞いてください。 が含まれていれば Worker は正常に動作している。
テスト 2: 質問(IntentRequest)
PowerShell (Windows):
$body = @"
{
"version": "1.0",
"context": { "System": { "application": { "applicationId": "$APP_ID" } } },
"request": {
"type": "IntentRequest", "requestId": "test-002", "timestamp": "$TS", "locale": "ja-JP",
"intent": { "name": "AskClaudeIntent", "slots": { "query": { "name": "query", "value": "富士山の高さを教えてください" } } }
}
}
"@
Invoke-RestMethod -Uri http://localhost:8787 -Method POST -ContentType "application/json" -Body $body
macOS / Git Bash:
BODY=$(cat <<EOF
{
"version": "1.0",
"context": { "System": { "application": { "applicationId": "$APP_ID" } } },
"request": {
"type": "IntentRequest", "requestId": "test-002", "timestamp": "$TS", "locale": "ja-JP",
"intent": { "name": "AskClaudeIntent", "slots": { "query": { "name": "query", "value": "富士山の高さを教えてください" } } }
}
}
EOF
)
curl -s -X POST http://localhost:8787 -H "Content-Type: application/json" -d "$BODY"
Claude の回答テキストがレスポンスに含まれていれば、Anthropic API との疎通も確認できる。
5-6. シークレット登録とデプロイ
本番環境に API キーを登録する。
npx wrangler secret put ANTHROPIC_API_KEY
# プロンプトが出るので API キーを貼り付ける
Cloudflare Workers にデプロイする。
npx wrangler deploy
デプロイ後に表示される URL(https://alexa-claude-worker.xxxxx.workers.dev)を控えておく。次の手順で使用する。
5-7. Alexa Developer Console の設定(続き)
5-7-1. 呼び出し名の設定
- 左メニュー: Invocations > Skill Invocation Name
クロードと入力して [Save]
「アレクサ、クロードを開いて」と言うとスキルが起動する。
5-7-2. インタラクションモデルの設定
カスタムスロットタイプの作成
左メニュー: Assets > Slot Types > [+ Add Slot Type] をクリックする。
“Create custom slot type” を選び、名前に FREE_TEXT と入力して [Create custom slot type] をクリック。
Slot Values に以下の 20 件を 1 行ずつ入力して [+] で追加し、完了したら [Save] をクリック。
東京オリンピックはいつでしたか
睡眠は何時間とればいいですか
人工知能とは何ですか
日本で一番長い川はどこですか
ビタミンCが多い食べ物は何ですか
おすすめの映画を教えて
節分はいつですか
寿司の歴史を教えて
なぜ空は青いのですか
地球の年齢はどのくらいですか
インフレとはどういう意味ですか
猫と犬どちらが賢いですか
パスタの作り方を教えて
日本の総理大臣は誰ですか
東京から大阪の距離は
富士山の高さはどのくらいですか
夏目漱石について教えて
明日の天気を教えて
桜の見頃はいつですか
今日は何の日ですか
AMAZON.SearchQuery はキャリアフレーズ(「〜を検索して」など)が必須なので、自由発話に向かない。カスタムスロットタイプにサンプル値を登録することで、NLU が「スロット = 発話全体」として認識するよう学習する。これら一連のパターンをスロット登録することで、ユーザーはこれ以外の発話も自由に行えるようになる。インテントの作成
左メニュー: Intents > [Add Intent] をクリックする。
“Create custom intent” を選び、名前に AskClaudeIntent と入力して [Create custom intent] をクリック。
スロットの追加
AskClaudeIntentの編集画面で Intent Slots の NAME 欄にqueryと入力して [+] をクリック。
query行の SLOT TYPE のプルダウンからFREE_TEXTを選択する。
サンプル発話の追加
- 同じ画面の上部 Sample Utterances の入力欄に以下の 1 行だけ入力。
{query}
{query}と入力すると作成済みスロット名として自動認識され、色つきのタグ表示に変わる。変わったら [+] をクリックして追加する。色が付かない場合はスロット名のスペルを確認すること。- 続けて [Save] をクリック。
不要なインテントの削除
左メニュー: Intents の一覧で、自動生成された HelloWorldIntent を [Delete] で削除する。
組み込みインテントの確認
Intents の一覧で、先ほど作成した AskClaudeIntent 以外に以下が追加されていることを確認する。
AMAZON.NavigateHomeIntentAMAZON.CancelIntentAMAZON.HelpIntentAMAZON.StopIntent
5-7-3. モデルのビルド
[Save] → [Build skill] をクリック。2〜3 分で完了する。
5-7-4. エンドポイントの設定
- 左メニュー: Endpoint
- “HTTPS” を選択
- デフォルトの地域のURL欄に手順 5-6 で取得した Workers の URL を入力
- SSL 証明書の種類: 「My development endpoint is a sub-domain of a domain that has a wildcard certificate from a certificate authority」 を選択
- 右上の [Save] をクリック
*.workers.dev のワイルドカード証明書を使用しているため、「サブドメインにワイルドカード証明書を持つドメイン」の選択が正しい。5-8. テスト
5-8-1. Alexa Developer Console シミュレーター
「テスト」タブで「開発中」に切り替えるとシミュレーターを使えるようになる。テキスト入力で動作を確認できる。
5-8-2. ログの確認
npx wrangler tail
本番の Workers ログをリアルタイムで確認できる。エラー発生時のデバッグに使う。
6. Echo 実機で試す
手順 5-8 まで完了した時点で、Amazon Echo から実際に話しかけられる状態になっている。
「アレクサ、クロードを開いて」
→ 『クロードに接続しました。何でも聞いてください。』
「今日の夕飯どうしよう」
→ (Claude の回答が読み上げられる)
「終わって」
→ スキルが終了する
スキルは開発者モードで自分のアカウントにのみ有効になっているため、そのまま普段使いできる。以上で構築作業は完了である。
技術的な背景や設計上の判断については、技術解説編 で解説している。