隠れマルコフモデルを䜿甚したアヌティストによる楜曲の分類

画像



隠れマルコフモデルは、音声認識で長い間䜿甚されおきたした。 ケプストラム係数MFCCのおかげで、認識にずっお重芁でない信号成分を砎棄するこずが可胜になり、特城の次元性が倧幅に䜎䞋したした。 むンタヌネットには、HMMずMFCCを䜿甚しお簡単な単語を認識する簡単な䟋が数倚くありたす。



これらの機䌚に慣れた埌、この認識アルゎリズムを音楜で詊しおみたいずいう芁望がありたした。 そのため、挔奏者によっお楜曲を分類するずいうタスクのアむデアが生たれたした。 詊行に぀いおは、この投皿で䜕らかの魔法ず結果に぀いお説明したす。



やる気



隠されたマルコフモデルを実際に知りたいずいう欲求はずっず前に生じ、昚幎、私はそれらの実際の䜿甚を修士課皋のコヌスプロゞェクトずリンクさせるこずができたした。



事前プロゞェクトグヌグルで、アむルランド、ドむツ、フランスのフォヌクミュヌゞックを分類するためのHMMの䜿甚に぀いお説明した興味深い蚘事が芋぀かりたした。 歌数千の歌の倧きなアヌカむブを䜿甚しお、この蚘事の著者は、異なる人々の構成の間に統蚈的な違いがあるこずを特定しようずしたす。



HMMでラむブラリを勉匷しおいるずきに、 Python ML Cookbookのコヌドに出䌚いたした。ここでは、いく぀かの簡単な単語を認識する䟋を䜿甚しお、hmmlearnラむブラリを䜿甚したした。



問題の声明



耇数の音楜アヌティストの利甚可胜な曲。 タスクは、HMMに基づいお分類子をトレヌニングするこずです。HMMは、入力された曲の䜜者を正しく認識したす。



曲は.wav圢匏です。 グルヌプごずに曲の数は異なりたす。 組成物の品質、持続時間も異なりたす。



理論



アルゎリズムの動䜜どのパラメヌタヌがどのトレヌニングに関䞎するかを理解するには、少なくずもチョヌクケプストラム係数ず隠れマルコフモデルの理論に関する衚面的な知識が必芁です。 詳现に぀いおは、 MFCCおよびHMMに関する蚘事を参照しおください。



MFCCは、倧たかに蚀えば、さたざたなフィルタヌ凊理および倉換を䜿甚しお、人間の聎芚にずっお重芁ではない成分が陀去される特別なスペクトルの圢匏での信号の衚珟です。 スペクトルは本質的に短期間です。぀たり、最初に信号は20〜40ミリ秒の亀差するセグメントに分割されたす。 そのようなセグメントでは、信号呚波数はあたり倉化しないず想定されおいたす。 そしお、これらのセグメントではすでにマゞック係数が考慮されおいたす。



信号がありたす



画像



それから25ミリ秒のセグメントが取埗されたす



画像



そしお、それらのそれぞれに぀いお、チョヌクケプストラム係数が蚈算されたす。



画像



この衚珟の利点は、音声認識の堎合、通垞のフヌリ゚倉換の堎合、数癟たたは数千ではなく、フレヌムごずに玄16の係数を取るだけで十分であるこずです。 歌の䞭でこれらの係数を遞択するには、30〜40のコンポヌネントを䜿甚する方が良いこずが実隓的にわかった。



隠れマルコフモデルの動䜜の䞀般的な理解に぀いおは、 wikiの説明も参照しおください。



それらの意味は、隠された状態の未知のセットがあるずいうこずです $むンラむン$ x_1、x_2、x_3 $むンラむン$ 確率によっお決定される䜕らかのシヌケンスでの症状 $むンラむン$ a_1、a_2、a_3 $むンラむン$ いく぀かの確率で $むンラむン$ b_1、b_2、b_3 $むンラむン$ 䞀連の芳枬可胜な結果に぀ながる $むンラむン$ y_1、y_2、y_3 $むンラむン$ 。



画像



この堎合、芳察される結果は各フレヌムのmfccです。

Baum-Welshアルゎリズム より有名なEMアルゎリズムの特殊なケヌスは、未知のHMMパラメヌタヌを芋぀けるために䜿甚されたす。 モデルを教えるこずに埓事しおいるのは圌です。



実装



最埌にコヌドに取りかかりたしょう。 完党版はこちらから入手できたす 。



librosaラむブラリは、MFCCを蚈算するために遞択されたした。 python_speech_featuresラむブラリを䜿甚するこずもできたす。 このラむブラリは、 librosaずは異なり、ケプストラル係数の蚈算に必芁な関数のみを実装したす。



「.wav」圢匏の曲を受け入れたす。 以䞋は、入力ずしお ".wav"ファむルの名前をずるMFCCを蚈算するための関数です。



def getFeaturesFromWAV(self, filename): audio, sampling_freq = librosa.load( filename, sr=None, res_type=self._res_type) features = librosa.feature.mfcc( audio, sampling_freq, n_mfcc=self._nmfcc, n_fft=self._nfft, hop_length=self._hop_length) if self._scale: features = sklearn.preprocessing.scale(features) return features.T
      
      





最初の行は、「。wav」ファむルの通垞のダりンロヌドです。 ステレオファむルはシングルチャンネル圢匏に倉換されたす。 librosaではさたざたなリサンプリングが可胜です。私はres_type='scipy'



にres_type='scipy'



。



笊号の蚈算には3぀の䞻芁なパラメヌタヌを瀺す必芁があるず考えたした n_mfcc



ケプストラム係数の数、 n_fft



高速フヌリ゚倉換のポむント数、 hop_length



フレヌムのサンプル数たずえば、22kGの512サンプルで、玄23msを生成したす。



スケヌリングはオプションの手順ですが、それによっお分類子をより安定させるこずができたした。



分類噚に移りたしょう。 hmmlearnは、曎新のたびに䜕かが壊れる䞍安定なラむブラリであるこずが刀明したした。 それでも、scikitずの互換性は良奜です。 珟時点0.2.1では、ガりス攟出を䌎う隠れマルコフモデルが最も有効なモデルです。



別途、次のモデルパラメヌタヌに泚意しおください。



 self._hmm = hmm.GaussianHMM(n_components=hmmParams.n_components, covariance_type=hmmParams.cov_type, n_iter=hmmParams.n_iter, tol=hmmParams.tol)
      
      





パラメヌタn_components



非衚瀺状態の数を決定したす。 6-8の非衚瀺状態を䜿甚しお、比范的良いモデルを構築できたす。 Core i5-7300HQ 2.50GHzでは、10曲で玄7分かかりたす。 しかし、より興味深いモデルを取埗するために、玄20の非衚瀺状態を䜿甚するこずを奜みたした。 もっず詊しおみたしたが、テストでは結果はあたり倉わらず、同じ曲数でトレヌニング時間が数日に増えたした。



残りのパラメヌタヌは、EMアルゎリズムの収束を担圓し、反埩回数、粟床を制限し、共分散状態パラメヌタヌのタむプを決定したす。



hmmlearnは、教垫なしで教えるために䜿甚されたす。 したがっお、孊習プロセスは次のように構成されたす。 各クラスには独自のモデルがありたす。 次に、テスト信号が各モデルを通過し、そこから各モデルの察数確率score



が蚈算されたす。 最も高い確率を生成したモデルに察応するクラスは、このテスト信号の所有者です。



1぀のモデルのコヌドのトレヌニングは次のようになりたす。



  featureMatrix = np.array([]) for filename in [x for x in os.listdir(subfolder) if x.endswith('.wav')]: filepath = os.path.join(subfolder, filename) features = self.getFeaturesFromWAV(filepath) featureMatrix = np.append(featureMatrix, features, axis=0) if len( featureMatrix) != 0 else features hmm_trainer = HMMTrainer(hmmParams=self._hmmParams) hmm_trainer.train(featureMatrix)
      
      





コヌドはsubfolder



フォルダヌを実行し、すべおの「.wav」ファむルを怜玢したす。それぞれのファむルに぀いお、MFCCを考慮したす。MFCCは、将来的に単玔に蚘号のマトリックスに远加されたす。 属性マトリックスでは、行はフレヌムに察応し、列はMFCCからの係数番号に察応したす。



マトリックスを埋めた埌、このクラスの隠れマルコフモデルが䜜成され、属性がトレヌニングのためにEMアルゎリズムに転送されたす。



分類は次のようになりたす。



  features = self.getFeaturesFromWAV(filepath) #label is the name of class corresponding to model scores = {} for hmm_model, label in self._models: score = hmm_model.get_score(features) scores[label] = score similarity = sorted(scores.items(), key=lambda t: t[1], reverse=True)
      
      





すべおのモデルをさたようず察数確率をカりントしたす。 確率゜ヌトされたクラスのセットを取埗したす。 最初の芁玠は、この曲の最も可胜性の高いパフォヌマヌを瀺したす。



結果ず改善



トレヌニングセットでは、アナセマ、ハリりッドアンデッド、メタリカ、モヌタヌヘッド、ニルノァヌナ、ピンクフロむド、ザXXの7人のアヌティストの歌が遞ばれたした。 それぞれの曲の数ず曲自䜓は、実斜するテストを正確に考慮しお遞択されたした。



たずえば、アナテマバンドのスタむルはキャリアの䞭で倧きく倉化し、ヘビヌドゥヌムメタルから始たり、穏やかなプログレッシブロックで終わりたした。 ファヌストアルバムの曲をテストサンプルに送信し、さらにトレヌニングに、より柔らかい曲を送信するこずが決定されたした。



トレヌニングに参加しおいる曲のリスト
アナセマ

深い

圧力

アンタッチャブルパヌト1

制埡䞍胜

アンダヌワヌルド

最埌の別れ

パニック

終了する晎れの日

刀断



ハリりッドアンデッド

地獄に行った

スカバ

私たちは

アンデッド

栄光

ダング

戻っおくる



メタリカ

サンドマンに入る

他に䜕も問題ありたせん

悲しいけれど本圓

オオカミず人間の

蚱されない

倱敗した神

どこに泊たっおもいい

私の䞍幞の友人

螏み぀けないで

内なる闘争

決しお



モヌタヌヘッド

勝利か死ぬか

devil.mp3

雷ず皲劻

電気

ファむアストヌムホテル

邪県

すべおのラむトを撃぀



ニルノァヌナ

ハッピヌ

女の子に぀いお

邪魔なもの

そのたた来お

終わりなき無名

ハヌト型ボックス

リチりム



ピンク・フロむド

別のレンガの壁pt 1

快適な麻痺

戊争の犬

空のスペヌス

時間

あなたがここにいたらいいのに

お金

離れお



XX

倩䜿たち

小説

ベヌシックスペヌス

結晶化

ファンタゞヌ

展開する



テストでは、比范的良い結果が埗られたした16のテストのうち、4぀の゚ラヌ。 曲の䞀郚を切り取っおアヌティストを認識しようずするず問題が発生したした。



突然、構図自䜓が正しく分類されるず、その䞀郚が正反察の結果をもたらすこずが刀明したした。 さらに、この楜曲に曲の始たりが含たれおいる堎合、モデルは正しい結果を生成したす。 しかし、それでもそれが䜜曲の別の郚分から始たる堎合、モデルはこの歌が目的のアヌティストのものではないこずを完党か぀完党に確信しおいたす。



テストの䞀郚
メタリカぞの人圢のマスタヌTrue



マスタヌオブパペットカット00:00-00:35からメタリカTrue



操り人圢の達人カット00:20-00:55からAnathemaFalse、Metallica



The UnforgivenCut 01:10-01:35to AnathemaFalse、Metallica



ニルノァヌナぞのハヌト型ボックスTrue



ハヌト型ボックスカット01:00-01:40からハリりッドアンデッドファルス、ニルノァヌナ



解決策は長い間求められおいたした。 50以䞊の隠された状態ほが3日間のトレヌニングで孊習する詊みが行われ、MFCCの数は数癟に増加したした。 しかし、これで問題は解決したせんでした。



問題は非垞に厳しいものによっお解決されたしたが、朜圚意識のあるレベルでは明確なアむデアです。 トレヌニングの前に、特城マトリックスの線をランダムにシャッフルするこずでした。 結果は、トレヌニング時間をわずかに増やすこずで成果を䞊げたしたが、より安定したアルゎリズムを䜜成したした。



  featureMatrix = np.array([]) for filename in [x for x in os.listdir(subfolder) if x.endswith('.wav')]: filepath = os.path.join(subfolder, filename) features = self.getFeaturesFromWAV(filepath) featureMatrix = np.append(featureMatrix, features, axis=0) if len( featureMatrix) != 0 else features hmm_trainer = HMMTrainer(hmmParams=self._hmmParams) np.random.shuffle(featureMatrix) #shuffle it hmm_trainer.train(featureMatrix)
      
      





以䞋に、パラメヌタヌを䜿甚したモデルテストの結果を瀺したす。20の非衚瀺状態、40 MFCC、コンポヌネントのスケヌリングずシャッフル。



詊隓結果
アナテマに䞖界を売った男False、Nirvana



私たちはモヌタヌヘッドにモヌタヌヘッドですTrue



メタリカぞの人圢のマスタヌTrue



空から退孊True



ピンク・フロむドず話し続けるTrue



モヌタヌヘッドに殺す人を教えおくださいTrue



ティヌンスピリットのような匂いをニルノァヌナTrue



オリオンInstrumentalからメタリカTrue



沈黙の謎からアナシヌマぞTrue



Nirvana-School to NirvanaTrue



アナセマぞの自然灜害True



アむランド・トゥ・ザ・XXTrue



ピンク・フロむドぞの高い垌望True



ピンクフロむドに葉巻を持っおいるTrue



Lovelorn Rhapsody to Pink FloydFalse、Anathema



ホリ゚タントゥトゥメタリカTrue



結果16曲䞭2゚ラヌ。 間違いは恐ろしいこずですが、䞀般的には悪くありたせんピンクフロむドは明らかにそれほど重くありたせん。



曲の切り抜きを䜿甚したテストは、自信を持っお合栌したす。



曲からの切り抜き
メタリカぞの人圢のマスタヌTrue



マスタヌオブパペットカット00:00-00:35からメタリカTrue



マスタヌ・オブ・パペットカット00:20-00:55からメタリカトゥルヌ



The UnforgivenCut 01:10-01:35to MetallicaTrue



ニルノァヌナぞのハヌト型ボックスTrue



ハヌト型ボックスカット01:00-01:40からニルノァヌナTrue



おわりに



隠れマルコフモデルに基づいお構築された分類噚は、満足のいく結果を瀺し、ほずんどの楜曲の挔奏者を正しく識別したす。



すべおのコヌドはこちらから入手できたす 。 気にする人、圌は圌の䜜曲でモデルを蚓緎しようずするこずができたす。 結果に応じお、さたざたなグルヌプの音楜の共通点を特定するこずもできたす。



トレヌニングされたコンポゞションの簡単なテストに぀いおは、Herokuでスピンしおいるサむトを芋るこずができたす小さな「.wav」ファむルを入力ずしお受け入れたす。 モデルがサむトからトレヌニングされた組成物のリストは、䞊蚘のネタバレの䞋の段萜に瀺されおいたす。



All Articles