Index
概要
スマートスピーカーの1つである、Amazon Echoを使ってkintoneで予定管理をスマートにしちゃいます。
今回kintoneは、Alexaスキルから予定データを出し入れする先として使います。
kintoneカレンダービューを用いて予定管理している方、
- 予定が2件までしか表示されない。
- 予定確認のためだけにkintoneにアクセスするのが億劫。
など、すこしスマートじゃないと思っている部分もあるのではないでしょうか。
今回は、PCやモバイルを用いてkintoneにアクセスすることなく、
Amazon Echoによる音声操作で、一日のスケジュールの把握、追加を実現します。
Amazon Echoとは
Google Homeなどと同じ、スマートスピーカーの一種です。「Amazon Alexa」を搭載しており、
音声操作だけで、音楽の再生、天気を調べる、ニュースの読み上げなど様々なことをしてくれます。
※ 写真は「Echo Dot」
Amazon Alexaとは
Amazonが開発した、音声認識技術の1つです。Alexa搭載デバイスのEchoだけでなく、
他サービスに組み込めるような音声認識サービスとなっています。詳しくはコチラをご覧ください。
完成イメージ
事前準備
Amazon開発者コンソールにログイン
Alexaスキル開発のために、Amazon開発者コンソールにログインが必要です。
開発コンソールログインのために、
- Amazon.co.jpでアカウントを取得
※英語で使用したい方はAmazon開発者コンソールでアカウント取得。 - 1で取得したアカウントでAmazon開発者コンソールにログイン
を行ってください。
※Amazon開発者ポータルでアカウントを作成すると、Amazon.comのアカウントになります。
なぜAmazon.co.jpのアカウントで開発者ポータルにログインする必要があるか
Alexaは、一般公開されているAlexaスキルを、スキルストアで追加することができます。
(Amazon.co.jpでスキルストアで公開されているスキル)
スキルストアに表示されるAlexaスキルは、Alexaにログインしているアカウントに依存します。
そのため、Amazon.comアカウントでスキルストアにアクセスすると、米国で公開されているスキルが表示され、日本語のスキルが表示されません。
日本語で一般公開されている他のAlexaスキルを利用したい方は、
Amazon.co.jpアカウントでAlexaスキルを作成し、そのアカウントでEchoと連携する必要があります。
詳しくは下記URLを参照してください。
https://dev.classmethod.jp/voice-assistant/solution-of-a-problem-amazon-com-account-conflict/
AWSアカウントの取得
AlexaスキルはAWS Lambda関数を呼び出すことが可能です。
今回はLambda関数を用いて、kintoneのレコード取得、登録を行います。
下記URLを参考にAWSアカウントを取得後、ログインしてください。
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/setting-up.html#setting-up-signup
kintoneアプリ準備
アプリ作成
「予定登録アプリ」を作成します。
フィールド名 | フィールドコード | フィールドタイプ |
イベント名 | eventName | 文字列(1行) |
開始日時 | startDateTime | 日時 |
終了日時 | endDateTime | 日時 |
予定管理なので見やすいようにカレンダー形式の一覧を作成します。
さらに見やすくしたい人は下記のイベントカレンダープラグインを使うと、綺麗に予定を管理することができます。
イベントカレンダープラグイン
https://developer.cybozu.io/hc/ja/articles/212155743
APIトークン発行
「アプリの設定>APIトークン」でAPIトークンを発行します。
今回は、Alexaスキルで予定の確認と追加を実装したいので、閲覧と追加のアクセス権があるAPIトークンを生成します。
Alexaスキルの作成(その1)
Step1 : Amazon開発者コンソールから、Alexaスキルを作成します。
先ほど作成したアカウントで、Amazon開発者コンソールにログインしましょう。
画像通りに画面を遷移して、Alexaスキルを作成します。
言語は日本語に設定します。
スキル名は任意に設定してください。
モデルは、カスタムを選択し、スキルを作成します。
スキルを作成したら、ビルドのエンドポイントの設定から、「AWS LambdaのARN」を押下し、表示されるスキルIDをメモしておいてください。
Step2 : 対話モデルの設定
インテントスキーマ
Alexaが対応できる様々な会話パターンを設定できます。詳しくはコチラをご覧ください。
今回はインテントスキーマを下記のJSONを使用して定義します。
上記のJSONを対話モデルのJSONエディターにコピペし、モデルを保存してください。
サンプル発話
インテントとインテントを呼び出すためのフレーズをマッピングします。
ビルトインインテントはサンプル発話をマッピングする必要はありません。(ビルトインインテントとは)
※Alexaは、サンプル発話のパターンを網羅すればするほど、インテント判別の精度が上がり、スムーズに会話できるようになります。
JSONエディターの14~23行目と、53~72行目の部分でサンプル発話を定義しています。
上の画像のように、サンプル発話が定義されているか確認してください。
カスタムスロットタイプ
スロットには標準スロットタイプとカスタムスロットタイプが存在します。
カスタムスロットタイプは、ユーザー側で値を設定する必要があります。(標準スロットタイプについてはコチラをご覧ください。)
今回は、予定管理アプリの「イベント名」に対応するスロットをカスタムスロットとして用意し、valueにあらかじめイベント名を入れておきます。
先ほどのJSONの75~111行目で定義しているので、下記の画像を参考にカスタムスロットが設定されているか確認してください。
ここまで来たら一度、Alexaの設定は終了です。次にLambda関数を設定します。
AWS Lambda関数の設定
Step1 : Lambda関数の実行ファイル作成
Node.jsをインストールした環境で作業します。
以下のサンプルコードをファイル名「index.js」で保存します。
上記コードの12~15行目を、ご自身の環境に合わせて設定してください。
以下のコマンドを先ほど保存したコードと同じ階層で実行してpackage.jsonを生成します。
上記のコマンド実行後にpackage.jsonの設定をしますが、"name"と"description"のみ任意に設定していただき、他はEnterで進んで問題ありません。
次に以下のコマンドでパッケージをインストールします。
さらに以下のコマンドを実行してZipファイルを作成します。実行失敗した場合は、
「index.js」と「node_modules」が同じ階層に存在しているか確認してください。
windows OSをお使いの方
windowsコマンドプロンプトを使用している方は、標準ではzipコマンドが入力できません。
そのため、Cygwinなどのツールが必要です。
また、Cygwinでファイルを作成すると、作成されたファイルに実行権限(パーミッション)が付与される場合があるので注意してください。
Step2 : Lambda関数作成
AWS Lamnbda関数設定画面から関数を作成します。
(作成するリージョンは「アジアパシフィック(東京)」を選択してください。詳細はコチラをご覧ください。)
「一から作成」を選択し、「名前」「ランタイム」「ロール」を設定します。
順番に、「名前」は任意、「ランタイム」は「Node.js 8.10」、「ロール」は「カスタムロールの作成」を設定してください。
「カスタムロールの作成」を選択すると画面が遷移します。
「カスタムロールを作成」を選択すると、下図の画面に遷移します。
「IAM ロール」は「新しい IAM ロールの作成」を選択し、「ロール名」は任意に設定してください。
設定後、許可を選択すると一つ前の画面に戻ります。
ロール作成を終えたら先ほどの画面に遷移するので、「既存のロールを選択」を選択し、先ほど作成したロールを設定してください。
関数の作成をクリックするとLambda関数が作成できます。
関数を作成し終えたら、画面右上に表示されるARNをメモしておきましょう。
また、先ほど作成したZIPファイルの実行コードをアップロードします。
「ハンドラ」が先ほど作成したJavascriptファイル「index.js」を指定する「index.handler」になっているか確認してください。
次に、Alexa Skills KitをLambda関数のトリガーに設定します。
トリガーの設定のスキルID欄に、Alexaスキルの作成(その1)でメモしたスキルIDを入力してください。
これでLambda関数の設定は終了です。
Alexaスキルの作成(その2)
Lambda関数の設定が終了したら、もう一度Amazon開発者コンソールに戻ります。
その1で作成したAlexaスキルの編集画面から、エンドポイントを開き、「AWS Lambda の ARN(Amazonリソースネーム)」にチェックを入れます。
デフォルトの地域に先ほどメモしたLambda関数のARNをペーストし、エンドポイントを保存してください。
最後に、下記の画面から、モデルをビルドして頂くとAlexaスキルとLambda関数を連携することができます。
※ビルドが失敗する場合は、
対話モデル > インテント > インテントを追加 > Alexaのビルトインライブラリから既存のインテントを使用 より、
AMAZON.StopIntent
AMAZON.HelpIntent
AMAZON.CancelIntent
の3つを追加して再ビルドを実行してみてください。
動作確認
先ほどの設定を終えると、作成したAlexaスキルのテストを行えます。
- 予定の確認(Alexa開発者コンソール上)
- 予定の追加(Alexa開発者コンソール上)
- Echoで音声操作して動作確認
をテストしてみましょう。
まずはAlexa開発者コンソール上からテストを有効化してください。
予定の確認
テスト画面でAlexaに今日の予定を訪ねます。
Alexaがkintoneの情報を取得できているのがわかります。
隠れている2つ分の予定も確認できていますね。
予定の追加
次に明日の予定を訪ねます。
明日は何も予定が入っていません。
明日は予定がないことがわかりました。
そこで、予定を追加してみます。
しっかりと予定が追加することができました!
Echoで動作確認をする場合
Alexaスキルはテスト終了後の設定で作成したスキルの公開設定がありますが、
Echoに紐づけたアカウントでスキルを開発し、テストを有効化することで、スキルを公開せず利用することができます。
EchoとAmazon開発者アカウントの紐づけは以下のサイトを参考にしてください。
サンプルコード解説
Lambdaに設定したサンプルコード「index.js」について少し解説します。
KintoneRestAPIClient
kintoneアプリのレコードを操作する際に、@kintone/rest-api-clientを使用しています。
@kintone/rest-api-client は、 kintone REST API を JavaScriptで扱う際に必要な処理をまとめたライブラリです。
詳しい導入と使用方法はGitHub、またはリファレンスをご覧ください。
ここではサンプルコードで使用しているクラスと関数について簡単に説明していきます。
GitHub
https://github.com/kintone/js-sdk/tree/master/packages/rest-api-client
リファレンス
https://github.com/kintone/js-sdk/tree/master/packages/rest-api-client#references
まず、サンプルコードの13~23行目についてです。
上記の6行目でclientを作成します。
clientにはbaseUrlとauthプロパティを含める必要があります。
baseUrlプロパティには利用している kintone 環境のドメインを設定し、authプロパティには認証情報を設定します。
今回はAPIトークン認証を行うため、authプロパティにapiTokenを指定しています。
次にサンプルコードの74行目のkintoneアプリのレコード取得、
149行目のkintoneアプリのレコード登録をしている部分についての説明です。
上記の9行目で「アプリID」と「クエリ条件文」をもとにkintoneアプリからレコードを複数件取得しています。
Promiseオブジェクトで返ってくるので、thenメソッドとcatchメソッドでそれぞれ成功時、エラー時の処理を記述します。
29行目では、「アプリID」と「レコードのJSON」でkintoneアプリにレコードを1件追加しています。
先ほどと同様にPromiseオブジェクトなので、thenとcatchでそれぞれ対応する処理を記述します。
Alexa ASK SDK for Node.js
Alexa ASK SDK for Node.jsは、Lambda上でNode.jsでAlexaスキルを作成する際に非常に便利なSDKです。
サンプルコードで使用しているAlexa ASK SDK for Node.jsはバージョン2(v2)を使用しています。
SDKの導入や利用方法などの詳細はGitHubをご確認してください。
GitHub
https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs/tree/master
下記のHelloWorldIntentサンプルをもとに軽く解説します。
サンプルでは「'HelloIntent'」が呼び出されたとき、アレクサが「Hello World!」と応答するようになっています。
サンプルコードは大きく3つの構成になっています。
①1,2行目でask-sdkの読み込みと変数定義
②4~17行目でAlexaスキルのハンドラーを定義
③20~32行目でLambdaハンドラーを作成
まず、AWS Lambda関数が呼び出された時に20行目から32行目のLambdaハンドラーが実行されます。
22行目でSkillBuilders.customビルダーを使用してSDKインスタンスを作成しています。
次に23行目ですが、「.withSkillId(ALEXA_APP_ID)」でAlexaスキルのスキルIDを判断しています。
2行目で定義したALEXA_APP_IDと一致しないスキルIDのリクエストをすべて拒否します。
さらに24行目のaddRequestHandlersビルダー関数からHelloWorldIntentHandlerを呼び出しているので、4行目が呼び出されます。
4~17行目はAlexaスキルのハンドラーを定義しています。今回はHelloWorldIntentHandlerです。
Alexaスキルのハンドラー内にはcanHandle関数とhandle関数の2つの関数が定義されています。
1つ目のcanHandle関数は、リクエストがIntentRequestかを検出し、リクエストのインテント名がHelloWorldIntentの場合にtrueを返します。
trueの場合は、そのままhandle関数が実行されます。
また、通常リクエストを取り出す場合は、
handlerInput.requestEnvelope.request.type === 'IntentRequest';
と書きますが、
getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
のような、より直接的にスロット値を取得できるユーティリティ関数やヘルパー関数が提供されています。
詳しくは リクエストからスロット値を取得する を参考にしてみて下さい。
2つ目のhandle関数は、実行したい処理やアレクサの応答レスポンスを作成して返します。
12行目のhandlerInput.responseBuilderには応答レスポンスに利用可能なメソッドがいくつか用意されているため、利用したいメソッドを確認してみてください。
最後に30,31行目でアレクサの応答レスポンスを保持しているskillインスタンスをreturnすることで、リクエストに応答したスキルを作成することができます。
終わりに
いかがでしょうか。
声だけでkintoneのレコード登録と取得ができました。
kintoneはほかにも豊富にAPIが用意されているので、音声操作でいろいろな操作ができます。
各サービスのガイドです。お困りの際はご活用ください!
更新履歴
- 2018/05/18
- Alexa開発者コンソールの新UIに対応
- 2018/07/12
- kintone API SDK(β) for Node.jsを使用したコードに修正
- 2021/05/21
- kintone RestAPIClientを使用したコードに修正
- luxonに変更
- ask-sdkに変更
このTipsは、2021年5月版 kintoneで確認したものになります。
こちらの記事を参考に、Alexaからのkintoneアプリ操作を実現できました。
とても参考になりました、ありがとうございます。
同じような機能をGaroonでも実現したいのですが、AlexaとGaroonスケジュールの連携は可能でしょうか?
(kintoneカスタマイズは経験ありますが、Garoonは最近触り始めたばかりで、もし見当違いな質問でしたら申し訳ありません。)
tomomo85 様
コメントいただきありがとうございます。cybozu developer network運営事務局です。
本記事をご活用いただけたとのこと、嬉しい限りです。
AlexaとGaroonスケジュールの連携も可能です。
GaroonとAWS Lambdaを使った他システムとの連携は、こちらの記事をご覧ください。
https://developer.cybozu.io/hc/ja/articles/208438756
なお、上記記事の公開時点ではGaroonのREST APIが公開されていなかったため、
SOAP APIを利用した処理になっておりますが、現在はGaroon REST APIをご利用いただくことが可能です。
引き続きご活用いただけますと幸いです。
回答ありがとうございます。
Garoonカスタマイズはkintoneカスタマイズと勝手が違うため、苦戦しております。
Garoon SOAP APIより、Garoon REST APIで実装したほうが良いのでしょうか?
トライしてみます。
tomomo85 様
>Garoon SOAP APIより、Garoon REST APIで実装したほうが良いのでしょうか?
扱いやすさと将来性という点ではREST APIがおすすめではありますが、SOAP API をご利用いただきましても問題ありません。
※Garoon REST APIは、アンケートを実施しておりますとおり、今後も追加を予定しております。
cybozu Development team様
アンケート回答させていただきました。
Garoon APIはSOAPもRESTも未経験につき、苦戦中です。
そういえば、別件ですが、
パッケージインストールコマンド使用時、下記のWARNが発生しました。
2018年4月、Alexa Skills Kitのv2がリリースされ、alexa-sdkはサポート外になりました。 ask-sdkコマンドを使用してください。
ということのようなので、
コマンドで先に進みました。
同様に、
「index.js」9行目も修正しております。
以上、ご確認のほどよろしくお願いいたします。
tomomo85 様
お世話になっております。
cybozu developer network運営事務局です。
アンケートご回答いただきありがとうございます。
また、開発に関する不明点ございましたら、ぜひコミュニティをご活用ください。
警告について報告頂きありがとうございます。
認識してはおりますが、サンプルコードの改修については検討中でございます。
今後ともcybozu developer networkをご活用いただければ幸いです。
ご担当者様
KintoneとAmazon Echoを連携して面白い製品が出来ないか検討しています。
kintoneに登録した情報に対して、Alexaから音声操作で抽出したいと思っていたので、
本ページはとても参考にさせていただきました。
2点お伺い・ご相談したいのですが、
・1アプリに対する1日10,000件API経由でのリクエストは今後拡張していく方針はございますか?
・ask-sdkバージョンでのサンプルが欲しいです(tomomo85 様もご指摘されてますし、ご検討中とのことですが…)
kon10hide32 様
お世話になっております。
cybozu developer network運営事務局です。
1.1アプリに対する1日10,000件API経由でのリクエストは今後拡張していく方針はございますか?
APIに関する問い合わせはこちらの手順を参考に、kintone API 問い合わせフォームから問い合わせください。
2.ask-sdkバージョンでのサンプルが欲しいです(tomomo85 様もご指摘されてますし、ご検討中とのことですが…)
ご要望頂きありがとうございます。引き続き検討致します。
また、すぐにでも改修が必要な場合は、お手数をおかけしますが、
下記の公式ドキュメントを参考にサンプルコードを改修をお願い致します。
https://ask-sdk-for-nodejs.readthedocs.io/ja/latest/ASK-SDK-Migration-Guide.html
今後ともcybozu developer networkをご活用いただければ幸いです。
cybozu developer network運営事務局
ご返答頂きありがとうございます。
内容承知いたしました。