침묵이 감지되면 Sox 녹음을 종료합니다.

침묵이 감지되면 Sox 녹음을 종료합니다.

저는 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

관련 정보