Reduza o ruído de fundo e otimize a fala de um clipe de áudio usando ffmpeg

30

Extraio clipes de áudio de um arquivo de vídeo para reconhecimento de fala. Esses vídeos são provenientes de dispositivos móveis / outros feitos à mão e, portanto, contêm muito ruído. Quero reduzir o ruído de fundo do áudio para que a fala que eu retransmito para o meu mecanismo de reconhecimento de fala fique clara. Estou usando o ffmpeg para fazer tudo isso, mas estou preso na fase de redução de ruído.

Até agora tentei os seguintes filtros:

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

Mas os resultados são muito decepcionantes. Meu raciocínio era que, como a fala está abaixo da faixa de 300-3000 hz, posso filtrar todas as outras frequências para suprimir qualquer ruído de fundo. o que estou perdendo?

Além disso, li sobre filtros weiner que poderiam ser usados ​​para aprimoramentos de fala e achei isso, mas não sei ao certo como usá-lo.

Sudh
fonte

Respostas:

35

Se você deseja isolar a fala audível, tente combinar um filtro passa-baixo com um filtro passa-alto. Para áudio utilizável, notei que filtrar 200hz e abaixo e filtrar 3000hz e acima faz um bom trabalho em manter o áudio de voz utilizável.

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

Neste exemplo, adicione o filtro passa-alto primeiro para cortar as frequências mais baixas e use o filtro passa-baixo para cortar as frequências mais altas. Se necessário, você pode executar seu arquivo por mais de uma vez para limpar as frequências db mais altas dentro dos intervalos de frequência de corte.

av8r
fonte
Desculpe, mas isso parece não fazer nenhuma redução perceptível de ruído para mim.
Angad
Isso funciona muito bem para reduzir o baixo nível de ruído de fundo (ventiladores, zumbidos etc.), mas pode comprometer um pouco a qualidade do áudio, embora isso possa ser atenuado com a aplicação de outros filtros posteriormente.
Iain Collins
3
Para o meu caso, o áudio original era tão ruim que era quase impossível ouvir a voz devido a um pouco de água caindo no fundo. Eu usei o seguinte. Não é de ótima qualidade, mas é 1000x melhor que o original. -af "highpass=f=200, lowpass=f=1000"
9777 Eric
Eu recebo algum erro com o acima, ou melhor, aviso do ffmpeg: [Parsed_highpass_0 @ 0x1524780] cortando 52 vezes. Por favor, reduza o ganho.
precisa saber é
6
Você pode visualizar seu filtro comffplay <input file> -af lowpass=3000,highpass=200
Björn
11

O FFmpeg agora possui 2 filtros nativos para lidar com o ruído de fundo:

Além disso, já há algum tempo, é possível usar ladspa(procure por supressor de ruído) e / ou lv2(procure por denoiser de fala) com o FFmpeg.

Paul B. Mahol
fonte
9

O ffmpeg não possui nenhum filtro de áudio decente para redução de ruído embutido. O Audacity possui um filtro NR bastante eficaz, mas foi projetado para ser usado com operação em 2 passagens com uma amostra apenas do ruído e depois da entrada.

Os comentários na parte superior de https://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cpp explicam como funciona. (basicamente: suprima todas as caixas de FFT abaixo do limite. Portanto, só permite que os sinais passem quando são mais altos que o nível de ruído nessa faixa de frequência. Ele pode fazer coisas incríveis sem causar problemas. É como um filtro passa-banda que se adapta Como a energia do ruído é espalhada por todo o espectro, apenas deixar passar algumas faixas estreitas reduzirá muito a energia total do ruído.

Consulte também Redução de ruído de áudio: como o audacity se compara a outras opções? para obter mais detalhes de como ele funciona, e que os compartimentos da FFT de um jeito ou de outro também são a base dos filtros comerciais típicos de redução de ruído.

Portar esse filtro para ffmpeg seria um pouco estranho. Talvez implementá-lo como um filtro com 2 entradas, em vez de um filtro de 2 passagens, funcionasse melhor. Como são necessários apenas alguns segundos para obter um perfil de ruído, não é necessário que ele leia todo o arquivo. E você NÃO deve alimentá-lo com todo o fluxo de áudio como uma amostra de ruído. Ele precisa ver uma amostra do ruído APENAS para definir limites para cada compartimento da FFT.

Então sim, uma segunda entrada, em vez de 2pass, faria sentido. Mas isso facilita muito o uso do que a maioria dos filtros ffmpeg. Você precisaria de um monte de vodu com extração de divisão / intervalo de tempo. E é claro que você precisa de intervenção manual, a menos que tenha uma amostra de ruído em um arquivo separado que será apropriado para vários arquivos de entrada. (uma amostra de ruído do mesmo microfone / configuração deve ser adequada para todos os clipes dessa configuração.)

Peter Cordes
fonte