Reduzieren Sie Hintergrundgeräusche und optimieren Sie die Sprache eines Audioclips mithilfe von ffmpeg

24672
Sudh

Ich extrahiere Audioclips aus einer Videodatei zur Spracherkennung. Diese Videos stammen von mobilen / anderen handgefertigten Geräten und enthalten daher viel Lärm. Ich möchte das Hintergrundgeräusch des Audiomaterials reduzieren, damit die von mir an meine Spracherkennungsmaschine weitergeleitete Sprache klar ist. Ich benutze ffmpeg, um all das zu erledigen, stecke aber in der Rauschunterdrückungsphase fest.

Bis jetzt 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. Ich denke, dass, da Sprache unter 300-3000 Hz liegt, ich alle anderen Frequenzen herausfiltern kann, um Hintergrundgeräusche zu unterdrücken. Was vermisse ich?

Ich habe auch über Weiner-Filter gelesen, die für Sprachverbesserungen verwendet werden könnten. Ich habe dies herausgefunden, bin mir aber nicht sicher, wie man es benutzt.

20

2 Antworten auf die Frage

23
av8r

Wenn Sie hörbare Sprache isolieren möchten, kombinieren Sie einen Tiefpassfilter mit einem Hochpassfilter. Für brauchbares Audio ist mir aufgefallen, dass das Herausfiltern von 200 Hz und darunter 3000 Hz und das Herausfiltern von 3000 Hz heraushebt.

ffmpeg -i <input_file> -af "highpass=f=200, lowpass=f=3000" <output_file> 

Fügen Sie in diesem Beispiel zuerst den Hochpassfilter hinzu, um die niedrigeren Frequenzen zu verringern, und verwenden Sie den Tiefpassfilter, um die höheren Frequenzen zu senken. Bei Bedarf können Sie Ihre Datei mehr als einmal durchlaufen lassen, um höhere Db-Frequenzen innerhalb der Cut-Frequenzbereiche zu bereinigen.

Sorry, aber das scheint für mich keine merkliche Geräuschreduzierung zu bewirken. Angad vor 9 Jahren 0
Dies funktioniert sehr gut, um ein niedriges Hintergrundrauschen (Lüfter, Brummen usw.) zu reduzieren, kann jedoch die Audioqualität etwas beeinträchtigen. Dies kann jedoch durch das Anwenden anderer Filter etwas gemindert werden. user20721 vor 7 Jahren 0
In meinem Fall war der ursprüngliche Ton so schlecht, dass die Stimme aufgrund von Wassergeräuschen im Hintergrund kaum zu hören war. Ich habe folgendes verwendet. Es ist keine tolle Qualität, aber 1000x besser als das Original. `-af" Hochpass = f = 200, Tiefpass = f = 1000 "` Eric vor 7 Jahren 1
Ich bekomme eine Fehlermeldung mit obiger oder besser Warnung von ffmpeg: [Parsed_highpass_0 @ 0x1524780] 52 mal abgeschnitten. Bitte reduzieren Sie den Gewinn. shevy vor 6 Jahren 0
Sie können eine Vorschau Ihres Filters mit ffplay anzeigen -af Tiefpass = 3000, Hochpass = 200` Björn vor 6 Jahren 1
7
Peter Cordes

ffmpeg hat keine anständigen Audiofilter für die Rauschunterdrückung eingebaut. Audacity verfügt über einen ziemlich effektiven NR-Filter. Es wurde jedoch für den Betrieb mit 2-Pass-Betrieb entwickelt, wobei nur das Rauschen und dann der Eingang verwendet werden.

Die Kommentare oben in https://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cpp erläutern die Funktionsweise. (Grundsätzlich gilt: Unterdrücken Sie jeden FFT-Behälter, der sich unterhalb der Schwelle befindet. Sie lässt also nur Signale durch, wenn sie lauter sind als das Grundrauschen in diesem Frequenzbereich. Sie können erstaunliche Dinge tun, ohne Probleme zu verursachen. Es ist wie ein Bandpassfilter, der sich anpasst Da die Energie des Geräusches über das gesamte Spektrum verteilt ist, wird die Gesamtrauschenergie nur um ein paar schmale Bänder reduziert.

Siehe auch Rauschunterdrückung: Wie verhält sich Audacity mit anderen Optionen? Weitere Informationen zu seiner Funktionsweise und zu den Schwellenwerten für FTS-FFTs auf die eine oder andere Weise sind auch die Grundlage für typische kommerzielle Rauschunterdrückungsfilter.

Das Filtern dieses Filters auf ffmpeg wäre etwas umständlich. Die Implementierung als Filter mit 2 Eingängen anstelle eines 2-Pass-Filters würde am besten funktionieren. Da es nur wenige Sekunden dauert, um ein Geräuschprofil zu erhalten, muss die gesamte Datei nicht durchgelesen werden. Und Sie sollten es sowieso nicht den gesamten Audiostream als Rauschmuster speisen. Es muss ein Beispiel für ein JUST-Rauschen angezeigt werden, um Schwellenwerte für jedes FFT-Bin festzulegen.

Ja, ein 2. Eingang statt 2Pass würde Sinn machen. Dies macht es jedoch viel einfacher zu bedienen als die meisten ffmpeg-Filter. Sie würden eine Menge Voodoo mit Stream-Split / Zeitbereichsextrakt benötigen. Und natürlich benötigen Sie einen manuellen Eingriff, es sei denn, Sie haben ein Rauschmuster in einer separaten Datei, die für mehrere Eingabedateien geeignet ist. (Ein Rausch-Sample vom gleichen Mikrofon / Setup sollte für alle Clips dieses Setups in Ordnung sein.)