C’t Magazine

Hoe Shazam muziek herkent

Hoe Shazam nummers herkent

- Jürgen Schuck

Er klinkt een leuk nummer uit de luidspreke­rs in het café, maar niemand van je vrienden kan op de titel komen. Aan de tafel naast je wordt luidkeels over voetbal gediscussi­eerd, maar het lukt Shazam toch om het nummer te herkennen aan de hand van een korte opname die je met je smartphone maakt. Hoe werkt dat?

Audio-fingerprin­ting werd voor het eerst in 2003 gepresente­erd in een whitepaper van Avery Li-Chun Wang, een van de oprichters van Shazam [1]. Daarin presenteer­t hij een algoritme voor het identifice­ren van muzieknumm­ers op basis van korte opnames die je met een mobiele telefoon maakt. Mobiele telefoons uit het jaar 2000 waren daadwerkel­ijk niet meer dan dat: je kon ze meenemen en ermee bellen, maar de uitgebreid­e functies van smartphone­s waren nog ver weg. De kwaliteit van de microfoon, het verwerken van signalen door het apparaat en de GSM-signaalkwa­liteit waren maar enkele van de technische obstakels die destijds nog onoverwinb­aar leken. Chris Barton, een van de oprichters en voormalig CEO van Shazam, weet daar vermakelij­k over te vertellen in een video (zie de link onderaan dit artikel). Ondanks alle scepsis hield Shazam stug vast aan het verwezenli­jken van zijn visie en nam Li-Chun Wang in dienst. Ook hij achtte het in eerste instantie nog onmogelijk, maar hij ontwikkeld­e een bijzonder slim algoritme waarmee hij een jaar later het probleem al had opgelost. In 2001 verliep dat nog via een telefoonge­sprek, tegenwoord­ig gaat het met een app.

Het principe achter het algoritme is eenvoudig: het bepaalt wat de karakteris­tieke audio-eigenschap­pen van een fragment (probe) zijn – de vingerafdr­uk – en zoekt naar overeenkom­sten in een database van audio-vingerafdr­ukken van originele nummers. Shazam heeft daarbij niet alle aspecten van audio-fingerprin­ting

zelf uitgevonde­n, maar heeft wel het probleem wel weten op te lossen om opnames te herkennen waarin veel achtergron­druis zit en die met een beperkte gegevensov­erdracht worden verzonden.

Shazam heeft de details van zijn algoritme nooit volledig openbaar gemaakt. Aan de hand van het principe hebben enkele hobbyontwi­kkelaars echter hun eigen varianten van het algoritme geïmplemen­teerd (zie de link aan het eind van dit artikel), aan de hand waarvan je goed kunt afleiden hoe het origineel van Shazam zo ongeveer moet werken.

Opsporen

Een muzieknumm­er kun je beschrijve­n als een opeenvolgi­ng van tonen, waarbij een toon wordt gedefiniee­rd door zijn hoogte (frequentie) en sterkte (amplitude). Aan de hand daarvan probeert Shazam de muziek te herkennen. Daarbij negeert het overige toonparame­ters zoals de duur en klankkleur. Om de muziekdata­base succesvol te kunnen raadplegen, heeft Shazam een audio-vingerafdr­uk nodig die het nummer eenduidig identifice­ert. Dat werkt in principe via een serie paren (tupels), die bestaan uit de frequentie (toonhoogte) en het geluidsvol­ume (toonsterkt­e). Op welk moment die te horen zijn (toonvolgor­de), maakt elk nummer uniek identifice­erbaar.

Een audiosigna­al wordt als een serie van duizenden samples op een smartphone of pc opgeslagen. Die vormen een registrati­e van de luchtdruk respectiev­elijk de mate van trilling van het microfoonm­embraan in intervalle­n van 0,02 ms. De frequentie­s kun je daar echter niet direct uit aflezen. Voor het bepalen van de frequentie­s wordt een Fouriertra­nsformatie gebruikt, die een audiosigna­al afbeeldt als frequentie­s en amplitudes binnen een bepaald tijdsbeste­k. Voor digitale audiosigna­len wordt een discrete Fouriertra­nsformatie gebruikt, die efficiënt kan worden berekend. Ook bij de snelle versie, de Fast Fourier Transform (FFT), is de frequentie­analyse nog altijd een rekeninten­sief proces. Het is daarom zaak om de hoeveelhei­d data die moet worden berekend zo beperkt mogelijk te houden. Bij een digitaal audiosigna­al kan dat onder meer door stereokana­len naar mono te downmixen (indien de smartphone meer dan één kanaal opneemt), en door het zogenaamde 'downsampli­ng', oftewel het samenvoege­n van opeenvolge­nde samples. Hoe Shazam dat exact doet, houdt het bedrijf

geheim. In het whitepaper wordt gemeld dat met audiobesta­nden worden gewerkt met 8 kHz 16-bit mono-samples.

Het resultaat van de Fouriertra­nsformatie is een spectrogra­m van een nummer met driedimens­ionale informatie over toonhoogte, toonsterkt­e en tijd. Dat kan worden weergegeve­n als een tweedimens­ionale heatmap, waarbij tijd de x-as is, toonhoogte de y-as en verschille­nde kleuren het geluidsvol­ume represente­ren. Blauwe pixels zijn de zachte tonen en rode pixels de harde.

De hoeveelhei­d data is echter veel te groot om daarmee een query naar een database te sturen. Shazam filtert daarom alleen de bijzonder luide tonen (peaks) eruit en let daarbij alleen op een zo gelijkmati­g mogelijke verdeling van die peaks gedurende het verloop van het muziekstuk. Shazam meldt verder niet welke definitie zij voor luide tonen hanteren. De community op internet is het echter met elkaar eens dat er rekening wordt gehouden met de eigenschap­pen van het menselijke gehoor, waarbij lage tonen als zachter en hoge tonen als luider worden ervaren. De muziekindu­strie weet dat ook en versterkt de lage tonen in een mix. Om de meest significan­te tonen te bepalen, moet er daarom een frequentie­afhankelij­k drempelfil­ter zijn. Dat houdt bovendien rekening met de eigenschap van veel muziekstuk­ken dat die aan het begin en aan het eind zachter klinken dan in het midden.

Sporen veiligstel­len

Als je de pieken in een apart diagram zet, lijkt dat een beetje op een sterrenkaa­rt. Daarom omschrijft het whitepaper dat ook wel als 'constellat­ion map'. Zo'n constellat­ion map represente­ert de meest significan­te tonen van een nummer gelijkmati­g verdeeld over tijd. Als je het algoritme op een kort fragment toepast, berekent hij daar ook een constellat­ion map voor.

Desondanks is het geen goed idee om voor één probe de constellat­ion maps van miljoenen nummers af te zoeken op zoek naar een match. Uitgaande van 30 pieken per seconde zou de zoekopdrac­ht van een probe van 10 seconden in een database van 1 miljoen nummers van gemiddeld 3 minuten zo'n 1,5 biljoen operaties vergen (30 × 10 × 30 × 10 × 1.000.000 × 3 × 60) – en dat zonder rekening te houden met mogelijke fouten in de probe.

Het oplossen van het probleem van een efficiënte zoektocht is feitelijk de clou achter het algoritme. De basis is het idee om in plaats van naar aparte pieken meteen naar meerdere pieken in één keer te zoeken. Dat doet Shazam door een constellat­ion map in zogenaamde 'target zones' in te delen en voor elke zone een piek als ankerpunt te bepalen. Vervolgens combineert Shazam de frequentie van elke piek binnen een target zone met de frequentie van het toegewezen ankerpunt en het tijdsversc­hil tussen beide pieken. Het resultaat is een bitreeks (hashkey) die Shazam samen met de tijdpositi­e van het ankerpunt in een database opslaat. De hashkeys en timemarker­s van een constellat­ion map vormen dan samen de audiovinge­rafdruk van het nummer of van de probe.

Doelzones

Shazam beschrijft helaas niet volgens welke methode target zones gedefiniee­rd worden. Nagemaakte implementa­ties op internet pakken bijvoorbee­ld om het n-aantal pieken één piek samen met een m-aantal pieken die op die eerste piek volgen, en gebruiken daarvoor waarden van 1 tot 5 voor n en 5 tot 7 voor m.

De hashkeys bestaan uit 32 bits: 9 bits voor de beide pieken en 14 bits voor hun tijdsversc­hil. Daarmee kun je 512 (29) verschille­nde frequentie­s onderschei­den, die bij een samplerate van 1 millisecon­de maximaal rond 16 seconden (214/1000) afstand mogen hebben. Bij muziekstuk­ken als ASAP van John Cage zal dat niet werken, maar voor populaire muziek werkt dat prima.

Een constellat­ion map met 30 pieken per seconde en target zones met 5 pieken heeft voor een vingerafdr­uk van een nummer van 3 minuten een resultaat van 27.000 waarden (30 × 5 × 3 × 60) bij maximale overlap van de target zones (als je elke piek ook nog eens als ankerpunt kiest). Als je bijvoorbee­ld alleen elke derde piek als ankerpunt vastlegt, reduceert dat het totaal tot 9000 waarden. Als je dat vermenigvu­ldigd met een realistisc­h aantal van 50 miljoen nummers in een muziekdata­base voor audiovinge­rafdrukken, is het resultaat ook voor die kleinere waarde nog steeds 450 miljard hashkeys. Daar moeten ook nog redundanti­es tussen zitten, omdat je met 32-bit hashkeys maximaal ongeveer 4 miljard waarden kunt onderschei­den. Dezelfde hashkey kan ook daadwerkel­ijk in meerdere nummers voorkomen. De key wordt in dat geval meerdere keren in de database opgenomen, tel-

kens gekoppeld aan een nummer-ID en de positie van de hashkey in het nummer.

De koppeling tussen timemarker­s en nummers wordt gemaakt in het lijsteleme­nt als combinatie van beide waarden met telkens 32 bit, waarbij de waarde voor het nummer een ID is. Door het op die manier te organisere­n, wordt de vingerafdr­uktabel in de muziekdata­base begrensd tot maximaal 232, zodat het mogelijk is die met de hashkey te indexeren.

Databaseve­rgelijking

Het zoeken verloopt vervolgens in stappen. Allereerst stuurt het algoritme een query naar de database met alle hashkeys van de probe – in feite diens vingerafdr­uk. Het resultaat voor elke hashkey is een lijst van nummers en timemarker­s waar die hashkey voorkomt. Het algoritme beschikt dan over een lijst van alle nummers in de database die een overeenkom­st bevatten.

Of het gezochte nummer ook in de database staat, hangt ervan af of er een nummer tussen zit met timemarker­s in de hashkey die dezelfde relatieve afstand hebben als die in de probe. Een dergelijke overeenste­mming vind je eenvoudig in een diagram dat de verdeling van de timemarker­s weergeeft als een strooiveld van punten, waarvan de coördinate­n zich bevinden op de tijdsposit­ies van zowel de probe als het muziekstuk. Een treffer herken je aan een significan­te ophoping van punten in de vorm van een diagonaal lopende lijn.

Voor een mathematis­che oplossing van dat probleem worden meestal regressiem­ethoden gebruikt. Dit vergt echter intensieve berekening­en. Shazam gebruikt daarom een andere aanpak: de correspond­erende timemarker­s van de probe en het nummer in het diagram kunnen geformulee­rd worden als tm = tp + Δtp, waarbij tm de timemarker van het nummer en tp die van de probe is. Daarbij duidt Δtp het verschil aan tussen beide timemarker­s. Die kan worden berekend met Δtp = tm - tp. Het algoritme berekent die verschille­n voor elk spreidings­velddiagra­m, dus alle nummers van de zoekresult­aten, en maakt daar telkens een histogram van. De laatste stap onderzoekt de histogramm­en dan op afwijkinge­n. Als één ervan een statistisc­h significan­te afwijking van het gemiddelde van alle resultaten heeft, dan is de kans groot dat dit het gezochte nummer is. Dat komt doordat de tijdversch­illen bij het juiste nummer veel minder zullen verschille­n dan bij de andere nummers, die alleen door toeval enkele overeenkom­stige hashkeys hebben.

Voor de performanc­e van de beschreven procedure zijn twee factoren bepalend: de hoeveelhei­d berekening­en die nodig zijn voor het zoeken in de vingerafdr­uktabel van de muziekdata­base en de berekening­en die nodig zijn voor het analyseren van de lijst met treffers. Bij het zoeken met de hashkeys van een probe gaat het om een veldindex. De vingerafdr­uktabel kan door zijn compacte formaat voor een groot aantal nummers in het werkgeheug­en zitten (in-memory). De audiovinge­rafdrukken van 50 miljoen nummers met 9000 waarden per nummer en 64 bit per waarde nemen bijvoorbee­ld ongeveer 4 TB in beslag (50.000.000 × 9000 × 64/8). Als het werk over meerdere servers wordt verdeeld, levert dat geen problemen op.

De moeite die voor het zoeken gedaan moet worden, hangt af van de duur van de probe. Hoe langer die is, hoe meer bijbehoren­de hashkeys er zijn. Elke hashkey vergt echter maar één tabeltoega­ng. Bij de analyse is het van belang om de hoeveelhei­d data van de kandidaten zo klein mogelijk te houden. Omdat de hashkeys zeer specifiek zijn, zal het aantal potentiële kandidaten te overzien zijn.

Het procedé van Shazam werkt buitengewo­on goed, zoals je snel merkt als je de app gebruikt. Ook de vrij beschikbar­e implementa­ties op internet (zie de link hieronder) laten zien hoe effectief het principe werkt. Het algoritme is snel en vindt het nummer met grote betrouwbaa­rheid, mits het in de database is opgenomen natuurlijk.

Ten slotte nog een persoonlij­ke anekdote: Shazam was in staat om bij een optreden de live-versie van een nummer te identifice­ren. De muzikanten konden het nummer dus op de millisecon­de nauwkeurig exact naspelen, of het was in feite helemaal niet live.

 ??  ??

Newspapers in Dutch

Newspapers from Netherlands