Comment changer la fréquence d'échantillonnage du microphone à 16000 sous Linux?

Jan 06 2021

Je travaille actuellement sur un projet pour lequel j'essaie d'utiliser Deepspeech sur un raspberry pi tout en utilisant l'audio du microphone, mais j'obtiens toujours une erreur de taux d'échantillonnage invalide. En utilisant pyAudio, je crée un flux qui utilise la fréquence d'échantillonnage souhaitée par le modèle, soit 16000, mais le microphone que j'utilise a une fréquence d'échantillonnage de 44100. Lors de l'exécution du script python, aucune conversion de fréquence n'est effectuée et la fréquence d'échantillonnage des microphones et la fréquence attendue la fréquence d'échantillonnage du modèle produit une erreur de fréquence d'échantillonnage non valide.

Les informations du microphone sont répertoriées comme ceci par 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 première chose que j'ai essayée a été de régler la fréquence d'échantillonnage du flux pyAudio sur 44100 et d'alimenter le modèle. Mais après des tests, j'ai découvert que le modèle ne fonctionnait pas bien quand il obtenait un taux différent de ses 16000 demandés.

J'ai essayé de trouver un moyen de faire passer le taux de changement du microphone à 16000, ou au moins de convertir son taux à 16000 lorsqu'il est utilisé dans le script python, mais en vain.

La dernière chose que j'ai essayée est de changer le fichier .asoundrc pour trouver un moyen de changer le taux, mais je ne sais pas s'il est possible de changer le taux du microphone à 16000 dans ce fichier. Voici à quoi ressemble actuellement le fichier:

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
} 

Le code python que j'ai créé fonctionne sur Windows, ce qui, je suppose, est dû au fait que Windows convertit le taux d'entrée en taux d'échantillonnage dans le code. Mais Linux ne semble pas faire cela.

tldr; la fréquence du microphone est de 44100, mais doit passer à 16000 pour être utilisable. Comment faites-vous cela sous Linux?

Modifier 1:

Je crée le flux pyAudio comme ceci:

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

Il utilise le débit et la largeur de faisceau du modèle, ainsi que le nombre de canaux du microphone et l'indice du microphone.

J'obtiens l'image audio suivante et je la formate correctement pour l'utiliser avec le flux que je crée pour le modèle, je fais ceci:

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 = Falsea été utilisé pour tester le modèle avec un taux d'entrée de 44100, sans cette valeur définie sur False, la même erreur que celle que je traite actuellement se produirait. model.beamWidthest une variable qui contient la valeur de la quantité de blocs attendue par le modèle. J'ai ensuite lu cette quantité de morceaux et les reformater avant de les alimenter dans le flux du modèle. Ce qui se passe comme ceci:

modelStream.feedAudioContent(self.__get_next_audio_frame__())

Réponses

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

Donc, après quelques tests supplémentaires, j'ai fini par éditer le fichier de configuration pour pulse. Dans ce fichier, vous pouvez décommenter les entrées qui vous permettent de modifier la fréquence d'échantillonnage par défaut et / ou alternative. L'édition de la fréquence d'échantillonnage alternative de 48000 à 16000 est ce qui a pu résoudre mon problème.

Le fichier se trouve ici: /etc/pulse/daemon.conf . Nous pouvons ouvrir et éditer ce fichier sur Raspberian en utilisant sudo vi daemon.conf. Ensuite , nous devons décommentez la ligne ; alternate-sample-rate = 48000qui se fait en enlevant la ;et changer la valeur 48000à 16000. Enregistrez le fichier et quittez vim. Redémarrez ensuite le Pulseaudio en utilisant pulseaudio -kpour vous assurer qu'il exécute le fichier modifié.

Si vous n'êtes pas familier avec vim et Linux, voici un guide plus élaboré à travers le processus de modification de la fréquence d'échantillonnage.