Benutzer-Werkzeuge

Webseiten-Werkzeuge


ss16:musik-erkennung

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ss16:musik-erkennung [2016/09/29 18:38]
zoppl [wichtige Bestandteile des Programms]
ss16:musik-erkennung [2016/09/30 11:32] (aktuell)
zoppl [Verlauf]
Zeile 131: Zeile 131:
 ==== Datenverarbeitung mittels Short-Time Fourier Transform ==== ==== Datenverarbeitung mittels Short-Time Fourier Transform ====
  
-Die Short-Time Fourier Transformation ist eine Art der Fourier Transformation,​ um die zeitliche Änderung des Frequenzspektrums eines zum Beispiel Audiosignals darzustellen. Das eingelesene Audiosignal wird hier in einen Datensatz umgewandelt,​ welcher später als Spektrogramm geplottet werden kann.+Die Short-Time Fourier Transformation ist eine Art der Fourier Transformation,​ um die zeitliche Änderung des Frequenzspektrums eines zum Beispiel Audiosignals darzustellen. Das eingelesene Audiosignal wird hier in einen Datensatz umgewandelt,​ welcher später als Spektrogramm geplottet werden kann. Durch ermitteln der Frequenzen können einzelne Instrumente und charakteristische Punkte im Lied gefunden werden. Dies wird im Abschnitt fingerprinting weiter erläutert
 <code python> <code python>
 """​ Short-Time Fourier Transformation """​ """​ Short-Time Fourier Transformation """​
Zeile 168: Zeile 168:
  
 Spektrogramme dienen dem Zweck ein Frequenzspektrum bildlich darzustellen. Bei der Arbeit mit Audiosignalen kann an einem Spektrogramm die jeweilige Intensität der verschiedenen Frequenzen abgelesen werden. ​ Spektrogramme dienen dem Zweck ein Frequenzspektrum bildlich darzustellen. Bei der Arbeit mit Audiosignalen kann an einem Spektrogramm die jeweilige Intensität der verschiedenen Frequenzen abgelesen werden. ​
 +
 +(ein Spektrogramm ist im Abschnitt Audio-fingerprinting zu sehen)
 +
  
 <code python> <code python>
Zeile 201: Zeile 204:
  
 Ein "​Audio-Fingerprint"​ ist, ähnlich wie der Fingerabdruck eines Menschen, eine Möglichkeit einer Audiodatei eine eindeutige Identität zuzuordnen. Zur schlussendlichen Erkennung eines Musikstückes ist daher eine Möglichkeit dieses anhand bestimmter Merkmale zu identifizieren von großer Bedeutung. ​ Ein "​Audio-Fingerprint"​ ist, ähnlich wie der Fingerabdruck eines Menschen, eine Möglichkeit einer Audiodatei eine eindeutige Identität zuzuordnen. Zur schlussendlichen Erkennung eines Musikstückes ist daher eine Möglichkeit dieses anhand bestimmter Merkmale zu identifizieren von großer Bedeutung. ​
-Zunächst werden im Spektrogramm lokale Maxima gesucht, Punkte, welche für die weitere Bearbeitung interessant scheinen. ​+Zunächst werden im Spektrogramm lokale Maxima gesucht, Punkte, welche für die weitere Bearbeitung interessant scheinen. Diese befinden sich dort, wo starke Farbunterschiede zwischen benachbarten Punkten auftreten, wie im Bild zu erkennen. Das heißt also Punkte, an denen ein abrupter Sprung in der Intensität entweder zeitlich (vertikaler Peak) oder die Frequenz betreffend (horizontal) auftritt. An dieser Stelle ist es sehr spannend, wodurch diese Peaks entstehen. Denn diese sollen ein Lied ja anscheinen charakterisieren. Also was könnte an einem Lied so charakteristisch sein und enstprechende Peaks im Spektroskop hervorrufen?​ Vertikale Peaks entstehen durch kurze Impulse mit einem großen Frequenzbereich,​ also vor Allem durch das Schlagzeug, horizontale Peaks sind längere Töne auf einer Frequenz, also durch andere Instrumente hervorgerufen. Diese Charakteristika werden anschließend in Form von ausgewählten charakteristischen Punkten verarbeitet.
 {{ :​ss16:​spectrogram_peaks.png?​nolink&​400 |}} {{ :​ss16:​spectrogram_peaks.png?​nolink&​400 |}}
  
Zeile 215: Zeile 218:
 </​code>​ </​code>​
  
-Jedoch ist es auf Grund der Fülle von Liedern nicht gerade unwahrscheinlich,​ dass zwei oder mehr Lieder gleiche lokale Maxima in ihren Spektrogrammen aufweisen. Mittels einer sogenannten "​Hash-Funktion"​ wird dieses Problem gekonnt umgangen. Eine Hash-Funktion nimmt einen Integer-Wert als Input und gibt einen anderen Integer-Wert als Output zurück. ​+Jedoch ist es auf Grund der Fülle von Liedern nicht gerade unwahrscheinlich,​ dass zwei oder mehr Lieder gleiche lokale Maxima in ihren Spektrogrammen aufweisen. Mittels einer sogenannten "​Hash-Funktion"​ wird dieses Problem gekonnt umgangen. Eine Hash-Funktion nimmt mehrere ​Integer-Werte als Input und gibt einen anderen Integer-Wert als Output zurück. ​
 So z.B. können aus den Frequenzen unserer lokalen Maxima und deren zeitlicher Abstand zueinander als Input ein eindeutiger Audio-Fingerprint erstellt werden. ​ So z.B. können aus den Frequenzen unserer lokalen Maxima und deren zeitlicher Abstand zueinander als Input ein eindeutiger Audio-Fingerprint erstellt werden. ​
 {{ :​ss16:​spectrogram_zoomed.png?​nolink&​300 |}} {{ :​ss16:​spectrogram_zoomed.png?​nolink&​300 |}}
Zeile 243: Zeile 246:
 ==== Eine Datenbank erstellen (lite) ==== ==== Eine Datenbank erstellen (lite) ====
  
-Unser erster Gedanke war es eine kleine Datenbank zu erstellen, welche Informationen zu Song, Album, Künstler, Genre und vor allem den Fingerprint Hash beinhaltet. Diese sollte auf Basis von SQL Lite entstehen. Da wir uns zum Ende des Semesters eingestehen mussten, dass eine Datenbank von mehreren 100 Songs eher unnötig ist, vor allem andere Teile des Programms bedürfen zuerst einer Optimierung,​ werden die aktuell eingelesenen Titelnamen der Fingerprints mittels Pickle in einer Textdatei gespeichert. Die einzelnen Fingerprints jedes einzelnen Songs befinden sich in einer jeweils eigenen Textdatei. Diese können dann später beim Vergleichen von Audiosignalen nacheinander aufgerufen werden.+Unser erster Gedanke war es eine kleine Datenbank zu erstellen, welche Informationen zu Song, Album, Künstler, Genre und vor allem den Fingerprint Hash beinhaltet. Diese sollte auf Basis von SQL Lite entstehen. Da wir uns zum Ende des Semesters eingestehen mussten, dass eine Datenbank von mehreren 100 Songs eher unnötig ist, vor allem andere Teile des Programms bedürfen zuerst einer Optimierung,​ werden die aktuell eingelesenen Titelnamen der Fingerprints mittels Pickle in einer Textdatei gespeichert. Pickle ist eine Funktion, die Dateien mit verschiedenem Inhalt (Zahlen, Buchstaben, Vektoren, ...) deutlich komprimiert speichern kann, und diese auch leicht wieder aufrufen kann. Die einzelnen Fingerprints jedes einzelnen Songs befinden sich in einer jeweils eigenen Textdatei. Diese können dann später beim Vergleichen von Audiosignalen nacheinander aufgerufen werden.
 Momentan besteht unsere Datenbank.txt Datei nur aus den Songs des Albums "​AM"​ von den Arctic Monkeys: Momentan besteht unsere Datenbank.txt Datei nur aus den Songs des Albums "​AM"​ von den Arctic Monkeys:
  
Zeile 261: Zeile 264:
 </​code>​ </​code>​
  
-Ein Fingerprint eines einzelnen Songs sieht in etwa so aus (nur die ersten paar Zeilen, da die komplette Datei den Rahmen dieses Wikis sprengen würde, etwa 6MB an Text):+Ein Fingerprint eines einzelnen Songs ist eine Aneinanderreihung von Zahlenpaaren,​ die die Hash-Zahl und die Zeit enthalten (Hash-Zahl, Zeit), (Hash-Zahl, Zeit),... Nach dem Durchlaufen von Pickle ​sieht das in etwa so aus (nur die ersten paar Zeilen, da die komplette Datei den Rahmen dieses Wikis sprengen würde, etwa 6MB an Text):
  
 <​code>​ <​code>​
Zeile 315: Zeile 318:
 </​code>​ </​code>​
  
 +
 +==== Verlauf ====
 +
 +In den ersten Wochen wurde die grobe Syntax zum Projekt erarbeitet und sich in die Materie eingelesen. Dazu hatten wir unter Anderem einen Auszug aus dem Patent von Shazam. Auch hat uns eine Internetseite (der Fingerprint-Link in den Quellen) geholfen, das Prinzip grundlegend zu verstehen. Danach wurden die Arbeitsschritte definiert und weitgehend nacheinander abgearbeitet. Das lief einigermaßen flüssig. Größere Probleme traten bei der Fourier-Transformation auf, da dieses mathematische Verfahren sehr zeitraubend ist und daher nach einigen Optimierungen gesucht werden musste. Gegen Ende hat sich daher ein Teil der Gruppe mehr mit dem Fingerprinting,​ der andere Teil mehr mit dem Erstellen der Datenbank beschäftigt. Diese parallele Arbeit hat etwas Zeit gespart, die bei der STFT verloren ging. Als letzter Schritt wurde der Vergleich in der letzten Woche und bis in die Vorlesungsfreie Zeit programmiert.
 +
 +Eine genauere Beschreibung der Arbeitsschritte ist im Logbuch enthalten
 ==== Logbuch ==== ==== Logbuch ====
  
 [[Logbuch]] [[Logbuch]]
 +
 +
 +==== Fazit ====
 +
 +Auch wenn die Ziele aus dem Bonus-Bereich offensichtlich (und vorhersehbar) zu hoch gesteckt waren, und es auch nicht zu einer Analyse einzelner Instrumente oder Teile dieser reichte, lässt sich rückblickend doch sagen, dass das Ziel im Kern erreicht wurde und ein sehr zufriedenstellendes Ergebnis entstanden ist. Das Programm funktioniert,​ es macht Spaß, zuzusehen wie es die Lieder erkennt, bisher besteht bei geringen Störgeräuschen eine 100%-Quote. Bei hohen Störgeräuschen gibt es Probleme, diese haben Apps wie Shazam, etc. aber auch! An der Schnelligkeit der Berechnung könnte noch gefeilt werden. Ein Abgleich mit unserer 12 Lieder großen Datenbank dauert an die 2 Minuten, das ist natürlich nicht sher komfortabel. Dies kann mit Verbesserungen der Fourierfunktion und der Vergleichsfunktion noch reduziert werden und ist bereits in Bearbeitung. Daran weiter zu arbeiten ist die Aussicht unseres Projektes.
ss16/musik-erkennung.1475167127.txt.gz · Zuletzt geändert: 2016/09/29 18:38 von zoppl