एक बार मौन का पता चलने के बाद अंत में रिकॉर्डिंग


16

मैं एक स्क्रिप्ट लिख रहा हूं जो मुझे बात करने के लिए sox का उपयोग करती है। अब मुझे इसकी प्रतीक्षा करने से पहले ध्वनि की आवश्यकता है, जब तक कि यह रिकॉर्डिंग शुरू होने से पहले ध्वनि का पता नहीं लगा लेती, और मुझे लगता है कि यह पता चला है। लेकिन मुझे भी कम से कम 3 सेकंड के लिए मौन रहने के बाद बाहर निकलने के लिए साबुन की आवश्यकता होती है। जैसा कि यह अब है, मुझे एक बार बात खत्म करने के लिए मैन्युअल रूप से sox को मारना होगा, अन्यथा sox बस फिर से इंतजार करता है जब तक कि मैं कुछ और बात नहीं करता, आउटपुट फाइल में संलग्न होता है (यह वह नहीं है जो मैं चाहता हूं)। यहाँ अब मैं उपयोग कर रहा हूँ रिकॉर्डिंग के लिए आदेश है:

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

फिर से, बस स्पष्ट होने के लिए, सोक्स को तब तक इंतजार करना चाहिए जब तक कि मैं बात करना शुरू नहीं कर दूं, और तब तक रिकॉर्ड करूं जब तक मैं बात करना बंद नहीं कर दूं, फिर सोक्स प्रोग्राम को छोड़ देना चाहिए।

जवाबों:


13

अपने मूल आदेश से नकारात्मक चिह्न निकालें:

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

जब "नीचे की गिनती" नकारात्मक होती है, तो मौन कमांड फ़ाइल के मध्य से सभी मौन को ट्रिम कर देगा। जब यह सकारात्मक होता है, तो यह फ़ाइल के अंत से चुप्पी को तोड़ देता है।


1
कि मैं के साथ आया था की तुलना में यह एक बहुत आसान समाधान है, योग्य!
इसहाक

3

मैंने उपरोक्त विचारों को कुछ और बताया। यह हमेशा के लिए रिकॉर्ड करता है, तब तक सभी शोर रिकॉर्ड करता है जब तक (लगभग) मौन का एक दूसरा सामना नहीं किया जाता है। फिर:

  • सुनिश्चित करता है कि दो उपनिर्देशिकाएँ बनाई गई हैं
  • रिकॉर्डिंग के दो स्पेक्ट्रोग्राफ्स की गणना करता है - एक सामान्यीकरण से पहले, और एक के बाद, और डेटास्टैम्प्ड फ़ोल्डरों को लिखता है।
  • फ़ाइल को सामान्यीकृत करने के लिए एक datestamped फ़ोल्डर में लिखता है।
  • सामान्यीकृत फ़ाइल को वापस खेलता है, दो chirp .ogg फ़ाइलों के साथ (आवाज संचालित सीबी रेडियो के माध्यम से वापस)

(बहुत ही कम यूएचएफ / 2 मीटर इको रिपीटर के लिए बनाता है)

#! / Bin / bash
जबकि सच है; कर
  आरई बफर.गॉग साइलेंस 1 0.1 5% 1 1.0 5%
  DATE = `तिथि +% Y% m% d% H% M% S`
  DPATH = `तिथि +% Y /% m /% d /`
  mkdir -p ./spectro/$DPATH
  mkdir -p ./voice/$DPATH
  $ DATE को प्रतिध्वनि बफ़र फ़ाइल का नाम बदलना
  sox बफर.ogg -n स्पेक्ट्रोग्राम -x 300 -y 200 -z 100 -t $ DATE.ogg -o/spectro/$DPATH/$DATE.png
  sox बफर .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 का साउंड रिकॉर्डर शुरू करता हूं:

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

आगे मुझे रिकॉर्डिंग प्रक्रिया का पीआईडी ​​मिलेगा: p=$!

फिर मैं रिकॉर्डिंग प्रक्रिया को शुरू करने के लिए एक सेकंड देता हूं, और तब तक इंतजार करता हूं जब तक कि फाइल बढ़ने न लगे।

सो जाओ १
जब तक ["$ var1"! = "$ var2"]; कर
    var1 = `du" /tmp/recording.flac ""
    सो जाओ १
    var2 = `du" /tmp/recording.flac "`
किया हुआ

इसके बाद लूप टूट जाता है, इसका मतलब है कि ध्वनि का पता चला है। इसलिए अब मैं एक और लूप बनाता हूँ जब तक कि डेटा फ़ाइल में जोड़ा जाना बंद न हो जाए (यह तब होगा जब एक बार फिर से चुप्पी का पता चलेगा)।

गूंज "ध्वनि का पता चला"
जब तक ["$ var1" == "$ var2"]; कर
    var1 = `du" /tmp/recording.flac ""
    नींद ०.५
    var2 = `du" /tmp/recording.flac "`
किया हुआ

अब मुझे छोड़ने की ज़रूरत है rec:

गूंज "मौन का पता लगाया"
मार $ पी

और बस। यहाँ पूरी स्क्रिप्ट है:

rec /tmp/recording.flac रेट 32k साइलेंस 1 0.1 3% -1 3.0 3% &
पी = $!
सो जाओ १
जब तक ["$ var1"! = "$ var2"]; कर
    var1 = `du" /tmp/recording.flac ""
    सो जाओ १
    var2 = `du" /tmp/recording.flac "`
किया हुआ
गूंज "ध्वनि का पता चला"
जब तक ["$ var1" == "$ var2"]; कर
    var1 = `du" /tmp/recording.flac ""
    नींद ०.५
    var2 = `du" /tmp/recording.flac "`
किया हुआ
गूंज "मौन का पता लगाया"
मार $ पी

अब मैं ऐसा करने के लिए एक बेहतर, अधिक स्थिर तरीका पसंद करूंगा, लेकिन इसके लिए अभी काम करना होगा।


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
बैश है while trueछोरों
माइकल Mrozek
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.