2010-04-10 80 views
10

我需要在linux中监听我的音频line-in,并且在播放音频的情况下,必须将声音记录并保存到文件中。熟悉如何motion监视视频源。监听音频线

是否有可能用bash做到这一点?

#!/bin/bash 

# audio device 
device=/dev/audio-line-in 

# below this threshold audio will not be recorded. 
noise_threshold=10 

# folder where recordings are stored 
storage_folder=~/recordings 

# run indefenitly, until Ctrl-C is pressed 
while true; do 
    # noise_level() represents a function to determine 
    # the noise level from device 
    if noise_level($device) > $noise_threshold; then 
    # stream from device to file, can be encoded to mp3 later. 
    cat $device > $storage_folder/$(date +%FT%T).raw   
    fi; 
done; 

编辑:沿东西线的流动,我想从这项计划中得到的是

a. when noise > threshold, start recording 
b. stop recording when noise < threshold for 10 seconds 
c. save recorded piece to separate file 
+0

以前从未听说过议案,不错 – 2010-04-10 11:38:08

+0

'date'的默认输出中有空格。最好使用'$(date +%FT%T)',看起来像:“2010-04-10T08:55:56”,因此它是可排序的并且没有空格。 [ISO 8601](http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/date_and_time_format.htm)(和[here](http://en.wikipedia.org/wiki/ISO_8601)) – 2010-04-10 14:00:09

+0

@ Dennis,thanx,改变了这一点。 – Stefan 2010-04-10 14:38:33

回答

5

SoX是声音处理的瑞士军刀。您可以利用它来分析录音。如下因素解决方案的唯一缺点是:

  1. 您需要将录音分头固定大小的块
  2. 你可以失去的拍摄时间(由于记录的杀人/分析/重启)

因此,进一步的改进可能会分析异步,尽管这会使工作复杂化。

#!/bin/bash 

record_interval=5 
noise_threshold=3 
storage_folder=~/recordings 

exec 2>/dev/null  # no default error output 
while true; do 
    rec out.wav & 
    sleep $record_interval 
    kill -KILL %1 
    max_level="$(sox out.wav -n stats -s 16 2>&1|awk '/^Max\ level/ {print int($3)}')" 
    if [ $max_level -gt $noise_threshold ];then 
    mv out.wav ${storage_folder}/recording-$(date +%FT%T).wav; 
    else 
    rm out.wav 
    fi 
done 

更新:

以下解决方案使用一个FIFO从REC输出。通过使用该管道分拿到大块,应该是没有的记录时间上的损失:

#!/bin/bash 

noise_threshold=3 
storage_folder=~/recordings 
raw_folder=~/recordings/tmp 
split_folder=~/recordings/split 
sox_raw_options="-t raw -r 48k -e signed -b 16" 
split_size=1048576 # 1M 

mkdir -p ${raw_folder} ${split_folder} 

test -a ${raw_folder}/in.raw || mkfifo ${raw_folder}/in.raw 

# start recording and spliting in background 
rec ${sox_raw_options} - >${raw_folder}/in.raw 2>/dev/null & 
split -b ${split_size} - <${raw_folder}/in.raw ${split_folder}/piece & 


while true; do 
    # check each finished raw file 
    for raw in $(find ${split_folder} -size ${split_size}c);do 
    max_level="$(sox $sox_raw_options ${raw} -n stats -s 16 2>&1|awk '/^Max\ level/ {print int($3)}')" 
    if [ $max_level -gt $noise_threshold ];then 
     sox ${sox_raw_options} ${raw} ${storage_folder}/recording-$(date +%FT%T).wav; 
    fi 
    rm ${raw} 
    done 
    sleep 1 
done1 
+0

+1的优秀解决方案,但这些缺点是致命的...它不适用于电话留言录音系统? – Stefan 2010-04-10 16:47:18

+0

第二个脚本在最后一行'done1'中有错误,如果我将其更改为'done',它将起作用,但会以慢动作录制音频。请解决这个问题。第一个脚本是完美的。 – Wally 2016-01-02 11:13:13

0

下面是如何提高J上ü的RGen的解决方案的草图:它只是双缓冲,所以当你在分析一个文件,你已经开始录制下一个。我猜测这个技巧会把差距缩小到100毫秒左右,但你必须做一些实验才能发现。

完全未经测试!

#!/bin/bash 

record_interval=5 
noise_threshold=3 
storage_folder=~/recordings 

exec 2>/dev/null  # no default error output 

function maybe_save { # out.wav date 
    max_level="$(sox "$1" -n stats -s 16 2>&1| 
       awk '/^Max\ level/ {print int($3)}')" 
    if [ $max_level -gt $noise_threshold ]; then 
     mv "$1" ${storage_folder}/recording-"$2" 
    else 
     rm "$1" 
    fi 
} 

i=0 
while true; do 
    this=out$i.wav 
    rec $this & 
    pid=$? 
    if [ $i -gt 9 ]; then i=0; else i=$(expr $i + 1); fi 
    archive=$(date +%FT%T).wav; 
    sleep $record_interval 
    kill -TERM $pid 
    maybe_save $this $archive & 
done 

的关键是,你杀了录音过程的那一刻,你在后台启动分析,然后看看周围循环再次访问记录下一个片段。 真的,你应该首先启动下一个记录过程,然后进行分析,但是 会使控制流程更丑陋。我会先测量一下,看看你有什么样的跳跃。

+0

这个脚本只是退出并说'Terminated'。没有记录文件。 – Wally 2016-01-02 11:00:05

2

这是一个更好的;

sox -t alsa default ./recording.flac silence 1 0.1 5% 1 1.0 5%

它产生的音频文件,只有当有声音,并削减了沉默。所以没有差距,没有像上面的东西长时间的沉默!

+0

它一直运行,直到没有声音,只要有声音记录了很短的时间并退出。您能否请您提供一个更加现成的解决方案,以便在不退出的情况下实际记录很长时间。 – Wally 2016-01-02 11:03:03

0
rec -c CHANNELS -r RATE -b BITS -n OUTPUT.AUDIOTYPE noisered NOISEREDUCTION.noise-profile silence 1 5 1% 1 1t 1% 

这将持续监控默认麦克风输入,直到听到声音超过所述背景噪声减小的轮廓的1%,那么输出AUDIOTYPE(MP4,FLAC,WAV,生等)的文件在速率hz,BITS,CHANNELS。以1%的降噪水平测量,录音将在静音1秒后停止。输出文件将清除背景噪音(大部分)。

现在,如果有人可以告诉我如何确定录制程序已停止编程,我可以使其对持续监视语音识别有用。