一旦检测到静音就结束 sox 录音

一旦检测到静音就结束 sox 录音

我正在编写一个脚本,使用 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

相关内容