Как изменить частоту дискретизации микрофона на 16000 в Linux?

Jan 06 2021

В настоящее время я работаю над проектом, для которого я пытаюсь использовать Deepspeech на Raspberry Pi при использовании звука с микрофона, но я продолжаю получать ошибку недопустимой частоты дискретизации. Используя pyAudio, я создаю поток, который использует частоту дискретизации, которую хочет модель, которая составляет 16000, но микрофон, который я использую, имеет частоту дискретизации 44100. При запуске скрипта python преобразование частоты не выполняется, а частота дискретизации микрофонов и ожидаемая частота дискретизации модели приводит к ошибке недопустимой частоты дискретизации.

Информация о микрофоне указана 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}

Первое, что я попробовал, - это установить частоту дискретизации потока pyAudio на 44100 и скормить модель. Но после тестирования я обнаружил, что модель плохо работает, когда она получает скорость, отличную от запрошенных 16000.

Я пытался найти способ установить частоту смены микрофона до 16000 или, по крайней мере, преобразовать его скорость в 16000, когда он используется в скрипте python, но безрезультатно.

Последнее, что я пробовал, - это изменить файл .asoundrc, чтобы найти его, чтобы изменить скорость, но я не знаю, можно ли изменить скорость микрофона на 16000 в этом файле. Вот как сейчас выглядит файл:

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
} 

Код python, который я сделал, работает в Windows, что, я думаю, связано с тем, что окна действительно преобразуют скорость ввода в частоту дискретизации в коде. Но Linux, похоже, этого не делает.

tldr; частота микрофона составляет 44100, но должна быть изменена на 16000, чтобы можно было использовать. Как это сделать в Linux?

Изменить 1:

Я создаю поток pyAudio следующим образом:

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

Он использует частоту и ширину луча модели, а также количество каналов микрофона и индекс микрофона.

Я получаю следующий аудиокадр и для его правильного форматирования для использования с потоком, который я создаю для модели, я делаю следующее:

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был использован для тестирования модели со скоростью ввода 44100, без этого значения False возникла бы та же ошибка, с которой я сейчас имею дело. model.beamWidth- это переменная, которая содержит значение количества фрагментов, ожидаемых моделью. Затем я считываю это количество фрагментов и переформатирую их перед подачей в поток модели. Что происходит так:

modelStream.feedAudioContent(self.__get_next_audio_frame__())

Ответы

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

Итак, после еще нескольких тестов я закончил редактировать файл конфигурации для Pulse. В этом файле вы можете раскомментировать записи, которые позволяют вам редактировать стандартную и / или альтернативную частоту дискретизации. Редактирование альтернативной частоты дискретизации с 48000 до 16000 - вот что помогло решить мою проблему.

Файл находится здесь: /etc/pulse/daemon.conf . Мы можем открыть и отредактировать этот файл на Raspberian, используя sudo vi daemon.conf. Затем нам нужно раскомментировать строку ; alternate-sample-rate = 48000, удалив ;и изменив значение 48000на 16000. Сохраните файл и выйдите из vim. Затем перезапустите Pulseaudio, pulseaudio -kчтобы убедиться, что он запускает измененный файл.

Если вы не знакомы с vim и Linux, вот более подробное руководство по процессу изменения частоты дискретизации.