2016-12-17 4 views
0

私は30秒の音楽サンプルを4つのジャンルの1つに分類しています:["electronic"、 "hip hop"、 "jazz"、 "rock"]助けの一種。ScikitlearnとkNearestNeighborクラシファイアで音楽を分類する際に問題が発生する

私は自分のデータセットをmp3ファイルから生成しました。私の "dataset"ディレクトリ内ではジャンルごとに100曲を並べ、各ジャンルのサブディレクトリに25を置いています(つまり、私は "電子"、 "ヒップホップ"などのサブディレクトリを持っています)。

これまでは、これらのmp3ファイルのそれぞれ30秒のサンプルを抽出し、サンプルが-32または-18dBを超えないように正規化し、モノにミックスしてwav(pyDub) 。

次に、私はlibrosaを使って各曲の1292フレームのmfccs(メル周波数ケプストラム係数)を抽出しました。次に、sklearnの前処理モジュールを使用してデータの平均と単位分散がゼロになるようにデータをスケーリングしました。

私はこれらの値をとり、それぞれの行がフレームであり、各列が12個の係数の1つであるMFFCsのcsvファイルに保存しました。 - 金Seve.mp3

1.6792870551627723,-0.3842983399875271,-0.4027844785642914,0.7165034707424635,-0.6823681099880697,0.8160136728323858,-1.5263184054951733,1.1145290823984928,-0.21784328023531235,0.047527570975473235,0.32866412875434237,1.869661743729989 
-1.6792870551627723,-0.3842983399875271,-0.4027844785642914,0.7165034707424635,-0.6823681099880697,0.8160136728323858,-1.5263184054951733,1.1145290823984928,-0.21784328023531235,0.047527570975473235,0.32866412875434237,1.869661743729989 
-1.6792870551627723,-0.3842983399875271,-0.4027844785642914,0.7165034707424635,-0.6823681099880697,0.8160136728323858,-1.5263184054951733,1.1145290823984928,-0.21784328023531235,0.047527570975473235,0.32866412875434237,1.869661743729989 
-1.6792870551627723,-0.3842983399875271,-0.4027844785642914,0.7165034707424635,-0.6823681099880697,0.8160136728323858,-1.5263184054951733,1.1145290823984928,-0.21784328023531235,0.047527570975473235,0.32866412875434237,1.869661743729989 
-1.6792870551627723,-0.3842983399875271,-0.4027844785642914,0.7165034707424635,-0.6823681099880697,0.8160136728323858,-1.5263184054951733,1.1145290823984928,-0.21784328023531235,0.047527570975473235,0.32866412875434237,1.869661743729989 
-1.6792870551627723,-0.3842983399875271,-0.4027844785642914,0.7165034707424635,-0.6823681099880697,0.8160136728323858,-1.5263184054951733,1.1145290823984928,-0.21784328023531235,0.047527570975473235,0.32866412875434237,1.869661743729989 
-1.6792870551627723,-0.3842983399875271,-0.4027844785642914,0.7165034707424635,-0.6823681099880697,0.8160136728323858,-1.5263184054951733,1.1145290823984928,-0.21784328023531235,0.047527570975473235,0.32866412875434237,1.869661743729989 
-1.6792870551627723,-0.3842983399875271,-0.4027844785642914,0.7165034707424635,-0.6823681099880697,0.8160136728323858,-1.5263184054951733,1.1145290823984928,-0.21784328023531235,0.047527570975473235,0.32866412875434237,1.869661743729989 
-1.6792870551627723,-0.3842983399875271,-0.4027844785642914,0.7165034707424635,-0.6823681099880697,0.8160136728323858,-1.5263184054951733,1.1145290823984928,-0.21784328023531235,0.047527570975473235,0.32866412875434237,1.869661743729989 
-1.6792870551627723,-0.3842983399875271,-0.4027844785642914,0.7165034707424635,-0.6823681099880697,0.8160136728323858,-1.5263184054951733,1.1145290823984928,-0.21784328023531235,0.047527570975473235,0.32866412875434237,1.869661743729989 
-1.6792870551627723,-0.3842983399875271,-0.4027844785642914,0.7165034707424635,-0.6823681099880697,0.8160136728323858,-1.5263184054951733,1.1145290823984928,-0.21784328023531235,0.047527570975473235,0.32866412875434237,1.869661743729989 
2.4841536110972022,-0.5831476248573247,0.37058328670683277,-1.4599220579565508,-0.35449671920732007,-1.1326787825224918,0.5880762356956317,-0.8108172607843107,0.010134004741811507,-0.14931018884055094,0.8707111843072819,0.1667143116197902 
2.0939135826765907,-0.4778720879089441,0.26530387765936375,-1.7076132053582773,0.11305806361775678,-1.310823349961563,1.1669240812438573,-0.8627333493359391,-0.19252158214293175,-0.039523355794829566,0.6658161856594883,0.2860711396454278 
1.0127547898943148,-0.6547501371081066,-0.202002065081406,-1.7889468252345162,1.1632837017143651,-0.9288351063974712,2.070078331574107,-0.7601750354687623,-0.27909671541985936,-0.13713166210030908,0.2267359005199065,0.27808482310773774 
0.06572087004052392,-1.8740496505118946,-0.9604185325425617,-1.0163364869696865,1.5840872642483552,-0.16659361108422382,1.7806813371087853,0.055159751832777354,0.6842054675590546,0.42350598071605017,-0.3324771084186967,-0.24348528197848257 
0.7159690101152768,-2.6235135217332606,-0.9099658866643047,-0.19653348650619468,1.0348534863167884,-0.6771927176675163,1.0703663687805878,0.3981886714210787,0.8503521825769755,0.4055860454830591,-0.11841556456925736,0.05030541244676532 
0.8810398765824345,-2.7727001749452045,-0.8484274387283207,0.14839104995756489,0.9124992899968386,-0.5987705973726993,0.6471053665081234,0.43190059553550836,0.9028748015921237,0.3425604687141461,-0.20209176692016032,0.15561852907964296 
1.5217565976091,-2.5946551685896044,-0.3924558895014341,0.36743931340001096,0.9126773048246598,-0.7581004315396501,0.4463892360730688,0.42969123923287,0.7276796949470707,-0.0079165602005986,-0.580154306587985,-0.07235102966750707 
2.08861621898524,-1.2804976691396324,0.46640912894919145,0.14007051920782673,0.9100754665932002,-1.51168507329552,0.7161640071116147,0.34780954351977644,0.3,-1.103443008391695,-0.7900432022174468,-0.2847124076141728 
1.300078728794466,-0.6136862665584394,0.5321920666343034,-0.25881789165042973,1.2648582642185016,-1.7504670292559645,1.4050993480861744,0.354988549965 

私は単に一つの大きなベクターに、各曲の1292個のフレームベクトルをコンパイルしようとした フリオBashmore:

だから、アイデア、最初の20のフレームに続いて曲を取得することができます各ジャンルについて、それをscikitlearnのkNNアルゴリズムの入力として使用します。私は非常に不幸な結果を得ている、私はちょうど "ロック"でいっぱいのベクトルを取得

私は本当にそれをまったく正確に行くつもりはないと確信しているが、 私は以下の2つの機能があります。最初のものは、各ジャンルごとにこの特徴ベクトルを作成する。 2番目の方法は、各ジャンルのベクトルと、そのジャンルのラベルで満たされたベクトルを使用して、単にそれを訓練します。

def create_np_vector(db_read, start_row): 
    num_frames = 1292 
    num_songs = 25 
    num_coefs = 12 
    #vector for all features of every song/sample of that genre 
    genre_vec = np.empty([(num_frames * num_songs), num_coefs]) 
    db_reader = csv.reader(db_read) 
    for row in itertools.islice(db_reader, start_row, start_row + 25): 
     id = row[0] 
     path = row[2] 
     mfcc_file = path + "/csv/" + id + ".csv" 
     mfcc_reader = csv.reader(open(mfcc_file, 'r')) 
     frame_num = 0 
     for mfcc_row in mfcc_reader: 
      frame_vec = np.array(mfcc_row) 
      genre_vec[frame_num] = frame_vec 
      frame_num = frame_num + 1 
    return genre_vec 

def train_knn(db_read, knn): 
    genres = ["electronic", "hip hop", "jazz", "rock"] 
    line_num = [0, 26, 51, 76] 
    x = 0 
    for genre in genres: 
     vec = create_np_vector(db_read, line_num[x]) 
     x = x + 1 
     print(genre) 
     knn.fit(vec, [genre for x in range(25*1292)]) 

私はここで何をしていますか?私はリソースとしてこれを使用しようとしています:http://modelai.gettysburg.edu/2012/music/、しかし私はまだかなり失われています。各オーディオファイルの平均ベクトルと共分散行列を計算する必要がありますか?

私がそれを行ったとしても、各ファイルの2つのベクトルはどうしたらよいですか?

+0

マシンの学習コードは完全にうまくいき、MFCCはジャンルの分類にはあまり適していない可能性があります。 MFCCはおそらく鍵、スペクトルバランス、オーバーミックスなどの特性をキャプチャする方が良くなるでしょう。ジャンルは、リズム、コード、および楽器によってはるかに決定されますが、MFCCによって実際には取り込まれません。 – Linuxios

+0

MFCCは長時間ジャンルのクラスに使用されていますが... – ohbrobig

+0

多分私は間違っていますが、ジャンルに関連する情報をどのように取り込むのか分かりません – Linuxios

答えて

0

MFCCは、スターターにとっては良いアプローチです。しかし、12個の係数を持つことは、あなたのクラシファイアを圧倒する可能性が非常に高いです。平均して、あなたのパフォーマンスは確実に向上します。 HereはLuis Pedro CoelhoおよびWilli RichertによるBuilding Machine Learning Systems with Pythonに記載されたような完全な溶液である。

ウェブサイトから無料試用版を入手できます。正確にこれについての章を読むには十分です:音楽ジャンルの分類。

関連する問題