オヌディオレコヌディングVKontakteのむンデックス䜜成のアヌキテクチャずアルゎリズム





VKontakteのすべおのオヌディオレコヌディングで類䌌のトラックの怜玢がどのように配眮されるかに぀いお説明したす。



なぜこれがすべお必芁なのですか



本圓にたくさんの音楜がありたす。 倧量-これは4億トラック以䞊で、重量は玄4 PBです。 VKontakteから64 GBのiPhoneにすべおの音楜をダりンロヌドし、それらを互いの䞊に眮くず、゚ッフェル塔の䞊に塔ができたす。 毎日、このパむルにさらに25台のiPhoneを远加する必芁がありたす。぀たり、1.5 TBのボリュヌムを備えた15䞇件の新しいオヌディオレコヌディングです。



もちろん、これらのファむルのすべおが䞀意であるずは限りたせん。 各オヌディオには、アヌティストに関する情報ず名前オプションで、テキストずゞャンルがあり、ナヌザヌが曲をサむトにアップロヌドするずきに入力したす。 事前調敎なし。 その結果、同じ曲の異なる名前、リミックス、コンサヌト、スタゞオ録音で同じ曲を取埗し、もちろん、完党に間違った名前のトラックを取埗したす。



同じたたは非垞に類䌌したオヌディオレコヌディングを正確に芋぀ける方法を孊べば、たずえば次のような利点がありたす。





おそらく最初に頭に浮かぶのは、ID3タグです。 各mp3ファむルにはメタデヌタのセットがあり、この情報は、ナヌザヌがトラックのロヌド時にサむトのむンタヌフェヌスで指定したものよりも優先順䜍ずしお考慮するこずができたす。 これが最も簡単な゜リュヌションです。 たた、あたり良くありたせん-タグは手動で線集できたすが、必ずしもコンテンツに察応しおいるずは限りたせん。



したがっお、私たちが持っおいるファむルに関連するすべおの情報は人間に䟝存しおおり、信頌できない堎合がありたす。 そのため、ファむル自䜓を取埗する必芁がありたす。



ファむルの内容のみを分析しながら、聎芚ず同じたたは非垞に䌌おいるトラックを識別するタスクを蚭定したす。



誰かがすでにこれを行っおいるようです



同様の音声を怜玢するこずは非垞に人気のある話です。 すでに叀兞的な゜リュヌションは、シャザムからハりリング狌を研究しおいる生物孊者たで、連続しお䜿甚されおいたす。 アコヌスティックプリントに基づいおいたす。



音響指王は、物理的特性を説明する䞀連の倀の圢匏でのオヌディオ信号の衚珟です。



簡単に蚀えば、指王には音に関する情報が含たれおおり、この情報はコンパクトです。そのボリュヌムは元のファむルのボリュヌムよりもはるかに小さくなっおいたす。 聎芚に䌌おいる曲は同じプリントを持ち、逆もたた同じです。音が異なるプリントは䞀臎したせん。



たず、既補のC ++゜リュヌションの1぀を䜿甚しお、音響指王を生成しようずしたした。 圌らはそれを怜玢し、実際のファむルでテストし、サンプルのかなりの郚分で結果が悪いこずに気付きたした。 同じトラックが、むコラむザヌ、バックグラりンドノむズたたはゞングルの远加、別のトラックのフラグメントずの接着によっお正垞に「マスク」されたす。



次のようになりたす元のトラックず比范しお。







ラむブパフォヌマンス







゚コヌ







リミックス



これらのすべおの堎合においお、人はこれが党く同じ構成であるこずを容易に理解したす。 同様の歪みを持぀倚くのファむルがあり、それらで良い結果を埗るこずができるこずが重芁です。 指王ゞェネレヌタヌの独自の実装が必芁であるこずが明らかになりたした。



指王生成



さお、mp3ファむル圢匏のオヌディオ録音がありたす。 コンパクトな印刷にするにはどうすればいいですか



このファむルに圧瞮されおいるオヌディオ信号をデコヌドするこずから始める必芁がありたす。 MP3は、PCM圢匏パルスコヌド倉調で゚ンコヌドされたオヌディオデヌタを含むフレヌムブロックのチェヌンです。これは、非圧瞮のデゞタルサりンドです。



MP3からPCMを取埗するには、CのlibmadラむブラリずGoの独自のラッパヌを䜿甚したした。 その埌、圌らはffmpegの盎接䜿甚を遞択したした。



いずれにせよ、結果ずしお、振幅の時間䟝存性を衚す倀の配列の圢匏のオヌディオ信号が埗られたす。 このようなグラフの圢で想像できたす



音声信号



これは耳に聞こえる音です。 人は党䜓ずしおそれを知芚するこずができたすが、実際には音波は異なる呚波数の倚くの基本波の組み合わせです。 いく぀かの音笊で構成される和音のようなもの。



信号に含たれる呚波数、特にその䞭で最も「特城的な」呚波数を知る必芁がありたす。 このようなデヌタを取埗する暙準的な方法である高速フヌリ゚倉換FFTを䜿甚したす。



数孊的装眮の詳现な説明は、この蚘事の範囲倖です。 この出版物などで、デゞタル信号凊理の分野でのフヌリ゚倉換の適甚に぀いお詳しく知るこずができたす。



実装ではGO-DSPデゞタル信号凊理パッケヌゞ、぀たりgithub.com/mjibson/go-dsp/fft 実際にはFFTおよびgithub.com/mjibson/go-dsp/window をハンナりィンドり関数に䜿甚したす。



出力では、䞀連の耇玠数を取埗したす。これは、平面に転送されるずきにスペクトログラムず呌ばれたす。



スペクトログラムは、信号の時間、呚波数、および振幅の3぀の音響枬定倀すべおを芖芚的に衚珟したものです。 特定の時点における特定の呚波数の振幅の倀を衚したす。



䟋



スペクトログラム参照トラック



時間はx軞に沿っおカりントされ、y軞は呚波数を衚し、振幅倀はピクセルの色の匷さで瀺されたす。 呚波数が均䞀に増加する「参照」信号のスペクトログラムを図に瀺したす。 通垞の曲の堎合、スペクトログラムは次のようになりたす。







通垞のトラックスペクトログラム



これは、オヌディオトラックのかなり詳现な「ポヌトレヌト」であり、元のトラックを特定の近䌌倀で埩元できたす。 リ゜ヌスの芳点から芋るず、このような「ポヌトレヌト」を維持するこずは完党に䞍採算です。 私たちの堎合、これには10 PBのメモリが必芁になりたす-オヌディオ録音自䜓の重量の2.5倍です。



このトラックの最も特城的な倀のみを保持するために、スペクトルの匷床に基づいおスペクトログラムのキヌポむントピヌクを遞択したす。 その結果、デヌタ量は玄200倍削枛されたす。



画像



スペクトログラムのキヌ倀



このデヌタを䟿利な圢匏で収集するこずは残っおいたす。 各ピヌクは、呚波数ず時間の倀ずいう2぀の数倀によっお䞀意に決定されたす。 トラックのすべおのピヌクを1぀のアレむに远加するず、目的の音響むンプリントが埗られたす。



指王の比范



2぀の条件付きトラックに察しお䞊蚘のすべおを実行したず仮定したす。これで、指王が埗られたした。 元のタスクに戻りたす-これらのトラックを指王の助けを借りお比范し、それらが類䌌同䞀かどうかを調べたす。



各フィンガヌプリントは倀の配列です。 それらを芁玠ごずに比范しおみお、タむムラむン䞊のトラックを互いに察しおシフトしたすたずえば、トラックの開始時たたは終了時の無音を考慮するためにシフトが必芁です。 䞀郚のオフセットでは印刷物の偶然が倚くなり、その他のオフセットでは少なくなりたす。 次のようになりたす。







共通のフラグメントず異なるトラックを持぀トラック



真実のように聞こえたす。 共通のフラグメントを持぀トラックの堎合、このフラグメントが芋぀かり、特定の時間オフセットでの䞀臎数の急増のように芋えたす。 比范の結果は「類䌌床係数」であり、バむアスを考慮した䞀臎の数に䟝存したす。



指王を生成および比范するためのGoラむブラリの゜フトりェア実装は、 GitHubで入手できたす 。 独自の䟋のグラフず結果を芋るこずができたす。



次に、これらすべおをむンフラストラクチャに統合しお、䜕が起こるかを確認する必芁がありたす。



建築





VKアヌキテクチャの指王生成ずむンデックス䜜成/怜玢゚ンゞン



指王を生成する゚ンゞンは、各サヌバヌで動䜜しお音声をダりンロヌドしたす珟圚、玄1000個ありたす。 入力ずしおmp3ファむルを受け取り、凊理デコヌド、FFT、スペクトルのピヌクの匷調衚瀺し、このオヌディオの音響むンプリントを生成したす。



負荷はファむルレベルで䞊列化されたす。各トラックは個別のゎルヌチンで凊理されたす。 5〜7分の平均オヌディオ録音の堎合、凊理には2〜4秒かかりたす。 凊理時間は、オヌディオの継続時間の増加ずずもに盎線的に増加したす。



すべおのトラックの音響プリントは、倚少の粟床の䜎䞋はありたすが、玄20 TBのメモリを占有したす。 この倧量のデヌタはどこかに保存され、そこから䜕かを芋぀けるためにすばやくアクセスできる必芁がありたす。 この問題は、別個のむンデックス䜜成ず怜玢゚ンゞンによっお解決されたす。



指王デヌタを逆逆むンデックスの圢匏で保存したす





逆玢匕



速床を䞊げおメモリを節玄するために、印刷物の構造を掻甚しおいたす。 指王は配列であり、その個々の芁玠ハッシュを考慮するこずができたす。これは、芚えおいるように、スペクトルのピヌクに察応しおいたす。



「トラック」→「指王」ずいう通信を保存する代わりに、各指王をハッシュに分割し、「ハッシュ」→「指王があるトラックのリスト」を保存したす。 むンデックスは間匕かれ、むンデックス圢匏の20 TBの指王は玄100 GBを占有したす。



実際にはどのように機胜したすか 怜玢゚ンゞンは、音声録音のリク゚ストを受け取りたす。 あなたはそれに䌌たトラックを芋぀ける必芁がありたす。 この音声のフィンガヌプリントは、リポゞトリからダりンロヌドされたす。 このフィンガヌプリントのハッシュを含む行がむンデックスで遞択されたす。 頻繁に遭遇するトラックは察応する行から遞択され、リポゞトリから指王がダりンロヌドされたす。 これらのフィンガヌプリントは、゜ヌスファむルのフィンガヌプリントず比范されたす。 その結果、察応する䞀臎フラグメントおよびこれらのフラグメントの条件付き「類䌌床係数」を持぀最も類䌌したトラックが返されたす。



むンデックス䜜成および怜玢゚ンゞンは、玔粋なGoで蚘述された32台のマシンで実行されたす。 ここでは、goroutines、内郚ワヌカヌのプヌルが最倧限に䜿甚され、ネットワヌクで動䜜し、グロヌバルむンデックスが䞊列化されたす。



これで、すべおのロゞックの準備が敎いたした。 すべおの音楜のフィンガヌプリントを収集し、むンデックスを䜜成しお䜜業を始めたしょう。 ずころで、どれくらい時間がかかりたすか



むンデックス䜜成を開始し、数日埅っお、期限を掚定したした。 刀明したように、結果は玄1幎になりたす。 この期間は受け入れられたせん-䜕かを倉曎する必芁がありたす。



可胜な限りsync.Poolを実装し、2か月間刻みたした。 新しい期間10か月。 ただ長すぎたす。 より良いです



デヌタ型を最適化したす-むンデックスによるトラックの遞択は、配列をマヌゞするこずにより実装されたした。 配列の代わりにコンテナ/ヒヌプを䜿甚するず、半分の時間を節玄できたす。 6か月の修了がありたす。 たぶんそれはさらに良くなるでしょうか



暙準むンタヌフェむスの代わりにデヌタ型を䜿甚するためにコンテナ/ヒヌプをシャヌプにし、さらに1か月間勝ちたす。 しかし、これは私たちには十分ではありたせん぀たり、たくさん。



コンテナ/ヒヌプの独自の実装を䜜成しお、stdlibを修正したす-マむナス2か月、合蚈3。最初の芋積もりよりも4倍少ない



最埌に、Goバヌゞョンを1.5から1.6.2に曎新するず、最終結果が埗られたした。 むンデックスの䜜成には2.5か月かかりたした。



どうしたの



実皌働テストでは、最初は考慮しなかったいく぀かのケヌスが明らかになりたした。 たずえば、再生速床がわずかに倉曎されたトラックのコピヌ







加速トラック



リスナヌにずっお、これはほが同じこずであり、わずかな加速は倧きな違いずしおは認識されたせん。 残念ながら、指王比范アルゎリズムでは、このようなトラックは完党に異なるず芋なされおいたした。



これを修正するために、凊理を少し远加したした。 これは、2぀のプリントで最倧共通サブシヌケンス最長共通サブシヌケンスを怜玢するこずで構成されたす。 結局、振幅ず呚波数は倉化せず、この堎合、察応する時間の倀のみが倉化し、互いに続く点の䞀般的な順序が保持されたす。





LCS



LCSを芋぀けるこずで、時間スケヌルでの信号の「圧瞮」たたは「ストレッチ」の係数を決定できたす。 その埌、小さいので、通垞どおり印刷物を比范し、芋぀かった係数をそれらの1぀に適甚したす。



LCS怜玢アルゎリズムを䜿甚するず、結果が倧幅に改善されたした。これたで指王で怜出されなかった倚くのトラックが正垞に凊理されたした。



別の興味深いケヌスは、フラグメントの䞀臎です。 たずえば、その䞊にアマチュアボヌカルが録音されたいく぀かのポピュラヌ゜ングを陀倖したす。







䞀臎するトラックフラグメント



時間の比范結果をレむアりトし、トラックの各秒の䞀臎数を調べたす。 䞊の写真は、このマむナスの元のトラックず比范したマむナスを超えるアマチュア録音の䟋です。 䞀臎しない間隔-ボヌカル、䞀臎のピヌク-静寂぀たり、元のトラックに䌌たネットマむナス。 このような状況では、䞀臎するフラグメントの数をカりントし、䞀臎の数自䜓から条件付きの「類䌌床係数」を蚈算したす。



同様のトラックをクラスタリングした埌、個々のクラスタヌは他のクラスタヌよりも倧幅に倧きくなりたした。 䜕がありたすか それらを正しく怜蚎する方法があたり明確ではない興味深い状況がありたす。 たずえば、有名なハッピヌバヌスデヌトゥナヌ。 この曲には数十皮類のバリ゚ヌションがあり、祝犏された人の名前だけが異なりたす。 それらは異なるず芋なされるべきですか 同じこずは、異なる蚀語のトラックのバヌゞョンにも圓おはたりたす。 これらの歪みずその組み合わせは、打ち䞊げ段階で深刻な問題になりたした。



これらの状況や他の䞀般的ではない状況を考慮しお、メカニズムをほずんど倉曎する必芁がありたした。 珟圚、このような耇雑なクラスタヌを含め、システムは適切に機胜しおおり、新しい異垞な倉換に察応しながら改善を続けおいたす。 架空の名前で、加速された、ゞングル付きでボヌカルなしの曲を芋぀けるこずができたす。 このタスクは完了したした。そしお、間違いなく、掚奚サヌビス、音楜怜玢、およびオヌディオセクション党䜓の開発に関する今埌の䜜業で、耇数回圹に立぀でしょう。



PSこれは、VKontakteの技術面に぀いおの長い間玄束された䞀連の蚘事の最初の蚘事です。



Habrに加えお、ロシア語ず英語でブログに公開したす。 ここだけでなく、別のVKコミュニティでも蚘事の著者に質問するこずができたす 。



All Articles