Sox를 사용하여 대화를 녹음하는 스크립트를 작성하고 있습니다. 이제 녹음을 시작하기 전에 소리가 감지 될 때까지 기다려야 삭스가 필요합니다. 그러나 최소한 3 초 동안 침묵이 있으면 종료 하기 위해 삭스가 필요합니다 . 지금은 대화를 마치면 수동으로 삭스를 죽여야합니다. 다음은 지금 사용중인 레코딩 명령입니다.
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3%
다시 말하지만, Sox는 대화를 시작할 때까지 기다렸다가 대화를 중단 할 때까지 녹음해야 Sox 프로그램이 종료됩니다.
답변
원래 명령에서 음수 부호를 제거하십시오.
rec /tmp/recording.flac rate 32k silence 1 0.1 3% 1 3.0 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 재생 끝난
답변
나는이 문제를 해결하는 일종의 흔들리는 길을 발견했다.
침묵이 감지되면 더 많은 소리가 들릴 때까지 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