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

20

Eu extraio clipes de áudio de um arquivo de vídeo para reconhecimento de fala. Esses vídeos vêm de dispositivos móveis / outros artesanais e, portanto, contêm muito ruído. Eu quero reduzir o ruído de fundo do áudio para que a fala que eu retransmita para o meu mecanismo de reconhecimento de fala seja clara. Estou usando o ffmpeg para fazer todas essas coisas, mas estou preso na fase de redução de ruído.

Até agora eu tentei seguir 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 foi que, como a fala fica abaixo do intervalo de 300-3000 hz, posso filtrar todas as outras freqüências para suprimir qualquer ruído de fundo. O que estou perdendo?

Além disso, li sobre filtros de weiner que poderiam ser usados para aprimoramentos de fala e encontrei este mas não tenho certeza de como usá-lo.

    
por Sudh 24.03.2014 / 22:43

2 respostas

23

Se você estiver procurando isolar a fala audível, tente combinar um filtro lowpass com um filtro de alta freqüência. Para áudio utilizável, notei que filtrar 200hz e inferiores e depois 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 primeiro o filtro de alta freqüência para cortar as freqüências mais baixas e use o filtro de baixa freqüência para cortar as freqüências mais altas. Se necessário, você poderia executar o seu arquivo através disso mais de uma vez para limpar freqüências mais altas de db dentro das faixas de frequência de corte.

    
por 04.11.2014 / 03:34
7

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

Os comentários no topo do link explicam como funciona. (basicamente: suprime todos os bin FFT que estão abaixo do limite. Então, só permite que os sinais sejam mais altos do que o ruído nessa faixa de freqüência. Ele pode fazer coisas incríveis sem causar problemas. É como um filtro band-pass que se adapta Como a energia do ruído está espalhada por todo o espectro, apenas a passagem de algumas faixas estreitas reduzirá a energia total do ruído a MUITO.

Veja também Redução de ruído de áudio: como A audácia se compara a outras opções? para obter mais detalhes sobre como ela funciona e que as bandejas de limiar de FFT, de uma maneira ou de outra, também são a base dos típicos filtros comerciais de redução de ruído.

Portar esse filtro para o ffmpeg seria um pouco estranho. Talvez implementá-lo como um filtro com duas entradas, em vez de um filtro de duas passagens, funcionaria melhor. Como só precisa de alguns segundos para obter um perfil de ruído, não é como se ele tivesse que ler todo o arquivo. E você NÃO deve alimentar todo o fluxo de áudio como uma amostra de ruído, de qualquer forma. Ele precisa ver uma amostra de JUST noise para definir limites para cada caixa FFT.

Então, uma segunda entrada, em vez de 2pass, faria sentido. Mas isso torna muito menos fácil de usar do que a maioria dos filtros ffmpeg. Você precisaria de um monte de vodu com extração de fluxo / intervalo de tempo. E, claro, você precisa de intervenção manual, a menos que tenha uma amostra de ruído em um arquivo separado que seja apropriado para vários arquivos de entrada. (uma amostra de ruído do mesmo microfone / configuração deve estar bem para todos os clipes daquela configuração).

    
por 21.02.2015 / 11:50