Como alterar a taxa de amostragem do microfone para 16000 no Linux?
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 = False
foi 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
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 = 48000
que é feito removendo o ;
e alterando o valor de 48000
para 16000
. Salve o arquivo e saia do vim. Em seguida, reinicie o Pulseaudio usando pulseaudio -k
para 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.