AlexaでAPKを配布するスキルの作り方

f:id:vasilyjp:20180927090637j:plain

こんにちは、VASILYで主にAndroid開発を担当している@Horie1024です。先日potatotips #48で「Alexa、APKを配布して」というタイトルでLTさせて頂きました。

資料は以下になりますが、本投稿では、Alexaスキルの仕組みから最終的にAPKが配布されるまでを出来る限り詳細に解説していきます。

目次

AlexaでAPKを配布する流れ

最初にAPKを配布するまでの全体の流れについて概要を示します。

f:id:vasilyjp:20180312173646p:plain

ユーザーがAlexa対応デバイス(Amazon echoなど)に対して音声でAPKの配布指示を出し実際に配布されるまでの流れは以下のようになります。

  1. ユーザーが「Alexa、BitriseでAPKを配布して」と発話
  2. Alexaサービスでの発話の処理とAWS Lambdaエンドポイントへのリクエスト
  3. Lambda FunctionでBitriseのビルドをトリガー
  4. APKのビルドとDeployGateへのアップロード
  5. DeployGateを経由したAPKの配布

ユーザーの音声をAlexaが理解し、AWS Lambdaエンドポイントを経由してBitriseでのビルドを動かす事でAPKを配布します。

Alexaスキル開発事始め

Alexaに開発者によって追加された機能をスキルと呼びます。Alexaスキルには以下のような種類があります。

  • カスタムスキル: 汎用のスキル
  • スマートホームスキル: 家電製品などを制御するスキル
  • フラッシュブリーフィングスキル: ニュースなどを読み上げるスキル

APKを配布するスキルはカスタムスキルにあたり、スマートホームスキルやフラッシュブリーフィングスキルは使用しません。

Alexaスキルの仕組み

Alexaがユーザーの発話を受けてレスポンスを返すまでの流れは以下のようになります。

f:id:vasilyjp:20180312173817p:plain 引用: Alexaスキル開発トレーニングシリーズ 第1回 初めてのスキル開発

ユーザーが発話し、Alexa対応デバイスからレスポンスを受け取るまでを順番に見ていきましょう。

  1. ユーザーがAlexa対応デバイスに発話
  2. デバイスはマイクで集音した音声データをAlexaサービスに送信
  3. Alexaサービスは音声データを解析し、AWS Lambdaを呼び出して解析結果を伝達
  4. Lambdaはスキルの処理を実行し、結果をAlexaサービスにレスポンスとして返却
  5. Alexaサービスはレスポンスに応じた音声データを生成、デバイスに返信
  6. デバイスは音声データを再生し、ユーザーに結果を伝達

この流れを実現するために開発者が行うことは以下の2点です。

  • 対話モデルと呼ばれるユーザーの音声をAlexaサービスに理解させるためのルールの設定
  • 対話モデルによる解析結果に応じて実行するAWS Lambdaエンドポイントの開発

対話モデル

以下の画像は対話モデルとAWS Lambdaエンドポイントの関係を表す図です。

f:id:vasilyjp:20180312173925p:plain 引用:Alexaスキル開発トレーニングシリーズ 第2回 対話モデルとAlexa SDK

Alexaサービスは、対話モデルによってユーザーの発する音声データを理解しAWS Lambdaエンドポイントを呼び出します。

対話モデルは、インテントとスロットおよびサンプル発話から構成されます。

インテントとスロット

AlexaサービスがAWS Lambdaエンドポイントを呼び出す際のリクエストは、インテントスロットからなります。スロットはユーザーの音声データのうち特定の型(日付や都市名)に当てはまるものを値として受け取れる変数のようなものです。APKを配布するスキルでは使用しません。

インテント(Androidエンジニアには親しみやすい名前ですね!)はユーザーの要望や意図を表し、スキルはインテントに応じた振る舞いを行うようにします。インテントは1つのスキルで複数定義することが可能です。

f:id:vasilyjp:20180312173957p:plain 引用: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」の始めるをクリックします。

f:id:vasilyjp:20180312174032p:plain

スキルの作成

「新しいスキルを追加する」をクリックするとスキルの情報を入力する画面が表示されるので埋めていきます。

f:id:vasilyjp:20180312174104p:plain

以下のように入力しています。呼び出し名がカタカナの方が認識されやすいです。

項目
スキルの種類 カスタム対話モデル
言語 Japanese
スキル名 Distribute Apk
呼び出し名 ビットライズ

呼び出し名にビットライズを指定することで、ユーザーは「アレクサ、ビットライズで○○」という発話でスキルを使用します。呼び出し名をビットライズにしているのは、APKのビルドと配布にBitriseを利用するためです。これについては後ほど解説します。また、呼び出し名を省略することはできません。

対話モデルの作成

対話モデルの作成は、2018年3月現在でベータ版ですがSkill Builderを使用した方が簡単です。「スキルビルダーを起動する」をクリックすると起動します。

f:id:vasilyjp:20180312174557p:plain

左メニューのIntentsのADDをクリックすることでインテントを追加できます。

f:id:vasilyjp:20180312174628p:plain

Create a new custom intentの入力フォームに「DistributeApk」を入力しCreate Intentをクリックします。

f:id:vasilyjp:20180312174656p:plain

「Sample Utterances」のフォームにサンプル発話を入力します。サンプル発話の節で想定したサンプル発話を入力します。

apk を 配布して
apk を 配布
apk を 配って

f:id:vasilyjp:20180312174801p:plain

入力が完了したら「SaveModel」をクリックし対話モデルを保存します。保存が完了したら「Build Model」をクリックし対話モデルをビルドします。

f:id:vasilyjp:20180312174831p:plain

これで対話モデルの作成は完了です。ここまでGUIで対話モデルを作成しましたが、Code Editorを選択するとJSONで表現された対話モデルを確認でき編集も可能です。

f:id:vasilyjp:20180312174903p:plain

設定(AWS Lambdaエンドポイントの指定)

サービスエンドポイントのタイプにAWS LambdaのARN(Amazonリソースネーム)を選択し、デフォルトにデプロイ済みのLambda FunctionのARNを指定します。Lambda Functionの実装はまだ行っておらず、ARNはわからないので一旦入力せずに保存しておきます。

f:id:vasilyjp:20180312174936p:plain

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.com

Serverlessを使用するとLambda functionのデプロイおよび管理を簡単に行えます。

Serverlessのインストール

Node.jsのインストールが必要になります。nvmnodebrewを使うと簡単です。本記事では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サービスからのリクエストを受けられるよう変更します。具体的にはeventsalexaSkillを指定します。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が実行されます。UnhandledLaunchRequestAMAZON.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点です。

  1. Androidプロジェクトのセットアップが容易である
  2. Build Trigger APIが用意されている
  3. Workflowを利用できる

以下のサンプルアプリプロジェクトについてセットアップします。

github.com

セットアップ

Bitriseにログインし、「Add first app」をクリックします。

f:id:vasilyjp:20180312175149p:plain

セットアップ画面が表示されるので画面の指示に従って設定していきます。「Connect your repository」で接続するリポジトリを選択します。

f:id:vasilyjp:20180312175221p:plain

「Setup repository access」では特に必要がなければ「AUTOMATIC」を選択し、「No, auto-add SSH key」をクリックします。

f:id:vasilyjp:20180312180109p:plain

「VALIDATING REPOSITORY」と表示されるのでしばらく待ちます。Bitriseが対象のリポジトリに含まれるプロジェクトがどのプラットフォームに属するかを判別します。

f:id:vasilyjp:20180312180229p:plain

Validationが完了するとプロジェクトの判別結果に基づいてビルドの設定を自動的に行なってくれます。問題があれば「MANUAL」をクリックし手動で設定できます。

特に問題が無ければ「Confirm」をクリックします。

f:id:vasilyjp:20180312180302p:plain

「Register a Webhook for me!」をクリックするとGitHubやBitbucketからのWebhookを自動的にセットアップし、コードをリポジトリにpushした際、Bitriseが自動的にビルドを開始してくれるようになります。

f:id:vasilyjp:20180312180329p:plain

これでセットアップは完了です。

f:id:vasilyjp:20180312180356p:plain

Workflows

BitriseのビルドフローはStepと呼ばれる単一のタスクを実行する部品のコレクションとして表され、Workflowsと呼ばれています。アプリケーションのトップページで「Workflow」タブをクリックすることでWorkflow Editorが起動し、Workflowsを編集可能です。

f:id:vasilyjp:20180312180426p:plain

Workflowsはデフォルトで「primary」と「deploy」が用意されています。新たなWorkflowを作る事も出来ますし、複数のWorkflowを繋げる事も可能です。

DeployGateへのAPKのアップロード

DeployGateへのAPKのアップロードは、StepをWorkflowに追加する事で実現します。今回、deploy workflowが実行された場合のみAPKがDeployGateへアップロードされるようにします。「deploy workflow」を選択し、Gradle Runner stepの直後に新たにScript stepを追加します。

f:id:vasilyjp:20180312204907g:plain

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が用意する環境変数になります。

f:id:vasilyjp:20180312183018p:plain

最終的なScript stepは以下のようになります。これでdeploy workflowが実行された場合にAPKがDeployGateへアップロードされるようになりました。

f:id:vasilyjp:20180312183050p:plain

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()
}

サンプルコードはこちらです。

github.com

AWS Lambdaへのデプロイ

IAMの作成

Serverlessが使用するIAMを作成します。ServerlessのAWS - Credentialsを参考に作成しましょう。

AWSにログイン後サービスからIAMを選択しユーザーメニューから「ユーザーを追加」をクリックしてください。またはこちらをクリックするとユーザーを追加画面が表示されます。

ユーザ名に「serverless-admin」アクセスの種類は「プログラムによるアクセス」にチェックを付けます。

f:id:vasilyjp:20180312183143p:plain

次のステップでは、アクセス権限を設定を設定します。「既存のポリシーを直接アタッチ」からAdministratorAccessにチェックを付けます。

f:id:vasilyjp:20180312183216p:plain

最後に選択内容を確認し「ユーザーの作成」をクリックします。ユーザーの追加が成功すると「アクセスキーID」と「シークレットアクセスキー」が表示されるのでこちらをメモしておきます。アクセス情報の取扱いには十分注意してください

f:id:vasilyjp:20180312183247p:plain

認証情報の登録

作成後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を確認してください。

f:id:vasilyjp:20180312183948p:plain

Alexaスキルメニューの設定でARNを入力し保存しましょう。

f:id:vasilyjp:20180312184616p:plain

シミュレータでのテスト

スキルのテストは、Alexaスキルメニューの「テスト」から簡単に行うことができます。2018年3月現在でベータ版ですが、実際に発話して動作を確認できるためテストシミュレータを使用することをオススメします。

「テストシミュレータに進む」をクリックする事でテストシミュレータに切り替える事が可能です。

また、「このスキルをテストするには対話モデルのタブを完成させてください。」を有効に切り替えてください。

f:id:vasilyjp:20180312184649p:plain

Alexa Simulatorタブの入力フォーム横マイクアイコンをクリックしホールドしている間、テストシミュレータは音声入力を受け付けます。シミュレータでテストする場合最初に「Alexa」と話しかける必要はありません。

f:id:vasilyjp:20180312204033g:plain

実機でのテスト

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の「☆ スキルのベータテスト」をクリックします。

f:id:vasilyjp:20180312184802p:plain

次に、Amazon echoのセットアップに利用したメールアドレスをテスターに追加し「テストの開始」をクリックします。

f:id:vasilyjp:20180312184830p:plain

これでベータテストが開始され、テスターに追加したメールアドレスに招待メールが送信されます。JP customersのリンクをクリックしてください

f:id:vasilyjp:20180312184858p:plain

https://alexa.amazon.co.jp/spa/index.html#skills/your-skillsに遷移しますのでログイン後、表示されるダイアログで「スキルテスト」をクリックしてください。

f:id:vasilyjp:20180312184929p:plain

そして「有効にする」をクリックする事でAmazon echo実機でスキルをテストすることができます。

f:id:vasilyjp:20180312184956p:plain

まとめ

Alexa対応デバイスに話しかける事でAPKを配布することができました。実際に実機で試してみると声だけで配布を実行できるのが新鮮でとても楽しかったですし、思っていた以上に便利です。今後Slack botで行っていた作業をAlexaスキルで実装してみるなどして、日々の業務効率の改善に生かせるか実験してみようと思います。

最後に

VASILYでは、Androidエンジニアを募集しています。少しでも興味がある方のご応募をお待ちしています。

カテゴリー