Tôi đang cố gắng tìm ra cách phát hiện số lượng âm tiết trong một bản ghi âm. Tôi nghĩ rằng một proxy tốt có thể là đỉnh trong tệp sóng.
Đây là những gì tôi đã thử với một tập tin tôi nói bằng tiếng Anh (trường hợp sử dụng thực tế của tôi là bằng tiếng Kiswaya). Bảng điểm của bản ghi ví dụ này là: "Đây là tôi đang cố gắng sử dụng chức năng hẹn giờ. Tôi đang xem tạm dừng, phát âm." Có tổng cộng 22 âm tiết trong đoạn văn này.
tập tin wav: https://www.dropbox.com/s/koqyfeaqge8t9iw/test.wav?dl=0
Các seewave
gói vào R là rất tốt, và có một số chức năng tiềm năng. Điều đầu tiên trước tiên, nhập tệp sóng.
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
Điều đầu tiên tôi đã thử là timer()
chức năng. Một trong những điều nó trả về là thời lượng của mỗi lần phát âm. Chức năng này xác định 7 cách phát âm, thiếu 22 âm tiết. Nhìn nhanh vào cốt truyện cho thấy rằng cách phát âm không bằng các âm tiết.
t <- timer(w, threshold=2, msmooth=c(400,90), dmin=0.1)
length(t$s)
# [1] 7
Tôi cũng đã thử chức năng fpeaks mà không đặt ngưỡng. Nó đã trả lại 54 đỉnh.
ms <- meanspec(w)
peaks <- fpeaks(ms)
Âm mưu này biên độ theo tần số chứ không phải thời gian. Thêm một tham số ngưỡng bằng 0,005 lọc tiếng ồn và giảm số đếm xuống còn 23 đỉnh, khá gần với số lượng âm tiết thực tế (22).
Tôi không chắc đây là cách tiếp cận tốt nhất. Kết quả sẽ nhạy cảm với giá trị của tham số ngưỡng và tôi phải xử lý một lô tệp lớn. Bất kỳ ý tưởng tốt hơn về cách mã hóa này để phát hiện các đỉnh đại diện cho âm tiết?
changepoint
gói. Nói một cách đơn giản, phân tích điểm thay đổi tập trung vào việc phát hiện thay đổi, ví dụ được liên kết có liên quan đến dữ liệu thương mại nhưng thật thú vị khi áp dụng kỹ thuật này vào dữ liệu âm thanh.