2010-04-10 50 views
10

Tôi cần theo dõi âm thanh đường dây trong trong linux và trong trường hợp âm thanh được phát, âm thanh phải được ghi lại và lưu vào tệp. Tương tự như cách motion theo dõi nguồn cấp dữ liệu video.Giám sát đường âm thanh

Có thể thực hiện điều này bằng bash không? cái gì đó dọc theo dòng:

#!/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; 

EDIT: Dòng chảy Tôi muốn nhận được từ chương trình này là

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

Không bao giờ nghe nói về chuyển động trước, đẹp nhất –

+0

Kết quả mặc định của 'ngày' có khoảng trống trong đó. Nó sẽ là tốt hơn để sử dụng một cái gì đó như '$ (ngày +% FT% T)' trông giống như: "2010-04-10T08: 55: 56" do đó, nó sắp xếp và không có không gian. [ISO 8601] (http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/date_and_time_format.htm) (và [tại đây] (http://en.wikipedia.org/wiki/ISO_8601)) –

+0

@ Dennis, thanx, đã thay đổi điều đó. – Stefan

Trả lời

5

SoX là con dao quân đội Thụy Sĩ chế biến âm thanh. Bạn có thể sử dụng nó để phân tích các bản ghi âm. Các thiếu sót duy nhất trong những giải pháp folowing là:

  1. Bạn cần phải chia ra các bản thu âm để khối kích thước cố định
  2. Bạn có thể mất thời gian ghi âm (do giết chết/phân tích/khởi động lại bản ghi âm)

Vì vậy, cải tiến hơn nữa có thể được thực hiện phân tích không đồng bộ, mặc dù điều này sẽ làm phức tạp công việc.

#!/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 

Cập nhật:

Các giải pháp sau đây sử dụng một fifo như đầu ra từ rec. Bằng việc sử dụng phân chia trên ống này để có được các khối, không nên có mất thời gian ghi:

#!/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 cho giải pháp tuyệt vời, nhưng những thiếu sót đó gây tử vong ... Nó sẽ không hoạt động đối với một cái gì đó giống như một hệ thống ghi âm tin nhắn điện thoại? – Stefan

+0

Tập lệnh thứ hai có lỗi ở dòng cuối cùng 'done1' và nếu tôi thay đổi nó thành' done', nó hoạt động nhưng ghi âm trong chuyển động chậm. Vui lòng sửa lỗi này. Kịch bản đầu tiên là hoàn hảo. – Wally

0

Dưới đây là một phác thảo làm thế nào để cải thiện giải pháp J ü rgen của: nó chỉ là đôi đệm, vì vậy khi bạn đang phân tích một tệp bạn đã bắt đầu ghi tệp tiếp theo. Tôi đoán rằng thủ thuật này sẽ giảm khoảng trống xuống mức 100 mili giây, nhưng bạn sẽ phải thực hiện một số thử nghiệm để tìm hiểu.

Hoàn toàn chưa được kiểm tra!

#!/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 

Điều quan trọng là thời điểm bạn giết quá trình ghi, bạn khởi chạy phân tích trong nền và sau đó thực hiện một chuyến đi vòng quanh khác để ghi lại đoạn tiếp theo. Thực sự bạn nên khởi chạy quy trình ghi tiếp theo trước, sau đó phân tích, nhưng sẽ làm cho luồng điều khiển trở nên xấu hơn một chút. Tôi sẽ đo đầu tiên để xem những loại bỏ qua bạn đang nhận được.

+0

Tập lệnh này chỉ thoát và nói 'Chấm dứt'. Không có tệp nào được ghi lại. – Wally

2

Dưới đây là hình ảnh tốt hơn nữa;

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

Nó tạo ra một tập tin âm thanh, chỉ khi có âm thanh, và cắt ra sự im lặng. Vì vậy, không có khoảng trống và không có im lặng dài như những thứ trên!

+0

Nó chạy cho đến khi không có âm thanh và ngay sau khi có âm thanh nó ghi lại trong một thời gian rất ít và thoát. Bạn có thể vui lòng cung cấp một giải pháp sẵn sàng hơn thực sự ghi lại trong một thời gian dài mà không bỏ thuốc lá. – Wally

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

này sẽ giám sát đầu vào microphone mặc định liên tục cho đến khi một âm thanh được nghe nói rằng vượt quá 1% số hồ sơ giảm tiếng ồn xung quanh, sau đó ra một tập tin của AUDIOTYPE (mp4, flac, wav, thô, vv) tại RATE hz, BITS, CHANNELS. Quá trình ghi sẽ dừng sau 1 giây im lặng khi đo được 1% mức giảm nhiễu. Các tập tin đầu ra sẽ được làm sạch của tiếng ồn xung quanh (chủ yếu).

Bây giờ, nếu ai đó chỉ có thể cho tôi biết cách xác định rằng bản ghi đã ngừng lập trình, tôi có thể làm cho nó hữu ích để giám sát liên tục nhận dạng giọng nói.