Como alterar a taxa de amostragem do microfone para 16000 no Linux?

Jan 06 2021

Atualmente, estou trabalhando em um projeto para o qual estou tentando usar a fala profunda em um pi de framboesa enquanto uso o áudio do microfone, mas continuo recebendo um erro de taxa de amostragem inválida. Usando o pyAudio, crio um fluxo que usa a taxa de amostragem que o modelo deseja, que é 16000, mas o microfone que estou usando tem uma taxa de amostragem de 44100. Ao executar o script python, nenhuma conversão de taxa é feita e a taxa de amostragem dos microfones e a esperada a taxa de amostragem do modelo produz um erro de Taxa de amostragem inválida.

As informações do microfone são listadas assim 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}

A primeira coisa que tentei foi definir a taxa de amostragem do stream pyAudio para 44100 e alimentar o modelo com isso. Mas depois de testar descobri que o modelo não funciona bem quando obtém uma taxa diferente de seus 16.000 solicitados.

Tenho tentado encontrar uma maneira de fazer com que a taxa de alteração do microfone para 16.000, ou pelo menos ter sua taxa convertida para 16.000 quando ele é usado no script python, mas sem sucesso.

A última coisa que tentei foi alterar o arquivo .asoundrc para descobrir como alterar a taxa, mas não sei se é possível alterar a taxa do microfone para 16000 neste arquivo. Esta é a aparência atual do arquivo:

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
} 

O código python que fiz funciona no Windows, o que eu acho que é porque o Windows converte a taxa de entrada para a taxa de amostragem no código. Mas o Linux não parece fazer isso.

tldr; a taxa do microfone é 44100, mas deve ser alterada para 16000 para ser utilizável. Como você faz isso no Linux?

Editar 1:

Eu crio o stream pyAudio assim:

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

Ele usa a taxa do modelo e a largura do feixe do modelo, e o número de canais do microfone e índice do microfone.

Pego o próximo quadro de áudio e para formatá-lo adequadamente para usar com o fluxo que crio para o modelo, faço o seguinte:

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 = Falsefoi usado para testar o modelo com uma taxa de entrada de 44100, sem isso definido como False, ocorreria o mesmo erro com o qual estou lidando atualmente. model.beamWidthé uma variável que contém o valor da quantidade de pedaços que o modelo espera. Eu então li essa quantidade de pedaços e os reformatei antes de alimentá-los no fluxo do modelo. O que acontece assim:

modelStream.feedAudioContent(self.__get_next_audio_frame__())

Respostas

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

Então, depois de mais alguns testes, acabei editando o arquivo de configuração do pulse. Neste arquivo, você pode remover o comentário de entradas que permitem editar a taxa de amostragem padrão e / ou alternativa. A edição da taxa de amostragem alternativa de 48.000 a 16.000 foi o que resolveu meu problema.

O arquivo está localizado aqui: /etc/pulse/daemon.conf . Podemos abrir e editar este arquivo no Raspberian usando sudo vi daemon.conf. Em seguida, precisamos descomentar a linha, o ; alternate-sample-rate = 48000que é feito removendo o ;e alterando o valor de 48000para 16000. Salve o arquivo e saia do vim. Em seguida, reinicie o Pulseaudio usando pulseaudio -kpara ter certeza de que executa o arquivo alterado.

Se você não está familiarizado com o vim e o Linux, aqui está um guia mais elaborado através do processo de alteração da taxa de amostragem.