audio — Módulo de Áudio

O módulo audio é usado para gravar amostras de áudio de um microfone. As amostras PDM capturadas do microfone são filtradas e decimadas em amostras PCM, que podem ser passadas para um callback do usuário ou lidas diretamente em um buffer.

Funções

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

Inicializa o módulo de áudio. Deve ser chamado primeiro, antes de usar o módulo de áudio.

channels é o número de canais de áudio. Pode ser 1 ou 2. As amostras de áudio são intercaladas quando mais de um canal é usado. A captura multicanal só é suportada em placas com mais de um microfone.

frequency é a frequência de amostragem PCM em Hz. O conjunto de frequências suportadas é específico de cada port/placa.

gain_db é o ganho do microfone a ser aplicado, em decibéis.

highpass é o coeficiente do filtro passa-alta (STM32) ou um booleano que habilita o filtro passa-alta (Alif). Ignorado em ports que não implementam um filtro passa-alta.

samples é o número de amostras PCM a acumular por callback. Se definido como -1, o valor é calculado automaticamente a partir do fator de decimação e do número de canais. Deve ser um múltiplo de 16. Disponível nos ports STM32 e Alif.

buffers é o número de buffers PCM internos usados para enfileirar amostras entre a ISR do DMA e o usuário. Disponível nos ports Alif e RP2.

overflow controla se um overflow de buffer gera RuntimeError. Quando False, o buffer mais antigo é sobrescrito e o streaming continua. Disponível nos ports Alif e RP2.

clkdiv sobrepõe o divisor de clock do PIO usado para gerar o clock PDM. Quando 0, o divisor é calculado a partir da frequência solicitada. Disponível no port RP2.

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

Inicia a captura de áudio.

callback é chamado pelo agendador com um único argumento pcmbuf cada vez que um novo buffer PCM está pronto. pcmbuf é um bytearray de 16 bits com sinal de amostras PCM cujo comprimento é determinado pelo fator de decimação, pelo número de canais e pelo argumento samples passado para audio.init(). No modo de canal único, cada entrada é uma amostra de 16 bits; no modo de canal duplo, as amostras são intercaladas em pares.

Em ports que suportam audio.get_buffer() (Alif e RP2), passar um valor não chamável (por exemplo, None) inicia a captura sem um callback, de modo que os buffers possam ser drenados com audio.get_buffer().

audio.stop_streaming() None

Para a captura de áudio e limpa qualquer callback instalado.

audio.get_buffer(timeout: int = 0) bytearray

Retorna o próximo buffer PCM disponível. Bloqueia até que um buffer esteja pronto ou até que timeout milissegundos tenham decorrido (0 significa esperar indefinidamente). Gera RuntimeError se o streaming não estiver habilitado, se ocorreu um overflow de buffer enquanto overflow é True, ou se um callback de streaming estiver instalado.

Disponível nos ports Alif e RP2.

audio.read_pdm(buf: bytearray) None

Lê amostras PDM brutas do microfone diretamente em buf. buf deve ser um array/bytearray cujo tamanho de elemento corresponda ao número de canais (1 byte para mono, 2 bytes para estéreo).

Disponível apenas no port STM32 (placas baseadas em SAI).

audio.samples() int

Retorna o número total de amostras PCM capturadas desde a última chamada de audio.start_streaming().

Disponível apenas no port RP2.

audio.overflow() bool

Retorna True se ocorreu um overflow de buffer desde a última chamada de audio.start_streaming().

Disponível apenas no port RP2.