![見出し画像](https://assets.st-note.com/production/uploads/images/36867488/rectangle_large_type_2_5d98cffe5cb7392b71b94901738bb6a1.jpg?width=1200)
Alexa Skill Kit "skill-sample-nodejs-audio-player" の為に必要な、書かれていない事柄
https://developer.amazon.com/ja-JP/alexa/alexa-skills-kit/start
ASK(Alexa Skill Kit) や AVS(Alexa Voice Service) は、試していますか? Amazon は、Alexa を使う為のすべてのインターフェースや、膨大なドキュメントを提供しています。しかし、開発した方はお気づきの通り、どちらも取り敢えず用意した感が否めません。そう、かつての MFC や VB のような Microsoft 製品のように、精錬された感じがしないのと同じです。Amazon は、それを踏襲しているのかも知れませんが、違うのはサポートが充実している点でしょうか。それで、かつての Microsoft が受けたような批判を回避しているのかも知れません。前置きが長くなっておりますが、そのような訳で、"skill-sample-nodejs-audio-player" についても、書かれている事柄だけでは足りない部分を、NOTE に記しておきます。
基本である streaming 再生のサンプル
Amazon の GitHub には、豊富なサンプルが用意されています。
プログラミングには、サンプルコードが必須ですが、Amazon は、それらサンプルコードも豊富に用意しています。Tutorial が一通り終わったら、これらのサンプルコードから入っていく事になりますが、"skill-sample-nodejs-audio-player" も、この GitHub の一部です。そして、基本的に README の通りです。
https://github.com/alexa/skill-sample-nodejs-audio-player
ASK CLI が古いバージョンを前提に解説されている
ひとつ目は、ASK CLI( Command Line Interface ) です。現在は、Version.2x がリリースされていますが、README は古い Version.1 を前提に解説されています。それを読み替えるか、Version.1x を意図的にインストールする必要があります。Version を指定してのインストール方法は、"@" の後に Version を付けて npm install しますが、Version.1x のインストール例は、以下の通りです。
npm install -g ask-cli@1
IAM に権限が足りない
README には、dynamoDB の為に IAM( Identity and Access Management ) へ read/write 権限を追加することが説明されていますが、これだけでは足りません。発生する Error Message に従って role や、user に権限を追加する必要があります。以下に、補足すべき権限を挙げておきます。
・AWSLambdaBasicExecutionRole
・AmazonDynamoDBFullAccess
・AWSXRayDaemonWriteAccess
・AWSLambdaFullAccess
・IAMFullAccess
また、これらの権限でも足りない場合は、以下の権限も検討して下さい。
AWSXrayFullAccess
注意:xxxFullAccess が目立ちますが、本来は必要となる操作に限定したミニマムな権限を付与することが望ましい。
Local Tests で time out する
README では、Local 環境で Tests を実施することが解説されていますが、多々、time out でエラーになります。その様な場合は、該当箇所の time out 時間を少し長めに設定します。以下、例です。
single-stream/lambda/test/test_launch_request_no_jingle.ts の例
describe('Audio Player Test : LaunchRequest', function () {
// pre-requisites
before(() => {
this.timeout(5000); <- この様な timeout 時間を増やす
return new Promise((resolve, reject) => {
// prepare the database
ddb.initialiseDDB(USER_ID).then(data => {
console.log("Finished preparing the database");
skill(request, null, (error, responseEnvelope) => {
skill_response = responseEnvelope;
resolve();
});
});
});
});
.
.
.
Lambda Function Configuration コマンドの --runtime 指定が古い
README では、IMPORTANT と注目させて Lambda Function Configuration の update が必要なことが解説されていますが、指定している node.js の Version が古いため、エラーとなってしまいます。その様な際は、--runtime 指定を外すことで問題なく実行されます。以下、--runtime 指定を外した時の aws command です。
aws lambda update-function-configuration --function-name ask-custom-My_Radio-default --handler dist/index.handler
検証時に RepeatIntent が必須だとエラーになる
deply が正常に終了し、Lambda Function Configuration も正常に update されると、実行が可能になります。しかし、プログラムの「検証」を行うと、「RepeatIntent は必須です。追加して下さい。」といったエラーとなります。恐らく、この skill 公開時には必須ではなかったのでしょう。RepeatIntent の為の記述は、"lambda/src/IntentHandlers.ts" と "model/" ディレクトリ配下の xx-XX.json にあります。該当箇所に RepeatIntent セクションが必要となります。例えば、IntentHandlers.ts には以下のように追加します。
.
.
.
}
'AMAZON.CancelIntent': async function (input: HandlerInput): Promise<Response> {
return this['AMAZON.StopIntent'](input);
},
'AMAZON.RepeatIntent': async function (input: HandlerInput): Promise<Response> {
input.responseBuilder.speak(i18n.S(input.requestEnvelope.request, 'UNHANDLED_MSG'));
return Promise.resolve(input.responseBuilder.withShouldEndSession(true).getResponse());
},
'AMAZON.StopIntent': async function (input: HandlerInput): Promise<Response> {
return Promise.resolve(audio.stop(i18n.S(input.requestEnvelope.request, 'STOP_MSG')));
},
.
.
.
また、"model/xx-XX.json" には、以下のように追加します。
.
.
.
{
"name": "AMAZON.CancelIntent"
},
{
"name": "AMAZON.RepeatIntent"
},
{
"name": "AMAZON.StartOverIntent"
}
.
.
.
Alexa を使用するリージョンに切り替える必要がある
NOTE は、日本人向けのアプリケーションですから、読まれている方の多くも日本人のことでしょう。したがって、使用している Echo 端末も日本語設定になっていることが多いことでしょう。シミュレーターも、Echo 端末も、この skill をテストする言語に切り替えて、その言語で話しかける必要があります。
以上
参考資料:
https://github.com/pvinis/alexa-pepper-radio
IntentHandlers.ts