Reduzieren Sie Hintergrundgeräusche und optimieren Sie die Sprache aus einem Audioclip mit ffmpeg

30

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.

Sudh
quelle

Antworten:

35

Wenn Sie hörbare Sprache isolieren möchten, kombinieren Sie einen Tiefpassfilter mit einem Hochpassfilter. Bei verwendbarem Audio ist mir aufgefallen, dass das Herausfiltern von 200 Hz und darunter und das Herausfiltern von 3000 Hz und darüber ziemlich gute Arbeit leistet, um brauchbares Sprachaudio zu erhalten.

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 abzusenken, und verwenden Sie dann den Tiefpassfilter, um die höheren Frequenzen abzusenken. Bei Bedarf können Sie Ihre Datei mehrmals durchlaufen lassen, um höhere db-Frequenzen innerhalb der Grenzfrequenzbereiche zu bereinigen.

av8r
quelle
Sorry, aber das scheint für mich keine merkliche Rauschunterdrückung zu sein.
Angad
Dies funktioniert sehr gut, um Hintergrundgeräusche (Lüfter, Brummen usw.) zu reduzieren, kann jedoch die Audioqualität geringfügig beeinträchtigen. Dies kann jedoch etwas gemindert werden, indem andere Filter nachträglich angewendet werden.
Iain Collins
3
In meinem Fall war der Originalton so schlecht, dass es fast unmöglich war, die Stimme zu hören, da im Hintergrund etwas Wasser rausfiel. Ich habe folgendes benutzt. Es ist keine gute Qualität, aber 1000x besser als das Original. -af "highpass=f=200, lowpass=f=1000"
Eric
Ich erhalte einen Fehler mit dem oben genannten oder besser gesagt, eine Warnung von ffmpeg: [Parsed_highpass_0 @ 0x1524780] schneide 52 mal ab. Bitte reduzieren Sie die Verstärkung.
Shevy
6
Sie können eine Vorschau Ihres Filters mitffplay <input file> -af lowpass=3000,highpass=200
Björn
11

FFmpeg verfügt jetzt über 2 native Filter für den Umgang mit Hintergrundgeräuschen:

Außerdem kann man seit einiger Zeit mit FFmpeg ladspa(nach Noise-Supressor suchen) und / oder lv2(nach Speech-Denoiser suchen) Filter verwenden.

Paul B. Mahol
quelle
9

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.)

Peter Cordes
quelle