一旦检测到静音,结束袜队记录


16

我正在编写一个脚本,该脚本使用sox记录我的讲话。现在,我需要sox来等待,直到它检测到声音,然后才开始录音,而我确实已经弄清楚了。但是一旦沉默至少3秒钟,我还需要sox 退出。就目前而言,一旦我结束交谈,我就必须手动杀死sox,否则sox会再次等到我再讲话,然后追加到输出文件中(那不是我想要的)。这是我现在正在使用的录制命令:

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

同样,为了清楚起见,Sox应该等到我开始讲话之后再记录,直到我停止讲话,然后sox程序应该退出。

Answers:


13

从原始命令中删除负号:

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

当“以下计数”为负数时,静默命令将从文件中间修剪所有静默。当它为正值时,它将从文件末尾修剪静默。


1
这比我想出的解决方案简单得多,哈哈!
艾萨克(Isaac)

3

我对上述想法做了一些调整。它会永久记录下来,记录所有噪音,直到(大约)一秒钟无声为止。然后:

  • 确保创建两个子目录
  • 计算记录的两个光谱仪-一个归一化之前,一个归一化之后,并写入带有时间戳的文件夹。
  • 将归一化的文件写入带有时间戳的文件夹中。
  • 播放具有两个线性调频.ogg文件的归一化文件(通过语音操作的CB Radio播放)

(使用非常方便的小型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 
完成

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再次检测到静音,就会发生这种情况)。

回声“检测到声音”
直到[“ $ 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

现在,我希望有一种更好,更稳定的方法来执行此操作,但这必须暂时有效。


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.