audio — Modul Audio

Modul audio slouží k záznamu zvukových vzorků z mikrofonu. PDM vzorky zachycené z mikrofonu jsou filtrovány a decimovány na PCM vzorky, které lze předat uživatelskému callbacku nebo přečíst přímo do bufferu.

Funkce

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

Inicializuje modul audio. Musí být zavolána jako první, dříve než se modul audio začne používat.

channels je počet zvukových kanálů. Může být 1 nebo 2. Při použití více než jednoho kanálu jsou zvukové vzorky prokládané. Vícekanálový záznam je podporován pouze na deskách s více než jedním mikrofonem.

frequency je vzorkovací frekvence PCM v Hz. Sada podporovaných frekvencí závisí na portu/desce.

gain_db je zisk mikrofonu, který se má aplikovat, v decibelech.

highpass je koeficient horní propusti (STM32) nebo boolean, který horní propust povoluje (Alif). Na portech, které horní propust neimplementují, je ignorován.

samples je počet PCM vzorků, které se mají akumulovat na jeden callback. Pokud je nastaveno na -1, hodnota se vypočítá automaticky z decimačního faktoru a počtu kanálů. Musí být násobkem 16. Dostupné na portech STM32 a Alif.

buffers je počet interních PCM bufferů použitých k řazení vzorků do fronty mezi DMA ISR a uživatelem. Dostupné na portech Alif a RP2.

overflow řídí, zda přetečení bufferu vyvolá RuntimeError. Při hodnotě False je nejstarší buffer přepsán a streamování pokračuje. Dostupné na portech Alif a RP2.

clkdiv přepíše dělič PIO hodin použitý k řízení PDM hodin. Při hodnotě 0 se dělič vypočítá z požadované frekvence. Dostupné na portu RP2.

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

Spustí záznam zvuku.

callback je volán z plánovače s jediným argumentem pcmbuf pokaždé, když je připraven nový PCM buffer. pcmbuf je signed 16bitový bytearray PCM vzorků, jehož délka je určena decimačním faktorem, počtem kanálů a argumentem samples předaným funkci audio.init(). V jednokanálovém režimu je každá položka jedním 16bitovým vzorkem; v dvoukanálovém režimu jsou vzorky prokládané v párech.

Na portech, které podporují audio.get_buffer() (Alif a RP2), předání nevolatelné hodnoty (např. None) spustí záznam bez callbacku, takže buffery lze místo toho vyprazdňovat pomocí audio.get_buffer().

audio.stop_streaming() None

Zastaví záznam zvuku a vymaže veškerý nainstalovaný callback.

audio.get_buffer(timeout: int = 0) bytearray

Vrátí další dostupný PCM buffer. Blokuje, dokud není buffer připraven nebo dokud neuplyne timeout milisekund (0 znamená čekat navždy). Vyvolá RuntimeError, pokud není povoleno streamování, pokud došlo k přetečení bufferu při overflow nastaveném na True, nebo pokud je nainstalován streamovací callback.

Dostupné na portech Alif a RP2.

audio.read_pdm(buf: bytearray) None

Čte surové PDM vzorky z mikrofonu přímo do buf. buf musí být array/bytearray, jehož velikost prvku odpovídá počtu kanálů (1 bajt pro mono, 2 bajty pro stereo).

Dostupné pouze na portu STM32 (desky založené na SAI).

audio.samples() int

Vrátí celkový počet PCM vzorků zachycených od posledního volání audio.start_streaming().

Dostupné pouze na portu RP2.

audio.overflow() bool

Vrátí True, pokud došlo k přetečení bufferu od posledního volání audio.start_streaming().

Dostupné pouze na portu RP2.