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!