Estou tentando descobrir como detectar o número de sílabas em um corpus de gravações de áudio. Eu acho que um bom proxy pode ter picos no arquivo wave.
Aqui está o que eu tentei com um arquivo meu falando em inglês (meu caso de uso real é em kiswahili). A transcrição deste exemplo de gravação é: "Sou eu tentando usar a função timer. Estou olhando para pausas, vocalizações". Há um total de 22 sílabas nesta passagem.
arquivo wav: https://www.dropbox.com/s/koqyfeaqge8t9iw/test.wav?dl=0
O seewave
pacote em R é ótimo e existem várias funções em potencial. Primeiramente, importe o arquivo 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
A primeira coisa que tentei foi a timer()
função. Uma das coisas que retorna é a duração de cada vocalização. Esta função identifica 7 vocalizações, o que está muito aquém de 22 sílabas. Uma rápida olhada na trama sugere que as vocalizações não são iguais às sílabas.
t <- timer(w, threshold=2, msmooth=c(400,90), dmin=0.1)
length(t$s)
# [1] 7
Eu também tentei a função fpeaks sem definir um limite. Ele retornou 54 picos.
ms <- meanspec(w)
peaks <- fpeaks(ms)
Isso representa a amplitude por frequência e não por tempo. A adição de um parâmetro de limite igual a 0,005 filtra o ruído e reduz a contagem para 23 picos, o que é bem próximo do número real de sílabas (22).
Não sei se essa é a melhor abordagem. O resultado será sensível ao valor do parâmetro threshold, e eu tenho que processar um grande lote de arquivos. Alguma idéia melhor sobre como codificar isso para detectar picos que representam sílabas?
changepoint
embalagem. Simplificando, a análise do ponto de mudança se concentra na detecção de alterações, o exemplo vinculado se refere aos dados comerciais, mas pode ser interessante aplicar essa técnica aos dados sólidos.