My Alexa の知見4  Generating Wake Word for only you - オリジナルなwake wordの作り方 -

## はじめに
この投稿は私がラズパイで自作Alexaを開発した知見を投稿するシリーズです。
同じ現象に当たった時の助けになればいいなと思ったので、始めることにしました。

## Wake word とは？
デバイスが[AVS](https://developer.amazon.com/alexa-voice-service)にリクエストを送るトリガーになる特定の単語のことです。

**alexa**, **amazon**, **echo**, **Computer**, 

## 前提条件
Alexa Enabled なオリジナルのデバイスにのみ適用できます。
Amazon Echo, Dot, Tapなど、Amazon 純正のデバイスは上の単語リストから選ぶことになります。

alexa client は、例によって [AlexaPi](https://github.com/jaws-ug-kobe/AlexaPi)を使います。

## alexa pi の構成
![IMG_2927.jpg](https://qiita-image-store.s3.amazonaws.com/0/49986/84084780-49c8-bb83-6f45-b1160820f91f.jpeg)

ざっくりしていますが、ユーザーが何かを発話したときに、

1. Detectorでwake wordを判定
2. WakewordだったらDeviceに引き渡して録音
3. 録音した音声をAVSに投げる

といった感じで処理しています。

## Detector
AlexaPi では、[Snowboy](https://github.com/Kitt-AI/snowboy) という hot word detection ライブラリを使っています。

### Snowboy における hot word の検知のやりかた
AlexaPi では、Snowboyのコードの一部を改造して利用していますが、考え方は同じです。

[ソース](https://github.com/jaws-ug-kobe/AlexaPi/blob/dev/wakeword_detection.py)

以下のソースは、説明のため一部コメントを足しています。

```pytb:wakeword_detection.py

:

# 1. 検知するホットワードファイルのリストを与えます。
models = ["resources/alexa.umdl", "resources/Stop.pmdl", "resources/Wakeup.pmdl]

# 2. ホットワードを検知したときに呼ばれるコールバックを登録します。（それぞれのコールバックの中身は省略しています）
callbacks = [alexa, go_back, go_out, stop]

# ３. snowboyインスタンスを生成するときにモデルのリストを渡します。
detector = snowboydecoder.HotwordDetector(models, sensitivity=0.5, recorder=recorder)
alexa_device = Device(recorder=recorder)

:

# main loop
# ４. 検知を開始するときにコールバックのリストを渡します。
detector.start(detected_callback=callbacks,
               interrupt_check=interrupt_callback,
               sleep_time=0.03,
               sensor_detect_callback=someone_detected)
:

```

オリジナルのホットワードファイルとコールバックをsnowboyに渡せば、検知してくれるというわけです。


## hotword の作り方

1: https://snowboy.kitt.ai/ にアクセスします。（要サインアップ）

<img width="1524" alt="スクリーンショット 2017-02-15 16.15.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/592fbfa6-cb77-f838-a5df-66475888be6a.png">


2: Create Hotword を選択します。

<img width="1043" alt="スクリーンショット 2017-02-15 16.16.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/5eeab750-93b5-2f50-e357-d7635d37a037.png">


３: ホットワードの言語を選びます。（日本語もできます）

<img width="903" alt="スクリーンショット 2017-02-15 16.16.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/e2fe1674-8afa-901c-d816-e5523c5be6cc.png">


４: ３回録音します。
<img width="899" alt="スクリーンショット 2017-02-15 16.17.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/5db34f8e-d553-0ed2-60b2-532067022fe9.png">

5: 検知できるかテストします。

<img width="899" alt="スクリーンショット 2017-02-15 16.18.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/461da698-fbfa-4f41-cc08-1dfaf96f166c.png">

検知できたら、ファイルをダウンロードします。
(例では、wake up.pmdl というファイルを作成しました。）

あとは、このファイルをデバイス側にインプリメントすれば、"wake up" を wake wordにすることができます。

## wake word の検知率を上げる
snowboy は、１回自分がサンプリングして作っただけでは、まさに自分用です。
検知率を上げるには、キーワードをいろんな人に喋ってもらんて、サンプリングされることが必要になります。
２０００人がサンプリングすれば、一般的なワードファイルとして昇格します。（後述）
いろんな人にサンプリングしてもらえばもらうほど、検知率が高くなるということです。

すでに存在するワードにサンプリングを追加する方法を以下に記載します。（作るときとあまりかわりません。）

1. https://snowboy.kitt.ai/ にアクセスします。（要 サインアップ）
2. サンプリングするホットワードを探します。


<img width="1077" alt="スクリーンショット 2017-02-21 16.40.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/b585f0f4-389a-b9b5-5647-38d4c3cdfa8c.png">

ホットワードのリンクをクリックします。

3.サンプリングします

***Record and download the model***をクリックします。

<img width="1088" alt="スクリーンショット 2017-02-21 16.46.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/a7ec8191-90e6-0bde-7a37-b5e3926563f3.png">


あとは、作成時と同じです。３回録音ー＞テストー＞ダウンロードする。

##補足
ホットワードのファイル拡張子には、**umdl** と **pmdl** があります。


**umdl**

様々な人が話したホットワードをリスティングしているファイルです。alexa でホットワードを検知させたい場合は、自分で録音するより、alexa.umdl があるのでこちらをつかいましょう。

**pmdl**
自分で作成した独自のホットワードです。
作成例のところにもありましたが、gender（性別）とage group(年齢の範囲)を選択する必要があります。自分以外にもホットワードを検知させたいような場合、何人もの人に話してもらって、いくつかのパターンでホットワードファイルを作ることになります。


## 最後に
ホットワードを自分で作ることができるようになると、alexaとまた仲良くなれた気がしていいですね。
ぜひ、デバイスつくるなら、やってみてはどうでしょう？？