Redução de ruído com áudio muito barulhento

8

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:

Meu sinal de entrada (8 kHz).  Áreas marcadas indicam cantos de pássaros

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.

Spectrogram

Também plotei energia média de longo prazo (com intervalos de 32 amostras) e removi alguns cliques dela. Aqui está o resultado:

Energia média a longo prazo

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!

Lukasz Tracewski
fonte
Bem-vindo ao DSP.SE. Esta é uma pergunta incrível! Espero que você possa obter algumas boas pistas aqui.
Phonon
@Lukasz Tracewski Respeitado senhor: Embora seja tarde demais, mas estou trabalhando no mesmo projeto, estou tendo problemas como como fazer espectrograma a partir de um arquivo wav. Graças em advance.Any hel seria muito apreciada
Mubeen Khan
@MubeenKhan Você quer dizer ajuda com a produção de espectrograma a partir de um arquivo de áudio? Existem dezenas de ferramentas e bibliotecas adequadas para esse fim. Você precisa de alguma recomendação? Ou você está perguntando sobre redução de ruído?
Lukasz Tracewski 7/10/19

Respostas:

4

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.

Lukasz Tracewski
fonte
0

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.

Yozek
fonte
A menos que eu o entenda mal, parece que você está se referindo a algo que eu já fiz no segundo parágrafo da minha pergunta (logo abaixo do primeiro gráfico). Com o método descrito em minha resposta, consegui encontrar todos os onets e aplicar a subtração espectral, o que fornece resultados ainda melhores. Lamentavelmente, também produz os chamados "tons musicais", que agora são minha principal preocupação. Obrigado mesmo assim!
Lukasz Tracewski