はじめに
Alexaを使って簡単に聞き流すタイプの単語帳を作れないかと思ったので作りました。
スキルの公開はしたくなかったので、自分専用です。
ざっくり構成
開発環境を作るのがめんどくさいので今回はAmazon Alexa developer consoleを利用してスキルの開発をします。
Google SpreadSheetを使って単語帳をつくってAPIで返すようにする
外部から叩いて、SpreadSheetの内容を返すようにします
データを作る
スクリプトを作成する
スクリプトの記載
- スクリプトの入力画面が出たら
コード.gs
に以下を記載
function doPost(e) {
// スプレッドシート&シートオブジェクトを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('シート1');
var sheetData = sheet.getRange('B3:C' + sheet.getLastRow()).getValues();
// データの成形
var responseList = [];
sheetData.map(function(d) {
responseList.push({ word: d[0], read: d[1] });
});
// レスポンス
var response = {
data: responseList,
meta: { status: 'success' }
};
return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
}
スクリプトをAPI化する
めんどくさいので認証なしのAPIにします
-
ウェブアプリ
を選択
リクエストを受けつかるか確認する
curl -L -d "hello" 上記でコピーしたURL
Alexaで応答してもらうようにする
Amazon Alexa developer consoleにログインします
初期構築
* スキルタブ > スキルの作成
コードをかく
- コードエディタタブ > Skill Code > lambda > lambda_function.py`
- Class
LaunchRequestHandler
,def handle
にコードを書いていく
url = "上記でSpreadシートをAPI化したときのリクエストURL"
pyaload = {"key1":"value1", "key2":"value2"}
r = requests.post(url)
text = ""
for item in r.json()["data"]:
text += item["word"]+","+item["read"]+"."
return (
handler_input.response_builder
.speak(text)
#.ask(text) //ユーザーに再質問して会話をつづける
.response
)
- response_builder.speak(text)
- speak()に渡した値をアレクサが応答する
- response_builder.ask(text)
- ask()に渡した値をアレクサが応答し、回答を待つ
クラスの役割
インテントハンドラ | 意味 |
---|---|
LaunchRequestHandler | スキルを起動するハンドラー。呼び出されたときに一番最初に実行される |
HelloWorldIntentHandler | ユーザーがしたいアクションを実行。LaunchRequestHandlerで対話が継続される場合に実行 |
指定のパッケージをインストール
requestsパッケージがないので、インストールする
- コードエディタタブ > Skill Code > lambda > requirements.txt`
requests==2.28.2
デプロイ
- コードエディタタブ上部にあるデプロイを押下してデプロイする
テスト
-
テスト
タブを開く -
スキルテストが有効になっているステージ:
を開発中にする -
テストを実行してOKだったら実際のアレクサも反応してくれるようになる
qiita投稿用
— すえ (@skane_26) January 22, 2023
Googleスプレッドシートに記載した内容をAlexaに喋らせる pic.twitter.com/8ZBRsNhDy6