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.get_buffer(timeout: int = 0) bytearray¶
다음으로 사용 가능한 PCM 버퍼를 반환합니다. 버퍼가 준비되거나
timeout밀리초가 경과할 때까지 블록됩니다(0은 무한 대기를 의미). 스트리밍이 활성화되어 있지 않거나,overflow가True인 동안 버퍼 오버플로가 발생했거나, 스트리밍 콜백이 설치되어 있는 경우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 포트에서만 사용할 수 있습니다.