Answers:
我对上述想法做了一些调整。它会永久记录下来,记录所有噪音,直到(大约)一秒钟无声为止。然后:
(使用非常方便的小型UHF / 2米回声中继器)
#!/ bin / bash 虽然是真的 做 rec buffer.ogg静音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 buffer.ogg -n频谱图-x 300 -y 200 -z 100 -t $ DATE.ogg -o ./spectro/$DPATH/$DATE.png sox buffer.ogg normbuffer.ogg增益-n -2 sox normbuffer.ogg -n频谱图-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 完成
我找到了一种解决该问题的不稳定方法。
我注意到,当检测到静音时,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再次检测到静音,就会发生这种情况)。
回声“检测到声音” 直到[“ $ var1” ==“ $ var2”]; 做 var1 =`du“ /tmp/recording.flac”` 睡0.5 var2 =`du“ /tmp/recording.flac”` 完成
现在我只需要退出rec
:
回声“检测到静音” 杀死$ 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”` 完成 回声“检测到声音” 直到[“ $ var1” ==“ $ var2”]; 做 var1 =`du“ /tmp/recording.flac”` 睡0.5 var2 =`du“ /tmp/recording.flac”` 完成 回声“检测到静音” 杀死$ p
现在,我希望有一种更好,更稳定的方法来执行此操作,但这必须暂时有效。
这将永远进行监听,仅记录最后的声音,直到听到一秒钟的静默为止,然后写入文件,为其加时间戳并重新启动:
#!/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
while true
循环