みなさんこんにちは、ゲーム実況動画 楽しいです 寒くなってきたので体調管理には気をつけましょう パズドラ、モンスト、がちゃ ひきましたか?パズドラのゴッドフェスはどうでした?緑オーディンが出たよ
ところで、オライリーから[実践機械学習システム(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) が出版されました。借りることができたので、この9章にある「音楽ジャンル分類」 を参考にして、機械学習を始めるときの参考になるものを書いてみます 初心者向け より難しい理論とか応用は偉い人にまかせます
機械学習ってなんだっけ?
荒っぽくまとめると
コンピューターになんらかの認識させるぞ!⇒のために⇒とりあえず、対象の特徴を把握させるぞ!特徴が近ければ似てるってことで!⇒のために⇒分析・解析して対象を数字にできるようにするぞ!
対象を数字にするって、なんか、変な日本語ですね 「特徴量を抽出」とか、難しい言葉では言うみたいです。
サウンドを分析して特徴量を出してというのをやってみます
書籍:実践機械学習システムの9章で音楽ジャンル分類を取り上げてます。でも、20ページしかないんです。20ページですべてわかるはずもないので、ボリュームを増す感じで、ちょっとずつやってきます。
周辺知識が無いとエラーでうまくいかないのでその辺、補足してきます
ゲーム 実況動画を分析 して云々します
書籍内では音楽ジャンルの分類をしてます。音楽ジャンルには興味ないので、YouTube上のゲーム実況動画でやってみます。うまくいくかどうかは、知りません
準備
ごめん、windows なんだ
MAC ユーザーのみんな、ごめん
用意しておくもの
- ffmpeg (動画から音声を分離したりするときに使います)
- 分析に使う動画:動画は準備してくださいな ※ダウンローダー等のURLはリンク先ツールがアドウェアやウィルスに汚染されていることが良くあるので(笑)載せません。安全なものを探してね
- python + scipy とかここからダウンロードできるよ ⇒ 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を起動します。
>>>
こんな感じのプロンプトになります。
ディレクトリ移動しときます
>>> import os
>>> os.getcwd()
>>> os.chdir("/work/tmp")
スペクトログラムつくってみる
書籍で紹介されている感じでいきます
※以降 「>>>」 は省略
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))
↑が書籍に出てるサンプルですが、これをそのままやったらエラー出ました。
AttributeError: 'module' object has no attribute 'io'
とかそんな感じです。必要なものをimportしていきます。
from scipy import io
from scipy.io import wavfile
これをやっとあと、あらためて
specgram(X, Fs=sample_rate, xextent=(0,30))
すると、数字がごちゃごちゃ表示されます うまくいったよーだ。しかし、ここできっと思うことでしょう「グラフじゃないぞ!本 に書いた通りやってもグラフができん!」
はい、できません。
こんどこそ、スペクトログラムを描画してみる
import matplotlib.pyplot as plt
pxx, freq, bing, t = plt.specgram(X, Fs=sample_rate, xextent=(0,30))
plt.show()
のようにすると、新しいウィンドウが起動してグラフが出来ていると思います
エラーの対応
pxx, freq, bing, t = plt.specgram(X, Fs=sample_rate, xextent=(0,30))
↑を実行したときにエラーが出る場合があります
MemoryError になったら
使用しているwavファイルが大きすぎる可能性があります。ffmpegでカット します。Audacity 使っても良いです。Audacityの方がGUIあるから簡単かもね。
ffmpeg -ss 0 -i test.wav -t 30 -c:a copy short.wav
のようにして最初の30秒にカットしちゃいましょう。そうしてから、
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
としてからの、
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ペリカ