Alexaスキルを開発するためのコマンドラインツールASK (Alexa Skill Kit) CLIを使う際にいろいろと嵌りましたので、今後迷う方が少なくなるようここにメモを残しておきます。
今回使ったのはWindows版のバージョン2.15.0です。ASK CLIについて検索したときにask api
コマンドを使って開発をする記事が多くヒットしてその通り打ち込んだのですが以下のようなエラーになってしまいました。おそらく現在とは古いバージョンのask
コマンドについて書かれており、コマンドの引数などが大きく異なっているので注意してください。こういう互換性が大きく変わる変更は開発者を混乱させますね。
> ask api
Command not recognized. Please run "ask" to check the user instructions.
ASK CLIのインストール
ASK CLIをインストールするにはnpm
コマンドが必要なのでNode.jsをインストールして使えるようにしておきます。npm
コマンドで以下のを実行してインストールします。
npm install -g ask-cli
手元の環境で実施したときはすんなりと成功とはいかず以下のようなエラーが出ました。ただask
コマンドは使えるようになり、今のところ正しく動作しているようなので一旦無視することにします。(いいのか?)
gyp ERR! UNCAUGHT EXCEPTION
gyp ERR! stack Error: spawn C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\15.0\Bin\MSBuild.exe ENOENT
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
gyp ERR! stack at onErrorNT (internal/child_process.js:415:16)
gyp ERR! stack at process._tickCallback (internal/process/next_tick.js:63:19)
gyp ERR! System Windows_NT 10.0.18363
gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild"
gyp ERR! cwd C:\Users\jito\AppData\Roaming\npm\node_modules\ask-cli\node_modules\dtrace-provider
gyp ERR! node -v v10.16.0
gyp ERR! node-gyp -v v3.8.0
gyp ERR! This is a bug in `node-gyp`.
gyp ERR! Try to update node-gyp and file an Issue if it does not help:
gyp ERR! <https://github.com/nodejs/node-gyp/issues>
念のためask
コマンドが使えるようになったかとバージョンを確認しておきます。2.x 系であることが表示されれば大丈夫だと思います。
> ask --version
2.15.0
ASKコマンドの環境設定
Amazon開発者ポータルの、どのアカウントで作業をするかを設定します。ask configure
コマンドを使って出てくるメニューに従って設定をします。
> ask configure
Alexaスキルを作る
新しいAlexaスキルはask new
コマンドを使用して作成します。メニューに従ってコードを書く言語、スキル名、プロジェクト名を指定してしばらく待つとスキルが作成できます。スキルの定義やコードなどはプロジェクト名のサブフォルダに格納されます。
> ask new
? Choose the programming language you will use to code your skill: NodeJS
? Choose a method to host your skill's backend resources: Alexa-hosted skills
Host your skill code by Alexa (free).
? Choose the default locale for your skill: ja-JP
? Choose the default region for your skill: us-east-1
? Please type in your skill name: Hello World Skill
? Please type in your folder name for the skill project (alphanumeric): HelloWorldSkill
? Creating your Alexa hosted skill. It will take about a minute.
Project directory for Hello World Skill created at
c:\work\mitoco\PushTest2\HelloWorldSkill
Lambda code for Hello World Skill created at
./lambda
Skill schema and interactionModels for Hello World Skill created at
./skill-package
Skill is enabled successfully.
Hosted skill provisioning finished. Skill-Id: amzn1.ask.skill.xxx-xxx-xxx-xxx-xxx
Please follow the instructions at https://developer.amazon.com/en-US/docs/alexa/hosted-skills/build-a-skill-end-to-end-using-an-alexa-hosted-skill.html#askcli to learn more about the usage of "git" for Hosted skill.
Alexaスキルの操作
スキルマニフェストはスキルの設定ファイルになります。プロジェクトのフォルダのskill-package\skill.json
に保存されています。
スキルの設定を変更する場合はこのJSONファイルを変更しますが、スキルに反映するにはask amapi update-skill-manifest
コマンドでアップデートをかけます。-s
オプションで更新対象のスキルIDを指定しますがスキルIDはプロジェクトフォルダの.ask\ask-states.jsonに記載されているのでそちらを参照してください。またファイルは--manifest
オプションで指定しますが、file:{ファイル名}
のように指定をします。file:
を頭につけるのが最初わからずに苦労しました。
ask smapi update-skill-manifest -s {スキルID} -g development --manifest "file:skill.json"
Alexa Developer Consoleのほうでスキルの設定を変更した場合はローカルのマニフェストをアップロードするとポータルでの変更が上書きされて消えてしまうので、最新のマニフェストをダウンロードするにはask amapi get-skill-manifest
を使用します。標準出力にマニフェストの内容がjsonで出力されるのでファイルにリダイレクトして保存します。
ask smapi get-skill-manifest -s {スキルID} > skill.json
Lambdaのログが見られないとき
Alexaスキルでインテントに対する処理はLambda関数で作ることが多いと思います。Lambda関数は例えばNode.jsの場合はconsole.log()
でログ出力をすることができます。ログはAWSの中にに保存されCloud Watchのロググループから参照することができます。ログはプログラム作成するときのデバッグに非常に役に立つのですが、Lambda関数をAlexa-hosted skillsを選んで作った場合には、Alexa Developer Consoleからコードエディタの左下にあるログ: Amazon CloudWatchをクリックするとCloud Watchに飛んでログを見ることができます。
クリックしたときに以下のようなエラーが表示されログが見られないことがあります。
ロググループが存在しません
特定のロググループ: /aws/lambda/xxx-xxx-xxx-xxx はこのアカウントまたはリージョンに存在しません。
公開をしていないスキルの場合は実行されてもログが作成されず上記エラーが表示されるようです。(公開かどうかは関係なかったので改訂)この場合は焦らなくてもよく、実際にLambda関数が動作したAWSの別リージョンにログが出力されているはずなので、画面右上のリージョン選択からログのあるリージョンを探します。
ask new
でスキルを作成したときにChoose the default region for your skillでus-east-1を選択していたので、てっきりこのリージョンで動くのかと思っていましたが、Lambda関数は別リージョンで動くこともあるようです。リージョンはたくさんあり探すのが大変です。環境変数AWS_DEFAULT_REGIONに実行中のリージョンが設定されるようなので、こんなLambda関数を書くとどのリージョンで実行されたかが分かるようになります。
const LaunchRequestHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
},
handle(handlerInput) {
var region = process.env.AWS_DEFAULT_REGION;
const speakOutput = 'ハロハロ起動 ' + region;
return handlerInput.responseBuilder
.speak(speakOutput)
.reprompt(speakOutput)
.getResponse();
}
};
ただ、リリース時にリージョン名を読み上げ出力するわけにはいかないので、他の方法としてはスキルマニフェストにリージョンの設定のようなものがあるのでこの中のどれかのリージョンを調べれば良いかもしれません。まだ調査中なので追って紹介できればと思います。
この問題の解決方法はこちらを参考にさせていただきました。
おわりに
Alexaスキルを開発するきっかけとしては、Amazon Echoと自社の会話プラットフォームとつないで音声会話でのFAQ回答システムや業務システム操作UIを開発しています。
→ 会話プラットフォームENOKI
ASK CLIは最近使い始めたばかりなので、これからも色々と試してみたいと思います。