33
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-11-20

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

ところで、オライリーから[実践機械学習システム(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章にある「音楽ジャンル分類」 :musical_note: を参考にして、機械学習を始めるときの参考になるものを書いてみます :smile: 初心者向け :exclamation: より難しい理論とか応用は偉い人にまかせます

機械学習ってなんだっけ?

荒っぽくまとめると

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

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

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

書籍:実践機械学習システムの9章で音楽ジャンル分類を取り上げてます。でも、20ページしかないんです。20ページですべてわかるはずもないので、ボリュームを増す感じで、ちょっとずつやってきます。

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

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

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

準備

ごめん、windows なんだ :computer:

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

用意しておくもの

  • ffmpeg (動画から音声を分離したりするときに使います)
  • 分析に使う動画:動画は準備してくださいな ※ダウンローダー等のURLはリンク先ツールがアドウェアやウィルスに汚染されていることが良くあるので(笑)載せません。安全なものを探してね :mag:
  • 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))

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

はい、できません。

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

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でカット :scissors: します。Audacity :sound: 使っても良いです。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ペリカ :cry:

33
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?