LoginSignup
19
13

More than 5 years have passed since last update.

Google Assistantアプリ開発経験者向けAlexaスキルの作り方

Last updated at Posted at 2018-03-15

はじめに

3月中にAlexaスキルをリリースするとTシャツ貰えるそうなのでいっちょやってみました。
スキルを開発して、特典をもらおう

その際Google Assistantアプリ開発経験者がAlexaスキルを作るうえでポイントになりそうなところをまとめてみました。

あとDialogflowのIntentとEntityをAlexaスキルの形式に変換かけるツール作ったので、Google Assistantアプリリリース済みの方はこれ使ってさくっとAlexaスキル作ってTシャツゲットしましょう!

Google AssistantアプリとAlexaスキルの開発要素比較表

まずGoogle Assistantアプリ開発に関わる要素がAlexaスキルのどの要素に相当するか把握すべく調べてみました。

今回のケースと逆方向で、Alexaスキル > Google Assistantアプリの流れで違いを比較した記事がありました。
AlexaSkillとGoogleAssistantの両方を開発・リリースしてみて気付いた違い【まとめ】

Service Alexa GoogleAssistant 備考
Developer Service Amazon Developer Actions on google 開発ポータルでプロジェクトの作成・定義を行う。
NLP Service
(Frontend)
Skill Builder
(Alexa Skill Kit)
Dialogflow IntentやSlotType (Entity) を定義して、
自然言語処理と対話モデルを紐付ける。
*NLP (Natural Language Processing)
Web Services AWS FireBase クラウドコンピューティングサービス
Computing Service
(Backend)
- Lambda - Cloud Functions Node.jsなどのBackend Functionを配置
*[Cloud Functions Tips] 参照
Storage Service - S3 - Cloud Storage audio/imageコンテンツ格納用
*[Cloud Storage・Hosting] 参照
CDN Service - Cloud Front - Hosting コンテンツ配信用
(GetRequestが少なければ無くてもよい)
*CDN (Contents Delivery Network)

なるほど。
あとはDialogflowの中身(Intent、Entity)が何に対応するか把握出来ればおっけーそうですね。

チュートリアルをやってみる

次にとりあえずチュートリアルですね。
Alexaスキル開発トレーニング

私は最初の2つをやってみました。
分かりやすくまとめられているのでこれだけで基本的な流れは把握できます。
セッション(DialogflowでいうContext)も扱う場合は第3回までやってみるといいかもしれません。

  • 第1回 初めてのスキル開発

    • Alexaスキルコンソール画面の概要
    • Intentの書き方
    • AWS Lambdaのコンソール画面の概要
    • サービスシミュレーター(テストするやつ)の使い方
  • 第2回 対話モデルとAlexa SDK

    • Slot(変数ワード、DialogflowでいうParameter)について
    • サンプル発話(DialogflowでいうTraining phrases)
    • Lambda(DialogflowでいうFulfillment)の詳しい書き方
    • デフォルトIntentについて

なお2018/3/10現在、Amazon開発者コンソールの新コンソールbeta版が使えるようになってます。
チュートリアルは旧コンソールでの手順なので注意して下さい。
LambdaのUIもちょっと変わっちゃってるぽいですが、大体わかるかなと思います。

リリース済みのGoogle AssistantアプリをもとにAlexaスキルを作ってみる

クロマチックチューナー」というGoogle Assistantアプリを既にリリースしているので、同じ実装を踏襲します。
なおGoogle Assistant版の実装は以下の記事にまとめています。
Google Homeアプリをリリースしてみた(実装編)

移行ツールを使って移行

上記のアプリでEnttityに色々打ち込んでおり、あれをコピペするのはちょっと気が重かったのでツールを作って移行しました。
GitHubに上げています。

Dialogflow2AlexaSkillJson

Dialogflowからエクスポートしたzipをツール(Node.js)に通すとAlexaスキルのJSONが出力され、新コンソールにJSONをポイっと投げ込めば簡単に移行できます。
移行出来るのはIntentとSlot Type(Entity)です。
なおGoogle AssistantアプリでContextとかは使ってなかったのでそのへん未対応です。

導入、使い方はREADMEを参照下さい。

またAlexaスキルはDialogflowに比べて色々制約がきつく、ちょこちょこ修正していく必要があります。
以下に移行後いじった内容をピックアップしてみます。

Intent

  • Intent名とSlot名が同じだと怒られます
    • Intent名はマジメに「XxxIntent」みたく名付けましょう
  • サンプル発話(Training phrases)に同じSlot(Entity)を繰り返し使えません
  • Welcome IntentはAlexaスキルではLaunchRequestとしてLambdaのコード上で管理されます
  • HelpIntentがBuilt-In Intentであり、必須です
    • 適当に書くとリジェクト食らいます

Slot Type(Entity)

  • Slotの値は基本的に日本語じゃないといけません(頭文字、イニシャリズム、アクロニムを除く)
    • 「a flat」みたいのはエラーは出ませんが申請時にリジェクト食らいます
    • 数字もダメです。カタカナか漢数字にしましょう

SaveとBuild

一通り修正できたら「Save Model」 > 「Build Model」と上部のボタンをポチポチしてって下さい。

EndPoint(Fulfillment)

AWS Lambdaでコーディングを行います。
HTTPSって選択肢もあったから他のWebhookでもいけそう。

静的応答

ここがDialogflowとの一番の違いだと思うんですが、固定フレーズ(DialogflowでいうText response)はここで定義するっぽいです。
なので、スキル開始時や終了時、ヘルプにFallbackだったりは文字列直打ちして対象Intentのハンドラーで応答かけます。

動的応答

Fulfillmentみたいな動的処理もここに一緒に書きます。
言語は色々選べて、Dialogflowと同じNode.jsを選択したのでコアコードをコピペしてAlexaスキルの仕様に微調整(sendGoogleResponse > this.emitとか、SSMLからspeakタグを除外したりとか)したらおっけー。

ちょっとハマったのはSlot Type(Entity)の値を一意で取得するときでした。
Slot Typeの値を一意に定める際は、this.event.request.intent.slots.xxx.valueではなく、this.event.request.intent.slots.xxx.resolutions.resolutionsPerAuthority[0].values[0].value.idでidを取得するっぽいです。
ここもDialogflowと違ってSlot Type(Entity)に完全一致ではなく部分一致した結果が配列で返ってくるっぽいので注意が必要です。

あとは今回作ったスキルでは静的ファイル(mp3)を読んでるのですが、置き場をGitHubにしてRawで参照かけることにしました。

Source

以上を踏まえて作成したのが以下になります。
handlers配下のTuneが動的応答、他は静的応答です。

index.js
"use strict";

const Alexa = require("alexa-sdk");

const APP_ID = "amzn1.ask.skill.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";

const START_MESSAGE = "欲しい音を教えて下さい。";
const END_MESSAGE = "終了する場合は「終了」と話しかけて下さい。";
const HELP_MESSAGE = `楽器のチューニングスキルです。ドからシまでの12音階の音を鳴らします。「ドの音」のように話しかけて下さい。それでは、${START_MESSAGE}`;
const STOP_MESSAGE = "さようなら";
const FALLBACK_MESSAGE = `すみません、よく分かりません。もう一度${START_MESSAGE}`;

exports.handler = function(event, context, callback) {
    const alexa = Alexa.handler(event, context);
    alexa.appId = APP_ID; 
    alexa.registerHandlers(handlers);
    alexa.execute();
};

const handlers = {
    "LaunchRequest": function () {
        this.emit(":ask", START_MESSAGE);
    },
    "Tune": function () {
        try {
            const note = this.event.request.intent.slots.note.resolutions.resolutionsPerAuthority[0].values[0].value.id;
            const url = `https://raw.githubusercontent.com/miso-develop/tuner/master/mp3/alexa/${note}.mp3`;
            const speak = `<audio src="${url}"></audio><break time="1s" />${END_MESSAGE}`;
            this.emit(":ask", speak);
        } catch(e) {
            this.emit(":ask", FALLBACK_MESSAGE);
        }
    },
    "AMAZON.HelpIntent": function () {
        this.emit(":ask", HELP_MESSAGE);
    },
    "AMAZON.CancelIntent": function () {
        this.emit(":tell", STOP_MESSAGE);
    },
    "AMAZON.StopIntent": function () {
        this.emit(":tell", STOP_MESSAGE);
    },
    "SessionEndedRequest": function () {
        this.emit(":tell", STOP_MESSAGE);
    }
};

EndPoint登録とappId登録

AlexaスキルとLambdaはそれぞれ別のコンソールで管理を行うので、互いに紐付けを行う必要があります。
チュートリアル参照。
最後に「Save EndPoints」ボタンもポチって下さい。

以上でAlexaスキルが完成です。

テスト

コンソールから

Actions on GoogleのSimulatorみたいのがあります。
デバッグはこちらで。
image

自動テスト

先日行われたスマートスピーカー勉強会で自動テストに関するLTがありました。
そのLTではGoogle HomeからAssistantを利用して喋らせてAlexaのテストを行っており面白かったです。

私の環境ではFirebaseのRealtime Databaseに言葉を書き込めばGoogle Homeが喋りだすようになってるので、Excelに書かれた言葉リストを上から順にFirebaseに書き込むマクロ組んでパターン網羅テストをしてみました。

Node.js版

一応Node.jsでも直接google-home-notifierを叩くスクリプトを作ってGitHubに上げました。
google-home-auto-tester

data.csvに喋らせたい言葉と待ち時間(msec)を以下のように記載してnode index.jsすることで順番に指定間隔で読み上げてくれます。
ポイントとしてgoogle-home-notifierは喋り始めに「デュリン!」って音が鳴り、これをAlexaが誤認識してしまうのでAlexaの応答中にうまいこと「デュリン!」って鳴るように待ち時間を調整するといいです。

data.csv
test1,5000
test2,5000
test3,0

リリース申請

ここも大体Google Assistantアプリと一緒です。
違いとしては、

  • 画像は108x108と512x512が必要です
  • プライバシーポリシーは特になければ不要です

ぐらいです。

リジェクト

当然ながら(?)リジェクトされました。2回。
内容としては、

  • ドキュメントちゃんと読め的なこと
    • サンプルフレーズの書き方とかで先頭に「アレクサ、」と書いてないとか
    • Slotの中身は日本語で、数字もカタカナか漢数字にしてねとか
  • ヘルプの内容しっかり書いてね
  • セッションオープン時は必ずAlexaスキル側でユーザーに問いかけるように
  • サンプル発話でSlotの重複ダメよ

てな感じでした。

ちなみに審査は結構早くて、朝申請だしたら夕方には返ってきました。

リリース

そして無事リリースされました。
image

参考動画


なおTシャツゲットキャンペーンはちゃんとエントリーしておかないとダメです。
スキルを開発して、特典をもらおう

おわりに

とりあえずGoogle Assistantアプリ作ったことある方は、

  • チュートリアルやる
  • 移行ツール使ってDialogflowからIntent、Entity移行
  • AWS Lambdaで静的応答と動的応答仕込む

でさくっといけるはず。
所々呼び方は違えど仕組みはほぼほぼ一緒です。
キャンペーンは残りあと半月ですが、頑張ってTシャツゲットしましょう!

19
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
13