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:
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!
fonte
Respostas:
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.
fonte