저는 sox를 사용하여 대화를 녹음하는 스크립트를 작성하고 있습니다. 이제 녹음을 시작하기 전에 소리가 감지될 때까지 기다려야 한다는 사실을 실제로 알아냈습니다. 하지만 양말도 필요해출구한 번 최소 3초 동안 침묵합니다. 지금처럼 말하기가 끝나면 수동으로 sox를 종료해야 합니다. 그렇지 않으면 sox는 내가 더 말할 때까지 다시 기다렸다가 출력 파일에 추가합니다(이것은 내가 원하는 것이 아닙니다). 이것은 내가 지금 사용하는 녹음 명령입니다.
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3%
다시 말하지만 Sox는 내가 말을 시작할 때까지 기다렸다가 내가 말을 멈출 때까지 녹음한 다음 sox 프로그램을 종료해야 합니다.
답변1
원래 명령에서 음수 부호를 제거합니다.
rec /tmp/recording.flac rate 32k silence 1 0.1 3% 1 3.0 3%
"Below Count"가 음수인 경우 묵음 명령은 파일 중간에서 모든 묵음을 잘라냅니다. 양수이면 파일 끝에서 무음을 제거합니다.
답변2
위의 아이디어를 일부 조정했습니다. (대략) 1초의 침묵이 발생할 때까지 모든 소음을 영원히 녹음합니다. 그 다음에:
- 두 개의 하위 디렉터리를 만들어야 합니다.
- 두 개의 기록된 스펙트럼(정규화 전과 후의 스펙트럼)이 계산되어 날짜 스탬프가 찍힌 폴더에 기록됩니다.
- 날짜 스탬프가 있는 폴더의 파일에 정규화된 파일을 씁니다.
- 두 개의 chirp .ogg 파일로 표준화된 파일을 재생합니다(음성 작동 CB 라디오를 통해 재생).
(매우 편리한 소형 UHF/2미터 에코 중계기를 만들 수 있습니다)
#!/bin/bash 사실이지만; buffer.ogg 침묵 1 0.1 5% 1 1.0 5% 기록 날짜=`날짜+%Y%m%d%H%M%S` DPATH=`날짜+%Y/%m/%d/` mkdir -p ./spectro/$DPATH mkdir -p ./voice/$DPATH echo 버퍼 파일 이름을 $DATE로 변경 sox buffer.ogg -n 스펙트로그램 -x 300 -y 200 -z 100 -t $DATE.ogg -o ./spectro/$DPATH/$DATE.png sox buffer.oggnormbuffer.ogg 이득 -n -2 soxnormbuffer.ogg -n 스펙트로그램 -x 300 -y 200 -z 100 -t $DATE.norm.ogg -o ./spectro/$DPATH/$DATE.norm.png mvnormbuffer.ogg ./voice/$DPATH/$DATE.ogg pre.ogg ./voice/$DPATH/$DATE.ogg post.ogg 재생 완벽한
답변3
나는 이 문제를 해결할 수 있는 불안정한 방법을 찾았습니다.
나는 침묵이 감지되면 더 많은 소리가 들릴 때까지 자연스럽게 sox가 파일에 아무것도 추가하지 않는다는 것을 알았습니다. 그래서 저는 이 사실을 활용해 보기로 했습니다.
먼저 백그라운드에서 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가 다시 침묵을 감지하면 이 작업이 발생합니다).
echo "소리가 감지되었습니다" ["$var1" == "$var2"]까지; var1=`du "/tmp/recording.flac"` 수면 0.5 var2=`du"/tmp/recording.flac"` 완벽한
이제 종료만 하면 됩니다 rec
.
echo "무음이 감지되었습니다" $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"` 완벽한 echo "소리가 감지되었습니다" ["$var1" == "$var2"]까지; var1=`du "/tmp/recording.flac"` 수면 0.5 var2=`du"/tmp/recording.flac"` 완벽한 echo "무음이 감지되었습니다" $p를 죽여라
이제는 이 작업을 수행하는 더 좋고 안정적인 방법을 선호하지만 지금은 이것이 작동해야 합니다.
답변4
이것은 영원히 듣고, 잠시 침묵이 들릴 때까지 마지막 사운드만 녹음한 다음 파일에 쓰고 타임스탬프를 지정한 다음 다시 시작합니다.
#!/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