audio --- โมดูล 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

เริ่มต้นโมดูล audio ต้องเรียกใช้ก่อนการใช้งานโมดูล audio

channels คือจำนวนช่องสัญญาณเสียง อาจเป็น 1 หรือ 2 ตัวอย่างเสียงจะถูกสลับกันเมื่อมีมากกว่าหนึ่งช่องสัญญาณ การบันทึกหลายช่องสัญญาณรองรับเฉพาะบอร์ดที่มีไมโครโฟนมากกว่าหนึ่งตัว

frequency คือความถี่ตัวอย่าง PCM เป็น Hz ชุดความถี่ที่รองรับขึ้นอยู่กับพอร์ต/บอร์ดที่ใช้งาน

gain_db คือค่าเกนของไมโครโฟนที่จะใช้ เป็นหน่วยเดซิเบล

highpass คือค่าสัมประสิทธิ์ตัวกรองความถี่สูง (STM32) หรือค่าบูลีนเพื่อเปิดใช้งานตัวกรองความถี่สูง (Alif) จะถูกละเว้นในพอร์ตที่ไม่มีการใช้งานตัวกรองความถี่สูง

samples คือจำนวนตัวอย่าง PCM ที่จะสะสมต่อคอลแบ็ก หากตั้งค่าเป็น -1 ค่าจะถูกคำนวณโดยอัตโนมัติจากปัจจัยการลดตัวอย่างและจำนวนช่องสัญญาณ ต้องเป็นผลคูณของ 16 ใช้งานได้บนพอร์ต STM32 และ Alif

buffers คือจำนวนบัฟเฟอร์ PCM ภายในที่ใช้เพื่อเข้าคิวตัวอย่างระหว่าง DMA ISR และผู้ใช้ ใช้งานได้บนพอร์ต Alif และ RP2

overflow ควบคุมว่าบัฟเฟอร์ล้นจะทำให้เกิด RuntimeError หรือไม่ เมื่อเป็น False บัฟเฟอร์ที่เก่าที่สุดจะถูกเขียนทับและการสตรีมยังคงดำเนินต่อไป ใช้งานได้บนพอร์ต Alif และ RP2

clkdiv แทนที่ตัวหารนาฬิกา PIO ที่ใช้ขับ PDM clock เมื่อเป็น 0 ตัวหารจะถูกคำนวณจากความถี่ที่ร้องขอ ใช้งานได้บนพอร์ต RP2

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

เริ่มการบันทึกเสียง

callback จะถูกเรียกจาก scheduler ด้วยอาร์กิวเมนต์เดียว pcmbuf ทุกครั้งที่บัฟเฟอร์ PCM ใหม่พร้อมใช้งาน pcmbuf คือ bytearray แบบ signed 16-bit ของตัวอย่าง PCM ซึ่งความยาวถูกกำหนดโดยปัจจัยการลดตัวอย่าง จำนวนช่องสัญญาณ และอาร์กิวเมนต์ samples ที่ส่งไปยัง audio.init() ในโหมดช่องสัญญาณเดียว แต่ละรายการคือตัวอย่าง 16-bit หนึ่งตัว ในโหมดสองช่องสัญญาณ ตัวอย่างจะถูกสลับกันเป็นคู่

บนพอร์ตที่รองรับ audio.get_buffer() (Alif และ RP2) การส่งค่าที่ไม่สามารถเรียกใช้งานได้ (เช่น None) จะเริ่มการบันทึกโดยไม่มีคอลแบ็ก เพื่อให้สามารถดึงข้อมูลจากบัฟเฟอร์ด้วย audio.get_buffer() แทน

audio.stop_streaming() None

หยุดการบันทึกเสียงและล้างคอลแบ็กที่ติดตั้งไว้

audio.get_buffer(timeout: int = 0) bytearray

คืนค่าบัฟเฟอร์ PCM ที่พร้อมใช้งานถัดไป บล็อกจนกว่าบัฟเฟอร์จะพร้อมหรือจนกว่าจะผ่านไป timeout มิลลิวินาที (0 หมายถึงรอตลอดไป) ทำให้เกิด RuntimeError หากการสตรีมไม่ได้เปิดใช้งาน หากเกิดบัฟเฟอร์ล้นขณะที่ overflow เป็น True หรือหากมีการติดตั้งคอลแบ็กสตรีมมิ่ง

ใช้งานได้บนพอร์ต Alif และ RP2

audio.read_pdm(buf: bytearray) None

อ่านตัวอย่าง PDM ดิบจากไมโครโฟนโดยตรงลงใน buf buf ต้องเป็น array/bytearray ที่ขนาดองค์ประกอบตรงกับจำนวนช่องสัญญาณ (1 ไบต์สำหรับโมโน 2 ไบต์สำหรับสเตอริโอ)

ใช้งานได้บนพอร์ต STM32 (บอร์ดที่ใช้ SAI) เท่านั้น

audio.samples() int

คืนค่าจำนวนตัวอย่าง PCM ทั้งหมดที่บันทึกได้นับตั้งแต่การเรียก audio.start_streaming() ครั้งล่าสุด

ใช้งานได้บนพอร์ต RP2 เท่านั้น

audio.overflow() bool

คืนค่า True หากเกิดบัฟเฟอร์ล้นนับตั้งแต่การเรียก audio.start_streaming() ครั้งล่าสุด

ใช้งานได้บนพอร์ต RP2 เท่านั้น