Saya mencoba mencari cara untuk mendeteksi jumlah suku kata dalam korpus rekaman audio. Saya pikir proxy yang baik mungkin adalah puncak dalam file wave.
Inilah yang saya coba dengan file saya berbicara dalam bahasa Inggris (kasus penggunaan saya yang sebenarnya adalah dalam Kiswahili). Transkrip rekaman contoh ini adalah: "Ini saya mencoba menggunakan fungsi timer. Saya sedang melihat jeda, vokalisasi." Ada total 22 suku kata dalam bagian ini.
file wav: https://www.dropbox.com/s/koqyfeaqge8t9iw/test.wav?dl=0
The seewave
paket di R besar, dan ada beberapa fungsi yang potensial. Pertama-tama, impor file 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
Hal pertama yang saya coba adalah timer()
fungsinya. Salah satu hal yang dikembalikan adalah durasi setiap vokalisasi. Fungsi ini mengidentifikasi 7 vokalisasi, yang jauh dari 22 suku kata. Melihat sekilas plot menunjukkan bahwa vokalisasi tidak sama dengan suku kata.
t <- timer(w, threshold=2, msmooth=c(400,90), dmin=0.1)
length(t$s)
# [1] 7
Saya juga mencoba fungsi fpeaks tanpa menetapkan ambang batas. Ini mengembalikan 54 puncak.
ms <- meanspec(w)
peaks <- fpeaks(ms)
Ini plot amplitudo oleh frekuensi daripada waktu. Menambahkan parameter ambang sama dengan 0,005 menyaring kebisingan dan mengurangi jumlah hingga 23 puncak, yang cukup dekat dengan jumlah suku kata yang sebenarnya (22).
Saya tidak yakin ini adalah pendekatan terbaik. Hasilnya akan peka terhadap nilai parameter ambang, dan saya harus memproses banyak file. Adakah ide yang lebih baik tentang cara membuat kode ini untuk mendeteksi puncak yang mewakili suku kata?
sumber
changepoint
paket. Sederhananya, analisis titik perubahan berfokus pada mendeteksi perubahan, contoh terkait terkait dengan data perdagangan tetapi mungkin menarik untuk menerapkan teknik ini pada data yang sehat.Jawaban:
Saya tidak berpikir apa yang berikut ini adalah solusi terbaik, tetapi @ eipi10 punya saran bagus untuk memeriksa jawaban ini di CrossValidated . Jadi saya lakukan.
Langkah pertama adalah membuat
argmax
fungsi:Saya membuat sedikit modifikasi pada
test
fungsi plot: (a) untuk secara eksplisit mendefinisikan x dan y dan (b) untuk menunjukkan jumlah puncak:Seperti
fpeaks
pendekatan yang saya sebutkan dalam pertanyaan awal saya, pendekatan ini juga membutuhkan banyak penyesuaian. Saya tidak akan tahu jawaban "benar" (yaitu, jumlah suku kata / puncak) yang masuk ke ini, jadi saya tidak yakin bagaimana mendefinisikan aturan keputusan.Pada titik ini
fpeaks
tampaknya sedikit kurang rumit bagi saya, tetapi masih belum memuaskan.sumber
loess
, saya tidak melihat argumen yang diberikan secara eksplisit untuk tingkat perataan. Sebenarnya, ada sedikit gunanya lari loess di atas jendela yang bergerak: sudah melakukan itu secara internal.w
adalah argumen dalam smoothing. Ini adalah bagaimana penulis solusi asli menggambarkan fungsi: "Ada dua parameter yang harus disesuaikan dengan keadaan: w adalah setengah-lebar dari jendela yang digunakan untuk menghitung maksimum lokal ... Lainnya - tidak eksplisit dalam hal ini kode - adalah argumen rentang dari loess yang lebih halus. "w
sebagai salah satu parameter karena ia memikirkan pendekatan yang sangat umum di mana yang lebih halus mungkin tidak loess tetapi mungkin akan menjadi median berjendela, atau Hanning, atau apa pun yang dianggap sesuai untuk perilaku statistik dari data dan tujuan analis. Sifat banyak smoothers itu akan tergantung pada lebar jendela.Saya memiliki masalah serupa untuk menganalisis profil elektroforesis protein. Saya memecahkannya dengan menerapkan beberapa fungsi dari paket msprocess R pada turunan kedua dari profil (lihat https://fr.wikipedia.org/wiki/D%C3%A9pouillement_d 'une_courbe # Position_et_hauteur_du_pic). Ini telah diterbitkan di sini: http://onlinelibrary.wiley.com/doi/10.1111/1755-0998.12389/abstract;jsessionid=8EE0B64238728C0979FF71C576884771.f02t03
Saya tidak tahu apakah solusi serupa dapat bekerja untuk Anda. Semoga berhasil
sumber
Berikut ini adalah perpustakaan di Python yang saya gunakan sebelumnya ketika mencoba memperkirakan periodisitas dengan menemukan puncak dalam fungsi autokorelasi.
Ini menggunakan orde pertama perbedaan / turunan diskrit untuk deteksi puncak dan mendukung penyetelan oleh ambang dan jarak minimum (antara puncak berurutan) parameter. Seseorang juga dapat meningkatkan resolusi puncak menggunakan estimasi kepadatan Gaussian dan interpolasi (lihat tautan).
Ini bekerja sangat baik di luar kotak bagi saya tanpa banyak mengutak-atik, bahkan untuk data yang berisik. Cobalah.
sumber
Saya ingin menyarankan solusi memanfaatkan
changepoint
paket. Contoh sederhana di bawah ini berupaya mengidentifikasi puncak, yang didefinisikan di sini sebagai titik perubahan dengan melihat satu saluran dari data yang tersedia.Contoh
Sumber data
Persiapan data
Bagan yang dihasilkan melalui
plot.ts
panggilan:Analisis titik perubahan
The
changepoint
paket menyediakan sejumlah pilihan untuk mengidentifikasi perubahan / puncak dalam data. Kode di bawah ini hanya memberikan contoh sederhana untuk menemukan 3 puncak menggunakan metode BinSeg :Bagan yang diperoleh: Dimungkinkan juga untuk mendapatkan nilai:
Catatan samping
Contoh yang diberikan sebagian besar berkaitan dengan menggambarkan bagaimana analisis titik perubahan dapat diterapkan pada data yang disediakan; hati-hati harus dilakukan sehubungan dengan parameter yang diteruskan ke
cp.var
fungsi. Penjelasan rinci tentang paket dan fungsionalitas yang tersedia diberikan dalam makalah berikut:Killepoint Killick, Rebecca and Eckley, Idris (2014) : paket R untuk analisis changepoint. Jurnal Perangkat Lunak Statistik, 58 (3). hlm. 1-19.
ecp
ecp
, Adalah paket R yang layak disebut . Fasilitasecp
memfasilitasi melakukan analisis titik perubahan multivariat non-parametrik, yang mungkin berguna jika orang ingin mengidentifikasi titik perubahan yang terjadi di berbagai saluran.sumber