audio — Модуль Audio

Модуль audio используется для записи аудиосэмплов с микрофона. Сэмплы PDM, захваченные с микрофона, фильтруются и прореживаются до сэмплов PCM, которые могут передаваться в пользовательскую функцию обратного вызова или считываться напрямую в буфер.

Функции

audio.init(channels: int = 1, frequency: int = 16000, gain_db: int = 24, highpass: float | bool = 0.9883, samples: int = -1, buffers: int = 16, overflow: bool = True, clkdiv: int = 0) None

Инициализирует модуль audio. Должна вызываться первой перед использованием модуля audio.

channels — количество аудиоканалов. Может быть 1 или 2. При использовании более одного канала аудиосэмплы чередуются. Многоканальный захват поддерживается только на платах с более чем одним микрофоном.

frequency — частота сэмплирования PCM в Гц. Набор поддерживаемых частот зависит от порта и платы.

gain_db — применяемое усиление микрофона в децибелах.

highpass — коэффициент фильтра верхних частот (STM32) или булево значение, включающее фильтр верхних частот (Alif). Игнорируется на портах, которые не реализуют фильтр верхних частот.

samples — количество сэмплов PCM, накапливаемых за один вызов функции обратного вызова. Если задано значение -1, оно вычисляется автоматически из коэффициента прореживания и количества каналов. Должно быть кратно 16. Доступно на портах STM32 и Alif.

buffers — количество внутренних буферов PCM, используемых для постановки сэмплов в очередь между DMA ISR и пользователем. Доступно на портах Alif и RP2.

overflow управляет тем, вызывает ли переполнение буфера исключение RuntimeError. При значении False самый старый буфер перезаписывается, и потоковая передача продолжается. Доступно на портах Alif и RP2.

clkdiv переопределяет делитель тактовой частоты PIO, используемый для управления тактовым сигналом PDM. При значении 0 делитель вычисляется из запрошенной частоты. Доступно на порте RP2.

audio.start_streaming(callback: Callable[[bytearray], None] | None) None

Запускает захват аудио.

callback вызывается планировщиком с единственным аргументом pcmbuf каждый раз, когда готов новый буфер PCM. pcmbuf — это знаковый 16-битный bytearray сэмплов PCM, длина которого определяется коэффициентом прореживания, количеством каналов и аргументом samples, переданным в audio.init(). В одноканальном режиме каждый элемент представляет собой один 16-битный сэмпл; в двухканальном режиме сэмплы чередуются парами.

На портах, поддерживающих audio.get_buffer() (Alif и RP2), передача невызываемого значения (например, None) запускает захват без функции обратного вызова, чтобы вместо этого буферы можно было опустошать с помощью audio.get_buffer().

audio.stop_streaming() None

Останавливает захват аудио и очищает любую установленную функцию обратного вызова.

audio.get_buffer(timeout: int = 0) bytearray

Возвращает следующий доступный буфер PCM. Блокируется до тех пор, пока буфер не будет готов или пока не истечёт timeout миллисекунд (0 означает ожидание без ограничения времени). Вызывает RuntimeError, если потоковая передача не включена, если произошло переполнение буфера при overflow равном True, или если установлена функция обратного вызова потоковой передачи.

Доступно на портах Alif и RP2.

audio.read_pdm(buf: bytearray) None

Считывает необработанные сэмплы PDM с микрофона напрямую в buf. buf должен быть объектом array/bytearray, размер элемента которого соответствует количеству каналов (1 байт для моно, 2 байта для стерео).

Доступно только на порте STM32 (платы на базе SAI).

audio.samples() int

Возвращает общее количество сэмплов PCM, захваченных с момента последнего вызова audio.start_streaming().

Доступно только на порте RP2.

audio.overflow() bool

Возвращает True, если переполнение буфера произошло с момента последнего вызова audio.start_streaming().

Доступно только на порте RP2.