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는 PCM 샘플 주파수(Hz)입니다. 지원되는 주파수 집합은 포트/보드에 따라 다릅니다.

gain_db는 적용할 마이크 게인이며, 단위는 데시벨입니다.

highpass는 하이패스 필터 계수(STM32)이거나 하이패스 필터를 활성화하는 불리언 값(Alif)입니다. 하이패스 필터를 구현하지 않는 포트에서는 무시됩니다.

samples는 콜백당 누적할 PCM 샘플 수입니다. -1로 설정하면 데시메이션 인자와 채널 수로부터 값이 자동으로 계산됩니다. 16의 배수여야 합니다. STM32 및 Alif 포트에서 사용할 수 있습니다.

buffers는 DMA ISR과 사용자 사이에서 샘플을 큐잉하는 데 사용되는 내부 PCM 버퍼의 개수입니다. Alif 및 RP2 포트에서 사용할 수 있습니다.

overflow는 버퍼 오버플로가 RuntimeError를 발생시킬지 여부를 제어합니다. False인 경우 가장 오래된 버퍼를 덮어쓰고 스트리밍이 계속됩니다. Alif 및 RP2 포트에서 사용할 수 있습니다.

clkdiv는 PDM 클럭을 구동하는 데 사용되는 PIO 클럭 분주기를 재정의합니다. 0인 경우 요청된 주파수로부터 분주기가 계산됩니다. RP2 포트에서 사용할 수 있습니다.

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

오디오 캡처를 시작합니다.

callback은 새로운 PCM 버퍼가 준비될 때마다 단일 인자 pcmbuf와 함께 스케줄러에서 호출됩니다. pcmbuf는 부호 있는 16비트 PCM 샘플의 bytearray이며, 그 길이는 데시메이션 인자, 채널 수, 그리고 audio.init()에 전달된 samples 인자에 의해 결정됩니다. 단일 채널 모드에서는 각 항목이 하나의 16비트 샘플이고, 이중 채널 모드에서는 샘플이 쌍으로 인터리브됩니다.

audio.get_buffer()를 지원하는 포트(Alif 및 RP2)에서는 호출 불가능한 값(예: None)을 전달하면 콜백 없이 캡처를 시작하므로, 그 대신 audio.get_buffer()로 버퍼를 비울 수 있습니다.

audio.stop_streaming() None

오디오 캡처를 중지하고 설치된 콜백을 모두 지웁니다.

audio.get_buffer(timeout: int = 0) bytearray

다음으로 사용 가능한 PCM 버퍼를 반환합니다. 버퍼가 준비되거나 timeout 밀리초가 경과할 때까지 블록됩니다(0은 무한 대기를 의미). 스트리밍이 활성화되어 있지 않거나, overflowTrue인 동안 버퍼 오버플로가 발생했거나, 스트리밍 콜백이 설치되어 있는 경우 RuntimeError를 발생시킵니다.

Alif 및 RP2 포트에서 사용할 수 있습니다.

audio.read_pdm(buf: bytearray) None

마이크에서 원시 PDM 샘플을 buf로 직접 읽어 들입니다. buf는 요소 크기가 채널 수와 일치하는 array/bytearray여야 합니다(모노의 경우 1바이트, 스테레오의 경우 2바이트).

STM32 포트(SAI 기반 보드)에서만 사용할 수 있습니다.

audio.samples() int

마지막 audio.start_streaming() 호출 이후 캡처된 총 PCM 샘플 수를 반환합니다.

RP2 포트에서만 사용할 수 있습니다.

audio.overflow() bool

마지막 audio.start_streaming() 호출 이후 버퍼 오버플로가 발생한 경우 True를 반환합니다.

RP2 포트에서만 사용할 수 있습니다.