audio --- 音频模块

audio 模块用于从麦克风录制音频采样。从麦克风采集到的 PDM 采样经过滤波和抽取后转换为 PCM 采样,可以传递给用户回调(callback)或直接读入缓冲区(buffer)。

函数

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 是音频通道数。可以是 12。当使用多个通道时,音频采样会交错排列。仅在配备多个麦克风的开发板上支持多通道采集。

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 位的 PCM 采样 bytearray,其长度由抽取因子、通道数以及传递给 audio.init()samples 参数决定。在单通道模式下,每个条目是一个 16 位采样;在双通道模式下,采样成对交错排列。

在支持 audio.get_buffer() 的 port(Alif 和 RP2)上,传递一个不可调用的值(例如 None)会在没有回调的情况下开始采集,这样可以改用 audio.get_buffer() 来排空缓冲区。

audio.stop_streaming() None

停止音频采集并清除任何已安装的回调。

audio.get_buffer(timeout: int = 0) bytearray

返回下一个可用的 PCM 缓冲区。会阻塞直到有缓冲区就绪,或直到经过 timeout 毫秒(0 表示永久等待)。如果未启用流式传输、在 overflowTrue 时发生了缓冲区溢出,或者已安装流式回调,则引发 RuntimeError

在 Alif 和 RP2 port 上可用。

audio.read_pdm(buf: bytearray) None

将原始 PDM 采样从麦克风直接读入 bufbuf 必须是一个 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 上可用。