ระบุตำแหน่งที่การร้องเพลงเริ่มต้นในการบันทึกด้วยเสียงเท่านั้น


14

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

ฉันกำลังมองหาวิธีที่มีประสิทธิภาพที่สุดในการตรวจสอบว่าที่ใดในการบันทึกของฉันที่ผู้ใช้เริ่มต้นและสิ้นสุดการร้องเพลงบรรทัดที่ 1 เริ่มต้นและสิ้นสุดการร้องเพลงบรรทัดที่ 2 เป็นต้น

ฉันได้วนเวียนอัลกอริทึมแบบง่ายๆที่ทำงานเมื่อมีสัญญาณรบกวนพื้นหลังน้อยมากในการบันทึก (เช่นจะเกิดขึ้นเมื่อไหร่?) แต่มันตกไปเป็นชิ้นเล็กชิ้นน้อยต่อหน้าเสียงที่เล็กที่สุด

ใครช่วยชี้ให้ฉันดูสิ่งที่แข็งแกร่งกว่านี้ได้ไหม


คำตอบของฉันอาจช่วยคุณได้ - dsp.stackexchange.com/a/1543/440
Dipan Mehta

ในการบันทึกเสียงบางเสียงเป็นเครื่องมือเดียวที่เล่นกับแอมพลิจูดเดียวกันในทั้งสองช่อง คุณสามารถใช้ข้อมูลนี้เพื่อแยกเสียงออกจากการบันทึกแบบสเตอริโอ
Jader Dias

คำตอบ:


4

หากเสียงพื้นหลังเป็นสีขาว - ไอคุณสามารถวัดความเรียบของสเปกตรัมและพิจารณาว่าเป็นเสียงเมื่อแอมพลิจูดอยู่เหนือขีด จำกัด บางส่วนและความเรียบของสเปกตรัมต่ำกว่าขีด จำกัด บางส่วน

โดยทั่วไปคุณเพียงแค่ใช้ FFT ของสัญญาณอันหนึ่งแล้วแบ่งค่าเฉลี่ยเรขาคณิตของขนาดของสเปกตรัมด้วยค่าเฉลี่ยเลขคณิต

คุณสามารถใช้ตัวกรองแบนด์ - พาสเพื่อเน้นเฉพาะบริเวณความถี่ที่เสียงของมนุษย์มักจะอยู่ (ง่ายเหมือนกับการตั้งค่าภูมิภาคที่ไม่ต้องการของ FFT เป็น 0 ก่อนที่จะวัดความแบนของสเปกตรัม)


Endolith จากประสบการณ์ของคุณมันสร้างความแตกต่างอย่างมากหรือไม่ถ้าคุณใช้ขนาดกำลังสองเทียบกับขนาดก่อนที่คุณจะวัดความเรียบของสเปกตรัม?
Spacey

@ Mohammad: ฉันไม่มีประสบการณ์กับมัน :) ฉันถามคำถามก่อนหน้านี้เพราะฉันไม่เข้าใจข้อมูลจำเพาะและฉันยังไม่แน่ใจว่าวิธีการใดที่ถูกต้อง ฉันไม่คิดว่ากำลังสองสร้างความแตกต่างในทางปฏิบัติใด ๆ หากคุณเพิ่งเรียกเมื่อผ่านเกณฑ์ก็ควรตอบสนองเหมือนกันว่ากำลังสองหรือไม่ (สมมติว่าคุณปรับเกณฑ์ที่จะจับคู่) ดังนั้นขนาดเพียงอย่างเดียวถูกกว่าการคำนวณ
endolith

@Endolith นี่เป็นช็อตเล็กน้อย: คุณรู้วิธีนำแนวทางนี้มาใช้ใน matlab หรือไม่? ฉันต้องการทดสอบวิธีการทั้งหมดที่กล่าวถึงใน MATLAB (ระดับแปดเสียงจริง) เพื่อดูว่าวิธีใดดีที่สุด
Mike Hogan

@MikeHogan: ไม่ฉันไม่ได้ใช้ matlab มานานแล้ว : / ที่ยังต้องทำงานจริง :) ฉันไม่มีอะไรเขียนไว้ล่วงหน้า แบ่งสัญญาณเป็นชิ้นเล็ก ๆ ทำ FFT ของแต่ละคนและแต่ละ FFT แบ่งค่าเฉลี่ยทางเรขาคณิตของขนาดด้วยค่าเฉลี่ยเลขคณิตของขนาด ตัวเลขที่สูงขึ้นจะมีเสียงดังตัวเลขที่ต่ำกว่าจะเป็นโทนเสียง
endolith

3

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

ซึ่งหมายความว่า spectrogram ของคุณเป็นเมทริกซ์ แต่ละคอลัมน์แสดงค่าสัมบูรณ์ของ FFT หนึ่ง snap-shot ในเวลาที่สัญญาณของคุณและแต่ละแถวแสดงให้เห็นว่าพลังงานจากวงดนตรีหนึ่งเปลี่ยนแปลงตลอดเวลา

ตอนนี้รับความแตกต่างของคอลัมน์ นั่นคือใช้คอลัมน์แล้วลบออกจากคอลัมน์ก่อนหน้าและทำสำหรับคอลัมน์ทั้งหมด (ออกจากคอลัมน์เริ่มต้นเพียงอย่างเดียวอย่างเห็นได้ชัด) จากนั้นรวมวงทั้งหมด นั่นคือเพียงรวมผลรวมของแถวทั้งหมดเข้าด้วยกัน

คุณจะจบลงด้วยสัญญาณ 1-D ที่ codifies สัญญาณของคุณonsets สิ่งนี้จะบอกคุณว่าเสียงของคุณเริ่มต้นที่ใด

แก้ไข:

ตอนนี้คุณได้ตรวจพบ onsets ถ้าคุณต้องการตรวจจับสิ่งที่ตรงกันข้าม (นั่นคือเมื่อสัญญาณไปจากไม่มีกิจกรรมใด ๆ ) ฟลักซ์สเปกตรัมจะให้ข้อมูลนั้นแก่คุณ ไม่ว่าคุณจะมีอาการเมื่อใดคุณจะมีจุดสูงสุดเป็นบวกและทุกที่ที่คุณมี 'deset' (หากไม่มีคำพูดที่ดีกว่า) คุณก็จะมีจุดสูงสุดเป็นลบ

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


Mohammad คุณหมายถึงอะไรโดย "row"?
Mike Hogan

@MikeHogan โปรดดูการแก้ไขของฉันฉันเขียนคำตอบอีกครั้ง
Spacey

สิ่งนี้จะไม่พบกับสิ่งใดเลยใช่ไหม เสียงกลองหรือเสียงหุนหันอื่น ๆ ก็จะถูกตรวจจับเช่นกัน มันไม่ได้แยกความแตกต่างระหว่างเสียงวรรณยุกต์กับเสียงที่มีเสียงดัง
endolith

@ endolith คุณยกจุดดี - แต่ฉันเชื่อว่ามันอาจยังคงทำงาน เหตุผลของฉันคือในสถานการณ์นี้คุณอยู่ในสถานะเสียง + เพลงหรืออยู่ในสถานะดนตรี ดังนั้นเมื่อคำนวณฟลักซ์สเปกตรัมคุณก็แค่คำนวณเดลต้าระหว่างเสียง + เพลงและเพลง (แน่นอนฉันจะต้องวิเคราะห์มันให้มากขึ้น แต่นั่นเป็นวิธีที่ฉันคิดตอนนี้) :-P
Spacey

1
@endolith ฉันเพิ่งอ่านอีกครั้งและ OP กำลังบอกว่ามีเพียงเสียง (เห็นได้ชัดว่ามันเป็นแอพที่เรียบง่าย) ดังนั้นในกรณีนี้มันจะเป็นเพียงเสียง VS อะไร
Spacey

2

จากประสบการณ์ของผมผมจะพยายามมองเข้าไปในเมลความถี่-Cepstrum-ค่าสัมประสิทธิ์ (MFCCs) MFCC นั้นใช้งานง่ายถ้าคุณมี FFT และมีการใช้งานค่อนข้างบ่อยในการประมวลผลเสียง

ด้วย MFCCs คุณควรจะสามารถแยกแยะข้อมูลเสียงที่แท้จริงจากสัญญาณรบกวนได้


@endolith ลิงก์นั้นอยู่เหนือฉันอย่างสิ้นเชิง! คุณรู้หรือไม่เกี่ยวกับการใช้งานโอเพนซอร์ซที่ฉันสามารถดูหรือสูตรทีละขั้นตอนว่ามันทำงานอย่างไร
Mike Hogan

2

" สเปกตรัมการไหล " (หรือที่เรียกว่า "ความแตกต่างสเปกตรัม") เป็นวิธีการทั่วไปสำหรับ "การตรวจจับการโจมตี" โดยทั่วไปคุณใช้ลำดับ FFT ของสัญญาณและสรุปขนาดของความแตกต่างของที่เก็บ FFT จากตัวอย่างหนึ่งไปยังอีกตัวอย่างหนึ่ง "Onset" โดยทั่วไปจะแสดงด้วย "กระโดด" ที่สำคัญในค่านี้

Google "การตรวจจับการโจมตี" สำหรับแนวคิดอื่น ๆ


2

การใช้ฟลักซ์สเปกตรัมเพียงอย่างเดียวอาจก่อให้เกิดผลบวกปลอมสำหรับเสียงบางอย่างรวมทั้งตรวจจับเสียงร้องเพลง

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

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