こんにちは、VASILYで主にAndroid開発を担当している@Horie1024です。先日potatotips #48で「Alexa、APKを配布して」というタイトルでLTさせて頂きました。
資料は以下になりますが、本投稿では、Alexaスキルの仕組みから最終的にAPKが配布されるまでを出来る限り詳細に解説していきます。
目次
- 目次
- AlexaでAPKを配布する流れ
- Alexaスキル開発事始め
- APKを配布するスキルの作成
- Serverlessを利用したAWS Lambdaエンドポイントの開発
- シミュレータでのテスト
- 実機でのテスト
- まとめ
- 最後に
AlexaでAPKを配布する流れ
最初にAPKを配布するまでの全体の流れについて概要を示します。
ユーザーがAlexa対応デバイス(Amazon echoなど)に対して音声でAPKの配布指示を出し実際に配布されるまでの流れは以下のようになります。
- ユーザーが「Alexa、BitriseでAPKを配布して」と発話
- Alexaサービスでの発話の処理とAWS Lambdaエンドポイントへのリクエスト
- Lambda FunctionでBitriseのビルドをトリガー
- APKのビルドとDeployGateへのアップロード
- DeployGateを経由したAPKの配布
ユーザーの音声をAlexaが理解し、AWS Lambdaエンドポイントを経由してBitriseでのビルドを動かす事でAPKを配布します。
Alexaスキル開発事始め
Alexaに開発者によって追加された機能をスキルと呼びます。Alexaスキルには以下のような種類があります。
- カスタムスキル: 汎用のスキル
- スマートホームスキル: 家電製品などを制御するスキル
- フラッシュブリーフィングスキル: ニュースなどを読み上げるスキル
APKを配布するスキルはカスタムスキルにあたり、スマートホームスキルやフラッシュブリーフィングスキルは使用しません。
Alexaスキルの仕組み
Alexaがユーザーの発話を受けてレスポンスを返すまでの流れは以下のようになります。
引用: Alexaスキル開発トレーニングシリーズ 第1回 初めてのスキル開発
ユーザーが発話し、Alexa対応デバイスからレスポンスを受け取るまでを順番に見ていきましょう。
- ユーザーがAlexa対応デバイスに発話
- デバイスはマイクで集音した音声データをAlexaサービスに送信
- Alexaサービスは音声データを解析し、AWS Lambdaを呼び出して解析結果を伝達
- Lambdaはスキルの処理を実行し、結果をAlexaサービスにレスポンスとして返却
- Alexaサービスはレスポンスに応じた音声データを生成、デバイスに返信
- デバイスは音声データを再生し、ユーザーに結果を伝達
この流れを実現するために開発者が行うことは以下の2点です。
- 対話モデルと呼ばれるユーザーの音声をAlexaサービスに理解させるためのルールの設定
- 対話モデルによる解析結果に応じて実行するAWS Lambdaエンドポイントの開発
対話モデル
以下の画像は対話モデルとAWS Lambdaエンドポイントの関係を表す図です。
引用:Alexaスキル開発トレーニングシリーズ 第2回 対話モデルとAlexa SDK
Alexaサービスは、対話モデルによってユーザーの発する音声データを理解しAWS Lambdaエンドポイントを呼び出します。
対話モデルは、インテントとスロットおよびサンプル発話から構成されます。
インテントとスロット
AlexaサービスがAWS Lambdaエンドポイントを呼び出す際のリクエストは、インテントとスロットからなります。スロットはユーザーの音声データのうち特定の型(日付や都市名)に当てはまるものを値として受け取れる変数のようなものです。APKを配布するスキルでは使用しません。
インテント(Androidエンジニアには親しみやすい名前ですね!)はユーザーの要望や意図を表し、スキルはインテントに応じた振る舞いを行うようにします。インテントは1つのスキルで複数定義することが可能です。
引用:Alexaスキル開発トレーニングシリーズ 第2回 対話モデルとAlexa SDK
また、インテントには標準の組み込みインテントがあり、それらも利用できます。以下は主な組み込みインテントです。
インテント名 | 概要 |
---|---|
AMAZON.HelpIntent | スキルの使い方を尋ねるインテント |
AMAZON.StopIntent | 処理やスキルを終了させるインテント |
その他の組み込みインテントについてはBuilt-in Intent Libraryを参照してください。
さて、ではAPKを配布するスキルはどのようなインテント名が良いでしょうか。APKを配布するという要望を表したDistributeApkとします。
サンプル発話
サンプル発話は、ユーザーの発話を適切なインテントとスロットに紐付けるための例文です。APKを配布する例文として以下を想定します。例文を増やすほど様々な言い回しに対応できますが、この3通りで恐らく問題ないでしょう。
apk を 配布して apk を 配布 apk を 配って
実際にユーザーがスキルを使用する場合、アレクサ + 呼び出し名 + サンプル発話 の形で発話することになります。呼び出し名はスキルを識別するためのprefixで必ず必要になります。
インテントスキーマ
インテントとスロット、サンプル発話はインテントスキーマというJSON形式でスキルに設定されます。これによって、ユーザーの発話がサンプル発話の例文に当てはまる場合、インテント名がDistributeApkとしてリクエストがAWS Lambdaエンドポイントに送られます。
{ "intents": [ { "name": "DistributeApk", "slots": [], "samples": [ "apk を 配布して", "apk を 配布", "apk を 配って" ] } ], "types": [] }
APKを配布するスキルの作成
ここからは、Amazon developerのAlexaコンソールにアクセスし、実際にスキルを作成する流れを紹介します。
Amazon developerへの登録
Amazon developerポータルへアクセスし、アカウントを作成します。この時ハマりやすいポイントがあるので注意してください。Alexa 開発者アカウント作成時のハマりどころを読んでからアカウントを作成することをオススメします。
Alexaメニューの表示
ログイン後ALEXAタブをクリックし以下のような画面を表示し、「Alexa Skills Kit」の始めるをクリックします。
スキルの作成
「新しいスキルを追加する」をクリックするとスキルの情報を入力する画面が表示されるので埋めていきます。
以下のように入力しています。呼び出し名がカタカナの方が認識されやすいです。
項目 | 値 |
---|---|
スキルの種類 | カスタム対話モデル |
言語 | Japanese |
スキル名 | Distribute Apk |
呼び出し名 | ビットライズ |
呼び出し名にビットライズを指定することで、ユーザーは「アレクサ、ビットライズで○○」という発話でスキルを使用します。呼び出し名をビットライズにしているのは、APKのビルドと配布にBitriseを利用するためです。これについては後ほど解説します。また、呼び出し名を省略することはできません。
対話モデルの作成
対話モデルの作成は、2018年3月現在でベータ版ですがSkill Builderを使用した方が簡単です。「スキルビルダーを起動する」をクリックすると起動します。
左メニューのIntentsのADDをクリックすることでインテントを追加できます。
Create a new custom intentの入力フォームに「DistributeApk」を入力しCreate Intentをクリックします。
「Sample Utterances」のフォームにサンプル発話を入力します。サンプル発話の節で想定したサンプル発話を入力します。
apk を 配布して apk を 配布 apk を 配って
入力が完了したら「SaveModel」をクリックし対話モデルを保存します。保存が完了したら「Build Model」をクリックし対話モデルをビルドします。
これで対話モデルの作成は完了です。ここまでGUIで対話モデルを作成しましたが、Code Editorを選択するとJSONで表現された対話モデルを確認でき編集も可能です。
設定(AWS Lambdaエンドポイントの指定)
サービスエンドポイントのタイプにAWS LambdaのARN(Amazonリソースネーム)を選択し、デフォルトにデプロイ済みのLambda FunctionのARNを指定します。Lambda Functionの実装はまだ行っておらず、ARNはわからないので一旦入力せずに保存しておきます。
Serverlessを利用したAWS Lambdaエンドポイントの開発
AlexaスキルはAlexaサービスのリクエスト先としてエンドポイントを用意する必要があり、AWS Lambdaで実装することが推奨されています。
今回、Lambda functionの実装には言語としてTypeScript、AWSへのデプロイにはServerlessを使用しています。
Serverlessは、サーバーレスアーキテクチャへのデプロイや管理を行うためのツールです。AWS Lambda、Google Cloud Functions、Azure Functions、IBM OpenWhiskといったFaaS(Function as a Service)に対応しています。
Serverlessを使用するとLambda functionのデプロイおよび管理を簡単に行えます。
Serverlessのインストール
Node.jsのインストールが必要になります。nvmやnodebrewを使うと簡単です。本記事ではNode.jsv8.9.4
を使用しています。
Serverlessは、npmを使用する場合は以下のようにインストールします。
$ npm install -g serverless
また、yarnを使用する場合以下のようになります。
$ yarn global add serverless
本記事で使用するserverlessのバージョンは1.26.1になります。
$ serverless -v 1.26.1
テンプレートから雛形プロジェクト作成
aws-nodejs-typescriptをtemplateに指定してserverless createを実行します。
$ serverless create --template aws-nodejs-typescript Serverless: Generating boilerplate... _______ __ | _ .-----.----.--.--.-----.----| .-----.-----.-----. | |___| -__| _| | | -__| _| | -__|__ --|__ --| |____ |_____|__| \___/|_____|__| |__|_____|_____|_____| | | | The Serverless Application Framework | | serverless.com, v1.26.1 -------' Serverless: Successfully generated boilerplate for template: "aws-nodejs-typescript" Serverless: NOTE: Please update the "service" property in serverless.yml with your service name
以下のように生成されます。
$ tree . ├── handler.ts ├── package.json ├── serverless.yml ├── tsconfig.json └── webpack.config.js
必要なライブラリの追加
開発に必要なライブラリや型定義の依存を追加します。
$ npm install alexa-sdk @types/alexa-sdk @types/request --save-dev
requestモジュールについては通常のdependenciesで追加します。型定義のみdevdependenciesとしました。
$ npm install request--save
yarnを使用する場合以下の通りです。
$ yarn add alexa-sdk @types/alexa-sdk @types/request --dev $ yarn add request
serverless.ymlの更新
serverless.ymlをAlexaサービスからのリクエストを受けられるよう変更します。具体的にはevents
にalexaSkill
を指定します。serverlessのドキュメントはこちらです。
これでAlexaサービスからのリクエストをhandler.bitriseSkill
で受けられるようになりました。
service: name: alexa-bitrise-distribute-apk # Add the serverless-webpack plugin plugins: - serverless-webpack provider: name: aws runtime: nodejs6.10 functions: bitriseSkill: handler: handler.bitriseSkill events: - alexaSkill
Alexaに対応したLambda functionの実装方法
Alexaスキルのエンドポイントに対応したLambda functionの書き方はシンプルで、alexa.registerHandlers
によって対話モデルで定義したインテント名に対応した処理を登録し、alexa.execute()
を実行するのみです。
AlexaサービスからDistributeApkインテントが送られてくると、対応するプロパティDistributeApk
が実行されます。Unhandled
、LaunchRequest
、AMAZON.StopIntent
はそれぞれ標準で用意されている組み込みインテントに対応しています。
import * as Alexa from 'alexa-sdk' import * as request from 'request' export const bitriseSkill = (event: Alexa.RequestBody<any>, context: Alexa.Context) => { const appSlug = process.env.APP_SLUG const apiToken = process.env.API_TOKEN const appId = process.env.APP_ID const alexa = Alexa.handler(event, context) alexa.appId = appId alexa.registerHandlers({ 'Unhandled': function () { this.emit(':tell', 'よく分かりません。') }, 'LaunchRequest': function () { this.emit(':tell', 'こんにちは。このスキルはビットライズのビルドをスタートさせエーピーケーを配布します。') }, 'AMAZON.StopIntent': function () { this.emit(':tell', 'またご利用ください。') }, 'DistributeApk': function () { // TODO ここにDistributeApkインテントがリクエストされた際の処理を書く } }) alexa.execute() }
DistributeApkインテントがリクエストされた場合に行う処理は、BitriseのBuild Trigger APIを使用したビルドのトリガーです。具体的な実装を行う前にBitriseの設定を行いましょう。
Bitriseの設定
BitriseはモバイルアプリにフォーカスしたCI/CDのPlatform as a Service(PaaS)です。セットアップが非常に簡単で数クリックするだけでAndroidアプリのCI/CD環境を構築することができます。また、Worlflowの概念を取り入れていてビルドステップのカスタマイズも容易です。
今回BitriseをAPKのビルドとDeployGateへのアップロードを行うCIサービスに選んだ理由は以下の3点です。
- Androidプロジェクトのセットアップが容易である
- Build Trigger APIが用意されている
- Workflowを利用できる
以下のサンプルアプリプロジェクトについてセットアップします。
セットアップ
Bitriseにログインし、「Add first app」をクリックします。
セットアップ画面が表示されるので画面の指示に従って設定していきます。「Connect your repository」で接続するリポジトリを選択します。
「Setup repository access」では特に必要がなければ「AUTOMATIC」を選択し、「No, auto-add SSH key」をクリックします。
「VALIDATING REPOSITORY」と表示されるのでしばらく待ちます。Bitriseが対象のリポジトリに含まれるプロジェクトがどのプラットフォームに属するかを判別します。
Validationが完了するとプロジェクトの判別結果に基づいてビルドの設定を自動的に行なってくれます。問題があれば「MANUAL」をクリックし手動で設定できます。
特に問題が無ければ「Confirm」をクリックします。
「Register a Webhook for me!」をクリックするとGitHubやBitbucketからのWebhookを自動的にセットアップし、コードをリポジトリにpushした際、Bitriseが自動的にビルドを開始してくれるようになります。
これでセットアップは完了です。
Workflows
BitriseのビルドフローはStepと呼ばれる単一のタスクを実行する部品のコレクションとして表され、Workflowsと呼ばれています。アプリケーションのトップページで「Workflow」タブをクリックすることでWorkflow Editorが起動し、Workflowsを編集可能です。
Workflowsはデフォルトで「primary」と「deploy」が用意されています。新たなWorkflowを作る事も出来ますし、複数のWorkflowを繋げる事も可能です。
DeployGateへのAPKのアップロード
DeployGateへのAPKのアップロードは、StepをWorkflowに追加する事で実現します。今回、deploy workflowが実行された場合のみAPKがDeployGateへアップロードされるようにします。「deploy workflow」を選択し、Gradle Runner stepの直後に新たにScript stepを追加します。
DeployGateへのAPKのアップロードはcurlコマンドで実行可能です。詳しくはDeployGate APIリファレンスを参照してください。
以下のコマンドを追加したScript stepで実行するよう設定します。
curl \ -F "token=${DEPLOY_GATE_API_TOKEN}" \ -F "file=@${BITRISE_APK_PATH}" \ -F "message=distribute from alexa" \ https://deploygate.com/api/users/horie1024/apps
DEPLOY_GATE_API_TOKEN
は環境変数としてBitriseに登録します。Workflow Editorからdeploy workflowでのみ有効な環境変数を登録可能です。BITRISE_APK_PATH
はデフォルトでBitriseが用意する環境変数になります。
最終的なScript stepは以下のようになります。これでdeploy workflowが実行された場合にAPKがDeployGateへアップロードされるようになりました。
AWS LambdaからのBitriseのビルドのトリガー
先程deploy workflowが実行された場合にAPKがDeployGateへアップロードされるようBitriseを設定しました。次にBitriseのBuild Trigger APIを利用してAWS Lambdaからdeploy workflowを実行します。Alexaに対応したLambda functionの実装方法で紹介したコードに処理を追加しましょう。
Build Trigger APIでは、branchやworkflowを指定する事が可能で、deploy workflowでmasterブランチについてビルドし「triggered from alexa」というメッセージをビルドに付加するリクエストBodyは以下のようになります。このリクエストBodyをBuild Trigger APIのエントリーポイントへPOSTリクエストで送信します。
{ "hook_info": { "type": "bitrise", "api_token": "..." }, "build_params": { "branch": "master", "workflow_id": "deploy", "commit_message": "triggered from alexa" } }
requestモジュールを利用したPOSTリクエストは以下のように書く事ができます。コード中のappSlugとapiTokenはAWS Lambdaの環境変数に予め登録しておき実行時に取得します。appSlugおよびapiTokenは、BitriseのアプリケーショントップのCodeタブから確認可能です。
Build Trigger APIへのリクエストが完了後、this.emit(':tell', '')
を使用してユーザーへレスポンスを返します。レスポンスからworkflow idを取得してユーザーへ返すメッセージを動的に変更しています。
request({ method:'post', url: `https://www.bitrise.io/app/${appSlug}/build/start.json`, headers: {"Content-Type": "application/json; charset=utf-8"}, json: true, body: { 'hook_info': { 'type': 'bitrise', 'api_token': apiToken }, 'build_params': { 'branch': 'master', 'workflow_id': 'deploy', 'commit_message': 'triggered from alexa' } } }, (error, response, body) => { let workflowId = body.triggered_workflow this.emit(':tell', `ワークフローアイディー${workflowId}で、ビットライズでのビルドを開始しました。ビルドが完了後、エーピーケーを配布します。`) })
最終的なコードは以下のようになります。
import * as Alexa from 'alexa-sdk' import * as request from 'request' export const bitriseSkill = (event: Alexa.RequestBody<any>, context: Alexa.Context) => { const appSlug = process.env.APP_SLUG const apiToken = process.env.API_TOKEN const appId = process.env.APP_ID const alexa = Alexa.handler(event, context) alexa.appId = appId alexa.registerHandlers({ 'Unhandled': function () { this.emit(':tell', 'よく分かりません。') }, 'LaunchRequest': function () { this.emit(':tell', 'こんにちは。このスキルはビットライズのビルドをスタートさせエーピーケーを配布します。') }, 'AMAZON.StopIntent': function () { this.emit(':tell', 'またご利用ください。') }, 'DistributeApk': function () { request({ method:'post', url: `https://www.bitrise.io/app/${appSlug}/build/start.json`, headers: {"Content-Type": "application/json; charset=utf-8"}, json: true, body: { 'hook_info': { 'type': 'bitrise', 'api_token': apiToken }, 'build_params': { 'branch': 'master', 'workflow_id': 'deploy', 'commit_message': 'triggered from alexa' } } }, (error, response, body) => { let workflowId = body.triggered_workflow this.emit(':tell', `ワークフローアイディー${workflowId}で、ビットライズでのビルドを開始しました。ビルドが完了後、エーピーケーを配布します。`) }) } }) alexa.execute() }
サンプルコードはこちらです。
AWS Lambdaへのデプロイ
IAMの作成
Serverlessが使用するIAMを作成します。ServerlessのAWS - Credentialsを参考に作成しましょう。
AWSにログイン後サービスからIAMを選択しユーザーメニューから「ユーザーを追加」をクリックしてください。またはこちらをクリックするとユーザーを追加画面が表示されます。
ユーザ名に「serverless-admin」アクセスの種類は「プログラムによるアクセス」にチェックを付けます。
次のステップでは、アクセス権限を設定を設定します。「既存のポリシーを直接アタッチ」からAdministratorAccessにチェックを付けます。
最後に選択内容を確認し「ユーザーの作成」をクリックします。ユーザーの追加が成功すると「アクセスキーID」と「シークレットアクセスキー」が表示されるのでこちらをメモしておきます。アクセス情報の取扱いには十分注意してください。
認証情報の登録
作成後serverless config
でAWSの認証情報を登録します。
$ serverless config credentials --provider aws --key YOUR_KEY --secret YOUR_SECRET
デプロイ
登録が完了後、serverless deploy
を実行するとTypeScriptのコンパイルからAWS Lambdaへのデプロイまで自動的に行われます。
$ serverless deploy Serverless: Bundling with Webpack... ts-loader: Using typescript@2.7.2 and tsconfig.json Time: 3875ms Asset Size Chunks Chunk Names handler.js 4.46 MB 0 [emitted] [big] handler handler.js.map 5.99 MB 0 [emitted] handler [30] ./node_modules/alexa-sdk/lib/utils/textUtils.js 1.48 kB {0} [built] [82] ./node_modules/extend/index.js 2.27 kB {0} [built] [144] ./node_modules/request/lib/cookies.js 974 bytes {0} [built] [182] ./handler.ts 1.96 kB {0} [built] [183] ./node_modules/alexa-sdk/index.js 1.62 kB {0} [built] [184] ./node_modules/alexa-sdk/lib/alexa.js 8.83 kB {0} [built] [807] ./node_modules/alexa-sdk/lib/templateBuilders/bodyTemplate1Builder.js 923 bytes {0} [built] [808] ./node_modules/alexa-sdk/lib/templateBuilders/bodyTemplate2Builder.js 1.16 kB {0} [built] [809] ./node_modules/alexa-sdk/lib/templateBuilders/bodyTemplate3Builder.js 1.16 kB {0} [built] [810] ./node_modules/alexa-sdk/lib/templateBuilders/bodyTemplate6Builder.js 1.16 kB {0} [built] [817] ./node_modules/alexa-sdk/lib/services/directiveService.js 2.27 kB {0} [built] [818] ./node_modules/alexa-sdk/lib/directives/voicePlayerSpeakDirective.js 604 bytes {0} [built] [819] ./node_modules/alexa-sdk/lib/utils/imageUtils.js 3.33 kB {0} [built] [820] ./node_modules/request/index.js 3.97 kB {0} [built] [825] ./node_modules/request/request.js 44.7 kB {0} [built] + 920 hidden modules Serverless: Packaging service... Serverless: Uploading CloudFormation file to S3... Serverless: Uploading artifacts... Serverless: Validating template... Serverless: Updating Stack... Serverless: Checking Stack update progress... ......... Serverless: Stack update finished... Service Information service: alexa-bitrise-distribute-apk stage: dev region: us-east-1 stack: alexa-bitrise-distribute-apk-dev api keys: None endpoints: None functions: bitriseSkill: alexa-bitrise-distribute-apk-dev-bitriseSkill Serverless: Removing old service versions...
AWSコンソールを開きサービスからLambdaを選択すると「alexa-bitrise-distribute-apk-dev-bitriseSkill」という関数が作成されています。関数名をクリックし関数の詳細画面に遷移後ARNを確認してください。
Alexaスキルメニューの設定でARNを入力し保存しましょう。
シミュレータでのテスト
スキルのテストは、Alexaスキルメニューの「テスト」から簡単に行うことができます。2018年3月現在でベータ版ですが、実際に発話して動作を確認できるためテストシミュレータを使用することをオススメします。
「テストシミュレータに進む」をクリックする事でテストシミュレータに切り替える事が可能です。
また、「このスキルをテストするには対話モデルのタブを完成させてください。」を有効に切り替えてください。
Alexa Simulatorタブの入力フォーム横マイクアイコンをクリックしホールドしている間、テストシミュレータは音声入力を受け付けます。シミュレータでテストする場合最初に「Alexa」と話しかける必要はありません。
実機でのテスト
Amazon echoなどのAlexa対応デバイス実機でスキルを動かすには、スキルのベータテストを開始する必要があります。
ベータテストを開始するには、「スキル」「対話モデル」「テスト」「公開情報」「プライバシーコンプライアンス」の全ての項目が完了している必要があります。
ここまでで未入力な項目は「公開情報」「プライバシーコンプライアンス」の2項目のはずなので完了させましょう。
公開情報の入力
公開情報の入力を完了するためには全ての項目を埋める必要があります。スキルのアイコン画像2種類(108×108、512×512)を登録する必要があるので用意してください。
今回はスキルを公開しないので仮で入力してしまって問題ありません。公開する場合全ての情報を入力後に審査を受ける必要があります。
以下のように設定しました。
項目 | 値 |
---|---|
カテゴリー | Productivity |
サブカテゴリー | Organizers & Assistants |
テストの手順 | test |
国と地域 | Japan |
スキルの簡単な説明 | AlexaにAPKの配布を依頼します。 |
スキルの詳細な説明 | Alexaに「ビットライズでAPKを配布して」と話しかけることでAPKをDeployGate経由で配布します。 |
サンプルフレーズ | ビットライズでAPKを配布して |
キーワード | 未入力 |
プライバシーコンプライアンスの入力
プライバシーコンプライアンスは以下のように設定しました。
項目 | 値 |
---|---|
このスキルを使って何かを購入をしたり、実際にお金を支払うことができますか? | いいえ |
このスキルはユーザーの個人情報を収集しますか? | いいえ |
このスキルは13歳未満の子供をターゲットにしていますか? | いいえ |
輸出コンプライアンス | チェック |
このスキルは広告を含みますか? | いいえ |
テスターへの追加とベータテストの開始
入力が完了し「申請する」ボタンを押せるようになりますが押さず、Skills Beta Testingの「☆ スキルのベータテスト」をクリックします。
次に、Amazon echoのセットアップに利用したメールアドレスをテスターに追加し「テストの開始」をクリックします。
これでベータテストが開始され、テスターに追加したメールアドレスに招待メールが送信されます。JP customersのリンクをクリックしてください。
https://alexa.amazon.co.jp/spa/index.html#skills/your-skillsに遷移しますのでログイン後、表示されるダイアログで「スキルテスト」をクリックしてください。
そして「有効にする」をクリックする事でAmazon echo実機でスキルをテストすることができます。
まとめ
Alexa対応デバイスに話しかける事でAPKを配布することができました。実際に実機で試してみると声だけで配布を実行できるのが新鮮でとても楽しかったですし、思っていた以上に便利です。今後Slack botで行っていた作業をAlexaスキルで実装してみるなどして、日々の業務効率の改善に生かせるか実験してみようと思います。
最後に
VASILYでは、Androidエンジニアを募集しています。少しでも興味がある方のご応募をお待ちしています。