audio — Modulo Audio

Il modulo audio viene utilizzato per registrare campioni audio da un microfono. I campioni PDM acquisiti dal microfono vengono filtrati e decimati in campioni PCM, che possono essere passati a una callback definita dall’utente oppure letti direttamente in un buffer.

Funzioni

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

Inizializza il modulo audio. Deve essere chiamata per prima, prima di utilizzare il modulo audio.

channels è il numero di canali audio. Può essere 1 o 2. I campioni audio vengono interlacciati quando si utilizza più di un canale. L’acquisizione multicanale è supportata solo sulle schede dotate di più di un microfono.

frequency è la frequenza di campionamento PCM in Hz. L’insieme delle frequenze supportate dipende dalla porta/scheda.

gain_db è il guadagno del microfono da applicare, in decibel.

highpass è il coefficiente del filtro passa-alto (STM32) oppure un valore booleano che abilita il filtro passa-alto (Alif). Viene ignorato sulle porte che non implementano un filtro passa-alto.

samples è il numero di campioni PCM da accumulare per ogni callback. Se impostato a -1 il valore viene calcolato automaticamente dal fattore di decimazione e dal numero di canali. Deve essere un multiplo di 16. Disponibile sulle porte STM32 e Alif.

buffers è il numero di buffer PCM interni utilizzati per accodare i campioni tra l’ISR del DMA e l’utente. Disponibile sulle porte Alif e RP2.

overflow controlla se un overflow del buffer genera un RuntimeError. Quando è False il buffer più vecchio viene sovrascritto e lo streaming continua. Disponibile sulle porte Alif e RP2.

clkdiv sovrascrive il divisore di clock del PIO utilizzato per pilotare il clock PDM. Quando è 0 il divisore viene calcolato dalla frequenza richiesta. Disponibile sulla porta RP2.

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

Avvia l’acquisizione audio.

callback viene chiamata dallo scheduler con un singolo argomento pcmbuf ogni volta che un nuovo buffer PCM è pronto. pcmbuf è un bytearray di campioni PCM a 16 bit con segno, la cui lunghezza è determinata dal fattore di decimazione, dal numero di canali e dall’argomento samples passato a audio.init(). In modalità a canale singolo ogni elemento è un campione a 16 bit; in modalità a doppio canale i campioni sono interlacciati a coppie.

Sulle porte che supportano audio.get_buffer() (Alif e RP2), passare un valore non richiamabile (ad esempio None) avvia l’acquisizione senza una callback, in modo che i buffer possano essere svuotati con audio.get_buffer().

audio.stop_streaming() None

Arresta l’acquisizione audio e cancella qualsiasi callback installata.

audio.get_buffer(timeout: int = 0) bytearray

Restituisce il prossimo buffer PCM disponibile. Si blocca finché un buffer non è pronto oppure finché non sono trascorsi timeout millisecondi (0 significa attendere indefinitamente). Genera un RuntimeError se lo streaming non è abilitato, se si è verificato un overflow del buffer mentre overflow è True, oppure se è installata una callback di streaming.

Disponibile sulle porte Alif e RP2.

audio.read_pdm(buf: bytearray) None

Legge campioni PDM grezzi dal microfono direttamente in buf. buf deve essere un array/bytearray la cui dimensione degli elementi corrisponda al numero di canali (1 byte per il mono, 2 byte per lo stereo).

Disponibile solo sulla porta STM32 (schede basate su SAI).

audio.samples() int

Restituisce il numero totale di campioni PCM acquisiti dall’ultima chiamata a audio.start_streaming().

Disponibile solo sulla porta RP2.

audio.overflow() bool

Restituisce True se si è verificato un overflow del buffer dall’ultima chiamata a audio.start_streaming().

Disponibile solo sulla porta RP2.