Vergleichen Sie zwei spectogram zu finden, die das offset, wo Sie match-Algorithmus
Nehme ich täglich 2 Minuten-radio-Sendung aus dem Internet. Es sind immer die gleichen Start-und End-jingle. Da die radio-broadcast-genaue Zeit kann variieren von mehr oder weniger 6 Minuten, die ich aufnehmen rund 15 Minuten radio.
Möchte ich, um die genaue Zeit, wo es diese jingles werden in den 15 Minuten aufzeichnen, so kann ich extrahieren Sie die Teil der audio-ich will.
Ich bereits eine C# - Anwendung, wo ich das Dekodieren von MP3 zu PCM-Daten umwandeln und die PCM-Daten, um ein Spektrogramm basierend auf http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx
Ich habe versucht, eine Cross-Correlation-Algorithmus auf die PCM-Daten, aber der Algorithmus ist sehr langsam, etwa 6 Minuten mit einem Schritt von 10ms und gibt Anlass, es nicht zu finden, die jingle-start-Zeit.
Ideen der algorithmen für den Vergleich von zwei Spektrogramm für ein match? Oder einen besseren Weg zu finden, dass jingle Startzeit?
Dank,
Update, sorry für die Verzögerung
Erste, ich danke für alle anwsers die meisten von Ihnen waren relevant und oder interessanten Ideen.
Habe ich versucht zu implementieren, die Shazam-Algorithmus vorgeschlagen von fonzo. Aber nicht zu erkennen, die peaks im Spektrogramm. Hier drei Spektrogramme der Start-jingle aus drei verschiedenen Datensätzen. Ich versuchte AForge.NET mit dem blob-filter (jedoch nicht identifizieren von peaks), verschwimmt das Bild und überprüfen Sie die Differenz in der Höhe, die Laplace-Faltung, slope-Analyse, erkennen der Reihe vertikaler Balken (aber es gab zu viele false positives)...
In der Zwischenzeit, während ich versuchte die Hough-Algorithmus vorgeschlagen, von Dave Aaron Smith. Wo berechne ich den RMS der einzelnen Spalten. Ja ja die einzelnen Spalten, es ist ein O(N*M), aber M << N (Beachte a-Säule ist um 8k-sample). So im gesamten ist es nicht schlecht, noch der Algorithmus dauert etwa 3 Minuten, hat aber nie nicht.
Ich konnte gehen mit, dass die Lösung, aber wenn möglich, würde ich lieber den Shazam, weil es O(N) und wahrscheinlich sehr viel schneller (und Kühler ist Sie auch). Also kennt einer von Euch eine Idee eines Algorithmus erkennt immer die gleichen Punkte in diese Spektrogramme (nicht zu Spitzen), durch einen Kommentar hinzufügen.
Neues Update
Schließlich ging ich mit dem Algorithmus oben erklärt, habe ich versucht zu implementieren, die Shazam-Algorithmus, aber konnte nicht finden, die richtigen peaks im Spektrogramm, die identifizierten Punkte, wo nicht konstant aus einer sound-Datei zu einer anderen. In der Theorie, die Shazam-Algorithmus ist die Lösung für diese Art von problem. Die Hough-Algorithmus vorgeschlagen, von Dave Aaron Smith war mehr stabil und effektiv. Ich splitten um die 400 Dateien, und nur 20 von Ihnen scheitern zu split richtig. Speicherplatz, wenn von 8 GB auf 1 GB.
Dank, für deine Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Frage mich, ob Sie könnte ein Hough-Transformation. Sie würde anfangen, durch die Katalogisierung in jedem Schritt der Eröffnungssequenz. Lassen Sie uns sagen, Sie verwenden 10 ms-Schritten und die Anfangssequenz ist 50 ms lang. Sie berechnen einige Metrik auf jedem Schritt und bekommen
Gehen Sie nun über Ihr audio-und analysieren jede 10 ms Schritt für die gleiche Metrik. Rufen Sie dieses array
have_audio
Nun erstellen Sie ein neues leeres array, das die gleiche Länge wie
have_audio
. Rufen Siestart_votes
. Es wird enthalten: "Stimmen" für den start der Eröffnungssequenz. Wenn Sie eine 1, können Sie in der 1. oder Schritt 3 die Anfangssequenz, also Sie haben 1 Stimme für die Eröffnung Sequenz ab dem 1 Schritt vor und 1 Stimme für die Eröffnung Sequenz starten 3 Schritte vor. Wenn Sie sehen, eine 10, Sie haben 1 Stimme für die Eröffnung Sequenz starten 2 Schritte vor, einen 17 Stimmen für Schritt 4 Wochen, und so weiter.So zum Beispiel, dass
have_audio
Ihrevotes
Aussehen wirdHaben Sie eine Menge von Stimmen an position 6, also gibt es eine gute chance, die Eröffnungssequenz startet es.
Könnte man die Leistung verbessern, indem nicht die Mühe zu analysieren, die gesamte Eingangssequenz. Wenn die opening Sequenz ist 10 Sekunden lang, könnte man nur nach den ersten 5 Sekunden.
Gibt es eine Beschreibung des Algorithmus verwendet, um den shazam-Dienst (worin Musik eine kurze, möglicherweise verrauschten sample) hier : http://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf
Von was ich Verstand, die erste Sache, die getan wird, zu isolieren peaks im Spektrogramm (mit einigen Anpassungen gewährleisten eine gleichmäßige Abdeckung), die eine "Konstellation" von paar Werte (Zeit, - Häufigkeit) von der initial-Spektrogramm. Ist das erledigt, wird die Probe Konstellation ist im Vergleich zu der Konstellation, die volle Strecke durch die übersetzung, ein Fenster von der sample-Länge vom Anfang bis zum Ende und zählen Sie die Anzahl der korrelierten Punkte.
Das Papier beschreibt die technische Lösung fanden Sie in der Lage sein zu tun, den Vergleich schnell, auch mit einer riesigen Sammlung von tracks.
Ist hier ein gutes python-Paket, das nicht nur das:
https://code.google.com/p/py-astm/
Wenn Sie auf der Suche für einen bestimmten Algorithmus, gute Suchbegriffe zu verwenden sind "akustische Fingerabdruck" oder "perceptual hashing".
Hier ist noch ein python-Paket, das könnte auch verwendet werden:
http://rudd-o.com/new-projects/python-audioprocessing/documentation/manuals/algorithms/butterscotch-signatures
Wenn Sie bereits wissen, die jingle-Sequenz, könnten Sie analysieren die Korrelation mit der Sequenz anstelle der Kreuz-Korrelation zwischen den vollen 15 Minuten zu Spuren.
Schnell die Berechnung der Korrelation gegen die (kurze) Sequenz, ich würde vorschlagen, mit einer Wiener-filter.
Edit: ein Wiener-filter ist ein Weg, um suchen Sie ein signal in eine Sequenz mit Lärm. In dieser Anwendung werden wir in Betracht ziehen, alles, was nicht "jingle" als Lärm (Frage an den Leser: können wir noch davon ausgehen, dass das Rauschen ist weiß und nicht korreliert?).
( fand ich den Hinweis, den ich suchte! Die Formeln die ich mich erinnerte, waren ein wenig aus, und ich werde entfernen Sie jetzt)
Die relevante Seite Wiener-Dekonvolution. Die Idee ist, dass wir definieren können, ein system, dessen Impulsantwort
h(t)
hat die gleiche Wellenform wie der jingle, und wir müssen die Stelle suchen, in einer lauten Sequenz, wo das system erhalten hat, ein Impuls (d.h.: emittiert ein jingje).Seit der jingle bekannt ist, können wir berechnen, Ihr Leistungsspektrum
H(f)
, und da können wir davon ausgehen, dass ein single-jingle wird in einer aufgezeichneten Sequenz, können wir sagen, dass der unbekannte inputx(t)
hat die Form eines Impulses, dessen LeistungsdichteS(f)
ist konstant auf jeder Frequenz.Gegeben und die Kenntnisse über, können Sie die Formel zu erhalten, eine "jingle-pass" - filter (wie in, nur Signale geformt wie der jingle kann passieren), dessen Ausgang ist am höchsten, wenn der jingle gespielt wird.