【動物会話】犬・猫・カラス音声認識を「エッジ音声認識アプリ」でやってみた♬

[昨夜までのアプリ]()の応用として、「動物との会話」をやるために、まず「犬・猫を音声で分離する。」をやってみた。
###とりあえずの目標
１．犬・猫の音声認識
２．動物の音声認識
３．犬の種類・猫の種類の認識
４．犬・猫・カラスの声にそれぞれの声で反応を返す
５．犬・猫・カラスの話を翻訳して、人の声で返すと翻訳して返す
。。。
最終目標；「動物と日常会話ができるようになる」
###今回やったこと
今回は以下のように、ほんのさわりのところをやってみました。
アプリ的には、ほぼ昨夜までのものと同様ですが、num_classes以外にも、実はちょっとだけ変更しました。
・犬・猫の音声認識
・犬・猫・ポメラニアンの音声認識
・犬・猫・ポメラニアン・カラスの音声認識
###・犬・猫の音声認識
これって、前回のアプリそのままでできたので、特に説明しません。
ちなみに、データはyoutubeにアップされているものを録音させていただきました。
録音方法は、[hirakegoma/pyaudio_realtime.py](https://github.com/MuAuan/hirakegoma/blob/master/pyaudio_realtime.py)を動かしてある意味取得できたもので、さすがにひどいノイズ（人の声が主なものや車の走る音）のときは手で除去しました。
以下比較のために、flatten_1以下を載せると以下のとおりでした。

```
flatten_1 (Flatten)          (None, 65536)             0
_________________________________________________________________
dense_1 (Dense)              (None, 40)                2621480
_________________________________________________________________
activation_1 (Activation)    (None, 40)                0
_________________________________________________________________
dropout_6 (Dropout)          (None, 40)                0
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 82
_________________________________________________________________
activation_2 (Activation)    (None, 2)                 0
=================================================================
Total params: 4,606,490
Trainable params: 4,605,786
Non-trainable params: 704
_________________________________________________________________
Train on 360 samples, validate on 106 samples
Epoch 256/256
360/360 [==============================] - 2s 5ms/step - loss: 0.1309 - acc: 0.9472 - val_loss: 0.4548 - val_acc: 0.8585
Test loss: 0.454764249752
Test accuracy: 0.858490563789
```
つまり、Test loss=0.45で、acc=0.9472 Val_acc=0.8585が得られて、かなりミスすることなく、犬・猫を学習できました。
ちなみに、データは「Train on 360 samples, validate on 106 samples」であり、内容は、猫は喧嘩しているもの、犬はとうぼえのものであまり犬らしくも猫らしくもありませんが、人のとうぼえが入ってしまう難はありますが、違いははっきりしています。
###・犬・猫・ポメラニアンの音声認識
これもnum_classes=3とし、dense_1を以下のように変更するだけで、学習できました。
ポメラニアンは、「わんわん。。。」吠えてる動画です。

```
flatten_1 (Flatten)          (None, 65536)             0
_________________________________________________________________
dense_1 (Dense)              (None, 60)                3932220
_________________________________________________________________
activation_1 (Activation)    (None, 60)                0
_________________________________________________________________
dropout_6 (Dropout)          (None, 60)                0
_________________________________________________________________
dense_2 (Dense)              (None, 3)                 183
_________________________________________________________________
activation_2 (Activation)    (None, 3)                 0
=================================================================
Total params: 5,917,331
Trainable params: 5,916,627
Non-trainable params: 704
_________________________________________________________________
Train on 540 samples, validate on 159 samples

Epoch 256/256
540/540 [==============================] - 3s 5ms/step - loss: 0.0764 - acc: 0.9722 - val_loss: 1.1435 - val_acc: 0.8365
Test loss: 1.14352112146
Test accuracy: 0.836477988171
```
ということで、Test loss=1.14と少し大きいですが、Training acc=0.9722でval_acc=0.8365で学習できました。
データは、猫；喧嘩、犬；とうぼえ、ポメラニアン；わんわん。。なのでこれも綺麗に分離できています。ちなみにこの三つを覚えただけで猫についてはほぼ猫に分類されています。また、犬については学習した動画を流しながら分類すると、当然かもだけど、きちんと分類してくれています。そしてその他の動画につても、犬はだいたい「わんわん」はポメラニアン、とうぼえは犬に分離しているようです。
※こういうものの精度は、基本実地で試す必要がありますが、今回は端折ります
###・犬・猫・ポメラニアン・カラスの音声認識
これが今回のメイン・イベントになります。
なぜメインかというと、カラスが曲者だからです。
カラスの声はすごく多様性があって、どうやらにゃんとかわんとかは鳴くけど、youtube上ではめったに「カー・カー」とは啼かないようです。
ということで、カラスについてはこういうのも同じ学習データに入れてしまいました。
それでもカラスもほぼ喧嘩や縄張り争い、蛇との喧嘩、。。。なんかを多く入れたので、（ウワンもカラスがこのような闘争的な状態の声はあてられるようになりました。）そちらの方向の声を学習してくれるものと思います。
※こういうのを見ると、人間の声紋だけが多様で使い分けて（会話している）わけではなく、程度の差こそあれ、それぞれ鳴き声を変化させて会話していると考えるのが当然だと思えます。
以下、代表的な声紋をだしておきます。
「猫」
![figure1.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/860cf366-c30f-4c0b-d385-21f93f1dd220.jpeg)
![figure14.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/44546ed7-d135-b869-70c8-ef1fe772b97c.jpeg)
「犬」
![figure2.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/2ef6a17f-08c2-f574-7da3-d9a530ff9660.jpeg)
![figure187.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/a6e431e5-9184-5040-d21a-87c5e110cb6b.jpeg)
「ポメラニアン」
![figure2.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/9cc6ad5c-beb5-f222-8e89-cc37b3bbeb1c.jpeg)
![figure71.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/dabf2f73-b2e9-dd38-dc06-0fc50bfe22ed.jpeg)
「カラス」
![figure1.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/e4307ae5-bcd8-6051-157d-447a18470631.jpeg)
![figure131.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/01cb289c-4782-685f-577e-f8a78f0c0351.jpeg)
実は、この４つ目にしてdense_1 (Dense)    (None, 120)  7864440として初めて収束できました。つまり40や80では収束しませんでした。したがって、パラメータ数が多くなりました。

```
flatten_1 (Flatten)          (None, 65536)             0
_________________________________________________________________
dense_1 (Dense)              (None, 120)               7864440
_________________________________________________________________
activation_1 (Activation)    (None, 120)               0
_________________________________________________________________
dropout_6 (Dropout)          (None, 120)               0
_________________________________________________________________
dense_2 (Dense)              (None, 4)                 484
_________________________________________________________________
activation_2 (Activation)    (None, 4)                 0
=================================================================
Total params: 9,849,852
Trainable params: 9,849,148
Non-trainable params: 704
_________________________________________________________________
Train on 720 samples, validate on 212 samples
Epoch 256/256
720/720 [==============================] - 3s 5ms/step - loss: 0.0370 - acc: 0.9903 - val_loss: 1.4429 - val_acc: 0.8066
Test loss: 1.44290749082
Test accuracy: 0.806603773585
```
結果的には、３カテゴリのときとほぼ同じような精度を得ることができています。間違える確率もまた人間の声や他の音のコンタミが入る確率も、こちらの方が格段に大きくなっていることを考えると、ちゃんと学習したと言えると思います。
今回は、科学的に結果を検証することはしていませんが、動画を見ながら・音を聞きながらなるほどという予測を出してきているので、ちゃんと出来た感触を持っています。おまけに、カラスと猫の場合を載せておきます。
###まとめ
・犬・猫音声認識をやったみた
・猫・犬・ポメラニアン・カラスの大きく４種類の声紋に対して音声認識が有効に働いていることを確認した

・このシリーズでは、次回は「それぞれの声で反応を返す」をやってみようと思う
・動物も当然会話していると思えるので、一つずつ問題を解決していこうと思う
###おまけ
学習データでは使わなかった、ある動画で音を拾った時の動作

[カラスの鳴き声 と おまけ(4K60p)]()

```
[  4.84121768e-25   3.97095044e-30   5.91308218e-32   1.00000000e+00]
karasu
[  2.23189581e-25   7.05856072e-33   0.00000000e+00   1.00000000e+00]
karasu
[  1.99899594e-17   2.29605051e-18   2.32416748e-28   1.00000000e+00]
karasu
[  1.28296949e-20   2.61988107e-19   3.26043987e-22   1.00000000e+00]
karasu
[  8.03867284e-09   1.88289540e-11   1.38513978e-09   1.00000000e+00]
karasu
[  3.51915849e-20   3.06128784e-37   7.85099016e-35   1.00000000e+00]
karasu
[  1.91986843e-10   1.00223896e-28   6.73752060e-30   1.00000000e+00]
karasu
[  1.20252933e-19   3.78222357e-20   2.61284271e-28   1.00000000e+00]
karasu
[ 0.  0.  0.  1.]
karasu
[  4.06833596e-27   0.00000000e+00   1.25645003e-38   1.00000000e+00]
karasu
[  4.00602030e-15   8.10020520e-28   1.92814516e-31   1.00000000e+00]
karasu
[  1.21778440e-22   2.12287594e-33   1.24532778e-37   1.00000000e+00]
karasu
[  3.51198800e-14   6.87849670e-26   2.76584424e-29   1.00000000e+00]
karasu
[  3.32398198e-09   3.63383499e-12   1.53803226e-15   1.00000000e+00]
karasu
[  2.64245970e-03   5.59651103e-10   1.98312274e-19   9.97357547e-01]
karasu
[  8.62635076e-02   2.24524550e-03   2.12957439e-05   9.11469936e-01]
karasu
[  1.86287638e-04   2.41330213e-07   6.61510712e-05   9.99747336e-01]
karasu
[  6.92967616e-04   1.36942272e-05   1.98991845e-08   9.99293327e-01]
karasu
[  1.17996531e-02   2.73524231e-04   9.38591182e-01   4.93356958e-02]
pomeranian
[  9.21318755e-02   3.97445547e-06   1.21874742e-04   9.07742262e-01]
karasu
[ 0.19954468  0.05095017  0.00309956  0.74640554]
karasu
[  7.43923423e-10   9.52980425e-13   1.13400414e-16   1.00000000e+00]
karasu
```

[【猫の鳴き声いろいろ】 かわいい猫の鳴き声](https://www.youtube.com/watch?v=zLDl12gruqQ)

```
[  1.00000000e+00   5.56946980e-16   0.00000000e+00   3.44303471e-33]
cat
[  1.00000000e+00   5.88895244e-09   4.00568523e-22   3.19785957e-18]
cat
[  1.00000000e+00   5.17428223e-13   1.00981350e-30   1.26777189e-26]
cat
[  1.76720999e-20   1.62847487e-38   4.40666171e-35   1.00000000e+00]
karasu
[  1.00000000e+00   1.18153454e-09   3.85557685e-17   6.31914121e-09]
cat
[  9.99999881e-01   4.59167726e-09   1.46587939e-12   1.06319391e-07]
cat
[  1.00000000e+00   1.51480215e-08   2.79186965e-13   2.07127772e-13]
cat
[  1.87732176e-08   7.45049078e-07   6.41593616e-03   9.93583262e-01]
karasu
[  9.99956012e-01   4.39855357e-05   6.94377932e-13   2.94258395e-08]
cat
[  1.00000000e+00   7.30104152e-17   6.92999176e-32   9.89009937e-23]
cat
[  1.00000000e+00   1.12970796e-16   1.65450833e-26   9.30938837e-27]
cat
[  1.00000000e+00   3.37631081e-26   0.00000000e+00   0.00000000e+00]
cat
[  7.82760435e-06   3.53470823e-04   8.71604741e-01   1.28033996e-01]
pomeranian
[  1.00000000e+00   8.15406076e-12   1.77895648e-30   2.22836311e-12]
cat
[  1.00000000e+00   5.31115383e-08   2.11096472e-18   2.73190889e-16]
cat
[  7.96978414e-01   7.77554372e-03   5.36943262e-04   1.94709033e-01]
cat
[  9.99875903e-01   1.53787838e-09   5.70166517e-16   1.24121041e-04]
cat
```