audio — Modulul Audio

Modulul audio este folosit pentru a înregistra eșantioane audio de la un microfon. Eșantioanele PDM captate de la microfon sunt filtrate și decimate în eșantioane PCM care pot fi transmise unei funcții de retroapelare (callback) a utilizatorului sau citite direct într-un tampon (buffer).

Funcții

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

Inițializează modulul audio. Trebuie apelată prima dată, înainte de a folosi modulul audio.

channels este numărul de canale audio. Poate fi 1 sau 2. Eșantioanele audio sunt intercalate atunci când se folosește mai mult de un canal. Captarea pe mai multe canale este acceptată doar pe plăcile cu mai mult de un microfon.

frequency este frecvența de eșantionare PCM în Hz. Setul de frecvențe acceptate este specific portului/plăcii.

gain_db este amplificarea (gain) microfonului care se aplică, în decibeli.

highpass este coeficientul filtrului trece-sus (STM32) sau o valoare booleană care activează filtrul trece-sus (Alif). Ignorat pe porturile care nu implementează un filtru trece-sus.

samples este numărul de eșantioane PCM care se acumulează per funcție de retroapelare (callback). Dacă este setat la -1, valoarea este calculată automat din factorul de decimare și numărul de canale. Trebuie să fie un multiplu de 16. Disponibil pe porturile STM32 și Alif.

buffers este numărul de tampoane (buffers) PCM interne folosite pentru a pune în coadă eșantioanele între ISR-ul DMA și utilizator. Disponibil pe porturile Alif și RP2.

overflow controlează dacă o depășire a tamponului (buffer) generează RuntimeError. Când este False, cel mai vechi tampon (buffer) este suprascris și streaming-ul continuă. Disponibil pe porturile Alif și RP2.

clkdiv suprascrie divizorul de ceas PIO folosit pentru a comanda ceasul PDM. Când este 0, divizorul este calculat din frecvența solicitată. Disponibil pe portul RP2.

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

Pornește captarea audio.

callback este apelată din planificator cu un singur argument pcmbuf de fiecare dată când un nou tampon (buffer) PCM este gata. pcmbuf este un bytearray de eșantioane PCM cu semn pe 16 biți a cărui lungime este determinată de factorul de decimare, numărul de canale și argumentul samples transmis către audio.init(). În modul cu un singur canal, fiecare intrare este un eșantion pe 16 biți; în modul cu două canale, eșantioanele sunt intercalate în perechi.

Pe porturile care acceptă audio.get_buffer() (Alif și RP2), transmiterea unei valori neapelabile (de ex. None) pornește captarea fără funcție de retroapelare (callback), astfel încât tampoanele (buffers) să poată fi golite folosind în schimb audio.get_buffer().

audio.stop_streaming() None

Oprește captarea audio și șterge orice funcție de retroapelare (callback) instalată.

audio.get_buffer(timeout: int = 0) bytearray

Returnează următorul tampon (buffer) PCM disponibil. Blochează până când un tampon (buffer) este gata sau până când trec timeout milisecunde (0 înseamnă așteptare la nesfârșit). Generează RuntimeError dacă streaming-ul nu este activat, dacă a avut loc o depășire a tamponului (buffer) în timp ce overflow este True sau dacă este instalată o funcție de retroapelare (callback) de streaming.

Disponibil pe porturile Alif și RP2.

audio.read_pdm(buf: bytearray) None

Citește eșantioane PDM brute de la microfon direct în buf. buf trebuie să fie un obiect array/bytearray a cărui dimensiune a elementului corespunde numărului de canale (1 octet pentru mono, 2 octeți pentru stereo).

Disponibil doar pe portul STM32 (plăci bazate pe SAI).

audio.samples() int

Returnează numărul total de eșantioane PCM captate de la ultimul apel al audio.start_streaming().

Disponibil doar pe portul RP2.

audio.overflow() bool

Returnează True dacă a avut loc o depășire a tamponului (buffer) de la ultimul apel al audio.start_streaming().

Disponibil doar pe portul RP2.