[非エンジニアでもわかる]指パッチンで電球を色っぽくした話

# はじめに

先日Twitterで指パッチンで電球を色っぽくする動画をツイートしたところたくさんのいいねとRTをしていただきました。
「これ好き」などの声もいただいて、とても嬉しかったです（やってよかった！）。


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">指パッチンで部屋を色っぽくしてみた。<br>伝わって欲しい。エンジニアってのは、ロマンチストな生き物だって事を。<a href="https://twitter.com/hashtag/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E7%84%A1%E9%A7%84%E9%81%A3%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#機械学習の無駄遣い</a> <a href="https://t.co/CiFGXvl39I">pic.twitter.com/CiFGXvl39I</a></p>&mdash; imajo@指パッチンで何かする人 (@imasirooo) <a href="https://twitter.com/imasirooo/status/1059385811940982787?ref_src=twsrc%5Etfw">2018年11月5日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


さて、この記事ではなぜ僕がこんなものを作ろうかと思ったのかと、超ざっくりの仕組みを書きます。
しかし、コードや難しいアルゴリズムは書かず、非エンジニアでも大体の仕組みがわかるよな記事を書ければと思っていますので最後まで読んでいただけると感激です。
（技術的な話はまた後ほど書きます）

# 指パッチンと電球を繋ぐ構成

まずは構成。指パッチンでどのように電球を操作しているかです。
その前に私の部屋の電球をご紹介します。
私の部屋はheuという電球を使っています。
これはIoT電球というもので、スマホから操作したりスマートスピーカーでON、OFFすることができます。
ガジェット好きな方は知っている方も多い以下と思います。
そして、***重要なのは、この電球はプログラムから操作することができる***のです。

<img width="809" alt="名称未設定_key.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/1c5256fd-111a-e9a3-328d-e7c21ed5a6ac.png">



つまり、自作のアプリなどから部屋の電球を操作することができます。
ちょっとだけ難しいワードをチラつかせると、ローカルの（電球のハブの）IPアドレスにPUTするだけです。
今回は自作の指パッチン検出プログラムから電球を操作する仕組みです。
それでは、次にどのように指パッチンを検出するかを説明していきたいと思います。

# 指パッチンを認識する

## 単発音を検出する(音の大きさ)

まず、指パッチンを検出するにあたって単発音を検出します。
単発音とは一瞬だけ大きくなる音です。
以下の画像は指パッチンをした時の音の大きさのグラフです。

<img width="350" alt="指パッチン2-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/e654ae00-9f22-d306-8ece-9319cb3f3c8c.png">


ほんの数ミリ秒だけの大きい音を検出した時に反応します。
しかし、以下のグラフを見てください。

<img width="350" alt="手拍子2-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/8e160270-8479-06c0-bcc3-aedb35171c27.png">


前の画像とすごく似ていますよね？
しかし、これは指パッチンのグラフではなくて、手を叩いた時の音です。
このままでは指パッチン以外の音にも反応してしまいそうです。

## スペクトル解析というものをやってみる(音の種類を見分ける)

このままでは手を叩いた音にも反応してしまうので、なんとかしないといけません。
人間である私たちは、音の違いを聞き分けられますよね。
指パッチンと手を叩いた音ってなんか違う。同じ大きさの音だとしてもです。
この、耳で聞いてわかる違いをグラフとして表現できれば、指パッチンの音だけを検出することができるはずです！！

そこで、この違いを抽出するためにスペクトル解析というものを行ってみました。
出てきましたね、難しい単語。僕も指パッチン検出プログラムを作るまでは「名前は聞いたことあるな〜」程度でした。
超ざっくり説明するとスペクトル解析とは先ほどの「音の大きさ」のグラフを「音の高さ」のグラフに変えることです。
どのようにやるかを説明すると数式とか出てきてしまうので飛ばします。
先ほどの指パッチンのグラフと手を叩いた音のグラフをそれぞれスペクトル解析してみたので比べてみましょう。

<img width="756" alt="名称未設定_key.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/8d680d73-ead7-ec0a-9fc1-60c6569008bd.png">


先ほどは違いがわからなかったグラフもこう見ると、なんか違うな〜ってのはわかってきました。

## 機械学習で違いを見分ける

さて、この「なんか違うな〜」ってのを手動で見分けるのもできなくはないかもしれませんが今っぽくないですね。（黙れ）
ということで、ミーハーな私は機械学習で見分けることにしました。
機械学習を知らない人は少ないかもしれませんが、超ざっくり説明します。
機械にデータを教えてあげて、機械に正解を求めさせるというものです。（機械学習に詳しい方はツッコミどころの多いい説明かもしれませんがスルーしてください）
つまり、今回は指パッチンの音をスペクトル解析したデータで機械に「これが指パッチンの音だよ」ってのを覚えさせます。そして、実際に指パッチンやそれ以外の音を聞かせて判断してもらうようになっています。

そして、これが指パッチンとそれ以外の音を見分けることができた動画になります。


<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>


# 電球(hue)を操作する

まあ、これは先ほど説明した通りにプログラム上で電球を操作するだけです。
最初にコードなどの難しいことは書かない宣言をしたので書きませんが、参考にした記事のみ載せておきます。興味があったらいじってみてください！

[Philips hueをAPIで制御してみる](https://make-muda.net/2016/01/3495/)

# 最後に（今後の展望？）

もともと最初に指パッチンと繋げたのがGoogleAssistantでした。
「OK Google」って言わなくても指パッチンで起動するスマートスピーカーを作りたかったのです。


<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>


こういうものを作って思うのは、なんの社会問題も解決しないけど作ってる方も使う方も楽しくなるようなものを作るのがエンジニアの醍醐味だなと思いました。
今後もこんな面白いものを作っていけたらな〜って思います。
***技術的なブログはいつかあげます***