음성 오디오를 리샘플링하려면 두 파이프 사이에 삭스를 삽입하세요.

음성 오디오를 리샘플링하려면 두 파이프 사이에 삭스를 삽입하세요.

모노 44kHz 오디오 파일을 16kHz 오디오 파일로 리샘플링하기 위해 "sox" 유틸리티를 두 개의 파이프 명령에 넣으려고 합니다.

단일 파이프로 잘 작동합니다.

$ speexdec toto.oga - | sox -V -t raw -b 16 -e signed -c 1 -r 44.1k - -r 16k toto.wav

그러나 다른 파이프를 추가하면 sox 유틸리티가 다음과 같이 불평합니다.

$ speexdec toto.oga - | sox -V -t raw -b 16 -e signed -c 1 -r 44.1k - -r 16k - | cat - > toto.wav
sox FAIL formats: can't determine type of `-'

어떤 아이디어가 있나요?

답변1

-t wav두 번째 출력 앞에 추가하여 sox 출력 유형을 선언해야 합니다 -.

파일 이름인 경우 sox는 이름을 보고 거기에서 유형을 추론하지만, stdout인 경우 유형을 선언해야 합니다.

마지막으로 지정된 출력 -b 16 -e signed -c 1이전에 입력에서 전송되었다고 가정하는 대신 다른 모든 설정( )을 선언할 수도 있습니다 .-

답변2

예를 들어 명시적인 파일 이름을 지정하면 toto.wavSoX는 .wav확장자로부터 WAV 형식을 사용해야 한다고 추론합니다. 출력된 "filename" 의 경우 -파생이 불가능하므로 명시적으로 지정된 타입을 사용해야 합니다 -t wav. 파일에 다른 확장자를 지정 toto.sound하거나( ) 확장자를 전혀 지정하지 않으려는 경우( )에도 toto동일하게 적용됩니다 .

관련 없는 메모에서 WAV 파일은 파일 시작 부분에 포함된 오디오의 길이를 저장합니다. 귀하의 경우 파일의 해당 부분이 파이프에 기록되면 최종 길이를 알 수 없으므로 "알 수 없는 길이"를 나타내는 값이 기록됩니다. 이는 파일로 수행하려는 작업에 따라 문제가 될 수도 있고 그렇지 않을 수도 있습니다.

답변3

speexdec toto.oga - | \
sox -V \
-t raw -b 16 -e signed -c 1 -r 44.1k - \
-t raw -b 16 -e signed -c 1 -r 16k - | \
cat - > toto.wav

관련 정보