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.
-af "highpass=f=200, lowpass=f=1000"
ffplay <input file> -af lowpass=3000,highpass=200
O FFmpeg agora possui 2 filtros nativos para lidar com o ruído de fundo:
afftdn
anlmdn
Além disso, já há algum tempo, é possível usar
ladspa
(procure por supressor de ruído) e / oulv2
(procure por denoiser de fala) com o FFmpeg.fonte
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.)
fonte