Wie erkenne ich Pfeifen, Knallgeräusche und andere Geräusche im Live-Audioeingang?

9

Ich habe viele Fragen zu SO gelesen, und ehrlich gesagt beschreibt jede von ihnen keinen bestimmten Weg, um dies zu erreichen. Einige sagen "do FFT" und andere sagen "Nulldurchgang" usw. Aber ich bin nur so weit gegangen zu verstehen, dass der digitale Audioeingang aus einer Reihe von Amplituden für eine bestimmte Frequenz besteht und gut. Ich weiß nicht wirklich viel darüber hinaus.

Jetzt kenne ich den Nyquist-Satz, die Frequenz, die Amplitude, die Fourier-Reihe usw., und das war vor zwei bis drei Jahren, als ich das in einem Semester in meinem Universitätsprogramm gemacht habe. Aber damals wurde uns die reale Verwendung von Fourier wirklich nicht viel beigebracht, und ich habe mich nicht darum gekümmert, mehr über das Thema zu lernen, als nur genug zu lernen, um das Thema zu bestehen. Aber jetzt muss ich all das Zeug benutzen.

Hier ist eine Momentaufnahme der Geräusche, die ich zu erkennen versuche:

Einzigartige Grafik mit Fingerschnappern und Ein- / Ausschalten des Lichtschalters

Offensichtlich haben die Sounds einzigartige Grafiken. Ich möchte nur verstehen, wie man ihre besonderen Eigenschaften für ihre einzigartigen stacheligen Linien in der Grafik extrahiert. Wie welche Amplitude, Frequenz usw. Und für wie viel Zeit - obwohl das trivial ist, denke ich.

Ich möchte eine einfache Schritt-für-Schritt-Liste mit nicht vagen Anweisungen - ich kann die Terminologie googeln, die ich nicht verstehe.

Wie vielleicht das? - -

  1. Erhalten Sie Audio-Eingabedaten

  2. Plotspektogramm

  3. Erhalten Sie ein Spektogrammdiagramm für den Ton, den Sie in einer geräuschlosen Umgebung erkennen möchten

  4. Studieren Sie diese Grafik - zeichnen Sie einzigartige Eigenschaften dieses Klangs

  5. Erstellen Sie eine Funktion, mit der diese besonderen Merkmale im Live-Audio-Feed anhand der in (4) enthaltenen Merkmale des Klangs erkannt werden können.

  6. Wenn eine Übereinstimmung gefunden wird, ist die Arbeit erledigt.

  7. Polieren Sie den Algorithmus, um falsche Negative auszusortieren.

Wo ich verwirrt bin ist - wie gehe ich etwa 3,4,5. Insbesondere 3 und 4. Da ich eine Software erstelle, in der der Benutzer jeden Ton als Gesteingabe zur späteren Verwendung aufzeichnen kann, möchte ich, dass mein System jeden Ton aufzeichnen und mit Live-Audio abgleichen kann Feed, um diese Klanggeste zu erkennen. Zum Beispiel Husten oder Fingerschnippen oder Pfeifen oder Klatschen. Oder sagen Konsonanten - oder oder oder . Fast jeder Ton.B X Z.ABXZ

Ich dachte daran, den Benutzer dazu zu bringen, den Ton, den er speichern möchte, als Geste in einer ruhigen Umgebung aufzunehmen. Und der Benutzer würde den Ton nur zwischen dem leisen Auffüllen der Zeit machen ; 3 Sekunden am Anfang und am Ende der Aufnahme.

Nehmen wir also an, mein System würde während der ersten 3 Sekunden feststellen, dass der aktuelle Eingang der normale leise Hintergrundton ist. Und dann würde eine plötzliche Änderung in der Grafik den Toneingang starten. Und wenn das aufhört, wird die Aufnahme noch 3 Sekunden lang fortgesetzt, wobei die nachlaufende leise Zeit aufgefüllt wird . Dies würde manuell vom Benutzer durchgeführt. Es würde dann automatisch nur die Eigenschaften des Teils speichern, während dessen die plötzliche Änderung des Diagramms andauerte - irgendwo zwischen den Auffüllzeiten.

Und so würden die Eigenschaften dieses Teils als Gesten-Daten dieses Sounds gespeichert, die später verwendet würden, um diesen bestimmten Sound im Live-Audio-Feed zu erkennen.

Das Problem ist, dass ich das alles in einfachem Englisch denke. Ich muss in Mathematik und Physik denken, um es effizient in meinen Code implementieren zu können. Ich habe einfach keine Ahnung, was ich schreiben soll und wo ich es in meinen Code schreiben soll - selbst wenn mir so viele Bibliotheken und Fragen zu SO zur Verfügung stehen.

Und tut mir leid, wenn das lang war.

bad_keypoints
quelle
1
Wird dieses Spektrogramm aus Neugier auf einem Telefon oder Tablet erstellt? Wenn ja, können Sie den Namen der App angeben. Es sieht wirklich cool aus. In Bezug auf Ihre Frage denke ich, dass Ihre Bewerbung dem Thema / der Aufgabe der isolierten Worterkennung ähnlich ist. Sie können wahrscheinlich viele Ideen und Inspirationen erhalten, wenn Sie das googeln. Der schwierige Teil besteht darin, die Gesten nicht in einem begrenzten, relativ kleinen Satz von Gesten zu erkennen. Der schwierige Teil besteht darin, die Dinge herauszufiltern, die keine Gesten sind.
Niaren
Dies ist die App: play.google.com/store/apps/… Und danke für Ihre Ansichten. Aber ich möchte, dass Sie mir sagen, wie ich nicht Wörter, sondern Geräusche (zumindest für den Moment) wie Pfeifen, Knallen, Klatschen usw. erkennen kann. Ich arbeite in Python.
bad_keypoints
1
Leider ist so etwas immer noch ein Forschungsgebiet. Mir ist nicht bekannt, dass jemand dieses spezielle Problem löst.
Björn Roche

Antworten:

2

Ich stimme zwar einem der Kommentare zu, dass die Verwendung von Spracherkennungstechniken ein guter Anfang sein könnte, aber diese Geräusche sind unterschiedlich, und mir ist nicht bekannt, dass jemand Nachforschungen angestellt hat, um sie zu kategorisieren (das von Nathan zitierte Papier scheint nur zwischen Sprache zu unterscheiden und Lärm). Wenn also nicht jemand etwas präsentiert, das dem widerspricht, müssen Sie Ihre eigene Technik erfinden, und das erfordert viel Lernen und viel Arbeit. Das Beste, was ich tun kann, ist, Ihnen den Einstieg zu erleichtern.

Erwarten Sie zunächst nicht, dass jemand eine Zauberformel herstellen kann. Es gibt keine Gleichung, um vom Klang zum Klang zu gelangen. Menschen und Computer müssen lernen, indem sie Daten einbeziehen, um fundierte Vermutungen darüber anzustellen, was Geräusche sind. Der Grund, warum die Leute in ihren Antworten "FFT verwenden" oder "Nulldurchgang verwenden" sagen, ist, dass dies einige der grundlegenden DSP-Bausteine ​​sind, die bei der Spracherkennung und verwandten Algorithmen verwendet werden. Die FFT und die Nulldurchgangsrate sind jedoch normalerweise nur die ersten Schritte bei der Erstellung einer Reihe von Parametern, die den Klang beschreiben. Diese Parameter werden dann statistisch analysiert (nicht durch eine magische Funktion), um zu bestimmen, zu welcher Kategorie sie höchstwahrscheinlich gehören. Beachten Sie, dass ich "höchstwahrscheinlich" sagte: sogar die beste Spracherkennung (und das menschliche Gehirn!

Zu den Parametern, nach denen Sie suchen könnten, gehören:

  • Nulldurchgangsrate
  • Frequenzschwerpunkt
  • Hüllkurve (dies ist eigentlich eine Reihe von Parametern, einschließlich z. B. Angriffszeit)
  • Spektralhüllkurve
  • gerade / ungerade harmonische Balance
  • Stimmlichkeit
  • Grundtonhöhe

Sobald Sie eine Reihe von Parametern haben, mit denen Sie Ihrer Meinung nach Ihre Sounds unterscheiden können, müssen Sie eine statistische Methode verwenden, um sie zu kategorisieren. Das Hidden-Markov-Modell wird häufig in der Sprache verwendet. Sie können sich auch mit logistischer Regression befassen, K-bedeutet, und ich bin sicher, dass es andere Möglichkeiten gibt, aber ich denke, HMM hat sich bewährt.

Björn Roche
quelle
Ihre Antwort ist gut, aber ich bitte Sie im Grunde darum, die eigenen Sounds des Benutzers mit den Sounds abzugleichen, die er später für die Verwendung meiner Software macht. Wie Ähnlichkeitszeug. Angenommen, ein Benutzer macht verschiedene Arten von Tönen A, B und C. Die Eigenschaften dieser Töne werden als C_A, C_B bzw. C_C gespeichert.
bad_keypoints
Die Technik ist immer noch dieselbe: 1. Finden Sie heraus, welche Parameter Sie messen werden, 2. Messen Sie sie, 3. Verwenden Sie Statistiken, um zu erfahren, was jeden Klang anders macht, 4. Verwenden Sie diese Daten zur Kategorisierung.
Björn Roche
Das habe ich mir also gedacht. aber ich denke, ich muss sehen, mit welchen Parametern aus der guten langen Liste, die Sie bereitgestellt haben, ich markieren muss, um Sounds zu unterscheiden.
bad_keypoints
1
Um ehrlich zu sein, bin ich sehr pessimistisch, wenn es darum geht, Dinge wie einen Fingerschnapp- und Lichtschalter in einer Vielzahl von Umgebungen ohne viele Beispieldaten und möglicherweise mehr Parameter als angegeben zu unterscheiden, aber ich hoffe, ich liege falsch. Bitte berichten Sie über Ihre Ergebnisse, auch wenn es eine Weile dauert.
Björn Roche
Einige Leute auf der music-dsp-Mailingliste ( music.columbia.edu/cmc/music-dsp ) haben möglicherweise andere Vorschläge.
Björn Roche
0

Ich habe dieses Papier zum entropiebasierten End Pointing verwendet, als ich versucht habe, diese Art von Geräuschen in Telefonanrufen zu ignorieren, die für die Spracherkennung am Computer verwendet werden. Wenn die Geräusche, die Sie erfassen möchten, Sprache sind, kann Entropie für Musik sehr gut funktionieren, für Musik möglicherweise nicht nützlich sein.

Nathan Day
quelle
0

Ich denke, Björns Empfehlungen sind sehr gut, aber ich möchte einige zusätzliche Informationen liefern. Nach Ihrer Beschreibung klingt dies sehr nach einem Problem bei der Identifizierung der Klangfarbe. In diesem Bereich gibt es einige Untersuchungen zu Computermusikkontexten (die Identifizierung verschiedener Instrumente ist eine nützliche Sache, und der Unterschied zwischen einem Knacken und Klatschen ist auf die Klangfarbe des Klangs zurückzuführen). William Brenthat in diesem Bereich einige Nachforschungen angestellt (suchen Sie auf seiner Seite nach timbreID) und eine Software zur Verwendung in Pure Data erstellt. In jeder Situation, in der Sie nach bestimmten Ereignissen suchen, ist eine automatische Segmentierung durch Erkennung des Beginns eine gute Idee. Da Sie bereits eine STFT durchführen, würde die Bestimmung eines Beginns nicht zu viel zusätzliche Arbeit erfordern (siehe Erkennung des Beginns des Spektralflusses). Eine Systemübersicht könnte wie folgt aussehen:

Ausbildung

  • Bestimmen Sie geeignete Merkmale (z. B. Nulldurchgangsrate, Spektralschwerpunkt, MFCCs).
  • Erkennen Sie einen Beginn
  • Berechnen Sie diese Funktionen für Audioeingaben (Ihre Gestenaufnahmen).
  • Führen Sie eine Datenbank mit Funktionsberechnungen. Sie müssen feststellen, ob es sich um eine überwachte oder eine unbeaufsichtigte Schulungssituation handelt. Geben Benutzer beispielsweise im Voraus an, dass ein Snap "Sound 1" und ein Klatschen "Sound 2" ist, oder versucht Ihr System, diese nach dem Training zu gruppieren.

Einstufung

  • Erkennen Sie einen Beginn in Echtzeit und berechnen Sie die Funktionen für eingehende Audiodaten
  • Verwenden Sie eine Entfernungsmetrik (euklidische Entfernung oder eine andere Lp-Entfernung), um eine Klassifizierung des nächsten Nachbarn oder K-nächsten Nachbarn durchzuführen, um den "nächsten" Ton aus Ihrer Datenbank zu bestimmen

Dieses Papier zur Identifizierung perkussiver Klangfarben könnte von Nutzen sein. Es enthält Definitionen für potenzielle Merkmale, die anhand des eingehenden Tons und der Klassifizierungsmethode des Autors berechnet werden können. Dies funktioniert ziemlich gut für perkussive Klänge, funktioniert aber möglicherweise nicht so gut für etwas wie Sprache (mehrere Silben). In diesem Fall wäre eine HMM-Methode besser geeignet. In ähnlicher Weise hängt die Genauigkeit Ihrer Onset-Erkennung von der Art der gesuchten Sounds ab.

Wenn Sie sich besonders Gedanken über Schnappschüsse und Lichtschalter machen, sollten Sie einige Zeit damit verbringen, herauszufinden, welche Funktionen die beiden Geräusche genau unterscheiden können.

Großartiger Scott
quelle
Ich würde den Beginn erkennen, indem ich plötzliche Änderungen in den eingehenden Audiodaten erkenne. Das sollte funktionieren. Ich erkenne den Beginn und das Ende der zu speichernden Gesten.
bad_keypoints
Ja, das sollte meistens funktionieren. Der einzige Grund, warum ich Spectral Flux vorgeschlagen habe, ist, dass Sie sowieso eine STFT nehmen werden. Wenn Sie eine ziemlich ruhige Umgebung erwarten, sollte eine grundlegende Amplitudenschwelle gut genug funktionieren.
Greatscott