![Reduzieren Sie Hintergrundgeräusche und optimieren Sie die Sprache eines Audioclips mit ffmpeg](https://rvso.com/image/1402573/Reduzieren%20Sie%20Hintergrundger%C3%A4usche%20und%20optimieren%20Sie%20die%20Sprache%20eines%20Audioclips%20mit%20ffmpeg.png)
Ich extrahiere Audioclips aus einer Videodatei zur Spracherkennung. Diese Videos stammen von Mobiltelefonen/anderen handgefertigten Geräten und enthalten daher viel Rauschen. Ich möchte das Hintergrundrauschen des Audios reduzieren, damit die Sprache, die ich an meine Spracherkennungs-Engine weiterleite, klar ist. Ich verwende ffmpeg, um all diese Dinge zu tun, stecke aber in der Rauschunterdrückungsphase 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
Aber die Ergebnisse sind sehr enttäuschend. Meine Überlegung war, dass ich, da Sprache im Bereich von 300-3000 Hz liegt, alle anderen Frequenzen herausfiltern kann, um Hintergrundgeräusche zu unterdrücken. Was übersehe ich?
Außerdem habe ich über Weiner-Filter gelesen, die zur Sprachverbesserung verwendet werden könnten, und fandDasaber ich bin nicht sicher, wie ich es verwenden soll.
Antwort1
Wenn Sie hörbare Sprache isolieren möchten, kombinieren Sie einen Tiefpassfilter mit einem Hochpassfilter. Für brauchbares Audio habe ich festgestellt, dass das Herausfiltern von 200 Hz und darunter und dann das Herausfiltern von 3000 Hz und darüber ziemlich gut funktioniert, um brauchbares Sprachaudio zu erhalten.
ffmpeg -i <input_file> -af "highpass=f=200, lowpass=f=3000" <output_file>
In diesem Beispiel fügen Sie zuerst den Hochpassfilter hinzu, um die niedrigeren Frequenzen abzuschneiden, und verwenden dann den Tiefpassfilter, um die höheren Frequenzen abzuschneiden. Bei Bedarf können Sie Ihre Datei mehr als einmal durchlaufen lassen, um höhere dB-Frequenzen innerhalb der abgeschnittenen Frequenzbereiche zu bereinigen.
Antwort2
FFmpeg verfügt jetzt über drei native Filter zum Umgang mit Hintergrundrauschen:
afftdn
: Entrauscht Audio-Samples mit FFTanlmdn
: Reduziert Breitbandrauschen in Audiosamples mithilfe eines Non-Local-Means-Algorithmusarnndn
: Reduziert Sprachgeräusche mithilfe von rekurrierenden neuronalen Netzwerken. Beispiele für zu ladende Modelldateien finden SieHier.
Außerdem kann man seit einiger Zeit Filter ladspa
(siehe „Rauschunterdrücker“) und/oder lv2
(siehe „Sprache-Rauschunterdrücker“) mit FFmpeg verwenden.
Antwort3
Update: Kürzlich wurde FFmpeg hinzugefügt, afftdn
das die unten beschriebene Methode der Rauschschwelle pro FFT-Bin verwendet, mit verschiedenen Optionen zum Anpassen/Ermitteln geeigneter Schwellenwerte im laufenden Betrieb.
anlmdn
(nicht-lokale Mittel) ist eine Technik, die für Videos gut funktioniert; den Audiofilter habe ich nicht ausprobiert.
Beides solltevielbesser als Hochpass/Tiefpass, es sei denn, Ihr einziges Geräusch ist ein 60-Hz-Brummen oder so etwas. (Menschliche Sprache kann in einem ziemlich schmalen Bandpass immer noch gut klingen, aber es gibt viel bessere Möglichkeiten, ein Breitbandrauschen im Hintergrund zu beseitigen.)
ffmpeg hat keine vernünftigen Audiofilter zur Rauschunterdrückung eingebaut. Audacity hat einen recht effektiven NR-Filter, dieser ist jedoch für den 2-Pass-Betrieb mit einer Probe nur des Rauschens und dann des Eingangs ausgelegt.
Die Kommentare obenhttps://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cppErklären Sie, wie es funktioniert. (Grundsätzlich: Unterdrücken Sie jeden FFT-Bin, der unter dem Schwellenwert liegt. Es werden also nur Signale durchgelassen, die lauter sind als das Grundrauschen in diesem Frequenzband. Es kann erstaunliche Dinge tun, ohne Probleme zu verursachen. Es ist wie ein Bandpassfilter, der sich an das Signal anpasst. Da die Energie des Rauschens über das gesamte Spektrum verteilt ist, wird die Gesamtenergie des Rauschens erheblich reduziert, wenn nur einige schmale Bänder davon durchgelassen werden.
Siehe auchAudio-Rauschunterdrückung: Wie schneidet Audacity im Vergleich zu anderen Optionen ab?für weitere Einzelheiten zur Funktionsweise und dazu, dass die Schwellenwertbildung bei FFT-Bins in der einen oder anderen Weise auch die Grundlage typischer kommerzieller Rauschunterdrückungsfilter ist.
Das Portieren dieses Filters auf ffmpeg wäre etwas umständlich. Vielleicht wäre es am besten, ihn als Filter mit 2 Eingängen statt als 2-Pass-Filter zu implementieren. Da er nur ein paar Sekunden braucht, um ein Rauschprofil zu erhalten, muss er nicht die ganze Datei durchlesen. Und Sie sollten ihm sowieso NICHT den gesamten Audiostream als Rauschprobe zuführen. Er muss eine Probe NUR von Rauschen sehen, um Schwellenwerte für jeden FFT-Bin festzulegen.
Also ja, ein zweiter Eingang anstelle von 2pass wäre sinnvoll. Aber das macht es viel weniger benutzerfreundlich als die meisten ffmpeg-Filter. Sie würden eine Menge Voodoo mit Stream-Split/Zeitbereichsextraktion brauchen. Und natürlich müssen Sie manuell eingreifen, es sei denn, Sie haben eine Rauschprobe in einer separaten Datei, die für mehrere Eingabedateien geeignet ist. (Eine Rauschprobe vom selben Mikrofon/Setup sollte für alle Clips aus diesem Setup ausreichen.)
Antwort4
FertigstellenBenutzer564335's Antwort:
Das: -af arnndn=m=cb.rnnn
ist wahrscheinlich der beste Rauschfilter, den ich je verwendet habeffmpeg
(KI-basiert).
So was:
ffmpeg -i <input_file> -af arnndn=m=cb.rnnn <output_file>
Keine Notwendigkeit für Frequenzbandfilter. Trainierte Modelle ( files.rnnn
)hier verfügbar(Sie müssen eine der Dateien herunterladen und verwenden).
Das cb
( conjoined-burgers
) Modell ist das, das ich gefunden habeam beeindruckendstenund vielseitig. Ich fand diesen Filter auch ziemlich effizient (scheint loudnorm
beispielsweise nicht mehr CPU zu verbrauchen als der Filter).
Außerdem gibt es seit ffmpeg 5.0 einen neuen Rauschfilter:Abonnieren.
Wenn ich mich recht erinnere, habe ich es versucht, aber es war meiner Meinung nach nicht so effizient wie das oben trainierte neuronale Netzwerk.