Estou tentando escrever um algoritmo que segmentaria automaticamente um pedaço de áudio com gravações de chamadas de pássaros. Meus dados de entrada são arquivos wave de 1 minuto e na saída eu gostaria de receber chamadas separadas para análise posterior. O problema é que a relação sinal / ruído é bastante terrível devido às condições ambientais e à baixa qualidade de um microfone (amostragem mono de 8 kHz).
Ficaria muito grato por qualquer conselho sobre como prosseguir com a redução de ruído.
Aqui está um exemplo da minha entrada, gravação de áudio de um minuto em formato de onda: http://goo.gl/16fG8P
É assim que o sinal se parece:
A filtragem passa-banda, na qual mantenho apenas algo entre 1500 - 2500 Hz, melhora a situação, mas ainda está longe das expectativas. Neste espectro ainda existe muito ruído.
Também plotei energia média de longo prazo (com intervalos de 32 amostras) e removi alguns cliques dela. Aqui está o resultado:
Com todo o ruído restante, tenho que definir um limiar muito baixo para o algoritmo de detecção de início para selecionar os últimos 10 segundos das chamadas de pássaros. O problema é que, se eu ajustá-lo dessa maneira, na próxima gravação eu posso obter um monte de falsos positivos.
O filtro da média móvel ajuda um pouco com o ruído do vento. Alguma outra ideia? Eu estava pensando em "Subtração espectral", mas aqui parece-me que tenho um problema de galinha e ovo - para encontrar uma área com apenas ruído, preciso segmentar o áudio e segmentar o áudio necessário para remover o ruído. Você conhece alguma biblioteca que possua esse algoritmo ou algumas implementações em pseudo-código? O Methinks Audacity usa esse método para remover o ruído. É muito eficaz, mas cabe ao usuário marcar a área somente de ruído.
Estou escrevendo em Python e é um projeto de código aberto gratuito.
Obrigado pela leitura!
fonte
Respostas:
No final, o que provou ser a melhor solução foi a detecção do início com base no conteúdo de alta frequência ou energia. Antes que pudesse funcionar, tive que usar o filtro passa-alto para cortar os primeiros 1 kHz, pois continha muito ruído.
Depois de ter uma área somente de ruído, eu poderia usar seu perfil para reduzir o ruído do restante da amostra.
Uma biblioteca que achei particularmente útil foi Aubio . Ele tem um bom conjunto de exemplos e fornece muitos algoritmos para você escolher para a detecção de início.
fonte
Não sei muito sobre redução de ruído de áudio, mas após uma subtração rápida e suja do ruído da banda passada filtrada (em torno de 1500-3000 hz), entendi o seguinte:
https://dl.dropboxusercontent.com/u/98395391/signal_denoised.wav
Eu acho que soa um pouco melhor dos sinais filtrados e originais.
Com um simples filtro Wiener, obtenho resultados muito semelhantes.
fonte