Jak zmienić częstotliwość próbkowania mikrofonu na 16000 w systemie Linux?

Jan 06 2021

Obecnie pracuję nad projektem, dla którego próbuję używać funkcji Deepspeech na Raspberry Pi podczas korzystania z dźwięku mikrofonu, ale wciąż otrzymuję błąd Invalid Sample Rate. Używając pyAudio, tworzę strumień, który używa częstotliwości próbkowania, której chce model, czyli 16000, ale mikrofon, którego używam, ma częstotliwość próbkowania 44100. Podczas uruchamiania skryptu Python nie jest wykonywana konwersja częstotliwości, a częstotliwość próbkowania mikrofonów i oczekiwana częstotliwość próbkowania modelu generuje błąd nieprawidłowej częstotliwości próbkowania.

Informacje o mikrofonie są wymienione w następujący sposób przez 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}

Pierwszą rzeczą, jaką próbowałem, było ustawienie częstotliwości próbkowania strumienia pyAudio na 44100 i przesłanie tego do modelu. Ale po testach stwierdziłem, że model nie działa dobrze, gdy uzyskuje stawkę inną niż żądana 16000.

Próbowałem znaleźć sposób na zmianę szybkości mikrofonu na 16000 lub przynajmniej przekonwertowanie jej na 16000, gdy jest używany w skrypcie Pythona, ale bezskutecznie.

Ostatnią rzeczą, jaką próbowałem, jest zmiana pliku .asoundrc w celu znalezienia sposobu na zmianę szybkości, ale nie wiem, czy jest możliwa zmiana częstotliwości mikrofonu na 16000 w tym pliku. Tak obecnie wygląda plik:

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
} 

Kod Pythona, który stworzyłem, działa w systemie Windows, co, jak sądzę, jest spowodowane tym, że Windows konwertuje szybkość wejścia na częstotliwość próbkowania w kodzie. Ale Linux nie wydaje się tego robić.

tldr; częstotliwość mikrofonu wynosi 44100, ale aby można było używać, musi zmienić się na 16000. Jak to robisz w Linuksie?

Edycja 1:

Tworzę strumień pyAudio w ten sposób:

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())

Wykorzystuje szybkość modelu i szerokość wiązki modelu oraz liczbę kanałów mikrofonu i indeks mikrofonu.

Dostaję następną ramkę audio i aby ją odpowiednio sformatować do użycia ze strumieniem, który tworzę dla modelu, robię to:

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 = Falsezostał użyty do przetestowania modelu ze współczynnikiem wejściowym 44100, bez tego ustawienia na False wystąpiłby ten sam błąd, z którym obecnie mam do czynienia. model.beamWidthto zmienna przechowująca wartość ilości porcji, jakiej oczekuje model. Następnie przeczytałem tę liczbę fragmentów i ponownie je sformatowałem przed przesłaniem ich do strumienia modelu. Co dzieje się tak:

modelStream.feedAudioContent(self.__get_next_audio_frame__())

Odpowiedzi

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

Więc po kilku dalszych testach zakończyłem edycję pliku konfiguracyjnego dla funkcji Pulse. W tym pliku możesz odkomentować wpisy, które pozwalają na edycję domyślnej i / lub alternatywnej częstotliwości próbkowania. Edycja alternatywnej częstotliwości próbkowania od 48000 do 16000 jest tym, co było w stanie rozwiązać mój problem.

Plik znajduje się tutaj: /etc/pulse/daemon.conf . Możemy otworzyć i edytować ten plik na Raspberian za pomocą sudo vi daemon.conf. Następnie musimy odkomentować linię, ; alternate-sample-rate = 48000co odbywa się poprzez usunięcie ;i zmianę wartości 48000na 16000. Zapisz plik i wyjdź z vima. Następnie uruchom ponownie Pulseaudio za pomocą, pulseaudio -kaby upewnić się, że uruchomi zmieniony plik.

Jeśli nie znasz Vima i Linuksa, tutaj znajdziesz bardziej rozbudowany przewodnik po procesie zmiany częstotliwości próbkowania.