
สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-23 15:12



สำหรับโครงการสุดท้ายของเราในหลักสูตรระบบโต้ตอบในฤดูใบไม้ผลินี้ เราได้สร้างระบบแบบเรียลไทม์สำหรับการระบุและแสดงภาพเสียงทั่วไปในห้องครัวโดยใช้การจำแนกประเภท Support-Vector Machine ระบบประกอบด้วยแล็ปท็อปสำหรับการสุ่มตัวอย่าง/การจัดประเภทเสียง และจอแสดงผล Arduino/ดอทเมทริกซ์สำหรับการแสดงภาพ ต่อไปนี้คือแนวทางในการสร้างเวอร์ชันของระบบนี้สำหรับเสียงจากห้องครัวของคุณเอง
กรณีการใช้งานดั้งเดิมของเราใช้เป็นอุปกรณ์สำหรับใช้ในครัวของคนหูหนวกและมีปัญหาทางการได้ยิน แต่ระบบนี้สามารถปรับตามทฤษฎีเพื่อระบุชุดของเสียงในบริบทต่างๆ ได้ ห้องครัวเป็นสถานที่ที่เหมาะสำหรับการเริ่มต้น เนื่องจากมักจะค่อนข้างเงียบและมีเสียงที่ชัดเจนและเรียบง่ายในปริมาณที่เหมาะสม
ที่เก็บ GitHub สำหรับโครงการนี้สามารถพบได้ที่นี่
เสบียง
- Arduino Leonardo Microcontroller พร้อมส่วนหัว
- KEYESTUDIO 16x16 Dot Matrix LED Display สำหรับ Arduino
- สายจัมเปอร์เขียงหั่นขนม
- สาย Micro-USB เป็น USB 2.0
-
แล็ปท็อปที่มี Jupyter Notebook (การติดตั้ง Anaconda)
คู่มือสำหรับผู้เริ่มต้นใช้งาน Jupyter Notebook สามารถพบได้ที่นี่
-
อิฐเลโก้ที่ไม่ตรงกันจำนวนมากสำหรับที่อยู่อาศัยของระบบ
(แต่จริงๆ แล้วคุณสามารถแทนที่สิ่งเหล่านี้ด้วยวัสดุก่อสร้าง DIY ที่คุณต้องการ!)
ขั้นตอนที่ 1: รวบรวมตัวอย่างเสียงในครัว

รูปด้านบน: ข้อมูลเสียงที่นำมาจากการบันทึกส้อมและมีดกระทบกันโดยใช้กระบวนการรวบรวมนี้
เพื่อระบุเสียงแบบเรียลไทม์ เราจำเป็นต้องจัดหาโมเดลการเรียนรู้ด้วยเครื่องของเราพร้อมตัวอย่างคุณภาพสำหรับการเปรียบเทียบ เราได้สร้างสมุดบันทึก Jupyter สำหรับกระบวนการนี้ ซึ่งสามารถเข้าถึงได้ที่นี่หรือผ่านที่เก็บ GitHub ของโปรเจ็กต์ของเรา พื้นที่เก็บข้อมูลยังมีคอลเลกชันตัวอย่างจากครัวสองแห่งที่แตกต่างกันเพื่อวัตถุประสงค์ในการทดสอบ
ขั้นตอนที่ 1.1: คัดลอกสมุดบันทึก CollectSamples.ipynb ไปยังไดเร็กทอรี Jupyter Notebook ที่ใช้งานได้แล้วเปิดขึ้น
ขั้นตอนที่ 1.2: เรียกใช้แต่ละเซลล์ทีละเซลล์ โดยให้ความสนใจกับบันทึกย่อที่เราให้ไว้ในส่วนหัว หยุดเมื่อคุณไปถึงหนึ่งชื่อ "การบันทึกตัวอย่าง"
หมายเหตุ: สมุดบันทึกนี้ใช้ไลบรารี Python หลายรายการ และแต่ละรายการต้องมีการติดตั้งก่อนจึงจะนำเข้าไปยังโปรเจ็กต์ได้สำเร็จ คุณสามารถดำเนินการนี้ได้ด้วยตนเอง แม้ว่าจะดูคำแนะนำสำหรับการติดตั้งไลบรารีภายใน Jupyter Notebook ได้ที่นี่
ขั้นตอนที่ 1.3: สร้างไดเร็กทอรีว่างเพื่อเก็บตัวอย่างของคุณภายในไดเร็กทอรีการทำงานของคุณสำหรับโครงการนี้
ขั้นตอนที่ 1.4: แก้ไขตัวแปร SAMPLES_LOCATION ในเซลล์ "Sample Recording" เพื่อให้ตรงกับตำแหน่งของไดเรกทอรีว่างของคุณ
ขั้นตอนที่ 1.5: เพิ่มหรือลบเสียงได้มากเท่าที่คุณต้องการในตัวแปร SOUND_LABELS
เพื่อให้โค้ดบันทึกตัวอย่างทำงาน แต่ละบรรทัดของตัวแปรนี้ต้องคั่นด้วยเครื่องหมายจุลภาคและอยู่ในรูปแบบต่อไปนี้:
'ts':Sound("TargetedSound", "ts")
ขั้นตอนที่ 1.6: เมื่อเพิ่มป้ายกำกับทั้งหมดแล้ว ให้ประเมินเซลล์ "การบันทึกตัวอย่าง" โดยเริ่มกระบวนการรวบรวมตัวอย่าง ในเอาต์พุตของเซลล์ คุณจะได้รับแจ้งให้ป้อนรหัสสั้นที่คุณเชื่อมโยงกับแต่ละเสียงในป้ายกำกับ (เช่น "ts" สำหรับ TargetedSound) อย่าเพิ่งทำเช่นนี้
ขั้นตอนที่ 1.7: นำแล็ปท็อปของคุณไปที่ห้องครัวและวางไว้ในพื้นที่ที่คุณน่าจะวางระบบที่เสร็จแล้วได้มากที่สุด ตำแหน่งนี้ควรเป็นศูนย์กลางสำหรับการรวบรวมเสียงที่ดีและแห้งและห่างจากการรั่วไหลที่อาจเกิดขึ้นเพื่อปกป้องอุปกรณ์อิเล็กทรอนิกส์ของคุณ
ขั้นตอนที่ 1.8: เตรียมเสียงเป้าหมายแรกของคุณ หากนี่คือเสียงบี๊บของตัวจับเวลาเตาอบ คุณอาจตั้งเวลาเป็นหนึ่งนาทีและรอให้นับถอยหลังเหลือ 20 วินาทีหรือมากกว่านั้นก่อนที่จะดำเนินการในขั้นตอนต่อไป
ขั้นตอนที่ 1.9: พิมพ์รหัสฉลากลงในพร้อมท์ (เช่น "ts") แล้วกด Enter/Return
ระบบจะเริ่มฟังเหตุการณ์เสียงที่แตกต่างจากเสียงรบกวนรอบข้างของห้อง เมื่อตรวจพบเหตุการณ์เสียงนี้ จะเริ่มบันทึกจนกว่าเสียงในห้องจะกลับสู่ระดับแวดล้อม จากนั้นจะบันทึกเสียงเป็นไฟล์ WAV 16 บิตไปยังไดเร็กทอรีที่ระบุใน SAMPLES_LOCATION ในรูปแบบ:
TargetedSound_#_captured.wav
ส่วน # ของชื่อไฟล์นี้สอดคล้องกับจำนวนตัวอย่างของเสียงเป้าหมายที่คุณรวบรวมไว้ หลังจากบันทึกไฟล์ WAV แล้ว ข้อความแจ้งจะทำซ้ำ ช่วยให้คุณสามารถรวบรวมตัวอย่างเสียงเดียวกันได้หลายตัวอย่างในการดำเนินการเซลล์เดียว
อย่าเปลี่ยนชื่อไฟล์นี้ เป็นสิ่งสำคัญสำหรับขั้นตอนต่อไป
ขั้นตอนที่ 1.10: ทำซ้ำขั้นตอนที่ 1.8 และ 1.9 จนกว่าคุณจะรวบรวมตัวอย่างแต่ละเสียงได้ 5-10 ตัวอย่าง
ขั้นตอนที่ 1.11: ป้อน "x" เมื่อเสร็จสิ้นเพื่อออกจากการดำเนินการ
คำเตือน: การไม่ออกจากเซลล์ในลักษณะนี้อาจทำให้โน้ตบุ๊กพังได้ ในกรณีนี้ ต้องรีเซ็ตเคอร์เนลของ Notebook และแต่ละเซลล์จะทำงานอีกครั้งจากด้านบน
ขั้นตอนที่ 1.11 (ไม่บังคับ): ตรวจสอบข้อมูล WAV ของแต่ละไฟล์ในเซลล์ "Quick Sound Visualization" เพื่อให้แน่ใจว่าคุณได้บันทึกข้อมูลที่ต้องการทั้งหมดแล้ว
เคล็ดลับบางประการ:
- บันทึกเมื่อห้องครัวของคุณเงียบ
- บันทึกเสียงเพียงครั้งเดียว ระบบไม่สามารถแยกแยะเสียงที่ทับซ้อนกันได้
- พยายามทำให้การทดลองใช้เสียงแต่ละครั้งมีความสอดคล้องกันมากที่สุด ซึ่งจะช่วยให้ความถูกต้องของการระบุตัวตน
- การประเมินเซลล์การบันทึกอีกครั้งจะรีเซ็ตค่า # ในชื่อไฟล์และเขียนทับไฟล์ที่มีอยู่ซึ่งตรงกับ # เราพบว่าการบันทึกเสียงตัวอย่างทั้งหมดในคราวเดียวนั้นง่ายที่สุด จากนั้นจึงหยุดเซลล์การบันทึก
- หากระบบไม่รับเสียงเป้าหมายของคุณ ให้ลองลดค่า THRESHOLD (ตั้งค่าเป็น 30 เพื่อเริ่มต้น) และประเมินเซลล์อีกครั้ง
- หากการบันทึกถูกกระตุ้นโดยเสียงอื่นที่อยู่นอกเสียงเป้าหมาย ให้ลองเพิ่มค่า THRESHOLD (ตั้งค่าเป็น 30 เพื่อเริ่มต้น) และประเมินเซลล์อีกครั้ง
ขั้นตอนที่ 2: การเตรียม Arduino/Matrix Display



ต่อไป เราจะตั้งค่าระบบการแสดงภาพโดยใช้จอแสดงผลดอทเมทริกซ์ Arduino Leonardo และ KEYESTUDIO 16x16 LED นี่คือการแสดงการคาดการณ์เสียงที่ตรวจพบของแบบจำลองการจัดหมวดหมู่ ก่อนหน้านี้ เราได้จัดเตรียมไฟล์ที่จำเป็นทั้งหมดไว้ทั้งที่นี่และในที่เก็บ GitHub ของโปรเจ็กต์
ขั้นตอนที่ 2.1: ต่อ Arduino และ LED matrix ตามแผนภาพด้านบน KEYESTUDIO มีสายไฟเพื่อเชื่อมต่อกับดอทเมทริกซ์ แต่ต้องใช้สายจัมเปอร์ของเขียงหั่นขนมเพื่อเชื่อมต่อสายเหล่านี้กับ Arduino
ขั้นตอนที่ 2.2: เปิด "arduino_listener.ino" โดยใช้ Ardunio IDE และอัปโหลดไปยัง Leonardo หากต่อสายอย่างถูกต้อง คุณจะเห็นไอคอน "กำลังฟัง" (ดูเหมือน Wi-Fi) ดังที่แสดงในภาพด้านบน
ขั้นตอนที่ 2.3: เตรียมไอคอนที่คุณต้องการแสดงสำหรับแต่ละเสียงเป้าหมายของคุณ หากต้องการทราบว่าไฟ LED ใดจะสว่างขึ้น ต้องส่งไอคอนจาก Arduino ไปยังเมทริกซ์เป็นอาร์เรย์ไบต์ ตัวอย่างเช่น ไอคอนถ้วยกาแฟของเรา (ในภาพด้านบน) จะถูกส่งไปยังเมทริกซ์ในรูปแบบนี้:
{
0xff, 0xff, 0xff, 0xff, 0xfc, 0xfb, 0xbb, 0x5b, 0xeb, 0xfb, 0xfb, 0xfc, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf7, 0xfb, 0xf, 0xf 0xfb, 0xf7, 0x0f, 0xdf, 0x1f, 0xff, 0xff };
เราวาดไอคอนของเราโดยใช้เครื่องมือออนไลน์ Dot2Pic โดยเลือก 16 คอลัมน์ 16 แถว และ "ขาวดำ 8 พิกเซลต่อไบต์ การตั้งค่าแนวตั้ง" จากเมนูแบบเลื่อนลง ของเราสามารถพบได้ในอาร์เรย์ "sample_icon_bytes.txt"
หมายเหตุ: อาจมีเครื่องมือออนไลน์ที่สามารถทำได้โดยอัตโนมัติกับไฟล์ที่อัปโหลด
ขั้นตอนที่ 2.4: วาดแต่ละไอคอน เมื่อวาดเสร็จแล้ว ให้เลือก "แปลงเป็นอาร์เรย์"
ขั้นตอนที่ 2.5: แทนที่ไอคอนที่ไม่จำเป็นซึ่งกำหนดไว้ที่ด้านบนของโค้ด "arduino_listening.ino" ตามต้องการ อย่าลืมเพิ่มความคิดเห็นที่อธิบายไอคอนเพื่อให้คุณจำได้ว่าอันไหน!
ขั้นตอนที่ 2.6: อัปโหลดรหัสใหม่ไปยัง Arduino อย่าเพิ่งปิดไฟล์ เราต้องการมันสำหรับขั้นตอนต่อไป
ขั้นตอนที่ 3: เรียกใช้ตัวแยกประเภทและระบุเสียง


ตอนนี้ถึงเวลาที่จะรวมระบบเข้าด้วยกัน ไปป์ไลน์การจำแนกประเภท การสื่อสาร Arduino และการบันทึกเสียงสดทำได้ผ่านโน้ตบุ๊ก Arduino เครื่องเดียวซึ่งมีให้ที่นี่หรือสามารถเข้าถึงได้ผ่านที่เก็บ GitHub ของโปรเจ็กต์ของเรา
ขั้นตอนที่ 3.1: คัดลอกโน้ตบุ๊ก FullPipeline.ipynb ไปยังไดเร็กทอรี Jupyter Notebook ที่ใช้งานได้แล้วเปิดขึ้น
ขั้นตอนที่ 3.2: เรียกใช้แต่ละเซลล์ทีละเซลล์ โดยให้ความสนใจกับบันทึกย่อที่เราให้ไว้ในส่วนหัว คาดว่าจะไม่มีผลลัพธ์ หยุดเมื่อคุณไปถึงเซลล์ชื่อ "โหลดข้อมูลการฝึกอบรม"
ขั้นตอนที่ 3.3: แก้ไขตัวแปร SAMPLES_LOCATION_ROOT ในเซลล์ "โหลดข้อมูลการฝึกอบรม" ไปยังไดเร็กทอรีหลักของตำแหน่งของไดเร็กทอรีตัวอย่างก่อนหน้าของคุณ จากนั้น เปลี่ยนตัวแปร SAMPLES_DIR_NAME เป็นชื่อของไดเร็กทอรีของคุณ ดังนั้นหากคุณตั้งค่าตำแหน่งใน CollectSamples.ipynb เป็น:
SAMPLES_LOCATION = "/Users/xxxx/Documents/KitchenSoundClassifier/MySamples/NewDir"
ตอนนี้คุณจะตั้งค่าตัวแปรเหล่านี้เป็น:
SAMPLES_LOCATION_ROOT = "/Users/xxxx/Documents/KitchenSoundClassifier/MySamples/"SAMPLES_DIR_NAME = "NewDir"
การทำเช่นนี้ทำให้สามารถเปลี่ยนแปลงตัวแยกประเภทได้อย่างรวดเร็วในกรณีที่มีความไม่ถูกต้อง คุณสามารถสลับไปมาระหว่างคอลเล็กชันตัวอย่างต่างๆ เพื่อปรับแต่งข้อมูลของคุณ
ขั้นตอนที่ 3.4: ประเมินเซลล์ คุณควรเห็นแต่ละคอลเลกชันโหลดสำเร็จ
ขั้นตอนที่ 3.5: เรียกใช้แต่ละเซลล์ต่อไปทีละเซลล์ โดยให้ความสนใจกับบันทึกย่อที่เราให้ไว้ในส่วนหัว
ขั้นตอนที่ 3.6: หยุดเมื่อคุณไปถึงเซลล์ "Messaging Arduino" กำหนดพอร์ตอนุกรมที่คอมพิวเตอร์ของคุณจะใช้สำหรับการสื่อสารกับ Arduino ในตัวแปร PORT_DEF สามารถพบได้ใน Arduino IDE และไปที่ Tools > Port
ข้อมูลเพิ่มเติมสามารถดูได้ที่นี่.
ขั้นตอนที่ 3.8: เปิด Arduino IDE ของคุณอีกครั้ง ในสถานที่ที่คุณทำการเปลี่ยนแปลงไอคอน ให้จดตัวอักษรไว้ข้างๆ ค่าอาร์เรย์ แต่อย่าเปลี่ยน ในตัวอย่างด้านล่าง นี่คือ "g"
// การกำจัดขยะconst ถ่านที่ไม่ได้ลงชื่อ g[1][32] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf7, 0xf7, 0xfb, 0xff, 0xfe, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x27, 0xc3, 0x03, 0xc3, 0x27, 0x2f, 0xff, 0xef, 0xdf, 0xbf, 0xff, 0xff, };
ขั้นตอนที่ 3.7: (กลับไปที่เซลล์ "Messaging Arduino" ของ Notebook) เปลี่ยนป้ายกำกับในพจนานุกรม self.sounds ให้ตรงกับป้ายกำกับที่คุณใช้ในการบันทึกตัวอย่าง ตรวจสอบให้แน่ใจว่าป้ายกำกับแต่ละอันสอดคล้องกับตัวอักษรตัวเดียวที่คุณระบุไว้ก่อนหน้านี้ ขั้นตอน "การบันทึก" และ "การฟัง" เป็นส่วนหนึ่งของฟังก์ชันหลักของระบบและไม่ควรเปลี่ยนแปลง อย่าเปลี่ยนตัวอักษรตัวที่สองเว้นแต่คุณจะรู้สึกมั่นใจในการเปลี่ยนแปลงเพิ่มเติมเล็กน้อยในโค้ด Arduino เช่นกัน เพราะจะทำให้การสื่อสารกับ Arduino/matrix ยุ่งเหยิง
ขั้นตอนที่ 3.8: เรียกใช้ฟังก์ชันหลัก! รหัสจะดึงข้อมูลการฝึก ดึงคุณสมบัติหลัก ป้อนลงในไปป์ไลน์ สร้างแบบจำลองการจำแนกประเภท จากนั้นเริ่มฟังเหตุการณ์เสียง เมื่อสัมผัสได้ คุณจะเห็นเมทริกซ์เปลี่ยนเป็นสัญลักษณ์การบันทึก (สี่เหลี่ยมจัตุรัสที่มีวงกลมอยู่ข้างใน) และจะแบ่งข้อมูลนี้และป้อนลงในแบบจำลอง สิ่งที่โมเดลคาดการณ์ไว้จะปรากฏขึ้นในไม่กี่วินาทีต่อมาบนการแสดงเมทริกซ์
คุณสามารถติดตามได้ในผลลัพธ์ของเซลล์ด้านล่าง มาดูกันว่าจะได้แม่นขนาดไหน!
ขั้นตอนที่ 4: การสร้างที่อยู่อาศัยของ LEGO



นี่คือส่วนที่สนุก! คุณได้ทำตามขั้นตอนการเรียนรู้ของเครื่องที่จริงจังทั้งหมดแล้ว และติดตั้งระบบตั้งแต่ต้นทางถึงปลายทางทั้งหมด และตอนนี้คุณจะได้เล่นกับเลโก้เป็นรางวัล ไม่มีกระบวนการให้รายละเอียดมากนักที่นี่ เราเพิ่งเพิ่มบล็อกที่เราชอบที่นี่และที่นั่นโดยไม่ต้องกังวลกับการออกแบบโดยรวมมากเกินไป และจบลงด้วยความสุขกับวิธีที่มันกลายเป็น
ให้รูปภาพของเราเป็นแรงบันดาลใจในการสร้างที่อยู่อาศัยที่สร้างสรรค์เฉพาะสำหรับห้องครัวของคุณ เราวาง Arduino และสายไฟส่วนใหญ่ไว้ในกล่องกลวง จากนั้นยึดจอแสดงผลเมทริกซ์ด้านบนด้วยระยะยื่น เราเพิ่มกระดาษเล็กน้อยบนจอแสดงผลเพื่อกระจายแสงเล็กน้อย ซึ่งเรารู้สึกว่าทำให้ไอคอนชัดเจนขึ้น
แนะนำ:
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: 5 ขั้นตอน

การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: การตวัดเป็นวิธีง่ายๆ ในการสร้างเกม โดยเฉพาะอย่างยิ่งเกมปริศนา นิยายภาพ หรือเกมผจญภัย
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: 3 ขั้นตอน

การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: ในคำแนะนำนี้ เราจะทำการตรวจจับใบหน้าบน Raspberry Pi 4 ด้วย Shunya O/S โดยใช้ Shunyaface Library Shunyaface เป็นห้องสมุดจดจำใบหน้า/ตรวจจับใบหน้า โปรเจ็กต์นี้มีจุดมุ่งหมายเพื่อให้เกิดความเร็วในการตรวจจับและจดจำได้เร็วที่สุดด้วย
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: 3 ขั้นตอน

วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: ในบทช่วยสอนนี้ ฉันจะแสดงขั้นตอนสำคัญในการติดตั้งปลั๊กอิน WordPress ให้กับเว็บไซต์ของคุณ โดยทั่วไป คุณสามารถติดตั้งปลั๊กอินได้สองวิธี วิธีแรกคือผ่าน ftp หรือผ่าน cpanel แต่ฉันจะไม่แสดงมันเพราะมันสอดคล้องกับ
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): 8 ขั้นตอน

การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): ตัวแปลงสัญญาณเสียงล้ำเสียง L298N Dc ตัวเมียอะแดปเตอร์จ่ายไฟพร้อมขา DC ตัวผู้ Arduino UNOBreadboardวิธีการทำงาน: ก่อนอื่น คุณอัปโหลดรหัสไปยัง Arduino Uno (เป็นไมโครคอนโทรลเลอร์ที่ติดตั้งดิจิตอล และพอร์ตแอนะล็อกเพื่อแปลงรหัส (C++)
เครื่อง Rube Goldberg 11 ขั้นตอน: 8 ขั้นตอน

เครื่อง 11 Step Rube Goldberg: โครงการนี้เป็นเครื่อง 11 Step Rube Goldberg ซึ่งออกแบบมาเพื่อสร้างงานง่ายๆ ในรูปแบบที่ซับซ้อน งานของโครงการนี้คือการจับสบู่ก้อนหนึ่ง