Come cambiare la frequenza di campionamento del microfono a 16000 su Linux?

Jan 06 2021

Attualmente sto lavorando a un progetto per il quale sto cercando di utilizzare Deepspeech su un raspberry pi mentre utilizzo l'audio del microfono, ma continuo a ricevere un errore di frequenza di campionamento non valido. Usando pyAudio creo uno stream che utilizza la frequenza di campionamento desiderata dal modello, che è 16000, ma il microfono che sto usando ha una frequenza di campionamento di 44100. Quando eseguo lo script python non viene eseguita alcuna conversione di frequenza e la frequenza di campionamento dei microfoni e quella prevista la frequenza di campionamento del modello produce un errore di frequenza di campionamento non valida.

Le informazioni sul microfono sono elencate in questo modo da 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}

La prima cosa che ho provato è stata impostare la frequenza di campionamento del flusso di pyAudio su 44100 e alimentare il modello. Ma dopo il test ho scoperto che il modello non funziona bene quando ottiene una velocità diversa dai 16000 richiesti.

Ho cercato di trovare un modo per avere il tasso di cambio del microfono a 16000, o almeno convertirlo in 16000 quando viene utilizzato nello script Python, ma senza alcun risultato.

L'ultima cosa che ho provato è cambiare il file .asoundrc per trovare per cambiare la velocità, ma non so se è possibile cambiare la velocità del microfono a 16000 all'interno di questo file. Ecco come appare il file attualmente:

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
} 

Il codice Python che ho creato funziona su Windows, il che immagino sia dovuto al fatto che Windows converte la frequenza dell'input nella frequenza di campionamento nel codice. Ma Linux sembra non farlo.

tldr; la velocità del microfono è 44100, ma deve essere modificata in 16000 per essere utilizzabile. Come lo fai su Linux?

Modifica 1:

Creo il flusso pyAudio in questo modo:

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

Utilizza la velocità del modello e l'ampiezza del fascio del modello, nonché il numero di canali del microfono e l'indice del microfono.

Ottengo il frame audio successivo e per formattarlo correttamente per usarlo con lo stream che creo per il modello faccio questo:

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 = Falseè stato utilizzato per testare il modello con una velocità di input di 44100, senza che questo fosse impostato su False si sarebbe verificato lo stesso errore con cui mi occupo attualmente. model.beamWidthè una variabile che contiene il valore per la quantità di blocchi che il modello si aspetta. Ho quindi letto quella quantità di blocchi e li ho riformattati prima di inserirli nel flusso del modello. Che succede in questo modo:

modelStream.feedAudioContent(self.__get_next_audio_frame__())

Risposte

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

Quindi, dopo qualche altro test, ho finito per modificare il file di configurazione per pulse. In questo file è possibile rimuovere il commento dalle voci che consentono di modificare la frequenza di campionamento predefinita e / o alternativa. La modifica della frequenza di campionamento alternativa da 48000 a 16000 è ciò che è stato in grado di risolvere il mio problema.

Il file si trova qui: /etc/pulse/daemon.conf . Possiamo aprire e modificare questo file su Raspberian usando sudo vi daemon.conf. Quindi è necessario decommentare la riga ; alternate-sample-rate = 48000che viene eseguita rimuovendo il ;e modificare il valore di 48000in 16000. Salva il file ed esci da vim. Quindi riavvia il Pulseaudio usando pulseaudio -kper assicurarti che esegua il file modificato.

Se non hai familiarità con vim e Linux, ecco una guida più elaborata attraverso il processo di modifica della frequenza di campionamento.