menschliches Sprachrauschen Filter

17

Kennt jemand einen Filter, um Nicht-Sprache zu dämpfen? Ich schreibe Spracherkennungssoftware und möchte alles außer menschlicher Sprache herausfiltern. Dazu gehören Hintergrundgeräusche, Geräusche, die von einem beschissenen Mikrofon erzeugt werden, oder sogar Hintergrundmusik. Ich habe bereits einen Filter erster Ordnung implementiert, der die Abnahme des Leistungsspektrums um 6 dB kompensiert, höre aber immer noch Rauschen (obwohl die Sprache viel klarer klingt). Ich habe überlegt, einen Tiefpassfilter zu verwenden, aber ich habe aus zwei Gründen Bedenken:

  1. Ich weiß nicht, ob ein Tiefpass-Vorfilter den Rest der Sprachverarbeitung stört oder nicht. Auch wenn das menschliche Ohr nur Töne unter 20 kHz erkennen kann, möchte ich nicht riskieren, Oberschwingungen höherer Ordnung zu eliminieren, die zur Sprachverarbeitung erforderlich sind (obwohl ich nicht weiß, ob dies der Fall ist oder nicht. Aber Ich möchte kein Risiko eingehen.

  2. Ich verstehe, dass die Erregung bestimmter Konsonanten (wie f, h und s) fast ausschließlich weißes Rauschen ist. Ich möchte keinen Rauschfilter implementieren , der sozusagen gutes Rauschen eliminiert .

Im Idealfall möchte ich nur die Sprache der Person ins Mikrofon sprechen lassen. Wenn Sie irgendwelche Ideen haben oder etwas fehlt, lassen Sie es mich bitte wissen. Sehr geschätzt!

Zetta Suro
quelle
Schätze ich. Ich lasse es jedoch offen, weil ich hier ähnliche Fragen (Filter und akustische Verarbeitung) gesehen habe, die gut beantwortet wurden.
Zetta Suro
Faustregel: Wenn Sie wissen möchten, wie ein bestimmter DSP-Algorithmus z. B. in einer bestimmten Sprache oder auf einer bestimmten Plattform implementiert wird, ist er für SO ein aktuelles Thema. Wenn es sich um eine Frage zu DSP-Algorithmen / -Techniken ohne spezifischen Programmierwinkel handelt, gehört sie mit ziemlicher Sicherheit zu DSP.SE (wo es auch tendenziell zu qualitativ besseren Antworten kommt).
Paul R
Erwischt. Haben Sie es hierher migriert? Wenn ja, danke. Ich konnte nicht herausfinden, wie ich es migrieren soll, also habe ich es hier noch einmal gefragt.
Zetta Suro
Nicht ich - ich habe es markiert und gefragt, ob ein Moderator es verschieben könnte, also hat wohl einer von TPTB es getan (danke an wen auch immer das war!).
Paul R

Antworten:

8

Ein Sprachkommunikationskanal, wie er in der Telefonie verwendet wird, hat typischerweise einen Frequenzgang von 300 Hz bis 3 kHz. Obwohl dies viel Energie in normaler Sprache zurückweist, ist die Verständlichkeit immer noch recht gut - das Hauptproblem scheint zu sein, dass bestimmte explosive Konsonanten , z. B. "p" und "t", ohne die höherfrequenten Komponenten ein wenig schwer zu unterscheiden sind .

Sie suchen also wahrscheinlich einen "Sweet Spot" zwischen der Nutzung der gesamten Bandbreite von 20 Hz - 20 kHz, die normalerweise für Consumer-Audio verwendet wird, und der aggressivsten Filterung für Sprachkommunikation (siehe oben). Ich würde vorschlagen, mit einem Bandpassfilter von 50 Hz bis 8 kHz zu beginnen. Es wird wahrscheinlich nur das SNR um ein paar dB verbessern, aber es kann hilfreich sein, insbesondere wenn Sie viel hochfrequentes Hintergrundrauschen haben.

Paul R
quelle
Vielen Dank! Ein Freund von mir schlug tatsächlich den Sprachkanal vor, aber ich vermutete, dass er die Energie einiger Konsonanten zu sehr abschwächen würde. Ich werde 50 Hz bis 8 kHz ausprobieren und sehen, wie das funktioniert!
Zetta Suro
2
Ich habe diese Antwort einfach gewählt, weil es die "schnelle" Lösung ist, nach der ich gesucht habe. Der Rest der Antworten wird viel mehr Forschung erfordern, die ich auf jeden Fall untersuchen werde, da sie auf lange Sicht hilfreich sein werden, aber dies ist eine einfache Filterlösung, nach der ich ursprünglich gesucht habe.
Zetta Suro
5

Die Verwendung eines Passbandfilters, der der Sprachbandbreite entspricht, hilft.

Wenn Sie über mehrere Mikrofone verfügen (wie dies jetzt bei Mobiltelefonen der Fall ist), gibt es eine Fülle von ICA-ähnlichen Methoden, die davon profitieren können - aber Ihre Frage deutet darauf hin, dass Sie nur einen Eingang haben.

Was Sie tun möchten, ist die "Ein-Mikrofon-Quellentrennung" (der Name stammt aus Roweis 'wegweisendem Papier), auch "Einzelsensor" genannt. Warnung: Dies ist keineswegs ein gelöstes Problem, und alle Forschungen auf diesem Gebiet sind sehr neu, wobei kein Algorithmus oder Ansatz ein "klarer Gewinner" ist (im Gegensatz zu Gaußschen Mischungsmodellen + FST wurde die Spracherkennung durchgeführt).

Ein guter Rahmen dafür ist die Wiener Filterung. Siehe Benaroya et al. "Single Sensor Source Separation basierend auf Wiener Filterung und Multiple Window STFT" (Lesen Sie Abschnitt 1 & 2, kümmern Sie sich nicht um das Multiresolution-Ding, es sei denn, Sie brauchen es wirklich). Kurz gesagt, Sie berechnen die STFT Ihres Signals, und Sie versuchen, für jeden STFT - Frame Schätzungen des Sprachspektrums und des Rauschspektrums zu erhalten, und Sie verwenden die Wiener - Filterung, um die beste Schätzung des Sprachspektrums daraus zu erhalten (diese ist vergleichbar mit "weich maskieren" des Spektrums).

Ihr Problem ist nun das folgende: Schätzen Sie bei einem STFT-Frame die Sprache und die Rauschkomponente daraus ab. Der einfachere Ansatz, der in dem Artikel von Benaroya beschrieben wird, ist die Vektorquantisierung. Nehmen Sie mehrere Stunden Rede von vielen Sprechern, berechnen Sie die STFT, führen Sie die LBG darauf aus, um ein Codebuch mit 512 oder 1024 typischen Sprachrahmen zu finden. Mach dasselbe für Lärm. Projizieren Sie nun ein gegebenes Bild Ihres Eingangssignals nicht negativ (ein Verfahren zur multiplikativen Gradientenaktualisierung wird in diesem Artikel beschrieben) auf die Sprach- und Geräuschbasis, und Sie erhalten Ihre Sprach- und Geräuschschätzungen. Wenn Sie sich nicht mit der nicht negativen Projektionssache befassen möchten, verwenden Sie einfach den nächsten Nachbarn. Dies ist wirklich das Einfachste, was in der Abteilung "Einzelsensor-Quellentrennung" funktionieren könnte.

Es sei angemerkt, dass ein Spracherkennungssystem tatsächlich eine Eingabe für ein Trennungssystem liefern könnte. Führen Sie einen ersten Dekodierungsdurchlauf mit Ihrem Spracherkennungssystem durch. Verwenden Sie für jeden Frame den mittleren MFCC-Vektor des Gaußschen, der die beste Punktzahl erzielt hat. Invertiere das zurück in ein Spektrum. Boom, Sie haben eine Maske, die Ihnen die wahrscheinlichste spektrale Position der sprachähnlichen Bits angibt, und Sie können sie als Eingabe für die Wiener-Filterung verwenden. Das klingt ein bisschen nach Handwinken, aber der Geist ist, dass man ein gutes Modell dafür braucht, um eine Quelle zu trennen, und ein rückwärts genommenes Spracherkennungssystem ist ein verdammt gutes generatives Modell für Sprachsignale.

Pichenetten
quelle
1

Sie sollten sich wahrscheinlich mit Independent Component Analysis (ICA) befassen, da Ihr Problem dem "Cocktail Party" -Problem sehr ähnlich ist, mit dem ICA häufig beschrieben wird. Kurz gesagt, ICA findet die Komponenten Ihres Signals, die unabhängig voneinander sind. Dies setzt voraus, dass andere Umgebungsgeräusche (Geschirrspüler, weißes Rauschen, Lüftergeräusche) von der Signalquelle der Stimme unabhängig sind und getrennt werden können.

ICA ähnelt PCA (Principal Component Analysis), maximiert jedoch nicht die Varianz auf den Hauptachsen, sondern die Unabhängigkeit. Es gibt viele ICA-Implementierungen, die sich in die von Ihnen verwendete Codierungsumgebung einfügen lassen.

Gallamin
quelle
4
ICA erfordert so viele Eingangssignale, wie zu trennende Quellen vorhanden sind. Bei der Sprachentstörung bleibt uns nur ein Signal und ICA ist daher keine Hilfe.
Pichenettes