ตรวจจับจำนวนของจุดสูงสุดในการบันทึกเสียง


12

ฉันกำลังพยายามหาวิธีตรวจสอบจำนวนพยางค์ในคลังเสียงของการบันทึกเสียง ฉันคิดว่าพร็อกซีที่ดีอาจเป็นจุดสูงสุดในไฟล์ wave

นี่คือสิ่งที่ฉันลองด้วยไฟล์ที่ฉันพูดเป็นภาษาอังกฤษ (กรณีการใช้งานจริงของฉันคือ Kiswahili) หลักฐานของการบันทึกตัวอย่างนี้คือ: "นี่คือฉันพยายามใช้ฟังก์ชั่นตัวตั้งเวลาฉันกำลังดูหยุดชั่วคราวการเปล่งเสียง" ในบทนี้มีทั้งหมด 22 พยางค์

ไฟล์ wav: https://www.dropbox.com/s/koqyfeaqge8t9iw/test.wav?dl=0

seewaveแพคเกจในการวิจัยเป็นสิ่งที่ดีและมีฟังก์ชั่นที่มีศักยภาพหลาย ก่อนอื่นให้นำเข้าไฟล์คลื่น

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

สิ่งแรกที่ฉันลองคือtimer()ฟังก์ชั่น หนึ่งในสิ่งที่มันกลับมาคือระยะเวลาของการเปล่งเสียงแต่ละครั้ง ฟังก์ชั่นนี้ระบุ 7 vocalizations ซึ่งสั้นกว่า 22 พยางค์ พล็อตเรื่องย่อแสดงให้เห็นว่าการเปล่งเสียงไม่ได้มีพยางค์เท่ากัน

t <- timer(w, threshold=2, msmooth=c(400,90), dmin=0.1)
length(t$s)
# [1] 7

ป้อนคำอธิบายรูปภาพที่นี่

ฉันลองใช้ฟังก์ชั่น fpeaks โดยไม่ตั้งค่าขีด จำกัด มันคืน 54 ยอด

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

ป้อนคำอธิบายรูปภาพที่นี่

พล็อตนี้มีความกว้างตามความถี่มากกว่าเวลา การเพิ่มพารามิเตอร์ threshold เท่ากับ 0.005 กรองสัญญาณรบกวนและลดจำนวนถึง 23 พีคซึ่งค่อนข้างใกล้เคียงกับจำนวนพยางค์ที่แท้จริง (22)

ป้อนคำอธิบายรูปภาพที่นี่

ฉันไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุด ผลลัพธ์จะมีความอ่อนไหวต่อค่าของพารามิเตอร์ threshold และฉันต้องประมวลผลไฟล์ชุดใหญ่ แนวคิดที่ดีกว่าเกี่ยวกับวิธีการเขียนโค้ดนี้เพื่อตรวจหาจุดสูงสุดที่เป็นตัวแทนของพยางค์?


2
นี่เป็นคำถามที่น่าสนใจมาก แต่คุณอาจจะได้รับความช่วยเหลือที่ดีขึ้นเกี่ยวกับวิธีการมากกว่าที่กองแลกเปลี่ยนการประมวลผลสัญญาณ Q & ไซต์
eipi10

โอเคขอบคุณ. จะตรวจสอบว่าไม่มีใครตอบ ชื่นชมมาก
Eric Green

แค่ความคิด แต่มันจะคุ้มค่าหรือไม่ที่จะต้องพิจารณาวิเคราะห์จุดเปลี่ยน ? การวิเคราะห์สามารถดำเนินการได้อย่างง่ายดายในRด้วยการใช้changepointแพคเกจ พูดง่ายๆคือการวิเคราะห์จุดเปลี่ยนมุ่งเน้นไปที่การตรวจจับการเปลี่ยนแปลงตัวอย่างที่เชื่อมโยงนั้นเกี่ยวข้องกับข้อมูลการค้า แต่น่าสนใจที่จะใช้เทคนิคนี้กับข้อมูลเสียง
Konrad

ฉันจะยอมรับคำตอบที่มีคะแนนโหวตมากที่สุดซึ่งเป็นความพยายามของฉันในการนำแนวคิด CV อื่นมาใช้ ฉันคิดว่าคำถามหลักยังคงอยู่: วิธีการใช้คุณสมบัติของการบันทึกเพื่อตรวจสอบยอดเขาที่สอดคล้องกับจำนวนพยางค์ที่พูดได้อย่างแม่นยำ ขอบคุณสำหรับความคิดทั้งหมด ฉันจะโพสต์กลับมาที่นี่เมื่อฉันมีทางออก
Eric Green

คำตอบ:


5

ฉันไม่คิดว่าสิ่งต่อไปนี้เป็นทางออกที่ดีที่สุด แต่ @ eipi10 มีคำแนะนำที่ดีที่จะตรวจสอบคำตอบเกี่ยวกับเรื่องนี้ CrossValidated ดังนั้นฉันทำ

วิธีการทั่วไปคือการทำให้ข้อมูลราบรื่นขึ้นจากนั้นหาจุดสูงสุดโดยการเปรียบเทียบตัวกรองสูงสุดในพื้นที่กับความราบรื่น

ขั้นตอนแรกคือการสร้างargmaxฟังก์ชั่น:

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)
}

ค่าส่งคืนรวมถึงอาร์กิวเมนต์ของ maxima ท้องถิ่น (x) - ซึ่งตอบคำถาม - และดัชนีลงใน x- และ y-arrays ซึ่ง maxima ท้องถิ่นเหล่านั้นเกิดขึ้น (i)

ฉันทำการแก้ไขเล็กน้อยกับtestฟังก์ชันการลงจุด: (a) เพื่อกำหนด x และ y และ (b) อย่างชัดเจนเพื่อแสดงจำนวนจุดสูงสุด:

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)
}

เช่นเดียวกับfpeaksวิธีการที่ฉันพูดถึงในคำถามเดิมของฉันวิธีการนี้ต้องใช้การปรับแต่งอย่างมาก ฉันไม่ทราบคำตอบ "ถูกต้อง" (เช่นจำนวนพยางค์ / จุดสูงสุด) ในเรื่องนี้ดังนั้นฉันไม่แน่ใจว่าจะกำหนดกฎการตัดสินใจอย่างไร

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)

ป้อนคำอธิบายรูปภาพที่นี่

ณ จุดนี้fpeaksดูเหมือนจะซับซ้อนน้อยกว่าฉัน แต่ก็ยังไม่พอใจ


อาจไม่น่าพอใจเนื่องจากพารามิเตอร์เหลืองของคุณไม่ได้ปรับให้เรียบพอ ตัวเลือกของความราบรื่นจะต้องได้รับคำแนะนำจากธรรมชาติของข้อมูลและวัตถุประสงค์; ไม่ใช่สิ่งที่จะถูกทิ้งให้อยู่กับสิ่งใดก็ตามที่เสนอโดยแพลตฟอร์มการคำนวณและค่าเริ่มต้นที่จัดหาให้
whuber

สิ่งเหล่านี้ไม่ใช่ค่าเริ่มต้น เพียงแค่ตัวอย่าง ฉันงงงวยกับความท้าทายที่ยิ่งใหญ่กว่าของการเรียนรู้ที่ไม่มีผู้ดูแลในกรณีนี้ ฉันไม่ทราบจำนวนพยางค์ในการบันทึกดังนั้นฉันไม่แน่ใจว่าจะปรับไฟล์เป็นกลุ่มได้อย่างไร พารามิเตอร์คงที่อาจไม่สมเหตุสมผล แต่ฉันไม่แน่ใจว่าจะตั้งกฎการตัดสินใจอื่นได้อย่างไร (เช่นตัวชี้วัดอื่นของคลื่นที่สามารถใช้เพื่อกำหนดค่าที่เหมาะสมที่สุดสำหรับพารามิเตอร์เหล่านี้) ฉันคิดว่าฉันต้องสร้างชุดฝึกอบรมที่ช่วยอัลกอริทึมในการตั้งค่าพารามิเตอร์เหล่านี้ ไม่แน่ใจว่า
Eric Green

ในคำสั่งของคุณถึงloessฉันไม่เห็นข้อโต้แย้งใด ๆ ที่ชัดเจนสำหรับระดับความราบรื่น จริงๆแล้วมันมีจุดเล็กน้อยที่จะวิ่งผ่านหน้าต่างที่มีการเคลื่อนไหวซึ่งมันทำภายในแล้ว
whuber

ฉันเห็นประเด็นของคุณ ฉันคิดว่านั่นwเป็นข้อโต้แย้งในการทำให้เรียบ นี่คือวิธีที่ผู้เขียนโซลูชันดั้งเดิมอธิบายถึงฟังก์ชั่น: "มีพารามิเตอร์สองตัวที่จะปรับตามสถานการณ์: w คือความกว้างครึ่งหนึ่งของหน้าต่างที่ใช้ในการคำนวณค่าสูงสุดในท้องถิ่น ... อื่น ๆ - ไม่ชัดเจนในเรื่องนี้ รหัส - คือการโต้แย้งการช่วงชิงของเรียบเนียนขึ้น "
Eric Green

ผู้เขียนคนนั้นรวมwเป็นหนึ่งในพารามิเตอร์เพราะเขามีวิธีการทั่วไปที่เรียบเนียนอาจไม่เหลือง แต่อาจจะเป็นค่ามัธยฐานของหน้าต่างหรือ Hanning หรือสิ่งอื่น ๆ ที่เหมาะสมกับพฤติกรรมทางสถิติของข้อมูลและ วัตถุประสงค์ของนักวิเคราะห์ คุณสมบัติของเครื่องปรับเรียบหลายชนิดนั้นขึ้นอยู่กับความกว้างของหน้าต่าง
whuber

1

ฉันมีปัญหาคล้ายกันในการวิเคราะห์โพรไฟล์อิเลคโตรโฟรีซิสโปรตีน ฉันแก้ไขพวกเขาโดยใช้ฟังก์ชั่นบางอย่างของแพ็คเกจ msprocess R ในส่วนที่สองของโปรไฟล์ (ดูhttps://fr.wikipedia.org/wiki/D%C3%A9pouillement_d 'une_courbe # Position_et_hauteur_du_pic) สิ่งนี้ได้รับการเผยแพร่ที่นี่: http://onlinelibrary.wiley.com/doi/10.1111/1755-0998.12389/abstract;jsessionid=8EE0B64238728C0979FF71C576884771.f02t03

ฉันไม่รู้ว่าโซลูชันที่คล้ายกันนี้สามารถทำงานให้คุณได้หรือไม่ โชคดี


ขอบคุณ @ user17493.bis รุ่งโรจน์ถึงคุณสำหรับการเผยแพร่ด้วยวัสดุเสริม จะทำให้ง่ายขึ้นมากสำหรับฉันที่จะลองทำตามแนวคิดนี้!
Eric Green

0

นี่คือห้องสมุดใน Python ที่ฉันใช้ก่อนหน้านี้ในขณะที่พยายามประเมินช่วงเวลาโดยการหาจุดสูงสุดในฟังก์ชั่นความสัมพันธ์อัตโนมัติ

มันใช้ความแตกต่างลำดับแรก / อนุพันธ์ไม่ต่อเนื่องสำหรับการตรวจจับสูงสุดและรองรับการปรับแต่งตามเกณฑ์และระยะทางขั้นต่ำ (ระหว่างยอดต่อเนื่อง) พารามิเตอร์ ท่านสามารถปรับปรุงความละเอียดสูงสุดโดยใช้การประมาณความหนาแน่นของเกาส์เซียนและการประมาณค่า (ดูลิงค์)

มันทำงานได้ค่อนข้างดีนอกกรอบสำหรับฉันโดยไม่ต้องปรับแต่งมากแม้แต่ข้อมูลที่มีเสียงดัง ให้มันลอง.


ขอบคุณ @ tool.ish ดูเหมือนเป็นทางเลือกที่ดีสำหรับวิธีการ R ที่ฉันอ้างถึง ฉันคิดว่าฉันยังคงมีความท้าทายในการจูนอย่างไรก็ตาม
Eric Green

0

ฉันอยากจะแนะนำวิธีการแก้ปัญหาการใช้changepointแพคเกจ ตัวอย่างแบบง่าย ๆ ด้านล่างพยายามระบุจุดสูงสุดที่นี่เป็นจุดเปลี่ยนแปลงโดยดูที่ช่องหนึ่งจากข้อมูลที่มี

ตัวอย่าง

การจัดหาข้อมูล

# Libs
library(seewave)
library(tuneR)

# Download
tmpWav <- tempfile(fileext = ".wav")
download.file(url = "https://www.dropbox.com/s/koqyfeaqge8t9iw/test.wav?dl=0",
              destfile = tmpWav)

# Read
w <- readWave(filename = tmpWav)

การเตรียมข้อมูล

# Libs
require(changepoint)

# Create time series data for one channel as an example
leftTS <- ts(data = w@left)

## Preview
plot.ts(leftTS)

แผนภูมิที่สร้างผ่านการplot.tsโทร: ช่องเป็นอนุกรมเวลา

การวิเคราะห์จุดเปลี่ยน

changepointแพคเกจให้จำนวนของตัวเลือกสำหรับการระบุการเปลี่ยนแปลง / ยอดในข้อมูล โค้ดด้านล่างเป็นเพียงตัวอย่างง่ายๆในการค้นหา3จุดสูงสุดโดยใช้วิธีBinSeg :

# BinSeg method (example)
leftTSpelt <- cpt.var(data = leftTS, method = "BinSeg", penalty = "BIC", Q = 3)
## Preview
plot(leftTSpelt, cpt.width = 3)

แผนภูมิที่ได้รับ: บางจุดเปลี่ยน นอกจากนี้ยังสามารถรับค่า:

cpts(leftTSpelt)
[1]  89582 165572 181053

หมายเหตุด้านข้าง

ตัวอย่างที่ให้ไว้ส่วนใหญ่เกี่ยวข้องกับการแสดงวิธีการวิเคราะห์การเปลี่ยนแปลงจุดสามารถนำไปใช้กับข้อมูลที่ให้ไว้; ควรใช้ความระมัดระวังด้วยความเคารพต่อพารามิเตอร์ที่ส่งผ่านไปยังcp.varฟังก์ชัน คำอธิบายโดยละเอียดเกี่ยวกับบรรจุภัณฑ์และฟังก์ชั่นการใช้งานที่มีให้ในบทความต่อไปนี้:

Killick, Rebecca และ Eckley, Idris (2014) changepoint: แพ็คเกจ R สำหรับการวิเคราะห์ changepoint วารสารซอฟต์แวร์เชิงสถิติ, 58 (3) หน้า 1-19

ecp

ecpเป็นอีกหนึ่งมูลค่าการกล่าวขวัญRแพ็คเกจ ecpอำนวยความสะดวกในการดำเนินการไม่ใช่ตัวแปรการวิเคราะห์จุดเปลี่ยนแปลงหลายตัวแปรซึ่งอาจจะเป็นประโยชน์ถ้าคนที่ต้องการที่จะระบุจุดเปลี่ยนแปลงที่เกิดขึ้นในหลายช่องทาง


ขอบคุณ @ Konrad ฉันไม่รู้เกี่ยวกับแพ็คเกจใดเลยขอบคุณที่สละเวลาในการสาธิต ฉันคิดว่าความท้าทายพื้นฐานที่ฉันมีกับแพ็คเกจเหล่านี้คือฉันไม่รู้ว่ามียอดเขามากแค่ไหนที่จะมองหาดังนั้นฉันไม่แน่ใจว่าจะปรับพารามิเตอร์ได้อย่างไร สิ่งนี้ยังดูเหมือนว่าสถานการณ์ที่ฉันต้องใช้อัลกอริทึมเพื่อกำหนดวิธีการตั้งค่าพารามิเตอร์เพื่อระบุจำนวนพีคที่ถูกต้อง (เช่นพยางค์) ให้ถูกต้อง
Eric Green

@EricGreen ในขั้นต้นการวิเคราะห์จุดเปลี่ยนจะช่วยให้คุณระบุยอดของคุณเพียงแค่ดูการกระจาย มันจะเป็นเรื่องของการใช้วิธีการลงโทษที่เหมาะสมและอื่น ๆ ฉันขอแนะนำให้คุณดูที่เว็บไซต์ที่เชื่อมโยงในความคิดเห็นก่อนหน้าของฉันเพราะมันแสดงกระบวนการในรายละเอียด
Konrad

ฉันไม่แน่ใจว่าคุณหมายถึงการกระจายดวงตาหรือเปล่า ฉันมีไฟล์ 2,000 ไฟล์และต้องการวิธีการนี้โดยอัตโนมัติ แม้ว่าฉันจะตรวจสอบแต่ละไฟล์ฉันก็พบว่ามันยากที่จะเห็นจำนวนพยางค์ว่าเป็นยอดเขา บางทีฉันอาจจะหนาแน่นและฉันจะได้เห็นข้อดีของวิธีนี้ ฉันยังคงต้องใช้วิธีปรับพารามิเตอร์ของแต่ละไฟล์โดยอัตโนมัติดังนั้นจำนวนยอดที่ตรวจพบนั้นเป็นพร็อกซีที่ถูกต้องสำหรับจำนวนพยางค์
Eric Green

@EricGreen ไม่ไม่ใช่วรรณกรรมแน่นอน หากคุณเข้าใจพารามิเตอร์ที่เหมาะสมซึ่งควรส่งผ่านไปยังหนึ่งในฟังก์ชันcptคุณจะสามารถเรียกใช้ข้ามวัตถุจำนวนเท่าใดก็ได้ เนื่องจากฉันไม่มีความเชี่ยวชาญด้านภาษาศาสตร์ฉันไม่รู้ว่าพยางค์จะสอดคล้องกับยอดเขาปกติที่สังเกตได้จากข้อมูลอนุกรมเวลาหรือไม่
Konrad

gotcha ฉันคิดว่าฉันสะดุดขั้นตอน "หาพารามิเตอร์ที่เหมาะสม" สำหรับกรณีการใช้งานเฉพาะนี้ แต่ฉันชื่นชมความคิดทั้งหมดและเรียนรู้เกี่ยวกับแพ็คเกจใหม่สองสามตัวที่อาจเป็นทางเลือกที่ดีสำหรับสิ่งที่ฉันได้ลอง
Eric Green
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.