สิ้นสุดการบันทึก sox เมื่อตรวจพบความเงียบ


16

ฉันกำลังเขียนสคริปต์ที่ใช้ sox เพื่อบันทึกการพูดของฉัน ตอนนี้ฉันต้องการทีมเพื่อรอจนกว่าจะตรวจจับเสียงก่อนที่จะเริ่มการบันทึกและฉันได้คิดออกว่า แต่ฉันยังต้องใช้ sox เพื่อออกเมื่อมีความเงียบอย่างน้อย 3 วินาที ตามที่เป็นอยู่ตอนนี้ฉันต้องฆ่า sox ด้วยตนเองเมื่อฉันพูดจบมิฉะนั้น sox จะรออีกครั้งจนกว่าฉันจะพูดเพิ่มอีกต่อท้ายไฟล์เอาต์พุต (นั่นไม่ใช่สิ่งที่ฉันต้องการ) นี่คือคำสั่งสำหรับการบันทึกที่ฉันใช้อยู่ตอนนี้:

rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3%

อีกครั้งเพื่อให้ชัดเจน Sox ควรรอจนกว่าฉันจะเริ่มพูดคุยแล้วบันทึกจนกว่าฉันจะหยุดพูดจากนั้นโปรแกรม sox ควรจะออกจาก

คำตอบ:


13

ลบเครื่องหมายลบออกจากคำสั่งดั้งเดิมของคุณ:

rec /tmp/recording.flac rate 32k silence 1 0.1 3% 1 3.0 3%

เมื่อ "ด้านล่างนับ" เป็นลบคำสั่งความเงียบจะตัดแต่งความเงียบทั้งหมดจากตรงกลางของไฟล์ เมื่อมันเป็นบวกมันจะปิดปากเงียบจากจุดสิ้นสุดของไฟล์


1
นั่นเป็นทางออกที่ง่ายกว่าที่คิดไว้ฮ่า ๆ !
Isaac

3

ฉันปรับเปลี่ยนความคิดข้างต้นบางอย่างเพิ่มเติม มันบันทึกตลอดไปบันทึกเสียงทั้งหมดจนกระทั่ง (ประมาณ) วินาทีแห่งความเงียบงัน แล้ว:

  • ตรวจสอบให้แน่ใจว่ามีการสร้างสองไดเรกทอรีย่อย
  • คำนวณสเปคโตรกราฟสองรูปแบบของการบันทึก - หนึ่งก่อนการทำมาตรฐาน
  • เขียนหนึ่งไฟล์ปกติลงในไฟล์ไปยังโฟลเดอร์ datestamped
  • เล่นไฟล์ปกติด้วยไฟล์ chirp .ogg สองไฟล์ (ย้อนกลับผ่านวิทยุ CB ที่ทำงานด้วยเสียง)

(ทำให้เป็นตัวสะท้อนกลับที่มีค่าน้อยมาก UHF / 2 เมตร)

#! / bin / ทุบตี
ในขณะที่จริง ทำ
  rec buffer.ogg เงียบ 1 0.1 5% 1 1.0 5%
  DATE = `วันที่ +% Y% m% d% H% M% S '
  DPATH = `date +% Y /% m /% d /`
  mkdir -p ./spectro/$DPATH
  mkdir -p ./voice/$DPATH
  echo การเปลี่ยนชื่อไฟล์บัฟเฟอร์เป็น $ DATE
  sox buffer.ogg -n spectrogram -x 300 -y 200 -z 100 -t $ DATE.ogg -o ./spectro/$DPATH/$DATE.png
  sox buffer.ogg normbuffer.ogg gain -n -2
  sox normbuffer.ogg -n spectrogram -x 300 -y 200 -z 100 -t $ DATE.norm.ogg -o ./spectro/$DPATH/$DATE.norm.png
  mv normbuffer.ogg ./voice/$DPATH/$DATE.ogg
  เล่น pre.ogg ./voice/$DPATH/$DATE.ogg post.ogg 
เสร็จแล้ว

2

ฉันพบวิธีสั่นคลอนชนิดที่แก้ปัญหานี้

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

ก่อนอื่นฉันเริ่มบันทึกเสียงของ sox ในพื้นหลัง:

rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3% &

ต่อไปฉันได้รับ PID ของกระบวนการบันทึกด้วย: p=$!

จากนั้นฉันก็ให้เวลาหนึ่งวินาทีในการเริ่มต้นการบันทึกให้เสร็จแล้วรอจนกระทั่งไฟล์เริ่มโต

นอน 1
จนถึง ["$ var1"! = "$ var2"]; ทำ
    var1 = `du" /tmp/recording.flac "`
    นอน 1
    var2 = `du" /tmp/recording.flac "`
เสร็จแล้ว

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

echo "ตรวจจับเสียง"
จนถึง ["$ var1" == "$ var2"]; ทำ
    var1 = `du" /tmp/recording.flac "`
    นอน 0.5
    var2 = `du" /tmp/recording.flac "`
เสร็จแล้ว

ตอนนี้ฉันต้องออกrec:

echo "เงียบตรวจพบ"
ฆ่า $ p

และนั่นคือมัน นี่คือสคริปต์ที่เสร็จสมบูรณ์:

rec /tmp/recording.flac อัตรา 32k เงียบ 1 0.1 3% -1 3.0 3% &
p = $!
นอน 1
จนถึง ["$ var1"! = "$ var2"]; ทำ
    var1 = `du" /tmp/recording.flac "`
    นอน 1
    var2 = `du" /tmp/recording.flac "`
เสร็จแล้ว
echo "ตรวจจับเสียง"
จนถึง ["$ var1" == "$ var2"]; ทำ
    var1 = `du" /tmp/recording.flac "`
    นอน 0.5
    var2 = `du" /tmp/recording.flac "`
เสร็จแล้ว
echo "เงียบตรวจพบ"
ฆ่า $ p

ตอนนี้ฉันต้องการวิธีที่ดีกว่าและมีเสถียรภาพมากขึ้นในการทำสิ่งนี้ แต่ตอนนี้จะต้องใช้งานได้


1

สิ่งนี้จะฟังตลอดไปบันทึกเฉพาะเสียงสุดท้ายจนกว่าจะได้ยินความเงียบหนึ่งวินาทีจากนั้นจึงเขียนไฟล์ประทับเวลาและเริ่มใหม่:

#!/bin/bash
/usr/bin/sox -t alsa default /home/default/working/recording.wav silence 1 0.1 5% 1 1.0 5%
DATE=$(date +%Y%m%d%H%M%S)
mv /home/default/working/recording.wav /home/default/waiting/$DATE.recording.wav
/home/default/startrecord.sh

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