>

말을 녹음하기 위해 sox를 ​​사용하는 스크립트를 작성하고 있습니다. 이제 녹음을 시작하기 전에 소리가 감지 될 때까지 기다려야 삭스가 필요합니다. 그러나 최소 3 초 동안 침묵이 있으면종료하려면 삭스가 필요합니다. 지금은 대화가 끝나면 수동으로 삭스를 죽여야합니다. 그렇지 않으면 삭스는 출력 파일에 덧붙여서 더 이야기 할 때까지 다시 기다립니다 (원하는 것이 아닙니다). 다음은 현재 사용중인 레코딩 명령입니다.

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%
    
    

    "카운트 미만"이 음수이면, 침묵 명령은 파일 중간에서 모든 침묵을 제거합니다. 긍정적 인 경우 파일 끝에서 침묵을 제거합니다.

  • 답변 # 2

    이 문제를 해결하는 일종의 흔들리는 방법을 찾았습니다.

    침묵이 감지되면 더 많은 소리가 들릴 때까지 sox가 파일에 아무것도 더 이상 추가하지 않는다는 것을 알았습니다. 그래서 저는이 사실을 활용하려고 노력했습니다.

    먼저, 나는 백그라운드에서 삭스의 녹음기를 시작한다 :

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

    다음으로 p=$! 를 사용하여 기록 프로세스의 PID를 얻습니다.

    그러면 녹화 과정을 잠시 시작한 다음 파일이 커질 때까지 기다립니다.

    수면 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를 죽이다
    

    이제이를 위해 더 좋고 안정적인 방법을 선호하지만 지금은 효과가있을 것입니다.

  • 답변 # 3

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

    두 개의 하위 디렉토리가 생성되도록합니다

    녹화의 두 가지 분광을 계산합니다. 하나는 정규화하기 전과 다른 하나는 날짜 표시 폴더에 기록합니다.

    정규화 된 파일을 날짜가 표시된 폴더에 파일로 씁니다.

    두 개의 처프 .ogg 파일 (음성으로 작동하는 CB 라디오를 통해 재생)으로 정규화 된 파일을 재생합니다.

    (매우 작은 UHF/2m 에코 리피터를 만듭니다)

    #!/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 재생
    끝난
    

  • 답변 # 4

    이것은 영원히 듣고, 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
    
    

  • 이전 text processing - 2 열에 값이있는 경우 행을 인쇄하는 쉘 스크립트
  • 다음 linux - 작동중인 장치