¿Cómo cambiar la frecuencia de muestreo del micrófono a 16000 en linux?

Jan 06 2021

Actualmente estoy trabajando en un proyecto para el que estoy tratando de usar Deepspeech en una Raspberry Pi mientras uso el audio del micrófono, pero sigo recibiendo un error de frecuencia de muestreo no válida. Usando pyAudio, creo una transmisión que usa la frecuencia de muestreo que el modelo desea, que es 16000, pero el micrófono que estoy usando tiene una frecuencia de muestreo de 44100. Al ejecutar el script de Python, no se realiza ninguna conversión de frecuencia y la frecuencia de muestreo de los micrófonos y la esperada La frecuencia de muestreo del modelo produce un error de frecuencia de muestreo no válida.

La información del micrófono se muestra así por 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}

Lo primero que intenté fue establecer la frecuencia de muestreo de la transmisión de pyAudio en 44100 y alimentar el modelo con eso. Pero después de probar descubrí que el modelo no funciona bien cuando obtiene una tasa diferente a la solicitada de 16000.

He estado tratando de encontrar una manera de que el micrófono cambie la velocidad a 16000, o al menos convertir su velocidad a 16000 cuando se usa en el script de Python, pero fue en vano.

Lo último que he intentado es cambiar el archivo .asoundrc para encontrar una forma de cambiar la tasa, pero no sé si es posible cambiar la tasa del micrófono a 16000 dentro de este archivo. Así es como se ve el archivo actualmente:

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
} 

El código de Python que hice funciona en Windows, lo que supongo que se debe a que Windows convierte la frecuencia de entrada a la frecuencia de muestreo en el código. Pero Linux no parece hacer esto.

tldr; La frecuencia del micrófono es 44100, pero tiene que cambiar a 16000 para que se pueda utilizar. ¿Cómo se hace esto en Linux?

Edición 1:

Creo la secuencia de pyAudio así:

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

Utiliza la velocidad del modelo y el ancho de haz del modelo, y el número de canales del micrófono y el índice del micrófono.

Obtengo el siguiente cuadro de audio y para formatearlo correctamente para usarlo con la secuencia que creo para el modelo, hago esto:

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 = Falsese usó para probar el modelo con una tasa de entrada de 44100, sin esto establecido en False, ocurriría el mismo error con el que trato actualmente. model.beamWidthes una variable que contiene el valor de la cantidad de fragmentos que espera el modelo. Luego leo esa cantidad de fragmentos y los reformateo antes de enviarlos al flujo del modelo. Que sucede así:

modelStream.feedAudioContent(self.__get_next_audio_frame__())

Respuestas

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

Entonces, después de algunas pruebas más, terminé editando el archivo de configuración para pulse. En este archivo, puede descomentar las entradas que le permiten editar la frecuencia de muestreo predeterminada y / o alternativa. La edición de la frecuencia de muestreo alternativa de 48000 a 16000 es lo que pudo resolver mi problema.

El archivo se encuentra aquí: /etc/pulse/daemon.conf . Podemos abrir y editar este archivo en Raspberian usando sudo vi daemon.conf. Luego necesitamos descomentar la línea ; alternate-sample-rate = 48000que se hace eliminando ;y cambiando el valor de 48000a 16000. Guarde el archivo y salga de vim. Luego reinicie Pulseaudio usando pulseaudio -kpara asegurarse de que ejecuta el archivo modificado.

Si no está familiarizado con vim y Linux, aquí hay una guía más elaborada a través del proceso de cambio de la frecuencia de muestreo.