Alexaスキル 入門 & VUI 設計

# 1. はじめに

---

## 自己紹介

- 所属
独立系SIer 先端技術事業部（2000年入社）

- 業務
Alexaスキル開発＆Googleアシスタント開発

- TAKAHIRO NISHIZONO
@zono_0 

---

## profile image
- アイコンかえました。（お知らせ）

![83260.png](https://qiita-image-store.s3.amazonaws.com/0/240522/8e3a2690-4dba-a347-15a6-168ebbee0952.png)


---
## 個人で開発したAlexaスキルの紹介
![スクリーンショット (198).png](https://qiita-image-store.s3.amazonaws.com/0/240522/bc630e93-3e7b-b8ad-c6e0-51f6def63620.png)

---
## 個人で開発したGoogleHomeアプリ
![スクリーンショット (201).png](https://qiita-image-store.s3.amazonaws.com/0/240522/c0125e82-3c25-0432-8c8e-e1f3edb67a3e.png)


---
## このスライドを見てできること
- Amazon Echoが理解できる。
- Amazon Alexaが理解できる。
- Alexaスキル開発の基本が理解できる。
- AlexaスキルのVUI設計が理解できる。

VUI：ボイスユーザインターフェース
→いけてるトークのこと。

---

# 2. Amazon Echoについて

---

## Amazon Echoとは

- Amazon が開発したスマートスピーカ。
- Amazon が所有する人工知能「<font color="Red">Alexa（アレクサ）</font>」を利用し、音声を認識して色々な操作を事項できる「<font color="Red">音声認識ユーザインターフェース</font>」。

---

## Amazon Echo ＆ Echo Dot

![Echo and Echo Dot.jpg](https://qiita-image-store.s3.amazonaws.com/0/240522/bcdba468-553b-6330-5cf1-f778d90a5184.jpeg)

---

## Amazon Echoの使い方

- Amazon Echoに対して話しかけるだけ。

```text:トーク（サンプル）
ユーザー：「アレクサ、今日の天気は？」
アレクサ：「〇〇の現在の天気は晴れで、摂氏20度です。」
```

---

## Amazon Echoの特徴

- 音声発話に対するレスポンスは<font color="Red">1秒以内</font>のこだわり。（byジェフ・ベゾフ氏）
- <font color="Red">7つのマイク</font>で、音声を正確にひろうことができる。
- 未来のUIは<font color="Red">タッチから音声</font>の時代になる？
- <font color="Red">スマートホームハブ</font>の役割を果たす。

---

## Amazon Echoで出来ること

- 天気、ニュース、スポーツの読み上げ
- 音楽、ラジオの再生
- ショッピング
- デバイスの操作（ライト、テレビ）
- <font color="Red">カスタムスキル</font>の実行（<font color="Red">音声アプリ</font>）
- タイマー（神機能！）

---

## Echo 姉妹製品

- Amazon Echo Dot 小型（$50）
- Amazon Echo Spot モニタ付き（$130）
- Amazon Tap 屋外用（$139.99）
- Amazon Echo Look カメラ付き（$199）
- Amazon Echo Show モニタ付き（$230）

---

## Echo 姉妹製品
![スクリーンショット (204).png](https://qiita-image-store.s3.amazonaws.com/0/240522/64c60029-e8ab-bfca-cfdf-fcde286a7624.png)


---

## 類似製品

- Google Home（$130）
- LINE WAVE（14,000円）
- Apple HomePod（$349）
- Microsoft Harman Kardon Invoke（$199.95）

---

# 3. Amazon Alexaについて

---

## Amazon Alexaとは

- Amazonが提供する<font color="Red">クラウドベースの音声認識サービス</font>。
- 音声Requestは、Alexaに送信され、テキスト変換後、Alexa Skill<font color="Red">（AWS Lambda）で処理</font>され、Response結果を音声で応答します。

---

## 音声処理の流れ

![スクリーンショット (25).png](https://qiita-image-store.s3.amazonaws.com/0/240522/677ea9d5-f88e-7cfc-08e7-793eb5682fd7.png)

---
# 4. Alexaスキルについて

---

## Alexaスキルとは

- Alexaが音声から変換したテキスト情報（JSON Request）を処理して応答（JSON Response）する<font color="Red">音声プログラム</font>。
- 一般的に音声プログラムは、<font color="Red">AWS Lambda Function</font>に実装される。

---

## Alexaスキルストアとは

- Alexaスキルの入手場所。
- スマホの<font color="Red">Alexaアプリ</font>からAlexaスキルを入手。
- Alexaスキルは、<font color="Red">スキルを「有効」にすることで利用できる</font>ようになる。
- Alexaスキルには、<font color="Red">「アカウントリンク」と呼ばれる個人情報登録が必要なもの</font>もある。

---

# 5. Alexaスキルの開発について

---

## 開発対象

- 開発対象は、AlexaスキルとLambda部分

![スクリーンショット (24).png](https://qiita-image-store.s3.amazonaws.com/0/240522/e4a87557-71d6-05e9-af8e-1862cfb81e73.png)


---

# 6. Amazon Developer Portalについて

---

## Amazon Developer Portalでの開発

- <font color="Red">Alexa Skills Kit</font>（ASK）
→<font color="Red">Alexaスキル（音声アプリ）</font>が作れます。

- Alexa Voice Service（AVS）
→独自のスマートスピーカが作れます。
→Raspberry PiでAVSを利用するとか。

---

## Alexa Skills Kit（ASK）とは

主に3種類のAlexaスキルが作成できる。
- <font color="Red">Custom Skills（一般的な音声スキル）</font>
- Smart Home Skills（家電操作のスキル）
- Flash Brifing Skills（ニュース読み上げスキル）

---

## 参考：Amazon Developer Portal
- 開発画面イメージ

![スクリーンショット (207).png](https://qiita-image-store.s3.amazonaws.com/0/240522/eb29d1cc-6545-eba4-3251-7b5678bbd6fc.png)

---

# 7. AWS Lambdaについて

---

## AWS Lambdaでの開発

- <font color="Red">AWS Lambda</font>で、<font color="Red">音声プログラム</font>を開発。
- Node.js（Javascript）、Pythonが利用可。
- Lambda関数には、<font color="Red">Amazon リソースネーム（ARN）</font>が付与され、一意に識別される。
- Amazon Developer Portal側で<font color="Red">エンドポイントにARNを設定</font>することで、Alexaスキルから、どのLambda関数を呼び出すかを設定。

---

## エンドポイントとARN

![スクリーンショット (27).png](https://qiita-image-store.s3.amazonaws.com/0/240522/c9a90282-4256-fbe1-d26f-abfe01948432.png)

---

## 参考：AWS Lambda
- 開発画面イメージ

![スクリーンショット (206).png](https://qiita-image-store.s3.amazonaws.com/0/240522/2423c677-ecaf-dc56-4d9a-7a0427a59818.png)


---

# 8. テスト方法について

---

## Alexaスキルのテスト方法とは

- Echoデバイス実機テスト
- <font color="Red">Amazon Developer Portal内のテストシミュレータ</font>（優秀、実機がなくてもスキル申請までもっていける）
- <font color="Red">Reverb</font>（スマホiOSで日本語がつかえたー！）
- Echosim.io（今はもう使わないかも）

---

## テストツールの紹介
- ADP内のテストシミュレータ（神ツール）

![スクリーンショット (20).png](https://qiita-image-store.s3.amazonaws.com/0/240522/26841287-d13c-7537-5b93-6cf48556d7ba.png)

---

## テストツールの紹介
- ADP内のサービスシミュレータ（Intent用）

![スクリーンショット (19).png](https://qiita-image-store.s3.amazonaws.com/0/240522/7688adbe-c2c9-243a-0e82-68bc197ccfc1.png)

---

## テストツールの紹介
- Echosim.io（https://echosim.io/）

![スクリーンショット (22).png](https://qiita-image-store.s3.amazonaws.com/0/240522/7ed633a2-b7b9-e20a-9b4b-a158df31cef0.png)

---

## テストツールの紹介
- Reverb（iOS、Androidアプリ。iOS版は日本語Alexaが使えておすすめ。）

![スクリーンショット (23).png](https://qiita-image-store.s3.amazonaws.com/0/240522/4259704c-2b4a-b675-59c5-394f1e62fe5f.png)

---

# 9. 必要な知識について

---

## スキル呼び出し

```text:スキル呼び出し
ユーザー：「アレクサ、ピカチュウトーク を 開いて。」
           -------  --------------    ------
          <wake word> <skill name>   <launch phrase>
```

- 起動フレーズ（launch）は、起動して。実行して。スタートして。なども使える。
- 接続詞「で」の使用は原則禁止らしい。

---

## スロット（<font color="Red">会話中のキーワード</font>）

```text:スロット
アレクサ：「ご利用の日付と時間をお知らせください。」
ユーザー：「<今日>の<15>時。」
           -----   --
           <slot> <slot>
```

- <<font color="Red">今日</font>>は、<font color="Red">AMAZON.DATE</font> スロット
- <<font color="Red">15</font>>は、<font color="Red">AMAZON.NUMBER</font> スロット

---

## インテント（<font color="Red">ユーザのお願いごと</font>）

```text:インテント
ユーザー：「ニュースを聞かせて。」
           -----------------
           <Intent>：例えば、NewsIntent

ユーザー：「運勢を占って。」
           -----------
           <Intent>：例えば、FortuneIntent

```

---

## インテントとスロット

```text:インテント＆スロット
ユーザー：「<今日>のニュースを聞かせて。」
           -----  -----------------
           <slot>  <Intent>：NewsIntent

```

- NewsIntentに、AMAZON.DATEスロットが、ひもづく関係。

---

## サンプル発話（呼び出しフレーズ）

```text:サンプル発話
ユーザー：「ニュースを聞かせて。」
ユーザー：「ニュースを知りたい。」
ユーザー：「ニュースを読んで。」
ユーザー：「ニュース!!」
           全て、NewsIntent の呼び出しフレーズとなる。

```

- 人が言いそうな発話パターンを洗い出し、あらかじめサンプル発話として登録する。

---

# 10. 開発用語

---

## 開発用語

- Skill name（スキル名）
- Invocation Name（<font color="Red">スキル呼び出し名</font>）
- Intent Schema（インテントの定義）
- Intent（<font color="Red">インテント</font>：人間の「意図」）
- Slot（<font color="Red">スロット</font>：変数みたいなもの）
- Sample Utterances（<font color="Red">サンプル発話</font>：インテント呼び出しフレーズ）
- Endpoint（エンドポイント Lambda のARN）

---

# 11. ビルトイン（標準機能）

---

## 便利なビルトインインテント
サンプル発話登録不要、標準で使える、[ビルトインインテント](https://developer.amazon.com/ja/docs/custom-skills/standard-built-in-intents.html)。

- <font color="Red">AMAZON.YesIntent</font>　・・・「はい。／オッケー。／いいよ。」
- <font color="Red">AMAZON.NoIntent</font>　・・・「いいえ。／ノー。」

---

## 必須のビルトインインテント
Amazon様仕様により<font color="Red">必須となるインテント</font>。

- <font color="Red">AMAZON.CancelIntent</font>　・・・「キャンセル。／取り消し。／やっぱりやめる。」
- <font color="Red">AMAZON.StopIntent</font>　・・・「ストップ。／止めて。／中止。」
- <font color="Red">AMAZON.HelpIntent</font>　・・・「ヘルプ。／どうすればいいの。／使い方を教えて。」

---

## 便利なビルトインスロット
スロット登録不要、標準で使える、[ビルトインスロット](https://developer.amazon.com/ja/docs/custom-skills/slot-type-reference.html)。

- <font color="Red">AMAZON.DATE、AMAZON.TIME、AMAZON.NUMBER</font>など

→Amazonが用意した<font color="Red">スロット登録済み用語</font>
→音声認識精度が高く、Good！

---

# 12. リクエストとインテント

---

## リクエストの種類
基本のリクエストは、3つ。

- 'LaunchRequest'　・・・<font color="Red">インテント無し起動</font>
- 'IntentRequest'　・・・<font color="Red">インテント指定発話</font>
- 'SessionEndedRequest'　・・・<font color="Red">予期せぬ終了</font>

---

## IntentRequestの種類
<font color="Red">IntentRequestには、子供Intentがいる。</font>

- 必須インテント3兄弟（CancelIntent、StopIntent、HelpIntent）
- はい／いいえ姉妹（YesIntent、NoIntent）
- ユーザ定義（NewsIntent、FortuneIntent）

---

# 13. VUI音声設計について

---

## VUI設計：トークシナリオ（例）

```text:トークシナリオ（例）
ユーザー：「アレクサ、<新幹線予約>を開いて。」
アレクサ：「新幹線予約へようこそ、このスキルでは新幹線
　　　　　　チケットをご購入いただけます。ご利用の日付
　　　　　　と時間をお知らせください。」
ユーザー：「<今日>の<15>時。」
アレクサ：「<〇月〇日>、<15>時ですね、自由席か指定席の
　　　　　　どちらになさいますか？」
ユーザー：「<自由席>でお願い。」
アレクサ：「<自由席>ですね、購入しますか？」
ユーザー：「<はい>。」
アレクサ：「チケット購入を確定しました、ご利用ありがとうございます。」

```

---

## VUI設計：スキル呼び出し名
ユーザ発話から、スキル呼び出し名 を決定。

```text:VUI設計解説
ユーザー：「アレクサ、<新幹線予約>を開いて。」
                     ---------
                     <スキル呼び出し名>

                     インテント指定なしの初回起動は、
                     'LaunchRequest' が呼ばれるっぺ。
```

---

## VUI設計：Intent ＆ Slot
ユーザ発話から、Intent と Slot を抽出する。

```text:VUI設計解説
ユーザー：「<今日>の<15>時。」
            ----   ---
            <slot> <slot>
            AMAZON.DATE と AMAZON.NUMBERが使えるっぺ。

            Intent名は、DateAndTimeIntent にすっぺ！
            サンプル発話は、以下でいけそうだべ。
            DateAndTimeIntent {DATE} の {TIME} 時 
```

---

## VUI設計：Intent ＆ Slot
ユーザ発話から、Intent と Slot を抽出する。

```text:VUI設計解説
ユーザー：「<自由席>でお願い。」
            -----
            <slot>
            ビルトインは使えない、カスタムスロットだべ。
            LIST_OF_SEATスロットを定義して、
            値に「自由席」と「指定席」を入れるべ。
            Intent名は、SeatIntent にすっぺ！
            サンプル発話は、以下でいけそうだべ。
            SeatIntent {SEAT} でお願い 
```

---

## VUI設計：Intent ＆ Slot
ユーザ発話から、Intent と Slot を抽出する。

```text:VUI設計解説
ユーザー：「<はい>。」
            ----
            これはAMAZON.YesIntentだべ。
            Slot定義は不要だべさ。

            サンプル発話には、以下もついかすっぺ。
            AMAZON.YesIntent 購入します 
```

---

# 14. 設計例

---

## IntentSchema.jsonの設計例

```json:IntentSchema.json
{
  "intents": [
    {
      "slots": [
        {
          "name": "DATE",
          "type": "AMAZON.DATE"
        },
        {
          "name": "TIME",
          "type": "AMAZON.TIME"
        }
      ],
      "intent": "DateAndTimeIntent"
    },
    {
      "slots": [
        {
          "name": "SEAT",
          "type": "LIST_OF_SEAT"
        },
      ],
      "intent": "SeatIntent"
    },
    {
      "intent": "AMAZON.YesIntent"
    },
    {
      "intent": "AMAZON.NoIntent"
    },
    {
      "intent": "AMAZON.CancelIntent"
    },
    {
      "intent": "AMAZON.StopIntent"
    },
    {
      "intent": "AMAZON.HelpIntent"
    }
  ]
}
```

---

## カスタムスロットの設計例

```plaintext:LIST_OF_SEAT.txt
自由席
指定席
```

---

## サンプル発話の設計例
ユーザ発話しそうな可能性を、全て列挙する。

```plaintext:Utterances.txt
DateAndTimeIntent {DATE} の {TIME} 時 
SeatIntent {SEAT} でお願い
AMAZON.YesIntent 購入します  
DateAndTimeIntent {DATE}
DateAndTimeIntent {TIME}
DateAndTimeIntent {TIME} 時 {DATE} で 
AMAZON.HelpIntent 使い方を教えて
AMAZON.HelpIntent 使い方教えて
AMAZON.HelpIntent 使い方
```

---

# 15. おまけ

---

## スマートスピーカをいますぐ体験
- iOS（iPhone、iPad）の方は、アプリ「<font color="Red">Reverb</font>」と「<font color="Red">Alexaスキル</font>」をインストールすると、日本語Alexaが使えます。
- iOS ＆ Android（スマホ、タブレット）の方は、アプリ「<font color="Red">Googleアシスタント</font>」をインストールすると、日本語Googleアシスタントが使えます。

---

# 16. まとめ

---

## Alexaスキル開発でおこなうこと

- <font color="Red">Amazon Developer Portal</font>を用いて、Alexaスキルの設定＆登録をおこなう。
- <font color="Red">スキル名、スキル呼び出し名、インテント、スロット、サンプル発話</font>等を定義。
- <font color="Red">AWS Lambda</font>を用いて、定義に沿った音声プログラムを作成する。

---

## さらなる高みへ
- Amazon Developer PortalのVUI設計としてはこれで十分。
- ただし、Lambda Function側では、状態遷移（state）を制御しないと、真のトーク上手にはなれない。。。
- まずは、状態遷移が不要なショートトークのAlexaスキルで、トークの極意を磨くのじゃ！

---

# 17. おわりに

---

## おわりに
いかがでしたでしょうか？
いけてるVUI設計が、できそうですか？

いけてなくてもいいので、
まずは、Alexaスキル作り、してみましょう！！

---
## ご視聴ありがとうございました。