はじめに
私はIoT機器が好きで、自宅でもAlexaを活用しています。
Alexaに話しかけた内容を自動でメールに送る仕組みができないかとふと思いつき、色々調べてやってみました。
その結果、「Alexa、マイメモで明日買い物に行きますよを送って」と話しかけるだけで、自分のメールに「明日買い物に行きますよ」というメモが届くようになりました。
この仕組みを応用すれば、他にも色々なことができるのではないかと考えています。例えば、Alexaに話しかけて、親友や家族に簡単な定型文やメッセージを送ることなども可能になります。
今回は、Geminiさんに聞きながら、こういう仕組みを作ってみました。自分へのメモとして構築手順を残したいと思います。
構築手順
前提
- AWSアカウントの作成が完了したこと
- Alexaアカウントの作成が完了したこと
手順
1. Amazon SES(メール送信サービス)の準備
概要:
メールを送るための「送信元」と「送信先」をAWS上で許可する。今回は練習のため、送信元と送信先を同じメールアドレスにする。
操作手順:
- AWSコンソールで「Amazon SES」を開き、「使用を開始」をクリックする
- 左上、三本線メニューの「設定」→「ID」をクリックし、「IDの作成」をクリックする
- 「Eメールアドレス」を選択し、自分のメールアドレスを入力する(※他の設定はデフォルトで問題なし)
- 「IDを作成」をクリックし、入力したアドレスに確認メールが届くので、リンクをクリックして承認する
- Amazon SESのIDステータスが「検証済み」になったことを確認
2. Alexa Developer Consoleでスキルを作成する
概要:
Alexa Developer Consoleは、Alexaスキル(Alexa向けのアプリケーション)を作成し、管理するためのAmazon提供のWebベースの統合開発環境である。
これは、Alexaに話しかけた内容をメールとして受け取る「マイメモ」スキルのような、音声入力を処理する仕組みを設計・設定するために利用される。
操作手順:
-
「スキルの作成」をクリック
-
スキルの設定画面に遷移されて、詳細を設定する
- 左メニューから「対話モデル」(Interraction model)→「インテント」(Intents)→「インテントを追加」(+ Add Intent)をクリック
- カスタムインテント名(Create custom intent): MemoIntent と入力して作成
- 画面下の「インテントスロット」セクションで、新しいスロット MemoContent を追加+
- スロットタイプ: AMAZON.SearchQuery を選択
- サンプル発話(Sample Utterances)を登録
- {MemoContent}を送って
- メモ{MemoContent}
- 「モデルを保存(Save)」し、画面を閉じずに一旦放置する
3. AWS Lambda(処理実行)の作成
概要:
サーバーレスでコードを実行する部分になる。関数の作成、コードの実装と権限付与の必要がある。話した内容を抽出とメール送信の役割を担う。
操作手順:
-
AWSコンソールで「Lambda」を開き、「関数の作成」をクリック
-
Lambda設定:
- 関数名: AlexaToEmailFunction (任意)
- ランタイム: Python 3.9 (または最新)
- アーキテクチャ: x86_64
- 「関数の作成」ボタンを押して作成完了まで待つ
-
権限設定(IAMロール)
※ LambdaがSESを使ってメールを送れるように権限を付与する。- 作成したLambda関数の「設定」タブ -> 「アクセス権限」 -> 実行ロール名をクリック(IAMコンソールが開く)
- 「許可を追加」 -> 「ポリシーをアタッチ」を選択
- 検索窓に AmazonSESFullAccess と入力し、チェックを入れて「許可を追加」をクリック
※ 本番運用時はFullAccessではなく、特定の送信権限のみに絞るのがベストプラクティスだが、今回は練習のためFullAccessで進む
-
コードの実装
Lambdaの「コード」タブに戻り、lambda_function.py に以下のコードを貼り付けて「Deploy」する
import json
import boto3
import datetime
from botocore.exceptions import ClientError
# ▼▼▼ 設定エリア ▼▼▼
SENDER = "あなたのメールアドレス@example.com" # Step1で認証したアドレス
# TO: 主な宛先(リスト形式)
TO_LIST = [
"あなたのメールアドレス@example.com" # Step1で認証したアドレス
]
# CC: 共有したい宛先(リスト形式)
CC_LIST = [
# "boss@example.com", # ← 必要ならコメントを外してアドレスを書く
]
# BCC: こっそり送りたい宛先(リスト形式)
BCC_LIST = [
# "secret@example.com",
]
# ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
AWS_REGION = "ap-northeast-1" # リージョンを一致する必要がある
def lambda_handler(event, context):
print("Event:", json.dumps(event))
request_type = event['request']['type']
if request_type == "LaunchRequest":
return build_response("メモをどうぞ。", should_end_session=False)
elif request_type == "IntentRequest":
intent_name = event['request']['intent']['name']
if intent_name == "MemoIntent":
slots = event['request']['intent']['slots']
if 'MemoContent' in slots and 'value' in slots['MemoContent']:
memo_text = slots['MemoContent']['value']
is_success, message = send_email(memo_text)
if is_success:
return build_response(f"メール送信しました。 {memo_text}", should_end_session=True)
else:
return build_response(f"エラーが発生しました: {message}", should_end_session=True)
return build_response("終了します。", should_end_session=True)
def send_email(text):
client = boto3.client('ses', region_name=AWS_REGION)
now = datetime.datetime.now() + datetime.timedelta(hours=9)
date_str = now.strftime("%Y/%m/%d")
time_str = now.strftime("%H:%M")
# ★修正:日付を下に配置するフォーマット
body_text = f"""
{text}
----------
{date_str} {time_str}
"""
try:
client.send_email(
Destination={
'ToAddresses': TO_LIST,
'CcAddresses': CC_LIST,
'BccAddresses': BCC_LIST
},
Message={
'Body': {'Text': {'Charset': "UTF-8", 'Data': body_text}},
'Subject': {'Charset': "UTF-8", 'Data': "【メモ】Alexaからのリマインド"},
},
Source=SENDER,
)
return True, "送信完了"
except ClientError as e:
error_message = e.response['Error']['Message']
print(f"Error: {error_message}")
return False, error_message
def build_response(text, should_end_session):
return {
'version': '1.0',
'response': {
'outputSpeech': {'type': 'PlainText', 'text': text},
'shouldEndSession': should_end_session
}
}
完了後、画面上部の「関数のARN」を確認し、後ほど使う
4. Alexa x Lambdaとの接続
概要:
AlexaとLambdaを連携させて、動作できるようにする。
操作手順:
- Alexa Developer ConsoleからスキルIDを取得する
- ステップ2で一旦放置したAlexa Developer Console画面に戻る
- 左メニューから「Endpoint」をクリック
- 「AWS Lambda ARN」を選択、「Your Skill ID」をコピーする
- AWS Lambda画面に戻って、トリガーを追加する
- 画面上部(関数の概要エリア)にある 「+ トリガーを追加 (Add trigger)」 ボタンをクリックする
- ソースを選択するプルダウンで 「Alexa Skills Kit」 を選択する
※ 注意: 「Alexa Smart Home」ではなく「Alexa Skills Kit」を選ぶ - 「スキルID検証 (Skill ID verification)」 という項目が表示される
- ここで 「有効化 (Enable)」 を選び、下の入力欄に、さきほどコピーした スキルID を貼り付ける
- 右下のオレンジ色の 「追加 (Add)」 ボタンをクリックする
- トリガーが追加されたら、Alexa開発コンソールに戻る
- 「Default Region」に、Lambdaの「関数のARN」を貼り付ける
- 「Save」して、モデルをビルド (Build Model)」ボタンをクリックする
5. テストと実行
操作手順:
- Alexa Developer Consoleの「テスト」タブをクリックする
- 「スキルテストが有効になっていません」を「開発中」に変更する
- シミュレーターのマイクアイコンを長押しするか、文字入力で以下のように話しかける
- 「マイメモを開いて」
- (Alexaが応答したら)「明日の会議資料を作るのを忘れないようにを送って」
- Lambdaが正しく動けば、指定したメールアドレスに「明日の会議資料を作るのを忘れないように」という本文のメールが届く
最後に
手を動かして、色々勉強になりました。テストの際にメールが届かなかったことはありました。調べてみたら、迷惑メールボックスに入っちゃいました(笑)。
自分へのメモとして、今回のハンズオンを記録しました。