我正在编写一个脚本,使用 sox 来记录我的谈话。现在我需要 sox 等到它检测到声音后再开始录音,我确实已经弄清楚了。但我也需要袜子出口一旦沉默至少 3 秒。就像现在一样,一旦我说完,我就必须手动杀死 sox,否则 sox 会再次等待,直到我再说一些,附加到输出文件(这不是我想要的)。这是我现在使用的录制命令:
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3%
再次强调一下,Sox 应该等到我开始说话,然后录制直到我停止说话,然后 sox 程序应该退出。
答案1
从原始命令中删除负号:
rec /tmp/recording.flac rate 32k silence 1 0.1 3% 1 3.0 3%
当“低于计数”为负数时,静音命令将从文件中间修剪所有静音。当它为正时,它会从文件末尾删除静音。
答案2
我对上面的想法做了一些调整。它会永远记录,记录所有噪音,直到(大约)遇到一秒钟的寂静。然后:
- 确保创建两个子目录
- 计算记录的两张光谱图 - 一张在标准化之前,一张在标准化之后,并写入带有日期标记的文件夹。
- 将规范化的文件写入带日期戳的文件夹中的文件。
- 播放标准化文件,带有两个 chirp .ogg 文件(通过语音操作的 CB Radio 播放)
(可制作一个非常方便的小型 UHF/2 米回波中继器)
#!/bin/bash 虽然是真的;做 记录缓冲区.ogg 沉默 1 0.1 5% 1 1.0 5% 日期=`日期+%Y%m%d%H%M%S` DPATH=`日期 +%Y/%m/%d/` mkdir -p ./spectro/$DPATH mkdir -p ./voice/$DPATH echo 将缓冲区文件重命名为 $DATE sox buffer.ogg -n 频谱图 -x 300 -y 200 -z 100 -t $DATE.ogg -o ./spectro/$DPATH/$DATE.png sox buffer.oggnormbuffer.ogg 增益 -n -2 soxnormbuffer.ogg -n 频谱图 -x 300 -y 200 -z 100 -t $DATE.norm.ogg -o ./spectro/$DPATH/$DATE.norm.png mvnormbuffer.ogg ./voice/$DPATH/$DATE.ogg 播放 pre.ogg ./voice/$DPATH/$DATE.ogg post.ogg 完毕
答案3
我找到了一种解决这个问题的不稳定方法。
我注意到,当检测到静音时,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
现在我更喜欢一种更好、更稳定的方法来做到这一点,但这目前必须有效。
答案4
这将永远监听,只记录最后的声音,直到听到一秒钟的沉默,然后写入文件,为其添加时间戳,然后重新启动:
#!/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