目次
序論
卒業論文を制作するにあたって結構苦労したので、ブログに残しておきます。
全体の流れは、
- openSMILEで音ファイルから音響特徴量をarff形式にして抽出。
- ラベリング後にwekaによってサポートベクター分類。
音響特徴量やopenSMILEの構造に関しては,こちら
https://amakazeryu.hatenablog.com/entry/2019/06/22/190002
openSMILEやwekaは海外のソフトなので日本語ページが不足しており、僕もわりかし苦労しました。単に機械学習するだけなら、wekaのGUIが優秀なのですぐにできるのですが、データの取り扱いやパラメータ設定でちんぷんかんぷんだったので、その記録を残します。
環境
- windows10 64bit
- GPU:Geforce1080Ti
- CPU:i7 7700k
- メモリ:16G
openSMILEの手順
インストール手順
openSMILEはINTERSPEECH2009~2013の論文に由来する音響特徴量抽出の為のソフトウェアです。音響系では割と色々な論文に使われている。
このページからzipファイル形式で落とせば良いと思います。gzファイルの場合はcygwinを入れないとwindowsでは開けません。他にも有料アプリがあるけど、Linux系に出来てwinに出来ない事は大抵cygwinを入れたらよいかと思います。
展開してopensmile-2.3.0\bin\Win32までいってGUIを起動したんですが、あんまし上手く動いてくれませんでした(涙)。コアダンプが起こっていてエラーメッセージがちゃんと出てくれないので、他の方法を取る事に。
特徴量抽出手順
英語マニュアル本を読むと、
SMILExtract_Release -C config/IS10_paraling.conf -I input.wav -O output.arff
というコマンドによって取り出せるとマニュアルに書いてあったので、実行すると実際にarff形式で取り出せました。「input」の所に対象のファイル名を入れると「output」の所に「input」から抽出した音響特徴量が上書きされます。
仮にarff形式のファイルがなければ、output.arffが生成されます。
configファイルはどの方法でどの特徴量を抽出するかを決める所で、configフォルダに色々あります。IS10はinterspeech2010 paralinguistic challengeに由来する設定です。目的に合わせて選べば善いかと思います。
クラスタリング
-instname input -class 0
というコマンドを末尾に加えることで、新しい要素をarff形式に入れる事ができます。
100個ぐらいの音声データから音響特徴量を抽出したかったので、今回はバッチファイルを作りました。下は一例。
.bat | |
cd C:\Program Files\opensmile-2.3.0\bin\Win32 | |
set i=1 | |
:loop | |
rem class label 0 means the user is puzzled, 1 means normal condition. | |
SMILExtract_Release -C config/IS10_paraling.conf -I input_%i%.wav -O output_IS10.arff -instname input_%i% -class 0 | |
rem ↓↓IS09 config file ver | |
:SMILExtract_Release -C config/IS09_emotion.conf -I input_%i%.wav -O output_IS10.arff -instname input_%i% -class 0 | |
set /a i+=1 | |
if %i% leq 100 goto loop |
SMILExtract_Releaseと同じフォルダにconfigフォルダとinput.wavを置きました。input.wavは取る時にナンバリングしておいたので、iのfor文を回す事によって一気にやってくれます。ちなCMDでやったので、「rem」や「:」とかはコメントアウトの部分です。パワーシェルを使ってもよいかと。
classは後で機械学習する際の教師ラベルです。
ひとまず特徴量抽出はこれでおしまい。
wekaでSVM
さてwekaでSVMをしましょう。openSMILEではGUIが上手く動いてくれなかったので苦労しましたが、wekaはグラフまで一瞬で書いてくれる優れものです。下のリンクからダウンロードして起動しましょう。
https://www.cs.waikato.ac.nz/ml/weka/downloading.html
飛べない鳥weka(ニュージランドクイナ)が可愛い。ExplorerからGUIを開きましょう。Open fileから抽出したarff形式を読み込みます。
arff形式はcsvの進化系みたいなデータセットです。wekaに元々あるarff形式のデータを一例に示します。
@relation weather.symbolic
@attribute outlook {sunny, overcast, rainy}
@attribute temperature {hot, mild, cool}
@attribute humidity {high, normal}
@attribute windy {TRUE, FALSE}
@attribute play {yes, no}@data
sunny,hot,high,FALSE,no
sunny,hot,high,TRUE,no
overcast,hot,high,FALSE,yes
rainy,mild,high,FALSE,yes
rainy,cool,normal,FALSE,yes
rainy,cool,normal,TRUE,no
overcast,cool,normal,TRUE,yes
sunny,mild,high,FALSE,no
sunny,cool,normal,FALSE,yes
rainy,mild,normal,FALSE,yes
sunny,mild,normal,TRUE,yes
overcast,mild,high,TRUE,yes
overcast,hot,normal,FALSE,yes
rainy,mild,high,TRUE,no
最初にデータの種類を
@ 名前 属性
という風に書いて、@data以降に実際のデータが入ります。arff形式同士のファイルをマージする方法は判らないんですが、データを付け足すのが容易です。openSMILEならば入れる先のdataset.arffに対して次のようにコマンドを打てば、入れる事ができます。
SMILExtract_Release -C config/IS10_paraling.conf -I input.wav -O dataset.arff
後からデータを追加するのが便利で助かりますね。wekaでは一つのarffファイルしか開けないので、データはすべて一つのarffファイルにまとめるのが良いと思います。
次に上のタブからclssify(分類)を選び、早速SMO(wekaでサポートベクター分類)をワンクリックでしようと思いましたが、なぜか押せない。SMOregは押せるんだけど。
開いたarffファイルのclassラベルが良くなかったようです。arff形式のファイルをコードライティング用のソフトで起動し、
@attribute class numeric → @attribute class {0,1}
にしてもう一度開くと出来るようになりました。numericはarff形式で実数を入れる事を意味するのでクラスタリングの意味合いを持たないようです。{0,1}の所は例えば天気なら{晴れ,雨,くもり}とかでも良いです。
Chooseの横をクリックするとカーネルや誤差範囲、ランダムシードなどが設定できます。カーネルはカーネルトリックの為に使うもので標準は多項式カーネルが用いられているようです。
後はStart押すだけです。
設定できる様々なパラメータに関してはまた後日解説したいと思います。お疲れ様でした。
質問を頂いたので,その時の説明パワポリンク置いておきます.