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是音频通道数。可以是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 位的 PCM 采样bytearray,其长度由抽取因子、通道数以及传递给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 上可用。