Kurangi kebisingan latar belakang dan optimalkan ucapan dari klip audio menggunakan ffmpeg

30

Saya mengekstrak klip audio dari file video untuk pengenalan suara. Video-video ini berasal dari ponsel / perangkat buatan tangan lainnya dan karenanya mengandung banyak suara. Saya ingin mengurangi kebisingan latar belakang audio sehingga ucapan yang saya sampaikan ke mesin pengenalan suara saya jelas. Saya menggunakan ffmpeg untuk melakukan semua hal ini, tetapi saya terjebak pada fase pengurangan kebisingan.

Sampai sekarang saya telah mencoba filter berikut:

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

Tetapi hasilnya sangat mengecewakan. Alasan saya adalah bahwa sejak pidato berada di bawah kisaran 300-3000 hz saya dapat menyaring semua frekuensi lain untuk menekan kebisingan latar belakang. Apa yang saya lewatkan?

Saya juga membaca tentang filter weiner yang dapat digunakan untuk peningkatan kemampuan berbicara dan menemukan ini tetapi saya tidak yakin bagaimana menggunakannya.

Sudh
sumber

Jawaban:

35

Jika Anda ingin mengisolasi suara yang terdengar, coba gabungkan filter lowpass dengan filter high pass. Untuk audio yang dapat digunakan, saya perhatikan bahwa menyaring 200 hz dan di bawah kemudian menyaring 3000 hz dan di atas melakukan pekerjaan yang cukup baik untuk menjaga audio suara yang dapat digunakan.

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

Dalam contoh ini, tambahkan filter pass tinggi pertama untuk memotong frekuensi yang lebih rendah kemudian gunakan filter pass rendah untuk memotong frekuensi yang lebih tinggi. Jika perlu, Anda dapat menjalankan file Anda melalui ini lebih dari sekali untuk membersihkan frekuensi db yang lebih tinggi dalam rentang frekuensi cut.

av8r
sumber
Maaf, tapi sepertinya ini tidak mengurangi kebisingan bagi saya.
Angad
Ini bekerja sangat baik untuk mengurangi tingkat kebisingan latar belakang yang rendah (kipas, dengung, dll) tetapi dapat sedikit mengurangi kualitas audio, meskipun itu dapat sedikit dikurangi dengan menerapkan filter lain sesudahnya.
Iain Collins
3
Untuk kasus saya, audio aslinya sangat buruk sehingga hampir tidak mungkin untuk mendengar suara karena suara air jatuh di latar belakang. Saya menggunakan yang berikut ini. Ini bukan kualitas yang hebat, tetapi 1000x lebih baik dari aslinya. -af "highpass=f=200, lowpass=f=1000"
Eric
Saya mendapatkan beberapa kesalahan dengan di atas atau lebih tepatnya, peringatan dari ffmpeg: [Parsed_highpass_0 @ 0x1524780] kliping 52 kali. Silakan kurangi keuntungan.
shevy
6
Anda dapat melihat pratinjau filter Anda denganffplay <input file> -af lowpass=3000,highpass=200
Björn
11

FFmpeg sekarang memiliki 2 filter asli untuk menangani latar belakang noise:

Juga, sejak beberapa waktu, seseorang dapat menggunakan ladspa(mencari penekan-kebisingan) dan / atau lv2(mencari penyebut ucapan) dengan FFmpeg.

Paul B. Mahol
sumber
9

ffmpeg tidak memiliki filter audio yang layak untuk pengurangan noise bawaan. Audacity memiliki filter NR yang cukup efektif, tetapi ia dirancang untuk digunakan dengan operasi 2-pass dengan sampel hanya noise, dan kemudian input.

Komentar di bagian atas https://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cpp menjelaskan cara kerjanya. (pada dasarnya: tekan setiap nampan FFT yang di bawah ambang batas. Jadi hanya memungkinkan sinyal masuk ketika mereka lebih keras daripada lantai kebisingan dalam pita frekuensi. Dapat melakukan hal-hal luar biasa tanpa menyebabkan masalah. Ini seperti filter band-pass yang menyesuaikan ke sinyal. Karena energi kebisingan tersebar di seluruh spektrum, hanya membiarkan melalui beberapa pita sempit itu akan mengurangi total energi kebisingan banyak.

Lihat juga Pengurangan kebisingan audio: bagaimana audacity dibandingkan dengan opsi lain? untuk perincian lebih lanjut tentang cara kerjanya, dan bahwa pengalokasian tempat sampah FFT dalam satu atau lain cara adalah dasar dari filter pengurangan kebisingan komersial juga.

Porting filter itu ke ffmpeg akan sedikit canggung. Mungkin menerapkannya sebagai filter dengan 2 input, bukannya filter 2-pass, akan bekerja lebih baik. Karena hanya perlu beberapa detik untuk mendapatkan profil noise, itu tidak seperti harus membaca seluruh file. Dan Anda TIDAK HARUS memberi makan seluruh aliran audio sebagai sampel suara. Perlu melihat sampel JUST noise untuk mengatur ambang batas untuk setiap nampan FFT.

Jadi ya, input ke-2, daripada 2pass, masuk akal. Tapi itu membuatnya jauh lebih mudah digunakan daripada kebanyakan filter ffmpeg. Anda memerlukan banyak voodoo dengan ekstrak stream split / rentang waktu. Dan tentu saja Anda memerlukan intervensi manual, kecuali jika Anda memiliki sampel derau dalam file terpisah yang akan sesuai untuk beberapa file input. (satu sampel derau dari mic / setup yang sama harus baik untuk semua klip dari setup itu.)

Peter Cordes
sumber