Estoy tratando de descubrir cómo detectar la cantidad de sílabas en un corpus de grabaciones de audio. Creo que un buen proxy podría ser picos en el archivo de onda.
Esto es lo que probé con un archivo de mí hablando en inglés (mi caso de uso real está en kiswahili). La transcripción de este ejemplo de grabación es: "Este soy yo tratando de usar la función de temporizador. Estoy viendo pausas, vocalizaciones". Hay un total de 22 sílabas en este pasaje.
Archivo wav: https://www.dropbox.com/s/koqyfeaqge8t9iw/test.wav?dl=0
El seewave
paquete en R es excelente, y hay varias funciones potenciales. Lo primero es lo primero, importa el archivo wave.
library(seewave)
library(tuneR)
w <- readWave("YOURPATHHERE/test.wav")
w
# Wave Object
# Number of Samples: 278528
# Duration (seconds): 6.32
# Samplingrate (Hertz): 44100
# Channels (Mono/Stereo): Stereo
# PCM (integer format): TRUE
# Bit (8/16/24/32/64): 16
Lo primero que probé fue la timer()
función. Una de las cosas que devuelve es la duración de cada vocalización. Esta función identifica 7 vocalizaciones, que es muy inferior a 22 sílabas. Un vistazo rápido a la trama sugiere que las vocalizaciones no son iguales a las sílabas.
t <- timer(w, threshold=2, msmooth=c(400,90), dmin=0.1)
length(t$s)
# [1] 7
También probé la función fpeaks sin establecer un umbral. Regresó 54 picos.
ms <- meanspec(w)
peaks <- fpeaks(ms)
Esto traza la amplitud por frecuencia en lugar de tiempo. Agregar un parámetro de umbral igual a 0.005 filtra el ruido y reduce el recuento a 23 picos, que es bastante cercano al número real de sílabas (22).
No estoy seguro de que este sea el mejor enfoque. El resultado será sensible al valor del parámetro de umbral, y tengo que procesar un gran lote de archivos. ¿Alguna idea mejor sobre cómo codificar esto para detectar picos que representan sílabas?
fuente
changepoint
paquete. En pocas palabras, el análisis del punto de cambio se centra en detectar el cambio, el ejemplo vinculado se refiere a los datos comerciales, pero podría ser interesante aplicar esta técnica a los datos de sonido.Respuestas:
No creo que lo que sigue sea la mejor solución, pero @ eipi10 tenía una buena sugerencia para consultar esta respuesta en CrossValidated . Así que lo hice.
El primer paso es crear la
argmax
función:Hice pequeñas modificaciones a la
test
función de trazado: (a) para definir explícitamente x e y y (b) para mostrar el número de picos:Al igual que el
fpeaks
enfoque que mencioné en mi pregunta original, este enfoque también requiere una gran cantidad de ajustes. No sabré la respuesta "correcta" (es decir, el número de sílabas / picos) que entra en esto, así que no estoy seguro de cómo definir una regla de decisión.En este punto me
fpeaks
parece un poco menos complicado, pero aún no es satisfactorio.fuente
loess
, no veo argumentos explícitamente dados para el grado de suavizado. En realidad, no tiene mucho sentido ejecutar loess sobre una ventana en movimiento: ya lo hace internamente.w
era un argumento en el alisamiento. Así es como el autor de la solución original describió la función: "Hay dos parámetros que deben ajustarse a las circunstancias: w es el ancho medio de la ventana utilizada para calcular el máximo local ... Otro - no explícito en esto código - es el argumento de la extensión del loess más suave ".w
como uno de los parámetros porque tenía en mente un enfoque muy general en el que el más suave podría no ser loess, pero tal vez sería una mediana con ventana, o Hanning, o cualquier otra cosa que se considere apropiada para el comportamiento estadístico de los datos y el objetivos del analista. Las propiedades de muchos de esos suavizadores dependerían del ancho de la ventana.Tuve problemas similares para analizar los perfiles de electroforesis de proteínas. Los resolví aplicando algunas de las funciones del paquete msprocess R en las segundas derivadas de los perfiles (consulte https://fr.wikipedia.org/wiki/D%C3%A9pouillement_d 'une_courbe # Position_et_hauteur_du_pic). Esto se ha publicado aquí: http://onlinelibrary.wiley.com/doi/10.1111/1755-0998.12389/abstract;jsessionid=8EE0B64238728C0979FF71C576884771.f02t03
No tengo idea si una solución similar puede funcionar para usted. Buena suerte
fuente
Aquí hay una biblioteca en Python que usé antes al intentar estimar la periodicidad al encontrar picos en la función de autocorrelación.
Utiliza diferencias de primer orden / derivadas discretas para la detección de picos y admite ajustes por parámetros de umbral y distancia mínima (entre picos consecutivos). También se puede mejorar la resolución máxima utilizando la estimación de densidad gaussiana y la interpolación (ver enlace).
Funcionó bastante bien de fábrica para mí sin muchos ajustes, incluso para datos ruidosos. Darle una oportunidad.
fuente
Me gustaría sugerir una solución utilizando el
changepoint
paquete. El siguiente ejemplo simplista intenta identificar picos, definidos aquí como puntos de cambio al mirar un canal de los datos disponibles.Ejemplo
Abastecimiento de datos
Preparación de datos
Gráfico generado a través de la
plot.ts
llamada:Análisis de punto de cambio
El
changepoint
paquete proporciona varias opciones para identificar cambios / picos en los datos. El siguiente código proporciona solo un ejemplo simple de encontrar 3 picos usando el método BinSeg :Gráfico obtenido: también es posible obtener valores:
Notas al margen
El ejemplo proporcionado se ocupa principalmente de ilustrar cómo se puede aplicar el análisis del punto de cambio a los datos proporcionados; Se debe tener precaución con respecto a los parámetros pasados a la
cp.var
función. En el siguiente documento se ofrece una explicación detallada del paquete y las funcionalidades disponibles:Killick, Rebecca y Eckley, Idris (2014) punto de cambio: un paquete R para el análisis del punto de cambio. Revista de software estadístico, 58 (3). pp. 1-19.
ecp
ecp
, es otro que vale la pena mencionar el paquete R. Estoecp
facilita la realización de análisis de puntos de cambio multivariados no paramétricos, que pueden ser útiles si uno quisiera identificar los puntos de cambio que ocurren a través de múltiples canales.fuente