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 และ Alifbuffersคือจำนวนบัฟเฟอร์ PCM ภายในที่ใช้เพื่อเข้าคิวตัวอย่างระหว่าง DMA ISR และผู้ใช้ ใช้งานได้บนพอร์ต Alif และ RP2overflowควบคุมว่าบัฟเฟอร์ล้นจะทำให้เกิดRuntimeErrorหรือไม่ เมื่อเป็นFalseบัฟเฟอร์ที่เก่าที่สุดจะถูกเขียนทับและการสตรีมยังคงดำเนินต่อไป ใช้งานได้บนพอร์ต Alif และ RP2clkdivแทนที่ตัวหารนาฬิกา 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.get_buffer(timeout: int = 0) bytearray¶
คืนค่าบัฟเฟอร์ PCM ที่พร้อมใช้งานถัดไป บล็อกจนกว่าบัฟเฟอร์จะพร้อมหรือจนกว่าจะผ่านไป
timeoutมิลลิวินาที (0หมายถึงรอตลอดไป) ทำให้เกิดRuntimeErrorหากการสตรีมไม่ได้เปิดใช้งาน หากเกิดบัฟเฟอร์ล้นขณะที่overflowเป็นTrueหรือหากมีการติดตั้งคอลแบ็กสตรีมมิ่งใช้งานได้บนพอร์ต Alif และ RP2
- audio.read_pdm(buf: bytearray) None¶
อ่านตัวอย่าง PDM ดิบจากไมโครโฟนโดยตรงลงใน
bufbufต้องเป็นarray/bytearrayที่ขนาดองค์ประกอบตรงกับจำนวนช่องสัญญาณ (1 ไบต์สำหรับโมโน 2 ไบต์สำหรับสเตอริโอ)ใช้งานได้บนพอร์ต STM32 (บอร์ดที่ใช้ SAI) เท่านั้น
- audio.samples() int¶
คืนค่าจำนวนตัวอย่าง PCM ทั้งหมดที่บันทึกได้นับตั้งแต่การเรียก
audio.start_streaming()ครั้งล่าสุดใช้งานได้บนพอร์ต RP2 เท่านั้น
- audio.overflow() bool¶
คืนค่า
Trueหากเกิดบัฟเฟอร์ล้นนับตั้งแต่การเรียกaudio.start_streaming()ครั้งล่าสุดใช้งานได้บนพอร์ต RP2 เท่านั้น