Tweet

2018年12月11日火曜日

【AmazonAlexaスキル開発】はじめてのストア審査申請対策講座

こういう人向け

  • せっかくスキル開発しているのに、一度も審査申請を出した事が無い
  • スキル審査申請の1歩が踏み出せない方
  • チャレンジしてみたい方
  • 現状でスキル開発に着手していない可能性に満ち溢れたあなた

スキル審査申請とは?

AmazonAlexaでは、Alexaスキルストアといわれるものがあります。


無料でこういったストアに、ストアを公開する事が可能です。
世の中を豊かにするスキルなど開発して、みなさまにご公開いただきたいです。

スキルされる項目について

  • アプリ内での処理(音声認識によるテストをAmazonがデバック)
  • 公開名(スキル名)
  • 説明(最大160文字)
  • 詳細な説明(最大4,000文字)
  • サンプルフレーズ(最小3件)
  • 小さなスキルアイコン
  • 大きなスキルアイコン
  • カテゴリー
  • キーワード
  • プライバシーポリシーのURL(必須ではない)
  • 利用規約のURL(必須ではない)
  • プライバシーとコンプライアンス のチェック
  • テストの手順 (明記する必要がある)
  • 公開範囲

上記項目について

基本的には上記は埋めるだけになっています。
たとえば、説明文や詳細な説明も特に厳しいルールなどはありません。

この中でも特に気をつけて記述したほうがいい、
取り組んだほうが良い内容を記載しておきます。

説明、詳細な説明、サンプルフレーズについて


本文の日本語がおかしかったりするのはOKな範囲ですが、
誤字が無いか一度Googleドキュメントや誤字チェックサイトで確認しましょう。

そして、文章内で使用した発話例、
たとえば「アレクサ、キドニークックでにんにく50gを教えて」などのフレーズは、
全部的確にスキル上で動作するかチェックされると思って下さい。

ですので、審査を上げる前に必ず実機テストで、
説明&詳細な説明&サンプルフレーズにかかれている発話例を全てチェックしましょう。

Amazon Lambda関数内の記述について


こちらも同様にソースコード内で使用している発話例が
問題なく動作しているか、今一度チェックしてみてください。

こちらの内容も見られていた事がありました。
ヘルプで案内される内容がスキル応答しないというご指摘をいただきました。

小さなスキルアイコン、大きなスキルアイコンについて


はじめて審査申請した時は、
利用規約ガチガチに読んで申請しましたが意外と適当です。

しかし、円形アイコンが作りづらい方もいらっしゃると思います。
私もそうです。

公式ツール「Alexa Icon Builder」を使用しましょう。
英語ですが、かなり直感的に使用できますよ。

もちろん、こちらの画像をダウンロードすると最適な画像サイズが2件ダウンロードされます。


そもそものスキル内容自体で、何を吹き込んでもおかしい挙動が起きないように。


簡単に言いますけど、一番むずかしいですよね。わかりますよ。
ただ、どんな発話パターンや悪意を持って壊しに来る発話例でも、
しっかり捌いたスキルでないと審査が通りません。

たとえば、想定外の処理になりそうな時は
let message = '';
やばい時:message = 'すみません、正しく認識できませんでした。もう一度おっしゃっていただけますか'

こういう風にして、messageを喋らせてあげて下さい。

プロンプト(動作をするよう促すもの。)について


  • スキルがタスクを完了した後、ユーザーへのプロンプトが提示されていないにもかかわらずセッションが開いたままになっています。スキルは、リクエストを完了した後、ユーザーの入力を求めるプロンプトを提示していない場合はセッションをクローズする必要があります。セッションをオープンしたままにする場合は、明確な発話を促すように修正をお願い致します。
絶対このままだと意味分からないので、噛み砕きます。
  • <いわゆるtell>で終わる場合は「続けて何かお調べしますか?」は使わない。
  • <いわゆるask>で終わる場合は「続けて何かお調べしますか?」を使用する。

ここでいう「続けて何かお調べしますか?」は、
セッションを継続する明確な発話になります。

雑な言い方をするのであれば、
  • tellは言いっぱなし(返答を聞かない)
  • askは質問を待つ(返答を聞く)
というAlexaの状態になります。(難しい話は今はしません)

ヘルププロンプトについて


  • ヘルププロンプトはユーザーへの質問で終わり、もしくは発話を促して終わり、応答を受信するまでセッションが開いたままになるよう確認ください。
こちらは、用意されているビルトインインサイトの中の
AMAZON.HelpIntent」を読んだ際に読み上げられる内容に関するものです。

試しに皆さんのスキルをAlexaシミュレーター上で「ヘルプ」といった場合の、
挙動についてのルールです。実際にみなさんのヘルプはどうなりますか。

セッションが開いたままになるように、というのはaskという意味です。

ヘルプで「スキルの機能を説明した上で使用しますか?」とaskするのが、
ベストプラクティスな気がします。


スキルの説明としてのヘルププロンプトについて


  • ヘルププロンプトは、
    スキルを初回起動した説明よりも少しでも詳細である必要があります。
一度同一の内容を読み上げて、審査落ちしたことがありました

ただ、文量的に2倍にしろっていうわけではなく、
大体1.2倍とか少しボリューミーにした感じでOKです。

補足説明をして分かりやすく説明してあげましょう。

ここまで徹底しても審査落ちは存在する。


審査落ちに対しては、「便利なもの」と受け取ってもいいと思います。
とても親切に何が悪いのか、改善策まで提示してくれるので、
とりあえず審査を投げて、悪いところ全部指摘してもらうという使い方も有りです。

審査はどれぐらいかかる?


大体1営業日(平日のみ)で返ってきます。
前日の分は内容次第(デバックの重さ、著作権審査が厳しいスキル)にもよりますが、
大体昼頃〜15時。

当日に12時頃に反映すれば19時ぐらいに返ってくる可能性がある、といった感じです。

基本的な心構えは翌営業日(翌日の平日)って感じです。


何事も恐れずやってみましょう。


それが成功へのチャンスです。


tell、ask関連の補足の記事


tell、ask関連で分からない場合はこちらの記事を読んでくださいね。
僕はresponseで書くのを強く推奨します。

【AmazonAlexaスキル開発】Responseオブジェクトについて考えてみる(ask,tellなど) http://iga34engineer.blogspot.com/2018/12/amazonalexaresponseasktell_10.html

【AmazonAlexaスキル開発】AmazonEchoSpotなどのディスプレイ対応スキルを作ったがiPhone版Alexaでは何も反映されず、審査落ちしなかった話。

こういう人向け

  • ディスプレイ機能対応スキルを開発してデバックしている方
  • Amazon Echo Spot対応スキルに挑戦している方

どういう結果になったか

  • ディスプレイ機能対応スキルを開発(さじグラム 紹介記事)→審査申請する。
  • Alexaシミュレータ上ではDisplayでのデバックは完璧。
  • iPhone版Alexaで確認すると、全くディスプレイに反映されない。
  • 審査が通る(ディスプレイに関する場所で今回審査落ちゼロ)

結論

  • iPhone版Alexaは、Amazon Echo Spot/Showのようにディスプレイ対応しているわけではない。
  • ただ、他の大手会社アプリの挙動がとっても気になる。

iPhone版Alexaは、
Amazon Echo Spotのようにディスプレイ対応しているわけではない。


これは明らかだと思います。
Amazon Echo Spotで完璧に動作していたとしても、
=iPhone版Alexaアプリに対応しているわけではない。

他の大手会社アプリの挙動がとっても気になる。ているわけではない。

これはめっちゃ思ってます。
みなさんJOYSOUNDスキル知ってますか。
ディスプレイ付きAlexaだとカラオケミュージックビデオが流れます。

ただ、iPhoneだと変な挙動するんですよね。
まるでiPhone用に用意されているかのような、演出が。
Twitterの動画見たい方はリンクまで。
曲が流れて歌詞がスクロール出来るんですよね。
うーん。なんでだろう。

iPhoneでディスプレイを表示させる為に特別な処置とか、
テンプレートとかあるんですかね。

噂レベルでもOKなので、コメント欄に情報求む!

こっちで調査までやるので、詳しい事知っている有識者様がいらっしゃったら、
ご教示いただけますか。


【AmazonAlexaスキル開発】開発スキル「さじグラム」スキル紹介

「さじグラム」とは


「さじグラム」ストアページURLはこちらになります。
スキルを有効にすれば、お使いのAlexaで無料でご使用いただけます。


こういう人向け

  • 料理を楽しまれる人
  • 醤油15mlが何gに相当するか分からない人、知りたい人

そもそも醤油15mlってなんで15gじゃないの?


すごいざっくり大げさな例えをします。
15mlの水と純金、同じ重さではないですよね。なんか純金のほうが重そうだなと。
醤油と水を比較すると醤油には大豆などのエキスなど染み込んでいるわけで、
同じ15mlだとしても同じgとは限らないです。

アプリ開発の経緯


僕が食事制限を行っており、
パッケージの成分表から厳密な塩分量を算出する必要があったからです。

たとえば醤油大さじ1杯は17gです。
100gあたりの成分が分かれば 1/100してx17すればいいと分かります。

毎回調味料を計測するわけではありませんが、
購入した調味料に大さじ1杯あたりの塩分、

小さじ1杯あたりの塩分をテプラで明記して貼ろうと思っていたので、
その作業の時に「醤油 大さじ」=何グラムとか調べるのが億劫だと思ったからです。

また、今回は初めてディスプレイ対応もしてみました。
(公式キャンペーンのAmazon Echo Show無料クーポンがほしかったのじゃ)
Amazon Echo Spotの使用ユーザーは少ないと思うのであくまで補助的なオプションです。
ただ、数値を聞き取らないで画面見れば出てくれるのは良いんじゃないでしょうか。


「さじグラム」はどういうスキルか


ひとことで言えば、あらゆる調味料の「大さじ/小さじ」のグラム数が分かります。
全部で46種類の調味料と色々な登録の仕方があるので、たいてい対応してます。

お菓子作りとかに使うグラニュー糖とかも登録してます。


スキル活用例(使い方)

実際の発話例から使い方をみていきましょう。

あなた「アレクサ、さじグラムを開いて」

あなたアレクサ、さじグラムで 塩 小さじ

あなた「アレクサ、さじグラムで 醤油 大さじ


各メディアにおける掲載や紹介などについて


宣伝・紹介大歓迎です。
事後報告で構いませんので 下記メールアドレスに記事リンクをお送りください。
iga34engineer★gmail.com (★→@に変更)

youtubeでレビュー動画とか動画出していただければ、
当記事に宣伝なり協力させてください。





【腎臓食】僕が考えた食事制限中でもマクドナルド大好きな僕が考えた、マクドナルドハンバーガーを食べる方法

こういう人向け


  • マクド派、マック派全員
  • 食事制限中だけども塩分の高いマクドナルドを食べたい人。

僕が課せられている食事制限(腎臓病患者)

  • キロカロリー 1,800kcal / 1day
  • たんぱく質  60g / 1day
  • 塩分   6.0g / 1day

マクドナルドの有名メニューで、やばさを知る。


僕がいつも食べているものでいうと、
チキンクリスプ 358kcal  たんぱく12.8g 食塩2.0g
ハンバーガー  260kcal たんぱく 13.3g 食塩 1.9g

つまり、
  • キロカロリー → 大体1食の600kcalの半分は満たされる。
  • タンパク質 → 1食あたりの20gを大体60%超え
  • 塩分 → 1食分の塩分を100%超える。
大体こんな感じでした。無理っしょ!笑
仮に塩分が50%カットされていれば2個とか食べれそうですけどね。

ぼくのかんがえた最強のマクドナルドを楽しむ方法


三等分にしてしまうという考え。

たとえば、チキンクリスプを3等分にすれば、
119kcal、たんぱく質4.2g、食塩相当量 0.66g
別に多くは無いと思うんですよ。

ちょっとしたオカズかな?みたいな成分に落ち着きます。

今まで食べていたマクドナルドハンバーガーの味が恋しくてもこれなら食べれるのでは?
そう考えました。

3等分にしたマクドナルドハンバーガーの使い方


下記に使用例を上げておきます。
  • 夜購入した場合、<夜><翌朝><翌ランチ>と3回で使い切る。
  • 夜購入した場合、<夜><翌朝><お弁当>に入れる。
  • 同居人がいる場合は、1/3上げる。そして翌日1回分食べられる。

まとめ

  • 食事制限中でもマクドナルドを食べよう!
  • チキンクリスプ100円なので1/3にしたらお弁当の材料費としても破格の値段になる。



【仕事術】僕が前職で教えてもらった「5分で終わる仕事は後回しにせず、5分以内に片付ける」

こういう人向け

  • 仕事の優先度付けが下手くそだなぁって自覚している人
  • 入社年数の浅い社員様

前職の先輩が教えてくれました。


前職で1年先輩の社員が教えてくれました。
あまり仕事の出来る先輩って感じでは決して無かったけどメンタルケアとかは丁寧でした。
個人的に誘ってくれてランチとかも行かせてもらいましたしね。
すごい話しやすい雰囲気を持っている人だなと思いました。
そういう先輩から言われた中で「これだけは確かになぁ」と思うのがあります。

「5分で終わる仕事は後回しにせず、すぐに着手する」


もちろんケースバイケースですよ笑
クライアントへの直行で5分遅れたら色々問題です。

ただ、上記の発言の理由を聞いてみたら納得の行くものでした。


その程度で終わる仕事は、思い出すのに5分以上の労力がかかる。


その程度で終わるタスクなのに、翌日に後回しにすると、
「そのタスクがなんだっけ。どういう内容だったっけ」と振り返るフェイズが生じます。

結局記憶が活性化されているタイミングでは5分で終わるような事が、
翌日だと思い出すという無駄な時間まで生じてしまいます。

もちろん丁寧に作業しなければならないタスクなどは備忘録などを作って、
時間をかけて思い出す必要はあると思います。

ただ、5分で終わる仕事に関しては、すぐ着手すべきということです。


早くても雑な仕事に意味はない。
5分で完璧に終わらせる。


僕は追加で上記を心がけています。
仕事は精度で評価されるので5分で終わる仕事ほど、よく見られると思って
丁寧に仕事をしております。

まとめ


  • 5分で終わる仕事は後回しにしない。

【AmazonAlexaスキル開発】Node.js 8.10(alexa-sdk V1)でAPI通信(HTTPS通信)を行う方法を解説

こういう人向け

  • APIを利用して外部のデータを取得してAlexaスキルに反映したい。
  • モジュールって何?って人
  • モジュールインストールにnpmやターミナルを使用するのに抵抗がある人
  • サンプルコードを元に作業してみたい人
  • モジュール導入が最大の鬼門の人(これはわかる)

今回作った教材用スキル「仮想通貨の終値チェック」


なんでも良かったんですけどパラメータのシンプルさが気に入りました。
(API通信という概念が初めての人は上記URL押して下さい。データが返ってきます)

ビットコイン、ネム(ゼム)、モナーコインっていうと、
昨日の終値を答えてくれるスキルです。
もちろん最新の情報を取得しに行っているのでAPI通信しております。

  • ビットコインなら上記URLをbtc
  • ネムなら上記URLをxemに変換する
みたいな処理を行って、URLを可変にしてあげれば
通信して取得出来ます。

今回使うモジュール(全然気にしなくていいですが)


recipes(recipes.js)moduleを使用します。
とはいえ、これを導入してくださいねなど言わないので安心してください。
全部解説しますので。

モジュール関連の豆知識というか前提知識(知っておいてもいいかも)


const Alexa = require ('alexa-sdk'); 
という表記って多く見ませんか?
みなさん多くの方がソースコードの1行目に書いているだろうアレです。

あれは実はモジュールの宣言と言って、こういう作法で書かれているものです。
  const  変数名 = require ('モジュール名') ;

なので、const Alexa = require ('alexa-sdk'); の意味はalexa-sdkモジュール使いますという、
意味だったんです。

今回はLambda関数の作り方だけ大きく異なるので解説します。


私はいつも自前のzipファイルをアップロードしてから、
インラインコードにたまにATOMエディタから貼り付けるみたいな流れでやっていますが、
今回はそんな面倒な事しなくてもOKです。

Lambda関数で用意されているテンプレートを今回は使用いたします。
(テンプレートめっちゃ便利、用途にあった物があればの話だけど)

 画像を編集してチェック付けたので分かりやすいと思います。
いつもは新規作成しておりましたが、「設定図」からhowなどで検索して、
「alexa-skill-kit-sdk-howtoskill」を選択して下さい。

その後、自動で必要なファイルなど読み込んで、すぐにindex.jsを編集可能になります。


作成後、ランタイム(下画像上部)がNode.js 6.10になっていますが、
Node.js 8.10に変えましょう。

検証した感じ、verUPによる弊害などありませんでした。問題なしです。

あとはいつも通り記述する感じです。
先ほどお話したモジュールの宣言も、
const recipes = require('./recipes');があるのでしっかりされています。

また、モジュール追加もしっかりされているので動作します。

API通信部分のコーディング解説


例の如く、index.jsを全文公開しているので下記URLをクリックしてご確認下さい。

該当部分を下部にコピペしました。
下記記述を上手く自分の使いたいようにカスタマイズすれば出来ると思います。
API通信はコーディングが鬼門じゃなくてモジュール追加が最大の鬼門です。


moneyName = intent.slots.crypt.resolutions["resolutionsPerAuthority"][0]["values"][0]["value"]["name"];
            let http = require('https');

            var URL = 'https://api.zaif.jp/api/1/last_price/'+moneyName+'_jpy';
            console.log(URL);

            http.get(URL, (res) => {
                res.setEncoding('utf8');

                res.on('data', (chunk) => {
                    var parsedValue = JSON.parse(chunk);
                    var key1 = "last_price";
                    console.log(parsedValue);
                    console.log(parsedValue[key1]);
                    var message = '昨日の終値は' + String(parsedValue['last_price']) + '円です。次にお調べしたい仮想通貨があれば教えてください';
                    this.response.speak(message).listen(message + ' ' + SECOND_MESSAGE);
                    this.emit(':responseReady');

                });

            }).on('error', (e) => {
                console.log(e.message); //エラー時
                // this.emit(':tell', 'エラーです'+e.message);
                this.response.speak('エラーです');
                this.emit(':responseReady');

            });
          }

API通信 まとめ

  • API通信の最大の鬼門はモジュールの追加インストールだと思ってます。
  • コードは大したことない、サンプルコードだけで十分対応可能な範囲。
  • 返ってくる値がJSONでも適切に処理してあげればOK

参考


https://qiita.com/miutex/items/ff09b2f171be1588ce7b
※元記事からtell,askからresponseオブジェクトへ書き換えなど行っております。

    2018年12月10日月曜日

    【AmazonAlexaスキル開発】Responseオブジェクトについて考えてみる(ask,tellなど)

    こういう人向け(for you)

    • 下記のコードの違いが分からない方
      • this.emit(':tell', outputSpeech)
      • this.emit(':responseReady');
    • ディスプレイ対応Alexaスキルで音声と画面出力が上手く行かない方。

    はじめに、おことわり


    当記事は[Alexa] Responseオブジェクトを利用した応答の作成を参考に作成してます。
    元記事の解説が素敵なので多く引用しております。
    一度読んでみる事もオススメします。

    tellとaskの違いについて

    処理的にはshouldEndSessionで返ってくるのがTRUE/FALSEかという違いがあります。
    引用画像の赤字部分に相当します。

    これはtellの処理です。

    しかし分かりやすく噛み砕くと、

    • tell:ユーザーのレスポンスを待たない発話
    • ask:ユーザーのレスポンスを待つ場合に利用されていました。
        ユーザーが8秒間黙っていた場合、さらなるプロンプトを発話します。

    みなさんは会話終了するか、ユーザーからの応答プロンプトを待つかで使い分けていたかと思います。

    (特に審査を通るスキルに関してはここらへんが厳密に審査されています)


    「tell」記述要項 と Responseオブジェクト記述



    「ask」記述要項 と Responseオブジェクト記述



    両方とも同じ内容で書けるなら、
    なぜ使い分けが必要なのか。


    ディスプレイ表示対応している時に、
    this.emit(':responseReady');を使用せざるを得なくて、私は書き方を変えました。

    ディスプレイ液晶対応アレクサスキルを考える時は、
    レスポンスオブジェクトでの書き方を理解する必要があると思ってます。

    【AmazonAlexaスキル開発】
    Echo Spotなどのディスプレイ対応Alexa対応スキルの作り方 ask-sdk V1での作り方 http://iga34engineer.blogspot.com/2018/12/amazonalexaecho-spotalexa-ask-sdk-v1.html

    試しに読んでみてね。

    駄目な例

        'complaints': function () {

          let message = "";
          //Alexa対応デバイスのディスプレイの有無を判定している。
          if (supportsDisplay.call(this)) {
              const builder = new Alexa.templateBuilders.BodyTemplate1Builder();

              // ディスプレイディレクティブの作成
              let template = builder.setTitle('愚痴愚痴いうもん')
                .setBackgroundImage(makeImage('https://省略.jpg'))
                .setTextContent(makePlainText('あなたは何も悪くないから必要以上に悲しむのはやめるのよ。'))
                .build();

                message = "ディスプレイありと認識しております。"
                this.emit(':ask', message);
                this.response.renderTemplate(template);
          }else{
            //Alexaディスプレイなし機種の場合の分岐
            message = "ディスプレイなしと認識しております。"
          }
            this.response.speak(message);
            this.emit(':responseReady');
        }

    上記のようにディスプレイ有り分岐で
    this.emit(----)を2回通る場合などは正常に動作しません。

    恐らくではありますが、this.emit(':ask', message);の時点でもうセッションが終了して、
    それ以降の処理が行われていないんですよね。
    いわゆるreturn的な処理と同一かと思っています。

    なので、Alexaに発音させる為に、this.emit(':ask', message);だけを使うっていう選択肢は悪手なのです。

    修正後


      const handlers = {
        'LaunchRequest': function () {//起動したとき
        const speechOutput= FIRST_MESSAGE;
        this.emit(":ask",speechOutput,HELP_REPROMPT);
        },
        //愚痴愚痴いうもん 唯一のインテント

        'complaints': function () {
          let message = "";
          //Alexa対応デバイスのディスプレイの有無を判定している。
          if (supportsDisplay.call(this)) {
              const builder = new Alexa.templateBuilders.BodyTemplate1Builder();
              // ディスプレイディレクティブの作成
              let template = builder.setTitle('愚痴愚痴いうもん')
                .setBackgroundImage(makeImage('https://省略語.jpg'))
                .setTextContent(makePlainText('あなたは何も悪くないから必要以上に悲しむのはやめるのよ。'))
                .build();

                message = "ディスプレイありと認識しております。"
                // this.emit(':tell', RESULT_DISPLAY_MESSAGE);
                this.response.renderTemplate(template);
          }else{
            message = "ディスプレイなしと認識しております。"
          }
            this.response.speak(message);
            this.emit(':responseReady');
        },

    コードをちゃんと修正いたしました。
    インテントの関数内で、this.emit('responseReady');が出てくる箇所をそもそも1箇所にして、
    アレクサに発声させる文章は、let messageに代入するように書き換えてます。

    これなら画面表示もさせつつ、音声で発生する事が可能になりました。

    まとめ

    • tell、askを適切に理解して使う。
    • ディスプレイ対応も考えると、Responseオブジェクトを利用してもいいかも。
    • 書き方を自分の中で落とし込んで使えるようにする。