2010-04-10 131 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秒後停止。輸出文件將清除背景噪音(大部分)。

現在,如果有人可以告訴我如何確定錄製程序已停止編程,我可以使其對持續監視語音識別有用。