15 votos

detectar el número de picos en la grabación de audio

Estoy tratando de averiguar cómo detectar el número de sílabas de un corpus de grabaciones de audio. Creo que es una buena proxy pueden ser picos en el archivo de onda.

He aquí lo he probado con un archivo de mí hablando en inglés (en mi caso de uso es en Kiswahili). La transcripción de este ejemplo de grabación es: "Esto me está tratando de utilizar la función de temporizador. Estoy buscando en las pausas, las 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 grande, y hay varias funciones potenciales. Lo primero es lo primero, importar el archivo de onda.

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

El primero que probé fue el timer() función. Una de las cosas que se devuelve es la duración de cada vocalización. Esta función identifica 7 vocalizaciones, que es muy corto, de 22 de sílabas. Un rápido vistazo 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

enter image description here

También probé el fpeaks función sin la fijación de un umbral. Volvió 54 picos.

ms <- meanspec(w)
peaks <- fpeaks(ms)

enter image description here

Este parcelas de la amplitud de la frecuencia de lugar de tiempo. La adición de un parámetro de umbral igual a 0.005 filtros de ruido y reduce el conteo de 23 de picos, que es bastante cercano a la realidad el número de sílabas (22).

enter image description here

No estoy seguro de que este es el mejor enfoque. El resultado será sensible al valor del parámetro umbral, y tengo que procesar una gran cantidad de archivos. Mejores ideas acerca de cómo este código para detectar picos que representan sílabas?

7voto

Anne Puntos 464

No creo que lo que sigue es la mejor solución, pero @eipi10 tenido una buena sugerencia para comprobar esta respuesta en CrossValidated. Así que lo hice.

Un enfoque general es suavizar los datos y, a continuación, buscar picos mediante la comparación de un máximo local de filtro suave.

El primer paso es crear la argmax función de:

argmax <- function(x, y, w=1, ...) {
  require(zoo)
  n <- length(y)
  y.smooth <- loess(y ~ x, ...)$fitted
  y.max <- rollapply(zoo(y.smooth), 2*w+1, max, align="center")
  delta <- y.max - y.smooth[-c(1:w, n+1-1:w)]
  i.max <- which(delta <= 0) + w
  list(x=x[i.max], i=i.max, y.hat=y.smooth)
}

Su valor de retorno incluye a los argumentos de los locales maxima (x), el cual responde a la pregunta-y los índices a los x - y y-matrices donde los locales máximos se producen (i).

He realizado modificaciones de menor importancia a la test de trazado de la función: (a) definir explícitamente x y y y (b) para mostrar el número de picos:

test <- function(x, y, w, span) {
  peaks <- argmax(x, y, w=w, span=span)

  plot(x, y, cex=0.75, col="Gray", main=paste("w = ", w, ", span = ", 
                                              span, ", peaks = ", 
                                              length(peaks$x), sep=""))
  lines(x, peaks$y.hat,  lwd=2) #$
  y.min <- min(y)
  sapply(peaks$i, function(i) lines(c(x[i],x[i]), c(y.min, peaks$y.hat[i]),
                                    col="Red", lty=2))
  points(x[peaks$i], peaks$y.hat[peaks$i], col="Red", pch=19, cex=1.25)
}

Como el fpeaks enfoque que he mencionado en mi pregunta original, este enfoque requiere también de una buena parte de la optimización. Yo no sé la respuesta "correcta" (es decir, el número de sílabas/picos) en esto, así que no estoy seguro de cómo definir una regla de decisión.

par(mfrow=c(3,1))
test(ms[,1], ms[,2], 2, 0.01)
test(ms[,1], ms[,2], 2, 0.045)
test(ms[,1], ms[,2], 2, 0.05)

enter image description here

En este punto, fpeaks parece un poco menos complicado para mí, pero aún no es satisfactoria.

1voto

user17493.bis Puntos 1

He tenido problemas similares a analizar electroforesis de proteínas perfiles. He resuelto mediante la aplicación de algunas de las funciones de la msprocess paquete de R en el segundo derivados de los perfiles (ver https://fr.wikipedia.org/wiki/D%C3%A9pouillement_d'une_courbe#Position_et_hauteur_du_pic). Esto ha sido publicado aquí: http://onlinelibrary.wiley.com/doi/10.1111/1755-0998.12389/abstract;jsessionid=8EE0B64238728C0979FF71C576884771.f02t03

No tengo idea de si es similar solución puede trabajar para usted. Buena suerte

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X