post Image
機械学習で(楽曲の)音声信号処理をするならlibrosaが便利

目的

機械学習で音楽関連のなにかをやりたいと思ったのがきっかけ。
音声データについて知識が皆無だったので、サクッといい感じにデータが作れそうなlibrosaは手っ取り早く色々試せそうだったので、使ってみた。

インストールはpip で

pip install librosa

こんな感じにサクッと入ります。

やったこと

librosaのドキュメントにある、

  • Demonstrationで基本的なデータ読み込み、特徴量抽出とか
  • Audio effectsでボーカル分離とかエフェクト効果とか

をjupyterで実行結果見ながら試してみた。
他にもいろいろ出来るようだけど、結局ここに書いてあるMFCCとかを使っている。

Demonstrationでlibrosaの基本的な使い方を見ていく

このページをコピペして実行すりゃ分かる内容ですが。

まずは音声データの読み込み

y, sr = librosa.load(audio_path)
このaudio_pathは、ディレクトリを直接文字列で書いてもOK。
例えば、
audio_path = "./example/song/data.wav"
こんな感じ。
読み込むデータフォーマットはwavじゃないとダメみたい。

mer spectrogram を求める

以下でメル周波係数が出てきます。
S = librosa.feature.melspectrogram(y, sr=sr, n_mels=128)

これを
log_S = librosa.logamplitude(S, ref_power=np.max)
こうして、dBに変換します。

dBに変換したものをmaatplot libで可視化します。


plt.figure(figsize=(12, 4))
librosa.display.specshow(log_S, sr=sr, x_axis='time', y_axis='mel')
plt.title('mel power spectrogram')
plt.colorbar(format='%02.0f dB')
plt.tight_layout()

librosaには結果を表示させるための関数が用意されているので、基本これを利用します。
librosa.display.specshow
引数は、表示させるデータ、サンプリングレート、どの値をx軸、y軸に持ってくるかの指定などです。
だいたい、上の4パラメーターを指定することが多いです。

ハーモニー部分とパーカッション部分の分離

音声データをハーモニー部分とパーカッション部分を分離するためには、

y_harmonic, y_percussive = librosa.effects.hpss(y)

で分離できます。
少し処理が重いので、大量のデータに対して適用するときはちょっと時間がかかります。

分離自体は、結構大まかなので、パーカッション部分は、主にビートを刻む打楽器系が抽出され、ハーモニー部分はパーカッション部分を差し引いたような感じです。
可視化されると、なんとなく打楽器系が分離されているのが分かります。
わかりやすいビートが刻まれていないジャズやクラシックではあまり良い結果が出ないようです。

Chroma(和音)を抽出する

librosaには、だいたいこの辺の音がなってるよね、というコードの分離もやってくれます。
C = librosa.feature.chroma_cqt(y=y_harmonic, sr=sr)

C~Bのうちどの成分が多いかという強度が示されているみたいです。
このへん上手くやると、なっているコードの検出とかもできそう。

メル周波ケプストラム係数を出す

音声解析で良く使われているメル周波ケプストラム係数(mfcc)の出し方も簡単で、

mfcc = librosa.feature.mfcc(S=log_S, n_mfcc=13)

で出せます。
引数のn_mfccで特徴量の次元を指定できます。

チュートリアルでは、mfccにさらに処理を行う、delta mfc やdelta^2 mfccも求めていますが、これが何をしているかが理解できてません。。

ほかにもまだまだ面白いのがありますが、いったんここまで。


『 Python 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。