スマートスピーカーアプリの基本的なところ

# はじめに
スマートスピーカー買いましたか？
スマートスピーカー使ってますか？
スマートスピーカーのアプリ作ってますかっ？

実はわりと簡単に作れてしまうこのアプリ。どうやって作るんだろう？と思う方は少なくないのではないでしょうか。
この記事ではアプリってどうやって作られているんだろう（動いているんだろう）？という点について書いてみます。

# 用語的なこと
AmazonEchoやGoogleHome両方を合わせて書いているためAmazonEchoのスキルを**アプリ**と記載しています。

# スマートスピーカーの起動（ウェイクワード）
最近はCMなどでも見るようになったのでなんとなくご存知かと思いますが、起動って言ってもいつも電源つけっぱなしじゃないの？という方もいるかもしれません（？）

通常何かを知りたい/聞きたい場合は次のように話しかけます。
「**アレクサ**、何か曲をかけて」
「**OK,Google**、今日の天気は？」

それぞれ曲がかかったり、天気を教えてくれたりするのですが、この「アレクサ」や「OK,Google」という言葉を最初に言わないと「何か曲をかけて！何か！曲を！」と呼べど叫べど反応してくれません。

この「アレクサ」や「OK,Google」というスマートスピーカーがユーザーの声を聞いてくれる状態になる言葉を**ウェイクワード**と呼びます。
このウェイクワードがないと、普段の会話を聞き取って動作しまくってしまいますもんね。

さて、このウェイクワード。実際に使っている方はわかると思いますが、ウェイクワードを言うとスピーカーが音とか光とかで「話していいよ？」という感じに反応してくれます。
なんとなく感覚的にその反応を見てから（待ってから）「今日の天気は？」と言いたくなりますが、実は続けて話しても大丈夫なようです。

→ https://robotstart.info/2018/03/29/smart-speakers-wake-word.html
(この記事自体はLINE Clovaの記事ですが、後ろの方にAlexaとGoogleHomeの事も書いてあります)

# スキル／アプリの起動
さて、スマートスピーカーが反応したら続いてアプリの起動です。
先述の通り、「何か曲をかけて」の部分がこれに該当するのですが、このような機能はスマートスピーカーが元々持っている機能です。
「〜〜ってどういう意味？」「いま何時？」の他にも色々と機能が搭載されているので探してみてください。

これに対して、企業や団体、個人が作成したアプリの起動はちょっと違って、次のように話しかけると起動します。
「アレクサ、〜〜〜〜（アプリ名）を実行して」
「OK,Google、〜〜〜〜（アプリ名）につないで」

若干違和感のある起動方法な気もしますけどね・・・（笑

このアプリを起動するところまでがスマートスピーカーの仕事です。
アプリが起動してからは、アプリケーションに実装されている機能が基本的に全ての応答を行うようになります。

# アプリの挙動
アプリには幾つか種類があり、ニュースなどを音声で流してくれる**フラッシュブリーフィング**、**スマートホーム**と呼ばれている「電気をつけて」や「掃除機をつけて」と言って家電を動かすアプリなどを作れるのですが、ここでは**対話を主としたアプリ**をメインに書いています。

ということで、いよいよアプリの挙動について書いていきます。
対話を主とするため、利用者とスピーカーで言葉を交わしていく形になります。チャットボットの音声版のようなイメージです。

対話イメージ

| No | 利用者 | スマートスピーカー |
|:-:|:--------|:-----------|
|1| 〜〜〜〜（アプリ名）を実行して |  |
|2| | 〜〜〜〜（アプリ名）です。このアプリはこんなことができますよ！ |
|3| じゃあ、●●●●をしたい |  |
|4| | ●●●●ですね。では始めましょう！ |
|-| 〜 | 〜 |
|9| 終了して | |
|10| | ご利用ありがとうございました！ |

という感じで、下記の太字部分のようなスマートスピーカーの挙動を作っていくことになります。
1. 利用者がアプリを起動する
2. スマートスピーカーが**起動時の言葉を話して、何をしたいかを問う**
3. 利用者が何をしたいか、または問いに対して答える
4. スマートスピーカーが、利用者の話を認識して、**それに対応した回答をして、次に何をしたいかを問う**
〜. 3,4を繰り返します。
9. 利用者がアプリの終了を告げる
10. スマートスピーカーは**アプリの終了メッセージを話す**

基本的に利用者は思うままに話しかければ大丈夫ですが、作り手がいて、どうやって作られているのかを知ると使い勝手が向上するかもしれないですね！
（アプリを作る方は、どう話しかけられてもちゃんと応答できるようには作っていますので、気にする必要は無いです）

## アプリの挙動（起動時）
アプリが起動された時にスマートスピーカーが話す**起動メッセージ**です。
一般的なアプリだとロゴだったり、起動時に表示されるメニュー画面っぽいものだったりに位置します。

スマートスピーカーのアプリとしては、そのアプリの使い方を簡潔に説明する内容になっていることが殆どです。

【応答のイメージ】
「(アプリ名)へようこそ！このアプリではこれこれこういう事ができます。こんな感じで話しかけてね」

利用者としては、初めて使うアプリの場合、ここの話を聞けば基本的な使い方は分かる・・・・と思います。
逆に作成者は、ここで簡潔に使い方(導入部分だけでも？)を利用者に伝える**必要**があります。(審査の対象になっています)

いよいよここから対話が始まります！

## アプリの挙動（対話）
「いま何時？」のような時間を問われて回答するだけのように、**起動とともにアプリが終わる**ものには当然ながら対話はありませんが、多くのアプリは起動後に利用者とスマートスピーカーが対話しながらサービスを届けます。

例えば、世界の時間と天気を教えてくれるアプリを作成するとして、その対話イメージを考えてみます。

---

利用者：「世界時計を開いて」
スマートスピーカー：「世界時計へようこそ。このアプリでは世界中の今の時間や天気を聞くことができます。まずは聞きたい国名または都市名を話してみてください。」

利用者：「サンフランシスコで」
スマートスピーカー：「サンフランシスコですね？では続いて、聞きたいのは時間ですか天気ですか？」

利用者：「時間です」
スマートスピーカー：「サンフランシスコは今、午前１１時４８分です。」
〜〜アプリ終了〜〜

---

非常に簡単な例ではありますが、簡潔に届けたいサービスに向けて必要な情報を集めようとスマートスピーカーが誘導しているのが分かるかと思います。（単純に質問しているだけですけども）

このように、利用者に届けたいサービスについて必要となる情報を話してもらうために、どのように対話をしていくのか、その対話フローを考えるのが基本的な設計部分になります。

例えば上記の対話フローの例では、サンフランシスコの時間を答えた時点でアプリを終了していますが、このまま対話を続けて、「他の国の時間や天気も確認しますか？」と、続けていくこともできます。
利用者からアプリ終了の意思を受け取るまで繰り返すか、一度回答したら終了するか。このあたりの設計も面白いですね。

## アプリの挙動（インテント）
少し技術的な話に入っていきます。

チャットボットなども同じことが言えるのですが利用者がこのようなアプリと対話する場合、アプリは利用者から**どのような事をしたいと言っているのか(もしくは入力しているのか)**を判断して応答内容を処理します。

しかしこの**どのような事をしたいと言っているのか(もしくは入力しているのか)**を判断するのは非常に難しいです。口語だったり言い回しだったり利用者によって言い方が変わってくるため、**こう言ってくれるはず**というのは通用しません。
そこで利用者が話した内容から**どのような事をしたいのか**を判断するために自然言語解析なんてものが登場します。今では多種多様な解析用のAPIなどが出てきているため、そのようなサービスを使用してアプリを作成することは可能ですが、敷居が高くなってきた感じがしますね。

でも大丈夫です！
スマートスピーカーのアプリ開発にはこの自然言語解析が備わっています。

スマートスピーカーの開発は概ね次のようなものになります。

- 自然言語解析部分
    - どういう事を言われたら、どういう事をしたいと判断するか
    - その時、どのプログラムを実行するか
    - その他
- プログラム部分
    - 何らかの処理を行って、応答文言をテキスト文字列で組み立てる
    - その他

自然言語解析部分は専用の登録用画面が開発者向けに用意されています。
ここで登録する**どういう事をしたいのか**を**インテント**と言います。
この辺りの設定方法は別のページで記載しますが非常に簡単に設定できます。

先の例では利用者が都市名を話す場面と、時間か天気を選んで話す場面がありましたね。
開発者はこの「都市名インテント」と「時間か天気インテント」の二つを登録することになります。

各インテントにはプログラムを紐づける事ができますので、例えば「都市名インテント」の場合は話された都市名を記憶して、「(都市名)ですね？では続いて、聞きたいのは時間ですか天気ですか？」という文字列を組み立てるようなプログラムを用意するだけです。


# いったん最後に
このように、利用者の話した内容とプログラム部分をかなり簡単に結びつける事ができるので、簡単なアプリであればサクッと作れてしまいます。
何かアイデアを思いついたら、とりあえず作ってみるか！というノリで始めてみても面白いかもしれません。

この次から実際の作り方、テストの仕方、申請の仕方までまとめていこうと思います。