Ich extrahiere Audio-Clips aus einer Videodatei zur Spracherkennung. Diese Videos stammen von Handys / anderen handgefertigten Geräten und enthalten daher viel Rauschen. Ich möchte das Hintergrundgeräusch des Audios reduzieren, damit die Sprache, die ich an meine Spracherkennungs-Engine weitergebe, klar ist. Ich benutze ffmpeg, um all diese Dinge zu erledigen, aber ich stecke in der Phase der Rauschunterdrückung fest.
Bisher habe ich folgende Filter ausprobiert:
ffmpeg-20140324-git-63dbba6-win64-static\bin>ffmpeg -i i nput.wav -filter_complex "highpass=f=400,lowpass=f=1800" out2.wav
ffmpeg -i i nput.wav -af "equalizer=f=1000:width_type=h:width=900:g=-10" output.wav
ffmpeg -i i nput.wav -af "bandreject=f=1200:width_type=h:width=900:g=-10" output.wav
Die Ergebnisse sind jedoch sehr enttäuschend. Meine Überlegung war, dass ich alle anderen Frequenzen herausfiltern kann, um Hintergrundgeräusche zu unterdrücken, da Sprache unter 300-3000 Hz liegt. Was vermisse ich?
Auch ich las über weiner Filter , die für die Spracherweiterungen verwendet werden könnte und fand dies aber ich bin nicht sicher , wie es zu benutzen.
-af "highpass=f=200, lowpass=f=1000"
ffplay <input file> -af lowpass=3000,highpass=200
FFmpeg verfügt jetzt über 2 native Filter für den Umgang mit Hintergrundgeräuschen:
afftdn
anlmdn
Außerdem kann man seit einiger Zeit mit FFmpeg
ladspa
(nach Noise-Supressor suchen) und / oderlv2
(nach Speech-Denoiser suchen) Filter verwenden.quelle
In ffmpeg sind keine anständigen Audiofilter zur Rauschunterdrückung integriert. Audacity verfügt über einen recht effektiven NR-Filter, der jedoch für den 2-Pass-Betrieb mit einer Stichprobe nur des Rauschens und des Eingangs ausgelegt ist.
Die Kommentare am oberen Rand von https://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cpp erklären, wie es funktioniert. (Grundsätzlich gilt: Unterdrücken Sie jedes FFT-Bin, das unter dem Schwellenwert liegt. Dadurch werden Signale nur durchgelassen, wenn sie lauter als das Grundrauschen in diesem Frequenzband sind. Es kann erstaunliche Dinge bewirken, ohne Probleme zu verursachen. Es ist wie ein Bandpassfilter, das sich anpasst Da die Energie des Rauschens über das gesamte Spektrum verteilt ist, wird die Gesamtenergie des Rauschens um ein Vielfaches reduziert, wenn nur einige schmale Bänder durchgelassen werden.
Siehe auch Audio-Rauschunterdrückung: Wie ist die Audacity im Vergleich zu anderen Optionen? Weitere Informationen zur Funktionsweise und zu den Schwellenwerten für FFT-Bins auf die eine oder andere Art und Weise sind auch die Basis für typische kommerzielle Rauschunterdrückungsfilter.
Es wäre etwas umständlich, diesen Filter nach ffmpeg zu portieren. Vielleicht würde die Implementierung als Filter mit 2 Eingängen anstelle eines 2-Pass-Filters am besten funktionieren. Da es nur ein paar Sekunden dauert, um ein Geräuschprofil zu erstellen, muss nicht die gesamte Datei gelesen werden. Und Sie SOLLTEN sowieso NICHT den gesamten Audiostream als Rauschprobe einspeisen. Es muss ein Beispiel für JUST-Rauschen angezeigt werden, um Schwellenwerte für jeden FFT-Bin festzulegen.
Also ja, eine 2. Eingabe anstelle von 2pass wäre sinnvoll. Aber das macht es viel weniger einfach zu bedienen als die meisten ffmpeg-Filter. Sie benötigen eine Menge Voodoo mit Stream Split / Time Range Extract. Und natürlich müssen Sie manuell eingreifen, es sei denn, Sie haben eine Geräuschprobe in einer separaten Datei, die für mehrere Eingabedateien geeignet ist. (Ein Rauschbeispiel vom selben Mikrofon / Setup sollte für alle Clips aus diesem Setup in Ordnung sein.)
quelle