サウンドを使った機械学習と分類を始めるときの手順をまとめてみた（参考：実践機械学習システム） ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい 

みなさんこんにちは、ゲーム実況動画 :tv: 楽しいです :smile: 寒くなってきたので体調管理には気をつけましょう :tea: パズドラ、モンスト、がちゃ :gem: ひきましたか？パズドラのゴッドフェスはどうでした？緑オーディンが出たよ :+1: 

<img src="https://qiita-image-store.s3.amazonaws.com/0/56465/fd71e446-907e-609c-8135-5a9bc5ca9273.jpeg" width="300">

ところで、オライリーから[実践機械学習システム(Amazon)] (http://www.amazon.co.jp/gp/product/4873116988/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873116988&linkCode=as2&tag=scleen-22) が出版されました。借りることができたので、この９章にある「音楽ジャンル分類」 :musical_note: を参考にして、機械学習を始めるときの参考になるものを書いてみます :smile: 初心者向け :exclamation: より難しい理論とか応用は偉い人にまかせます

# 機械学習ってなんだっけ？

## 荒っぽくまとめると

コンピューターになんらかの認識させるぞ！⇒のために⇒とりあえず、対象の特徴を把握させるぞ！特徴が近ければ似てるってことで！⇒のために⇒分析・解析して対象を数字にできるようにするぞ！

対象を数字にするって、なんか、変な日本語ですね :sweat_drops: 「特徴量を抽出」とか、難しい言葉では言うみたいです。

# サウンドを分析して特徴量を出してというのをやってみます

[書籍：実践機械学習システム](http://www.amazon.co.jp/gp/product/4873116988/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873116988&linkCode=as2&tag=scleen-22)の９章で音楽ジャンル分類を取り上げてます。でも、２０ページしかないんです。２０ページですべてわかるはずもないので、ボリュームを増す感じで、ちょっとずつやってきます。

**周辺知識が無いとエラーでうまくいかないのでその辺、補足してきます**

## ゲーム :game_die: 実況動画を分析 :chart:  して云々します

書籍内では音楽ジャンルの分類をしてます。音楽ジャンルには興味ないので、YouTube上のゲーム実況動画でやってみます。うまくいくかどうかは、知りません :scream: 

# 準備

## ごめん、windows なんだ :computer: 

MAC ユーザーのみんな、ごめん :sob: 

### 用意しておくもの

 - ffmpeg (動画から音声を分離したりするときに使います) 
 - 分析に使う動画：動画は準備してくださいな ※ダウンローダー等のURLはリンク先ツールがアドウェアやウィルスに汚染されていることが良くあるので（笑）載せません。安全なものを探してね :mag: 
 - python + scipy とか[ここからダウンロードできるよ](https://code.google.com/p/pythonxy/wiki/Downloads?tm=2) ⇒ python2.7 がインストールされました（2014年11月時点）

### てもとの環境

 - windows7 (64bit) です

## あると良い知識とかツールとか

 - python を使った操作もろもろ（Python Interpreterの使い方とか）
 - プログラミング全般の知識（多いほど良い）
 - 音声ファイルのフォーマットに関する知識（少し）
 - Audacity 音声ファイルをいじれるとても便利なフリーソフト

# はじめる

## さて、各種ツールのインストールも終わったので

### 動画から音声を切り出す

みんなが大好き ffmpeg の出番です

```
ffmpeg -i input.mp4 -map 0:1 test.wav
```

こんな感じで音声を wav で抜き出します。

**分析に使うscipyというモジュールがwav形式のファイルを直接読み込めるので、必ずwav形式で準備します。**

mp3, aac とかはたぶんダメなんだと思います

## 作業ディレクトリ（フォルダ）は c:/work/tmp ということにします

### test.wav を c:/work/tmp に保存

## さっそく分析：スペクトログラムをつくってみる

### Python Interpreter を使う

「スタート」メニューからPython Interpreterを起動します。

```
>>>
```

こんな感じのプロンプトになります。

### ディレクトリ移動しときます

```py
>>> import os
>>> os.getcwd()
>>> os.chdir("/work/tmp")
```

### スペクトログラムつくってみる

書籍で紹介されている感じでいきます

※以降 「>>>」 は省略

```py
import scipy
from matplotlib.pyplot import specgram
sample_rate, X = scipy.io.wavfile.read("test.wav")
print sample_rate, X.shape
specgram(X, Fs=sample_rate, xextent=(0,30))
```

↑が書籍に出てるサンプルですが、これをそのままやったらエラー出ました。

```py3tb
AttributeError: 'module' object has no attribute 'io'
```

とかそんな感じです。必要なものをimportしていきます。

```py
from scipy import io
from scipy.io import wavfile
```

これをやっとあと、あらためて

```py
specgram(X, Fs=sample_rate, xextent=(0,30))
```

すると、数字がごちゃごちゃ表示されます :+1: うまくいったよーだ。しかし、ここできっと思うことでしょう「グラフじゃないぞ！本 :book: に書いた通りやってもグラフができん！」

はい、できません。

### こんどこそ、スペクトログラムを描画してみる

```py
import matplotlib.pyplot as plt
pxx, freq, bing, t = plt.specgram(X, Fs=sample_rate, xextent=(0,30))
plt.show()
```

のようにすると、新しいウィンドウが起動してグラフが出来ていると思います

## エラーの対応

```py
pxx, freq, bing, t = plt.specgram(X, Fs=sample_rate, xextent=(0,30))
```

↑を実行したときにエラーが出る場合があります

### MemoryError になったら

使用しているwavファイルが大きすぎる可能性があります。ffmpegでカット :scissors: します。Audacity :sound: 使っても良いです。Audacityの方がGUIあるから簡単かもね。

```
ffmpeg -ss 0 -i test.wav -t 30 -c:a copy short.wav
```

のようにして最初の30秒にカットしちゃいましょう。そうしてから、

```py
sample_rate, X = scipy.io.wavfile.read("short.wav")
pxx, freq, bing, t = plt.specgram(X, Fs=sample_rate, xextent=(0,30))
plt.show()
```

うまくいったかい？

### 謎のエラーが出たら

helperが云々でエラーが出る可能性があります。使っているwavファイルがステレオの場合、このコードではうまくいきませんので、左耳の分だけ抽出しちゃいます。ffmpegでやりますが、Audacityでもできます。

```
ffmpeg -i short.wav -map_channel 0.0.0 left.wav
```

としてからの、

```py
sample_rate, X = scipy.io.wavfile.read("left.wav")
pxx, freq, bing, t = plt.specgram(X, Fs=sample_rate, xextent=(0,30))
plt.show()
```

で、グラフが表示されるはずです。

# つづきはまた今度

## ストックが多かったら(30ぐらい？)需要が多いということで続く予定

ニッチすぎて達成しない方に1000ペリカ :cry: