指パッチン検出アプリを作ってみた。そして公開してみた。（多分）誰でも使えるよ。


# 指パッチン検出アプリとは?

その名の通り、指パッチンを検出する男の夢を叶えたアプリケーションです。
***以下の動画では指パッチンでGoogleAssistantを起動させていますが、今回紹介するのは指パッチンの音を検知する機能のみです。***

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">男の夢を叶えました。女性を家に呼んでご利用ください。<br><br>1.まず指パッチンをします<br>2.単発音をスペクトル解析（音の特徴を取得）<br>3.機械学習を使って指パッチンかを判断<br>4.スマートスピーカー起動<br>5.ドヤ顔で「電気つけて」 <a href="https://t.co/6SyPTS70xw">pic.twitter.com/6SyPTS70xw</a></p>&mdash; imajo@指パッチンで何かする人 (@imasirooo) <a href="https://twitter.com/imasirooo/status/1055059556781371392?ref_src=twsrc%5Etfw">2018年10月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

多数の方に「使ってみたい！」といっていただけたので、公開することにしました。
Twitter等でお声をいただいた皆さまありがとうございます。

# 環境

以下の環境で動くことを確認しています。

* Python3.5.1
* Mac OS X(10.14.1)

***Python3.7以上だとtensorflowのインストールにミスるみたいです。3.6以下を推薦します。***

# 仕組みを超簡単に紹介します

***「仕組みなんて興味ねえ！早く使いてえ！」って方は飛ばしてください。***

以下の流れで指パッチンを検出しています。

1. 単発音を検出
2. 検出した単発音をスペクトル解析
3. 機械学習を使って指パッチンかを判断

もっと詳細を知りたい方は以下をご覧ください。
[非エンジニアでもわかる指パッチンで電球を色っぽくした話](https://qiita.com/imajoriri/items/0d1120917714bc4f3727)


# インストール方法

それでは今お使いのPC（Mac推薦）で指パッチン検出アプリを使えるようにしていきます。

## 指パッチンをあなたの指にインストール()

すでにインストールされている方は飛ばしてください。インストールされていない方にとってはここが最大の難関かと思われます。
しかし、動作環境等によってインストール方法が変わってくるかと思われますので説明は省きます。***ご了承ください***
以下のサイト等が参考になるかと思われるので、ぜひ習得してみてください。

[指パッチンのやり方にはコツがあった！大きい音の鳴らし方はコレ！](https://wakuwaku-days.com/finger-snapping/)

## clone

冗談はさておき、ここからが実際にインストールの作業になります。
まずは、コード自体をcloneします。cdもしておきましょう。

```
$ git clone https://github.com/imajoriri/finger-snap.git
$ cd finger-snap
```

## モジュールのインストール

残念ながらこれだけでは動かないので、その他必要なモジュール等を入れていきます。

まずは、音声処理に必要な`PortAudio`というライブラリをインストールします。
Macですと以下のコマンドでインストールできます。

```:Macでの場合
$ brew install portaudio
```

***申し訳ないのですが、windowsだとインストール方法が違うようです。
[ググって](https://www.google.co.jp/search?q=windows+pyaudio+%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&oq=windows+pyaudio+%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&aqs=chrome..69i57.12001j0j7&sourceid=chrome&ie=UTF-8)みてください。***

その他、必要なPythonのモジュールをpipでインストールします。

```
$ sudo pip install -r requirements.txt
# もしくは
$ sudo pip install numpy matplotlib tensorflow wave
```

うまくインストールできない場合は以下のサイト等を参考にしてください。
[macOSにpyaudioをインストールする](https://qiita.com/mayfair/items/abb59ebf503cc294a581)

# 使ってみる

以下のコマンドで実行可能です。指パッチン検出が始まると`指パッチンの検出を始めます`と表示されます。

```
$ python detection_only.py 100
```

指パッチンの検出を始めます
`100`の部分は検出する時間[秒]です。
指パッチンを検出すると、以下の表示が出ます。

```
これは指パッチンです
```

また、指パッチン以外の単発音を検出した場合は以下の表示が出ます。

```
これは指パッチンではないです
```

使い方を動画で見たい方は以下のツイートからみることができます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">指パッチンとそれ以外を区別している動画 <a href="https://t.co/YuTp99vx7e">pic.twitter.com/YuTp99vx7e</a></p>&mdash; imajo@指パッチンで何かする人 (@imasirooo) <a href="https://twitter.com/imasirooo/status/1059991082828582912?ref_src=twsrc%5Etfw">2018年11月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# GitHub

以下が実際のコードです。スターをもらえると少しやる気が増えます。(あとこの記事自体にもいいねを、、、）
https://github.com/imajoriri/finger-snap

![imajoriri_finger-snap.png](https://qiita-image-store.s3.amazonaws.com/0/195882/cfb4039e-edbb-a8a3-f409-bf7f4b4c329f.png)


# うまく動かない

Macとラズパイのみでしか動作検証していないので、環境によってはうまくいかない場合もあります。ご了承ください。
もしうまく動かない時は[@imasirooo](https://twitter.com/imasirooo)までご連絡いただけると嬉しいです（解決できるとは言っていない）

うまく動くけど認識率が悪い、、、って場合は私の指パッチンの音と違う可能性が考えられます。
残念ながら100%私の指パッチンのデータを使っているので、、、
そんな時はあなたの指パッチンデータを入れてあげましょう!!

## 指パッチンデータを入れる

以下のコマンドでデータを入れることができます。

```
$ python3 for_develop/input_data.py
検出を始めます。50秒間です
```

すると50秒間、単発音を検出します。
ここで、指パッチンをしてみてください。すると以下のような表示になり、単発音が指パッチンの音かそれ以外かを求められます。

```
finger:1
not finger: 2
>>
```

指パッチンの場合は`1`。それ以外は`2`を入力してください。
以下は指パッチンの場合です。

```
finger:1
not finger: 2
>> 1
検出を終了します
```

すると、`./sounds/finger-16000`ディレクトリにwaveファイルとして保存します。
最低でもそれぞれ5つくらいのデータを入れるといいかと思います。

## 学習させる

何個かデータを入れられたら実際に学習を回します。

```
$ python3 for_develop/do_learning.py

...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
...学習中...
```

これであなたの指パッチンでも反応するようになりました（多分）

# 最後に

なんとなくの思いつきで作り始めたものですが、試していただきありがとうございます。
ちなみに機械学習等は初めて使ったので、大したコードは書いていません。

精度云々の話は置いておき、使う人、見る人、何より作っている自分がわくわくできるようなものだと思ってます。
こう言うくだらないものをたくさん作っていきたい〜〜

Ttwitterフォローしてもらえるとやる気元気パワーアップするのでよろしくです。
[@imasirooo](https://twitter.com/imasirooo)