Reconhecendo dados agrupados em formas

9

Estou trabalhando em um projeto em Python para detectar e classificar alguns cantos de pássaros, e me encontrei em uma posição em que preciso converter um arquivo wave em dados de frequência versus tempo. Isso não tem sido um problema muito grande, mas para poder classificar as diferentes sílabas em grupos, preciso escrever algo que detecte quando os dados se agrupam em uma determinada forma. Para ter uma idéia da aparência dos dados, veja uma imagem de como os dados são exibidos quando plotados:

insira a descrição da imagem aqui

Eu preciso de alguma maneira de obter cada sílaba individual (cada forma com uma separação de cada lado) e salvá-las em uma variável ou em seus próprios arquivos, para que eu possa executar a correlação de Pearson entre eles usando o SciPy.

Além disso, prefiro o Python, mas estou aberto a codificar em outros idiomas, se você tiver outra maneira de fazê-lo.

Obrigado!

Smckee
fonte
Não estou completamente familiarizado com o que estou prestes a sugerir, mas parece que a Transformada de Wavelet Contínua com uma wavelet que contém as propriedades de suas sílabas é algo que vale a pena dar uma olhada.
21812 heltonbiker
Você precisa encontrar uma forma ou está tentando classificar os pássaros? Se sim, usando o som do Hidden Markov Model?
11552 Mikhail

Respostas:

2

Duas questões:

1 / Perto de 8s, podemos observar um tom estável por cerca de 100ms, depois um aumento repentino caindo até 8,5s. Essa sequência inteira (8s a 8,5s) forma uma única entidade, ou você considera os dois estágios (estável e depois decrescente) duas entidades?

2 / Deseja trabalhar com ou sem supervisão. Você conhece antecipadamente os "padrões" a serem procurados?

  • Se você deseja trabalhar sem supervisão (digamos que você reuniu gravações e pretende extrair uma "representação estruturada"), seu problema é semelhante, em um primeiro passo, à detecção de atividade de voz. Basta usar a intensidade do sinal, talvez em conjunto com uma métrica de "pitchiness" (digamos, a proporção do máximo da autocorrelação na faixa brid, 1kHz - 5kHz aqui) para detectar segmentos onde há um tom agudo forte ativo. Filtre a mediana pela sequência resultante para suavizá-la e limpe-a para obter os diferentes segmentos. Depois de dividir seu sinal em segmentos, você pode fazer coisas interessantes com eles. Por exemplo, você pode extrair para cada um deles uma trajetória de afinação (uma sequência com o pico de frequência mais forte para cada quadro da FFT ou algo mais robusto extraído com um verdadeiro estimador de afinação), use DTW para calcular uma matriz de distâncias em pares entre cada bloco e use um algoritmo de agrupamento (médias médias, agrupamento aglomerativo) para identificar grupos de padrões de afinação semelhantes (os segmentos 8: 8.5 e 10: 10.5). É provável que uma abordagem não supervisionada seja segmentada em excesso - por exemplo, 7.6: 8.5 e 9.6: 10.5 seja reconhecida como a repetição dos dois mesmos blocos, enquanto para você eles podem ser fundamentalmente um único padrão, mas você pode usar algo comoSequitur para ter um nível de estrutura mais alto.

  • Se você tiver um dicionário predefinido de "padrões" com os quais deseja rotular seu sinal, é melhor seguir o tipo de abordagem usada para o reconhecimento de fala, com a única grande diferença de que o reconhecimento de fala não leva em consideração o tom, enquanto estiver no seu o argumento do caso é a única informação a ser considerada! Um sistema de reconhecimento de fala lida com as tarefas de segmentação e reconhecimento em uma única operação de decodificação FST.

pichenettes
fonte