Linux에서 마이크 샘플 속도를 16000으로 변경하는 방법은 무엇입니까?

Jan 06 2021

현재 마이크 오디오를 사용하는 동안 Raspberry Pi에서 Deepspeech를 사용하려는 프로젝트를 진행 중이지만 잘못된 샘플 속도 오류가 계속 발생합니다. pyAudio를 사용하여 모델이 원하는 샘플 속도 인 16000을 사용하는 스트림을 생성하지만 사용중인 마이크의 샘플 속도는 44100입니다. Python 스크립트를 실행할 때 속도 변환이 수행되지 않고 마이크의 샘플 속도와 예상 모델의 샘플 속도는 잘못된 샘플 속도 오류를 생성합니다.

마이크 정보는 pyaudio에 의해 다음과 같이 나열됩니다.

{'index': 1, 'structVersion': 2, 'name': 'Logitech USB Microphone: Audio (hw:1,0)', 'hostApi': 0, 'maxInputChannels': 1, 'maxOutputChannels': 0, 'defaultLowInputLatency': 0.008684807256235827, 'defaultLowOutputLatency': -1.0, 'defaultHighInputLatency': 0.034829931972789115, 'defaultHighOutputLatency': -1.0, 'defaultSampleRate': 44100.0}

내가 시도한 첫 번째 것은 pyAudio 스트림 샘플 속도를 44100으로 설정하고 모델에 공급하는 것입니다. 그러나 테스트 후 요청한 16000과 다른 속도를 얻었을 때 모델이 잘 작동하지 않는다는 것을 알았습니다.

마이크 변경 률을 16000으로 설정하거나 파이썬 스크립트에서 사용할 때 적어도 16000으로 변환하는 방법을 찾으려고했지만 아무 소용이 없습니다.

내가 시도한 가장 최근의 일은 .asoundrc 파일을 변경하여 속도를 변경하는 것이지만이 파일 내에서 마이크의 속도를 16000으로 변경할 수 있는지 여부를 모르겠습니다. 현재 파일은 다음과 같습니다.

pcm.!default {
        type asymd
        playback.pcm
        {
                type plug
                slave.pcm "dmix"
        }
        capture.pcm
        {
                type plug
                slave.pcm "usb"
        }
}

ctl.!default {
        type hw
        card 0
}

pcm.usb {
        type hw
        card 1
        device 0
        rate 16000
} 

내가 만든 파이썬 코드는 윈도우에서 작동하는데, 윈도우가 입력 속도를 코드의 샘플 속도로 변환하기 때문이라고 생각합니다. 그러나 리눅스는 이것을하지 않는 것 같습니다.

tldr; 마이크 속도는 44100이지만 사용하려면 16000으로 변경해야합니다. Linux에서 어떻게 수행합니까?

편집 1 :

다음과 같이 pyAudio 스트림을 만듭니다.

self.paStream = self.pa.open(rate = self.model.sampleRate(), channels = 1, format= pyaudio.paInt16, input=True, input_device_index = 1, frames_per_buffer= self.model.beamWidth())

모델의 속도와 모델의 빔폭, 마이크의 채널 수 및 마이크의 인덱스를 사용합니다.

다음 오디오 프레임을 가져 와서 모델에 대해 만든 스트림과 함께 사용하도록 올바르게 포맷하기 위해 다음을 수행합니다.

def __get_next_audio_frame__(self):
    audio_frame = self.paStream.read(self.model.beamWidth(), exception_on_overflow= False)  
    audio_frame = struct.unpack_from("h" * self.model.beamWidth(), audio_frame)     
    return audio_frame

exception_on_overflow = False44100의 입력 속도로 모델을 테스트하는 데 사용되었습니다.이 값을 False로 설정하지 않으면 현재 처리하는 것과 동일한 오류가 발생합니다. model.beamWidth모델이 예상하는 청크의 양에 대한 값을 보유하는 변수입니다. 그런 다음 그 양의 청크를 읽고 모델의 스트림에 공급하기 전에 다시 포맷합니다. 다음과 같이 발생합니다.

modelStream.feedAudioContent(self.__get_next_audio_frame__())

답변

N.T.AvH Jan 09 2021 at 23:47

그래서 더 많은 테스트를 마친 후 pulse에 대한 구성 파일을 편집했습니다. 이 파일에서 기본 및 / 또는 대체 샘플링 속도를 편집 할 수있는 항목의 주석 처리를 제거 할 수 있습니다. 대체 샘플링 속도를 48000에서 16000으로 편집하여 문제를 해결할 수있었습니다.

파일은 다음 위치에 있습니다 /etc/pulse/daemon.conf .. 를 사용하여 Raspberian에서이 파일을 열고 편집 할 수 있습니다 sudo vi daemon.conf. 그런 다음을 제거 하고 값을 로 변경하여 ; alternate-sample-rate = 48000수행 한 줄의 주석 처리를 제거해야 합니다 . 파일을 저장하고 vim을 종료하십시오. 그런 다음를 사용하여 Pulseaudio를 다시 시작하여 변경된 파일을 실행하는지 확인합니다.;4800016000pulseaudio -k

당신은 정력에 익숙하지 않은 리눅스는 경우 여기에 샘플 속도를 변경하는 과정을 통해 더 정교한 가이드입니다.