
Extraio clipes de áudio de um arquivo de vídeo para reconhecimento de fala. Esses vídeos vêm de dispositivos móveis/outros dispositivos feitos à mão e, portanto, contêm muito ruído. Quero reduzir o ruído de fundo do áudio para que a fala que transmito ao meu mecanismo de reconhecimento de fala seja 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 foi que, como a fala está na 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 melhorar a fala e descobriessemas não tenho certeza de como usá-lo.
Responder1
Se você deseja isolar a fala audível, tente combinar um filtro passa-baixa com um filtro passa-alta. Para áudio utilizável, notei que filtrar 200 Hz e abaixo e depois filtrar 3000 Hz 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 passa-alta para cortar as frequências mais baixas e depois use o filtro passa-baixa para cortar as frequências mais altas. Se necessário, você pode executar seu arquivo mais de uma vez para limpar frequências de db mais altas dentro das faixas de frequência de corte.
Responder2
O FFmpeg agora possui 3 filtros nativos para lidar com ruído de fundo:
afftdn
: Elimina o ruído de amostras de áudio com FFTanlmdn
: Reduz o ruído de banda larga em amostras de áudio usando um algoritmo de meios não locaisarnndn
: reduz o ruído da fala usando redes neurais recorrentes. Exemplos de arquivos de modelo para carregar podem ser encontradosaqui.
Além disso, há algum tempo, pode-se usar filtros ladspa
(procurar supressor de ruído) e/ou lv2
(procurar denoiser de fala) com FFmpeg.
Responder3
Atualização: FFmpeg adicionado recentemente afftdn
que usa o método de limite de ruído por FFT-bin descrito abaixo, com várias opções para adaptar/descobrir valores de limite apropriados em tempo real.
anlmdn
(meios não locais) é uma técnica que funciona bem para vídeo; Não experimentei o filtro de áudio.
Qualquer um destes deve sermuitomelhor que passa-alta / passa-baixa, a menos que seu único ruído seja um zumbido de 60 Hz ou algo assim. (A fala humana ainda pode soar bem em uma passagem de banda bastante estreita, mas existem maneiras muito melhores de limpar um ruído de fundo de banda larga.)
O ffmpeg não possui nenhum filtro de áudio decente para redução de ruído integrado. O Audacity possui um filtro NR bastante eficaz, mas foi projetado para ser usado com operação de 2 passagens com uma amostra apenas do ruído e depois da entrada.
Os comentários no topohttps://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cppexplique como funciona. (basicamente: suprima todos os compartimentos FFT que estão abaixo do limite. Portanto, ele só permite a passagem de sinais quando eles são mais altos do que o nível de ruído naquela banda de frequência. Ele pode fazer coisas incríveis sem causar problemas. É como um filtro passa-banda que se adapta ao sinal. Como a energia do ruído está espalhada por todo o espectro, deixar passar apenas algumas bandas estreitas reduzirá MUITO a energia total do ruído.
Veja tambémRedução de ruído de áudio: como o Audacity se compara a outras opções?para obter mais detalhes sobre como funciona, e que o limite de compartimentos FFT de uma forma ou de outra também é a base de filtros comerciais típicos de redução de ruído.
Portar esse filtro para o 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 ler o arquivo inteiro. E você NÃO DEVE alimentar todo o fluxo de áudio como uma amostra de ruído, de qualquer maneira. Ele precisa ver uma amostra APENAS de ruído para definir limites para cada compartimento FFT.
Então, sim, uma segunda entrada, em vez de 2 passagens, faria sentido. Mas isso o 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 divisão de fluxo/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 seja apropriado para vários arquivos de entrada. (uma amostra de ruído do mesmo microfone/configuração deve servir para todos os clipes dessa configuração.)
Responder4
Completarusuário564335a resposta:
Esse: -af arnndn=m=cb.rnnn
é provavelmente o melhor filtro de ruído que useiffmpeg
(baseado em IA).
Assim:
ffmpeg -i <input_file> -af arnndn=m=cb.rnnn <output_file>
Não há necessidade de filtros de banda de frequência. Modelos treinados ( files.rnnn
)disponivel aqui(você precisa baixar e usar um dos arquivos).
O modelo cb
( conjoined-burgers
) é o que encontreimais impressionantee versátil. Também achei esse filtro bastante eficiente (não parece usar mais CPU do que o loudnorm
filtro, por exemplo).
Além disso, desde o ffmpeg 5.0, existe um novo filtro de ruído:afwtdn.
Se bem me lembro, tentei, mas não foi tão eficiente quanto a rede neural treinada acima do IMHO.