Reconociendo datos agrupados en formas

9

Estoy trabajando en un proyecto en Python para detectar y clasificar algunas canciones de pájaros, y me he encontrado en una posición en la que necesito convertir un archivo de onda en datos de frecuencia frente a tiempo. Esto no ha sido un gran problema, pero para poder clasificar las diferentes sílabas en grupos, necesito escribir algo que detecte cuándo los datos se agrupan en una determinada forma. Para darle una idea de cómo se ven los datos, aquí hay una imagen de cómo se ven los datos cuando se trazan:

ingrese la descripción de la imagen aquí

Necesito alguna forma de obtener cada sílaba individual (cada forma con una separación a cada lado) y guardarlas en una variable o en sus propios archivos para poder ejecutar la correlación de Pearson entre ellas usando SciPy.

Además, prefiero Python, pero estoy abierto a la codificación en otros idiomas si tiene otra forma de hacerlo.

¡Gracias!

smckee
fuente
No estoy completamente familiarizado con lo que voy a sugerir, pero parece que la Transformación continua de wavelet con una wavelet que contiene las propiedades de sus sílabas es algo que vale la pena echarle un vistazo.
heltonbiker
¿Necesitas encontrar una forma o estás tratando de clasificar las aves? Si es así, ¿usa el sonido de Hidden Markov Model?
Mikhail

Respuestas:

2

Dos preguntas:

1 / Cerca de 8 segundos, podemos observar un tono estable durante 100 ms aproximadamente, luego un aumento repentino que cae hasta 8.5 segundos. ¿Esta secuencia completa (8s a 8.5s) forma una sola entidad, o considera que las dos etapas (estable y luego decreciente) son dos entidades?

2 / ¿Quieres trabajar con o sin supervisión? ¿Conoces de antemano los "patrones" que debes buscar?

  • Si desea trabajar sin supervisión (digamos que ha reunido grabaciones y tiene como objetivo extraer una "representación estructurada" de él), su problema es similar, en un primer paso, a la detección de actividad de voz. Simplemente use la intensidad de la señal, tal vez junto con una métrica de "tono" (por ejemplo, la relación del máximo de la autocorrelación en el rango de brid, 1kHz - 5kHz aquí) para detectar segmentos donde hay un tono activo fuerte. Filtra la mediana de la secuencia resultante para suavizarla y luego pon un umbral para obtener los diferentes segmentos. Una vez que haya desglosado su señal en segmentos, puede hacer cosas interesantes con ellos. Por ejemplo, podría extraer para cada uno de ellos una trayectoria de tono (una secuencia con el pico de frecuencia más fuerte para cada cuadro FFT, o algo más robusto extraído con un verdadero estimador de tono), use DTW para calcular una matriz de distancias por pares entre cada bloque, y use un algoritmo de agrupación (k-medias, agrupación aglomerativa) para identificar grupos de patrones de tono similares (los segmentos 8: 8.5 y 10: 10.5). Es probable que un enfoque no supervisado se segmente en exceso; por ejemplo, 7.6: 8.5 y 9.6: 10.5 se reconocerán como la repetición de los dos mismos bloques, mientras que para usted podrían ser fundamentalmente un solo patrón, pero podría usar algo comoSequitur para tener un nivel de estructura más alto.

  • Si tiene un diccionario predefinido de "patrones" con el que desea etiquetar su señal, es mejor que siga el tipo de enfoques utilizados para el reconocimiento de voz, con la única gran diferencia de que el reconocimiento de voz no tiene en cuenta el tono, mientras está en su ¡La presentación del caso es la única información a considerar! Un sistema de reconocimiento de voz aborda las tareas de segmentación y reconocimiento en una sola operación de decodificación FST.

pichenettes
fuente