วิธีตรวจจับที่ง่ายที่สุดในการเริ่มและหยุดซองจดหมายเสียง


43

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

ตัวอย่างเช่นถ้ามีคนบันทึกตัวเองพูด

Hi [some silence] My name is Bob [some silence] How are you?

ฉันต้องการทำคลิปเสียงสามคลิปจากนี้ หนึ่งที่กล่าวว่าHiหนึ่งที่กล่าวว่าและหนึ่งที่กล่าวว่าMy name is BobHow are you?

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

หากใครมีคำแนะนำใด ๆ เกี่ยวกับความดี แต่วิธีง่ายๆในการทำสิ่งนี้ก็คงจะดี สำหรับวัตถุประสงค์ของฉันการแก้ปัญหาสามารถเป็นพื้นฐานค่อนข้าง

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

ขอบคุณสำหรับความช่วยเหลือ!

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


แก้ไข 1

การตอบสนองยอดเยี่ยมจนถึงตอนนี้! แค่อยากจะอธิบายว่านี่ไม่ใช่เสียงสดและฉันจะเขียนอัลกอริธึมด้วยตัวเองใน C หรือ Objective-C ดังนั้นการแก้ปัญหาใด ๆ ที่ใช้ไลบรารีไม่ใช่ตัวเลือกจริงๆ


1
ดูเหมือนว่าคุณกำลังพยายามแบ่งมันโดยใช้ช่วงเวลาแห่งความเงียบเป็นจุดพัก ทำไมไม่ใช้เพียงแค่การกำหนดค่ากำลังไฟใหม่เพื่อกำหนด "ความเงียบ" และมีเวลาในการพิจารณาว่าระยะเวลานานพอที่จะเป็นการหยุดพักหรือไม่
Jim Clay

@JimClay ใช่นั่นคือสิ่งที่ฉันพยายามจะทำ ฉันไม่เคยได้ยินว่ามีการตีลังกา แต่ดูเหมือนว่าฉันจะใช้อะไรได้บ้าง มันซับซ้อนหรือไม่ คุณช่วยขยายความหน่อยได้ไหม?
Eric Brotto

@EricBrotto บางทีคุณควรบอกเราเล็กน้อยเกี่ยวกับความสามารถที่คุณมีในห้องสมุดของคุณ ที่จะช่วยให้เราสามารถนวดวิธีการที่แท้จริงให้คุณได้ดี
สเปซีย์

Approch สำหรับการตรวจสอบความเงียบนี้ดีกว่าสิ่งที่ควรเป็นระดับอื่นนอกเหนือจาก 0.05 x = wavread ('s1.wav'); i = 1; ในขณะที่ abs (x (i)) <0.05% การตรวจจับความเงียบ i = i + 1; สิ้นสุด x (1: i) = []; x (6000: 10000) = 0;
zeee

คำตอบ:


26

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

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

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

  1. แยกสัญญาณซองจดหมาย
  2. เลือกเกณฑ์ที่ดี
  3. ตรวจจับสถานที่ที่ขนาดซองจดหมายเกินเกณฑ์

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

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

{1,45,6,2,43,2}{1,45,6,2,43,2} สามารถทดลองได้และขึ้นอยู่กับหลาย ๆ อย่างเช่นอัตราการสุ่มตัวอย่างของคุณ

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


3
จริง ๆ แล้วฉันได้ใช้สิ่งนี้เป็นหนึ่งในปลั๊กอินใน good'ol winamp สิ่งที่คุณกำลังอธิบายนั้นดี แต่ไม่เพียงพอ โดยปกติจะมีเสียง (เสียงสระ) และเสียงที่ไม่ออกเสียง (พยัญชนะ) หากมีเสียงที่เปล่งออกมาเพียงอย่างเดียวสิ่งที่คุณกำลังอธิบายจะใช้ได้ - แต่เสียงที่ยังไม่ได้ออกเสียงเป็นพลังงานที่ต่ำมากและไม่สามารถแยกความแตกต่างจากเสียงทั่วไปได้ และไม่มีเสียงดังรบกวนนอกจากนี้ยังมีน้อยมากแม้ในสตูดิโอ
Dipan Mehta

วิธีการบรรลุในงูหลาม?
kRazzy R

26

สิ่งที่คุณต้องการทำจริง ๆ แล้วเรียกว่าการตรวจจับเสียงกิจกรรมหรือการตรวจจับคำพูด

โดยทั่วไปสัญญาณเสียงพูดที่บริสุทธิ์ (ซึ่งไม่มีเพลง) มีสามส่วน

  1. เสียงที่เปล่งออกมา - ซึ่งเกิดจากเสียงสระ
  2. เสียงที่ไม่ได้ออกเสียง - ซึ่งประกอบด้วยพยัญชนะ

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

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

มาถึงคำถามวิธีแก้ปัญหา:

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

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

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

มาตรฐาน G.729 คำนวณ VAD ตามคุณสมบัติเช่น: ความถี่สเปกตรัมเส้น, พลังงานเต็มวง, พลังงานต่ำแบนด์ (<1 kHz), และอัตราการข้ามศูนย์

มาตรฐาน GSM ใช้งานได้ดังต่อไปนี้ตัวเลือกที่ 1 คำนวณ SNR ในเก้าแบนด์และใช้เกณฑ์กับค่าเหล่านี้ ตัวเลือก 2 คำนวณพารามิเตอร์ต่าง ๆ : กำลังของช่องสัญญาณเสียงและพลังเสียง จากนั้นจะเกณฑ์การวัดเสียงโดยใช้เกณฑ์ที่แตกต่างกันไปตาม SNR โดยประมาณ (จากวิกิพีเดีย)

สำหรับเทคนิคขั้นสูงเพิ่มเติมฉันกำลังแสดงรายการอ้างอิงบางอย่างในเรื่องนี้

  1. แหล่งอ้างอิงมากที่สุด: Jongseo Sohn; น้ำซูคิม; วันทนาสังข์; "การตรวจจับกิจกรรมด้วยเสียงแบบใช้สถิติ" จดหมายการประมวลผลสัญญาณ, IEEE, ม.ค. 1999, เล่ม: 6 ปัญหา: 1 หน้า: 1-3

  2. มีความเกี่ยวข้องมากที่สุดสำหรับคุณ: Mark Marzinzik และ Birger Kollmeier "การตรวจหาคำพูดหยุดชั่วคราวสำหรับการประมาณค่าคลื่นความถี่ของเสียงโดยการติดตามการเคลื่อนที่ของซองจดหมาย Power" ธุรกรรม IEEE บนการประมวลผลเสียงและเสียง, VOL 10, ไม่ 2, กุมภาพันธ์ 2545 หน้า 104

  3. Ramírez, J.; JM Górriz, JC Segura (2007) "การตรวจจับกิจกรรมด้วยเสียงความรู้พื้นฐานและระบบรู้จำเสียง" ใน M. Grimm และ K. Kroschel การรู้จำเสียงพูดที่แข็งแกร่งและความเข้าใจ pp. 1–22 ไอ 978-3-902613-08-0

  4. เกริ่นนำ: Jonathan Kola, Carol Espy-Wilson และ Tarun Pruthi "Voice Activity Detection"


วิธีการบรรลุในงูหลาม?
kRazzy R

9

ฉันต้องการ Jim Clay คนที่สองโดยสิ้นเชิงกับวิธีการของเขา แต่เปลี่ยนรสชาติโดยใช้ซองจดหมายเล็กน้อย:

เรารู้ว่าคำพูดส่วนใหญ่เกิดขึ้นประมาณ 1-2kHz การสุ่มตัวอย่างข้อมูลของคุณน่าจะเป็น 44kHz (ขึ้นอยู่กับอุปกรณ์บันทึกของคุณ) ดังนั้นสิ่งที่ฉันจะทำก่อนคือค่าเฉลี่ยเคลื่อนที่ของสัญญาณกำลังสองในเวลาจริงใน 10 จุดเพื่อให้มีซองจดหมายของพลังงานสัญญาณ นั่นจะทำให้เกิดความล่าช้าในการตรวจจับดังนั้นคุณจึงต้องการให้สิ่งนี้อยู่ในระดับต่ำ

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

หากไม่ใช่การบันทึกตามเวลาจริงคุณอาจพบว่ามีประโยชน์ในการใช้ค่าเฉลี่ยเคลื่อนที่แบบ 0 เฟสเพื่อลดความน่ารำคาญที่เกิดจากความล่าช้า บอกเราว่ามันเหมาะกับคุณไหม


9

เอริค

หากคุณเป็นคนที่ทำอะไรซักอย่างรวดเร็วและสกปรกสิ่งแรกที่คุณจะได้คือซองจดหมายและฉันจะทำอย่างนี้ง่ายๆ (ใน MATLAB) โดย:

 envelope = abs(hilbert(yourSignal));

ณ จุดนี้ฉันก็จะเกณฑ์และ 'เสียงอยู่' ถ้าคุณสูงกว่าเกณฑ์ที่แน่นอน

นี่เป็นวิธีแก้ปัญหาที่ง่ายมาก แต่อาจเหมาะกับคุณ


1
+1 บางทีคุณอาจอธิบายรายละเอียดเกี่ยวกับวิธีการที่อยู่เบื้องหลังบรรทัดโค้ดนี้ได้หรือไม่ ฉันแน่ใจว่า OP ไม่คุ้นเคยกับการดึงซองจดหมายผ่าน Hilbert Transform
Phonon

@ Mohammad ขอบคุณ! แต่โปรดดูที่แก้ไขของฉัน 1. แน่นอนผมอยากที่รวดเร็วและสกปรก แต่ยังต้องทำขั้นตอนวิธีการด้วยตัวเอง :)
เอริค Brotto

@EricBrotto เอาละฉันสามารถบอกคุณได้ว่าจะใช้ฮิลแบร์ตหม้อแปลงได้อย่างไร แต่ฉันสมมติว่าคุณมีความสามารถในการทำ FFT ในไลบรารี C / Obj-C ของคุณหรือไม่ ถ้าไม่ใช่นั่นจะเป็นปัญหา ... :-)
Spacey

วิธีการบรรลุในงูหลาม?
kRazzy R

คุณใจดี / แหม่มคุณช่วยชี้ให้ฉันเห็นถึงวิธีการที่ฮิลเบิร์ตจะนำไปใช้ใน Python ได้อย่างไร
kRazzy R

6

ฉันคิดว่าคุณกำลังติดต่อกับสัญญาณจริงไม่ใช่สัญญาณที่ซับซ้อน - หากไม่เป็นเช่นนั้นโปรดแจ้งให้เราทราบและฉันสามารถแก้ไขคำตอบได้

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

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

ล้างและทำซ้ำ


4

ฉันได้เขียนคลาสตัวตรวจจับกิจกรรมใน Java มันเป็นส่วนหนึ่งของการเปิดแหล่งที่มาของฉันคอลเลกชัน Java DSP คุณสามารถใช้โปรแกรมทดสอบ WavSplitter.java เพื่อตรวจสอบด้วยไฟล์ WAV เป็นอินพุต


จำไว้โดยเฉพาะ OP บอกว่าเขาต้องการเขียนอัลกอริธึมเองใน C.
Sam Maloney

มันง่ายมากที่จะแปลงอัลกอริธึมจาก Java เป็น C
Christian d'Heureuse

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