audio — Módulo de Áudio

O módulo audio é utilizado para gravar amostras de áudio a partir de um microfone. As amostras PDM captadas pelo microfone são filtradas e decimadas para amostras PCM, que podem ser passadas a um callback do utilizador ou lidas diretamente para 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 antes de utilizar 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 se utiliza mais de um canal. A captura multicanal só é suportada em placas com mais de um microfone.

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

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

highpass é o coeficiente do filtro passa-alto (STM32) ou um booleano que ativa o filtro passa-alto (Alif). Ignorado em portas que não implementam um filtro passa-alto.

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 nas portas STM32 e Alif.

buffers é o número de buffers PCM internos utilizados para colocar amostras em fila entre o DMA ISR e o utilizador. Disponível nas portas Alif e RP2.

overflow controla se um overflow de buffer lança RuntimeError. Quando False, o buffer mais antigo é sobrescrito e a transmissão continua. Disponível nas portas Alif e RP2.

clkdiv substitui o divisor de relógio PIO utilizado para acionar o relógio PDM. Quando 0, o divisor é calculado a partir da frequência solicitada. Disponível na porta RP2.

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

Inicia a captura de áudio.

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

Em portas que suportam audio.get_buffer() (Alif e RP2), passar um valor não chamável (por exemplo, None) inicia a captura sem callback, para 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 aguardar indefinidamente). Lança RuntimeError se a transmissão não estiver ativa, se tiver ocorrido um overflow de buffer enquanto overflow é True, ou se existir um callback de transmissão instalado.

Disponível nas portas Alif e RP2.

audio.read_pdm(buf: bytearray) None

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

Disponível apenas na porta STM32 (placas baseadas em SAI).

audio.samples() int

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

Disponível apenas na porta RP2.

audio.overflow() bool

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

Disponível apenas na porta RP2.