【TensorFlow】ニューラルネットワークで周波数スペクトルを学習して、楽器音色を推定する【Python】
どうも、たっきーです。
ぷっちょ(マスカット)が好き。
なにする?
今回のタスクは「音源同定」。
そのタスク達成するためのツールは「機械学習」。
単一の楽器が鳴っている生音ファイル(.wav)を複数用意して、データセットとする。
今回は単層のニューラルネットワーク(NN)という機械学習のアルゴリズムを使って、音源同定をこなしていきたい。
TensorFlowの使い方は以下の本を参照。
TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説~
- 作者: 中井悦司
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/09/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
モチベーション
(機械学習)エンジニア男子はモテるらしい。
モテたいので頑張る。
まぁ、僕はJKなんですけど。
エンジニア男子がどのくらい最高かっていうと、一度エンジニア男子と付き合ったら二度とエンジニア男子以外を好きにならないぐらい最高だよ。
— りりそん@浦田理絵 (@ririson_jp) 2017年12月13日
彼らは頭が回るしひねったジョークも上手いし俗世のくだらないことたちと距離を置いているからね。
最高にユニークでセクシーでクールなんだよ!!!!!!!
環境
ニューラルネットワーク(NN)とは
人間の神経回路網を模した数式的なモデルのこと。
NNは、入力層、出力層、隠れ層から構成され、層と層の間には、ニューロン同士の結合の強さを示す重みがある。
難しいことはわからないので割愛。
データセットの用意
AppleLoopにあるヤァツをWAV形式で書き出してチョキチョキする。
最近知ったんだが、研究用のデータセットがあるらしい。産業技術総合研究所から出てる。
RWC Music Database (in Japanese)
もっと早く知りたかった()
まぁ、今回は折角AppleLoppsからデータセット作ったのでそれを使って行きたい。
↓こんな感じで楽器毎に音源が用意されている。
前回に書いたやつでデータセットにする。
流れ
- 楽器毎のデータセット作成
- 一秒ごとに切り取る
- ステレオ→モノラルに変換
- 学習用データとテスト用データを分ける
- FFTで周波数解析して周波数スペクトルを求める
- 0〜1で正規化
- それぞれの音源に対応する楽器のラベルデータを付ける
- NNで周波数スペクトルを学習
- 学習結果を元にテスト用データがどの楽器か推定
コード
まずはimport系と種まきとWAVの読み込み系とFFT系を定義。
次にデータセット系を定義。
主に各々でイジるところ。ディレクトリ名を入れればいい。今回はエレキギターとベースの分類を行ってみる。
次にNNをTensorFlowでつくる。
とうとう学習ステップ。
結果
['Eguitar', 'Bass']Step: 100, Loss: 155.835200, Accuracy: 0.505000 Step: 200, Loss: 141.524743, Accuracy: 0.560000 Step: 300, Loss: 135.902021, Accuracy: 0.595000 Step: 400, Loss: 103.269195, Accuracy: 0.835000 Step: 500, Loss: 76.209220, Accuracy: 0.920000 Step: 600, Loss: 53.022086, Accuracy: 0.925000 Step: 700, Loss: 40.102229, Accuracy: 0.955000 Step: 800, Loss: 34.835865, Accuracy: 0.960000 Step: 900, Loss: 31.750563, Accuracy: 0.955000 Step: 1000, Loss: 32.527884, Accuracy: 0.965000 Step: 1100, Loss: 36.188868, Accuracy: 0.950000 Step: 1200, Loss: 26.584764, Accuracy: 0.965000 Step: 1300, Loss: 27.493180, Accuracy: 0.970000 Step: 1400, Loss: 26.846440, Accuracy: 0.965000 Step: 1500, Loss: 37.596496, Accuracy: 0.930000 Step: 1600, Loss: 27.732768, Accuracy: 0.965000 Step: 1700, Loss: 31.237676, Accuracy: 0.960000 Step: 1800, Loss: 29.663903, Accuracy: 0.960000 Step: 1900, Loss: 29.423946, Accuracy: 0.960000 Step: 2000, Loss: 35.136697, Accuracy: 0.960000
Stepが学習ステップ。Lossが損失関数。Accuracyが認識成功率。
ハイパーパラメータ達
1 |
|
ノードの数 |
4096 |
FFTのサンプル数 |
1024 |
窓関数 |
ハミング窓 |
オプティマイザ |
Adam |
学習率 |
0.0001 |
活性化関数 |
注意点
/Users/tacky0612/anaconda3/lib/python3.6/site-packages/numpy/core/numeric.py:531: ComplexWarning: Casting complex values to real discards the imaginary part return array(a, dtype, copy=False, order=order)
という警告文が出る。どうやら計算の過程でNaN(欠損値)が出ちゃうかもよーってことらしい。
無音の音源があるとmax(abs(data))が0になってしまうので0で割り算してしまうのでNaNが発生してしまうので注意。
dtype=tf.float64 を指定しないと計算途中でオーバーフローしちゃうので注意。(デフォルトでtf.float32)
TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説~
- 作者: 中井悦司
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/09/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
Learning Tensorflow: A Guide to Building Deep Learning Systems
- 作者: Tom Hope,Yehezkel S. Resheff,Itay Lieder
- 出版社/メーカー: Oreilly & Associates Inc
- 発売日: 2017/08/27
- メディア: ペーパーバック
- この商品を含むブログを見る
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
- 作者: Al Sweigart,相川愛三
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/06/03
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
おわりに・感想
今回はエレキギターとエレキベースの分類を試みたけど、周波数スペクトルを学習してるので、この結果はそりゃあたりまえかぁって感じ。
データセットの関数、めちゃめちゃ適当に書いたのでもうちょっと綺麗にしたい(そのうちやる(多分。。。))
うーん、、、同一の楽器でも音高・音の強さ・楽器の個体差・奏法・などによって特徴が変動するので、単に周波数スペクトルを見るだけじゃちょっとしんどいかなぁ。。。ってのが正直な感想。
今後の展開としてニューラルネットワークを多層化してみようかなーって感じ。
最近また同じようなことやってる論文を読み漁ってるんだけど、僕の頭めちゃ弱いので理解できない事だらけなので理論弱者になってる。。。
けんきうしつに着いたらアンパンマンが飛んでた pic.twitter.com/zZiSwJaASx
— たっきー@ダサテプラP (@tacky0612) 2017年12月14日
【Python】WAVファイルの波形データにFFTかけて周波数スペクトルを複数表示する【サウンドプログラミング】
どうもたっきーです。
最近の悩みは虫歯です;;
これは前回からの続きなので前回のヤツやってないと動作しません()
参考
なにする?
WAVファイルのデータにFFTかけて周波数解析し、matplotlibで周波数スペクトルを複数表示する。
調べてみたところ、FFTかけるときに窓関数というものをかけるのが一般的らしいのでそれも実装。
環境
macOS High Sierra 10.13
Python 3.6.3
numpy 1.13.3
matplotlib 2.1.0
FFTとは
高速フーリエ変換(fast Fourier transform)とは、離散フーリエ変換(discrete Fourier transform, DFT)を計算機上で高速に計算するアルゴリズムのこと。
ちなみにDFTを直接計算するとめちゃめちゃ時間かかる。。。
そこで考えられたのがFFTってわけ。
めちょ早い。
数学が苦手なので中身の数式には触れない。
Numpyを使えばnp.fft.fft()で一瞬で求められる。
周波数スペクトルとは
光や音や電磁波信号は様々な周波数の成分から構成されている。そのようなものから周波数毎の強さを定量的に求める処理をスペクトル解析(spectrum analysis)と呼ぶ。
んで、そのスペクトル解析で求められたものを、x軸に周波数、y軸に強度をグラフにプロットしたものを周波数スペクトルと呼ぶ。
例↓↓↓(一応、強度については0〜1で正規化してある。)
窓関数とは
こんな関数↓
僕の窓関数に対する理解は、『数値解析が容易になるべんりツール』って感じ。(簡単になるってニュアンスとはまたちょっと違う)
まぁ色んな窓関数があるわけだが、王道はハミング窓らしいので今回は無心でハミング窓を使用。
窓関数を用いる理由についてはここが分かりやすかった。
コード
まずは関数の定義。
んで、各引数は以下の通り。
それでは、スペクトルを一個だけ表示してみる。
IN
OUT
複数表示してみる。
IN
OUT
うまく表示できました✋
サウンドプログラミング入門――音響合成の基本とC言語による実装 (Software Design plus)
- 作者: 青木直史
- 出版社/メーカー: 技術評論社
- 発売日: 2013/02/01
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 18回
- この商品を含むブログ (6件) を見る
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
- 作者: Al Sweigart,相川愛三
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/06/03
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
おわりに・感想
この後、色んな楽器の周波数スペクトルを表示してみたが、目視では楽器ごとの周波数スペクトルの規則性みたいなのはあまり感じられなかった。(あくまで主観。)
しかし、低音楽器であるベースは周波数の低い位置に周波数スペクトルが固まっていた。↓
って、まぁ当たり前なんだが。
あ、この前に鹿と戯れてきましたカワイイ。
ぽなかしゅちしか!w pic.twitter.com/udBvsz6jVH
— たっきー@ダサテプラP (@tacky0612) 2017年12月10日
【Python】複数のWAVファイルの波形を表示するプログラム【サウンドプログラミング】
どうもこんにちは。たっきーです。
最近カフェインをよく摂取している。
参考
なにする?
WAVファイルの波形をmatplotlibで複数表示する。
ただし、読み込まれるデータはバイナリなので数値を変換する必要がある。
割りとここのパクってfor文で回してるだけな感じある。(ありがとうございます。)
環境
- Python 3.6.3
- numpy 1.13.3
- matplotlib 2.1.0
下準備
ここで作ったWAVデータを用意する。
まぁ、実は複数の連番WAVファイルを用意するだけでいいが。
コード
とりあえず関数の定義。WAVファイルの数値変換と振幅正規化してる。
time = ○○で表示する時間を指定できる。
わかりやすいようにx軸y軸にラベルとグラフタイトルと付け加えている。
一応、y軸を固定しないと勝手に最適化(?)されてしまうのでy軸を-1~1で固定してある。
あとは 以下のように関数を呼び出すとグラフが表示出来る。
OUTPUT
多分、青色が左の音の波形で、橙色が右の音の波形(だと思う)
あとはfor文で回すだけ。
OUTPUT(略)
こんな感じで表示される。
2列〜3列で表示したいんだがどうしたらいいんだ…って感じ。
詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~
- 作者: 巣籠悠輔
- 出版社/メーカー: マイナビ出版
- 発売日: 2017/05/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
おわりに・感想
ささっと書いたのですごい雑なコードになってしまった。。。
今回は波形を1秒毎に表示してみたけど、案外1秒間ずっと無音の部分とかあった。
なので、今度時間がある時に無音部分を判別してはじくプログラムとか組んでみたいなぁ(どうせやらない。)
楽器(今回はpiano,guitar,bass,drams)の音色を機械学習で分類したいんだが、流石に波形みるだけじゃあまり規則性みたいなものは目視ではあまり感じられなかった。(timeを短くしてみてもあまりわからなかった。)
もっとmatplotlibを上手く使いこなせるようになりてぇ。。。
おっすオラ、マックブック・プロ
— たっきー@ダサテプラP (@tacky0612) 2017年11月27日