audio --- 音訊模組¶
audio 模組用於從麥克風錄製音訊取樣。從麥克風擷取的 PDM 取樣會經過濾波與降取樣,轉換成 PCM 取樣,再傳遞給使用者回呼函式或直接讀入緩衝區。
函式¶
- 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¶
初始化音訊模組。在使用音訊模組之前必須先呼叫此函式。
channels是音訊聲道數量。可為1或2。當使用一個以上的聲道時,音訊取樣會交錯排列。多聲道擷取僅在具有多個麥克風的開發板上支援。frequency是以 Hz 為單位的 PCM 取樣頻率。支援的頻率組合視 port/開發板而定。gain_db是要套用的麥克風增益,單位為分貝。highpass是高通濾波器係數(STM32)或啟用高通濾波器的布林值(Alif)。在未實作高通濾波器的 port 上會被忽略。samples是每次回呼要累積的 PCM 取樣數量。若設為-1,則會根據降取樣係數與聲道數量自動計算其值。必須是 16 的倍數。可在 STM32 與 Alif port 上使用。buffers是用於在 DMA ISR 與使用者之間排入取樣佇列的內部 PCM 緩衝區數量。可在 Alif 與 RP2 port 上使用。overflow控制緩衝區溢位是否引發RuntimeError。當設為False時,最舊的緩衝區會被覆寫,串流會繼續進行。可在 Alif 與 RP2 port 上使用。clkdiv覆寫用於驅動 PDM 時脈的 PIO 時脈除數。當設為0時,除數會根據要求的頻率計算得出。可在 RP2 port 上使用。
- audio.start_streaming(callback: Callable[[bytearray], None] | None) None¶
開始音訊擷取。
每當有新的 PCM 緩衝區就緒時,
callback就會由排程器以單一引數pcmbuf呼叫。pcmbuf是一個帶正負號的 16 位元bytearrayPCM 取樣,其長度由降取樣係數、聲道數量以及傳遞給audio.init()的samples引數決定。在單聲道模式中,每個項目為一個 16 位元取樣;在雙聲道模式中,取樣會成對交錯排列。在支援
audio.get_buffer()的 port(Alif 與 RP2)上,傳入不可呼叫的值(例如None)會在沒有回呼函式的情況下開始擷取,如此便可改用audio.get_buffer()來取出緩衝區。
- audio.get_buffer(timeout: int = 0) bytearray¶
傳回下一個可用的 PCM 緩衝區。會封鎖直到有緩衝區就緒,或直到經過
timeout毫秒為止(0表示永遠等待)。若串流未啟用、若在overflow為True時發生緩衝區溢位,或若已安裝串流回呼函式,則引發RuntimeError。可在 Alif 與 RP2 port 上使用。
- audio.read_pdm(buf: bytearray) None¶
從麥克風讀取原始 PDM 取樣,直接讀入
buf。buf必須是元素大小與聲道數量相符的array/bytearray(單聲道為 1 位元組,立體聲為 2 位元組)。僅可在 STM32 port(採用 SAI 的開發板)上使用。
- audio.samples() int¶
傳回自上次呼叫
audio.start_streaming()以來所擷取的 PCM 取樣總數。僅可在 RP2 port 上使用。
- audio.overflow() bool¶
若自上次呼叫
audio.start_streaming()以來發生過緩衝區溢位,則傳回True。僅可在 RP2 port 上使用。