Terug naar boven

Uitleg radio playlist op Muziekweb


Radio playlist/afspeellijst

De radio playlists die u op Muziekweb ziet worden automatisch samengesteld door onze computers. Deze computers luisteren naar de radiozenders. Op basis van ‘audio fingerprints’, wordt de juiste muziek herkend. Hiervoor wordt geput uit de complete Muziekweb-collectie. Als de muziek niet voorkomt in de collectie van Muziekweb, kunnen onze computers het ook niet herkennen. Dit kan bijvoorbeeld voorkomen bij live optredens. Hierdoor kunt u wel eens “gaten” zien bij een playlist.

Technische uitleg

Alle ongeveer 6,5 miljoen muziek bestanden zijn doormiddel van een fingerprint algoritme geïndexeerd. Hiervoor wordt het audio signaal van 44,1 kHz teruggebracht naar 5kHz. Vervolgens wordt een Fast Fourier Transformatie (FFT) toegepast over een window van 371ms aan audio. Uit deze data wordt een 32-bits getal berekent. Dit is de “subfinger” die wordt opgeslagen. Daarna gaan we 11,6 ms verder in de audio en doen we hetzelfde nogmaals. Dit gaat net zolang door tot het gehele nummer in subfingers is omgezet. Het geheel van alle subfingers is de fingerprint van de muziek. Deze fingerprint is aanzienlijk korter dan de oorspronkelijk audio track. Deze fingerprint wordt opgeslagen in een MySQL database, zodat het later opgevraagd kan worden om te vergelijken met een ander stukje muziek.

Vanuit de gemaakt MySQL database wordt een inverted index opgebouwd. Wij gebruiken hiervoor Lucene. Dit is dezelfde software die we gebruiken voor het maken van de zoekinterface op Muziekweb. Hiermee is het mogelijk om snel op basis van subfingers de juiste track te selecteren. Deze lucene index is ongeveer 286gb groot en groeit wekelijks. Hij bestaat uit ongeveer 2,5 miljard unieke ingangen (subfingers).

De MySQL database en de lucene index worden wekelijks bijgewerkt, dit proces duurt ongeveer 24 uur. Zodra de nieuwe index beschikbaar is wordt deze gekopieerd naar de verschillende computers die naar de radiozenders luisteren.

De computers die naar de radiozenders luisteren gaan als volgt te werk. Het audiosignaal (mp3 of aac stream) wordt gedecodeerd naar wav formaat en omgezet naar een 5kHz signaal. Hieruit wordt door het beschreven algoritme weer subfingers gecreëerd. Dit wordt elke keer over 15 seconden aan audio gedaan.

Het match algoritme zoekt de subfingers op in de lucene index. Op basis hiervan worden mogelijke audio tracks geselecteerd. Om nu de juiste muziektrack te vinden, wordt doormiddel van de Hamming distance bepaald welke muziektrack het meest overeen komt. Je kunt je voorstellen dat het originele muziek bestand zoals het op cd staat door allerlei compressie naar bijvoorbeeld mp3 er anders uitziet. Een match wordt dan ook gevonden door een bepaalde graad van fout toe te staan. Uiteindelijk resulteert dit dan (hopelijk) in de “herkenning” van de correcte audio track. Sommige radiozenders versnellen de audio enigszins waardoor detectie wordt bemoeilijk, dit is bijvoorbeeld het geval bij Radio 538. Om de muziek dan toch te herkennen wordt de audio eerst vertraagd voordat de fingerprint wordt berekend.

Een soortgelijk algoritme met beschrijving kunt u hier vinden, nadeel van deze implementatie is dat het gebruikte algoritme moeilijk schaalbaar is.

Computerpark

Er wordt gebruikt gemaakt van twee servers en drie Intel NUC’s. Een server dient als MySQL database, de andere server wordt gebruikt voor het maken van de fingerprints en de inverted (lucene) index. Voor het luisteren naar de radiozenders maken we gebruik van intel NUC’s. Elke NUC kan gelijktijdig drie radiozenders volgen. Op dit moment volgen we 8 radiozenders en hebben we hiervoor dus drie NUC’s in gebruik.

De code is beschikbaar op github, inclusief een 1,3 miljoen fingerprint database.

De software is voor Muziekweb ontwikkeld door Yvo Nelemans.