침묵이 감지되면 삭스 기록 종료


16

Sox를 사용하여 대화를 녹음하는 스크립트를 작성하고 있습니다. 이제 녹음을 시작하기 전에 소리가 감지 될 때까지 기다려야 삭스가 필요합니다. 그러나 최소한 3 초 동안 침묵이 있으면 종료 하기 위해 삭스가 필요합니다 . 지금은 대화를 마치면 수동으로 삭스를 죽여야합니다. 다음은 지금 사용중인 레코딩 명령입니다.

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

다시 말하지만, Sox는 대화를 시작할 때까지 기다렸다가 대화를 중단 할 때까지 녹음해야 Sox 프로그램이 종료됩니다.

답변:


13

원래 명령에서 음수 부호를 제거하십시오.

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

"카운트 미만"이 음수이면, 침묵 명령은 파일 중간에서 모든 침묵을 제거합니다. 양수이면 파일 끝에서 무음을 자릅니다.


1
그것은 내가 생각해 낸 것보다 훨씬 간단한 해결책입니다, LOL!
Isaac

3

위의 아이디어를 좀 더 조정했습니다. 그것은 영원히 기록하고 (대략) 1 초의 침묵이 생길 때까지 모든 소음을 기록합니다. 그때:

  • 두 개의 서브 디렉토리가 작성되도록합니다
  • 녹음 전 두 가지 분광 (정규화 전과 후)을 계산하고 날짜가 표시된 폴더에 씁니다.
  • 정규화 된 폴더를 파일에 날짜 스탬프 폴더에 씁니다.
  • 두 개의 처프 .ogg 파일을 사용하여 정규화 된 파일을 재생합니다 (음성으로 작동하는 CB 라디오를 통해 재생).

(매우 작은 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가 파일에 아무것도 더 이상 추가하지 않습니다. 그래서 나는이 사실을 이용하려고 노력하기로 결정했습니다.

우선, 백그라운드에서 삭스의 녹음기를 시작합니다.

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

이것은 영원히 듣고, 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.