กลับไปหน้ารวมไฟล์
how-to-do-automatic-song-classification-b16f08.md

ในบทเรียนนี้เราจะเก็บข้อมูลจากไมโครโฟนเพื่อดึงข้อมูลเพลงเป็นช่วงๆ แล้วใช้ NanoEdge AI Studio (เครื่องมือฟรี) ในการสร้างโมเดล AI ที่สามารถจำแนกเพลงของเราได้อัตโนมัติ

ไม่ต้องกังวลไป น้องไม่ต้องมีความรู้เรื่อง AI ก็ทำตามได้สบายๆ :)

แผนการมีดังนี้:

  1. ขั้นตอนที่ 1: เตรียมการตั้งค่า
  2. ขั้นตอนที่ 2: เก็บข้อมูลจากไมโครโฟน
  3. ขั้นตอนที่ 3: สร้างโมเดล Classification
  4. ขั้นตอนที่ 4: เพิ่มโมเดลลงในโค้ด Arduino ของเรา
  5. ขั้นตอนที่ 5: ใช้ LED Matrix แสดงผลเพลงที่ตรวจจับได้

จัดไปวัยรุ่น!

ขั้นตอนที่ 1: เตรียมการตั้งค่า

อย่างแรก เราต้องเชื่อมต่อไมโครโฟนเข้ากับบอร์ด Arduino ก่อน

ใช้สายจัมเปอร์เชื่อมต่อดังนี้:

  1. OUT (ไมค์) ไปที่ A0 (บอร์ด)
  2. GND ไปที่ขา GND ใดก็ได้บนบอร์ด
  3. VCC ไปที่ 3.3v

ตรวจสอบให้แน่ใจว่ามีสาย USB เชื่อมต่อบอร์ดกับคอมพิวเตอร์อยู่

ใน Arduino IDE:

ตรวจสอบว่าเลือกพอร์ต COM ถูกต้อง: Tools > Port แล้วเลือกอันที่ถูกต้อง

เลือกบอร์ดให้ถูกต้อง:

  1. Tools > Boards > Arduino Renesas UNO R4 boards > Arduino UNO R4 WIFI
  2. ถ้าไม่เจอ ให้คลิก Tools > Boards > Boards Manager..., หา UNO R4 แล้วติดตั้งแพ็คเกจ

ขั้นตอนที่ 2: บันทึกข้อมูลด้วยไมโครโฟน

เราใช้ไมโครโฟนดิจิทัลที่มีอัตราข้อมูลสูงมาก

เราจะเก็บข้อมูลเพลงเป็นช่วงๆ โดยเก็บค่าจากไมโครโฟนลงในบัฟเฟอร์ และลดอัตราข้อมูลลงโดยเก็บเพียง 1 ค่าจากทุกๆ 32 ค่าที่อ่านได้

เราเก็บบัฟเฟอร์ของเพลง ไม่ใช่เก็บโน้ตเดี่ยวๆ เพื่อนำไปจำแนก แม้แต่คนเรายังจำเพลงจากโน้ตสุ่มๆ โน้ตเดียวไม่ได้เลย

วิธีการทำ:

  1. กำหนด AMP_PIN เป็น A0 เพราะไมค์ของเราใช้พิน A0 ส่งข้อมูล
  2. เรากำหนดบัฟเฟอร์ชื่อ neai_buffer เพื่อเก็บค่าที่อ่านได้
  3. ในกรณีนี้ บัฟเฟอร์มีขนาด 1024 (SENSOR_SAMPLE)
  4. เราเริ่มต้น Serial ในฟังก์ชัน setup()
  5. เราสร้างฟังก์ชัน get_microphone_data() เพื่อเก็บข้อมูลจากไมค์เป็นบัฟเฟอร์ โดยเก็บแค่ 1 ใน 32 ค่า
  6. เราพิมพ์ค่าบัฟเฟอร์ออกมาเพื่อส่งผ่าน Serial

โค้ด:

/* Defines ----------------------------------------------------------*/

#define SENSOR_SAMPLES 1024 //buffer size

#define AXIS 1 //microphone is 1 axis

#define DOWNSAMPLE 32 //microphone as a very high data rate, we downsample it

/* Prototypes ----------------------------------------------------------*/

void get_microphone_data(); //function to collect buffer of sound

/* Global variables ----------------------------------------------------------*/

static uint16_t neai_ptr = 0; //pointers to fill for sound buffer

static float neai_buffer[SENSOR_SAMPLES * AXIS] = {0.0}; //souhnd buffer

int const AMP_PIN = A0; // Preamp output pin connected to A0

/* Setup function ----------------------------------------------------------*/

void setup() {

Serial.begin(115200);

delay(10);

}

/* Infinite loop ----------------------------------------------------------*/

void loop() {

get_microphone_data();

}

/* Functions declaration ----------------------------------------------------------*/

void get_microphone_data()

{

static uint16_t temp = 0; //stock values

int sub = 0; //increment to downsample

//while the buffer is not full

while (neai_ptr < SENSOR_SAMPLES) {

//we only get a value every DOWNSAMPLE (32 in this case)

if (sub > DOWNSAMPLE) {

/* Fill neai buffer with new accel data */

neai_buffer[neai_ptr] = analogRead(AMP_PIN);

/* Increment neai pointer */

neai_ptr++;

sub = 0; //reset increment

}

else {

//we read the sample even if we don't use it

//else it is instantaneous and we don't downsample

temp = analogRead(AMP_PIN);

}

sub ++;

}

//print the buffer values to send them via serial

for (uint16_t i = 0; i < SENSOR_SAMPLES; i++) {

Serial.print(neai_buffer[i]);

Serial.print(" ");

}

Serial.print("\n");

neai_ptr = 0; //reset the beginning position

}

วิธีใช้โค้ดนี้ก็แค่ก๊อปวางลงใน Arduino IDE ถ้าน้องทำตามขั้นตอนตั้งค่าแล้ว ก็แค่กด UPLOAD (ลูกศรเล็กๆ ด้านบน) ได้เลย

ในขั้นตอนต่อไป เราจะใช้โค้ดนี้เก็บข้อมูลใน NanoEdge AI Studio และสร้าง AI Library ไว้จำแนกเพลง

ขั้นตอนที่ 3: โมเดล Classification

ด้วยโค้ดจากขั้นตอนที่แล้ว เราสามารถใช้ NanoEdge เก็บชุดข้อมูลสำหรับเพลงแต่ละเพลงที่เราอยากจำแนกได้:

  1. เปิด NanoEdge
  2. สร้างโปรเจค N-class classification
  3. เลือกบอร์ด Arduino R4 WIFI เป็นเป้าหมาย (บอร์ดอื่นก็ใช้ได้)
  4. เลือก Microphone 1axis เป็นเซ็นเซอร์
  5. คลิก Next

จากนั้นเราจะเก็บข้อมูลสำหรับแต่ละเพลง ในขั้นตอน SIGNAL STEP:

  1. คลิก ADD SIGNAL
  2. เลือก FROM SERIAL (USB)
  3. เปิดเพลงก่อน (เช่นจากโทรศัพท์)
  4. จากนั้นคลิก START/STOP เพื่อเก็บข้อมูล (ตรวจสอบว่าเลือกพอร์ต COM ถูกต้อง)
  5. เก็บบัฟเฟอร์ขณะที่เพลงเล่นอย่างน้อยสองรอบ หลีกเลี่ยงบัฟเฟอร์ว่าง (หยุดเก็บถ้าจำเป็น)
  6. คลิก CONTINUE แล้ว IMPORT
  7. เปลี่ยนชื่อไฟล์ได้ถ้าอยาก
  8. ทำซ้ำสำหรับแต่ละเพลง

เมื่อเก็บข้อมูลทุกเพลงที่ต้องการแล้ว ไปที่ขั้นตอน BENCHMARK STEP

ยิ่งมีเพลงเยอะ ยิ่งยากขึ้น เริ่มจากเพลงน้อยๆ ก่อนนะ

  1. คลิก NEW BENCHMARK
  2. เลือกเพลงทั้งหมดแล้วคลิก START

Benchmark จะหาค่าที่ดีที่สุดของโมเดลและวิธีประมวลผลข้อมูล เพื่อหาโมเดลที่สามารถจำแนกเพลงได้

ภายในไม่กี่สิบนาที น้องควรได้คะแนน > 80% ถ้าไม่ถึง อาจต้องกลับไปขั้นตอนก่อนหน้าและเก็บข้อมูลใหม่ด้วยบัฟเฟอร์ที่ยาวขึ้นหรือค่า downsample ที่มากขึ้น แบบนี้:

/* Defines ----------------------------------------------------------*/

#define SENSOR_SAMPLES 2048 //buffer size

#define DOWNSAMPLE 64 //microphone as a very high data rate, we downsample it

แล้วทำกระบวนการทั้งหมดซ้ำใหม่

ขั้นตอนเสริม (Optional):

ไปที่ EMULATOR STEP เพื่อทดสอบว่าโมเดลทำงานได้จริง:

  1. คลิก INIATILIZE EMULATOR
  2. คลิก SERIAL (USB)
  3. คลิก START/STOP ขณะที่เปิดเพลง

สิ่งที่เห็นด้านขวาบนคือความน่าจะเป็นที่ข้อมูลจะเป็นของแต่ละคลาส ถ้าโมเดลทำงาน ค่าความน่าจะเป็นสูงสุดควรตรงกับเพลงที่กำลังเล่นอยู่ อาจสลับไปมาบ้างเป็นบางครั้ง

ด้านขวาล่างคือแค่การนับจำนวนคลาสที่ถูกตรวจจับ (คลาสที่มีความน่าจะเป็นสูงสุดด้านบนจะถูกเลือกเป็นคลาสที่ตรวจจับได้)

จากนั้นไปที่ COMPILATION STEP:

คลิก compile กรอกฟอร์มเล็กน้อย แล้วบันทึก AI library (.zip) ของน้องไว้

ในขั้นตอนต่อไป เราจะเพิ่มไลบรารีนี้เข้าไปใน Arduino IDE เพื่อจำแนกเพลงบนบอร์ดได้โดยตรง

รายละเอียดเทคนิคเพิ่มเติม: กระบวนการ TinyML

โปรเจค Automatic Song Classification นี่แหละ ที่จะพาไมโครคอนโทรลเลอร์ของเราไปเล่นในแดน AI ให้เห็นกันจะๆ ต่างจาก Spectrum Analyzer ทั่วไปที่แค่วัดเสียงเบสไปวันๆ ระบบนี้ใช้ Neural Network (TinyML) ที่เทรนไว้แล้วมาจับแพทเทิร์นในเสียงเพลง แยกแยะออกเลยว่าเพลงไหนเป็นเพลงไหน

น้องจะเขียน `if/else` แบบธรรมดามาตรวจสอบไม่ได้หรอก ต้องเทรนโมเดลเท่านั้น! กระบวนการมันก็คือ เก็บข้อมูล, เทรนโมเดล, แล้วเอาโมเดลไปรันแบบเรียลไทม์

1. เก็บข้อมูลเสียง (The Dataset)

  1. ฮาร์ดแวร์: ถ้าอยากได้ผลลัพธ์ดีๆ แนะนำให้ใช้ไมโครโฟนดิจิตอล I2S ที่ความไวสูง (เช่น INMP441) ต่อกับบอร์ดอย่าง ESP32 หรือ Arduino Nano 33 BLE Sense เพื่อเก็บข้อมูลคุณภาพสูง แต่ถ้าใช้เซ็ตอัพไมโครโฟนอนาล็อกแบบในรูปก็ใช้ได้กับ Arduino UNO R4 WiFi ตามเวิร์กโฟลว์ของ NanoEdge AI Studio นะ
  2. การเก็บตัวอย่าง: น้องก็เปิดเพลงที่อยากให้ระบบจำแนก แล้วให้ไมโครโฟนฟัง ไมโครคอนโทรลเลอร์จะแปลงคลื่นเสียงดิบๆ ให้กลายเป็นข้อมูลตัวเลข (หรือในขั้นสูงหน่อยก็แปลงเป็นคุณลักษณะอย่าง Mel-Frequency Cepstral Coefficients (MFCCs) – ซึ่งเป็นภาพแสดงความถี่เสียงแบบกะทัดรัดเมื่อเวลาผ่านไป)

2. เทรนโมเดลด้วย NanoEdge AI Studio

น้องก็อัพโหลดข้อมูลตัวเลขที่เก็บมา ขึ้นไปบน NanoEdge AI Studio ตามที่เห็นในรูปด้านบน

  • อัลกอริทึม Benchmark ของแพลตฟอร์มจะวิเคราะห์ข้อมูลจากแต่ละคลาสเพลงอัตโนมัติ มันจะหาวิธีประมวลผลสัญญาณและโมเดล Machine Learning (เช่น Neural Network) ที่ดีที่สุด เพื่อเรียนรู้แพทเทิร์นเฉพาะที่ทำให้เสียงของเพลงหนึ่งต่างจากอีกเพลง
  • พอเทรนเสร็จ NanoEdge AI Studio จะให้ไลบรารีภาษา C/C++ ที่คอมไพล์แล้ว (`NanoEdgeAI.h` และ `knowledge.h`) มาเลย พิเศษสำหรับบอร์ด Arduino ของน้องโดยเฉพาะ!

3. การทำนายแบบเรียลไทม์ (Real-Time Inference)

  • สมองกล: น้องก็เอาไลบรารีที่ได้มา ไปใส่ใน Arduino IDE แล้วอัพโหลดสเก็ตช์สุดท้ายลงบอร์ด
  • พอเปิดเพลงในห้อง ไมโครโฟนจะบันทึกเสียงช่วงสั้นๆ (Buffer) ไว้
  • ไลบรารี AI บนบอร์ดจะคำนวณการจำแนกเพลงแบบ Local เลย (ไม่ต้องใช้เน็ต) แล้วส่งผลลัพธ์ออกมา เช่น ไปที่ Serial Monitor หรือ LED Matrix นั่นแหละ Arduino ของเราก็จำแนกเพลงได้ด้วยคณิตศาสตร์ TinyML แล้วไง!

ขั้นตอนที่ 4: เอาไลบรารี Classification มาใช้

ได้ไลบรารีมาแล้ว ต่อไปก็ต้องเอามาใส่ในโค้ด Arduino ของเรา:

  1. เปิดไฟล์ .zip ที่ได้มา จะมีโฟลเดอร์ Arduino ที่ข้างในมี zip อีกอัน
  2. นำเข้าไลบรารีใน Arduino IDE: Sketch > Include library > Add .ZIP library... แล้วเลือกไฟล์ .zip ที่อยู่ในโฟลเดอร์ Arduino

**ถ้าน้องใช้ไลบรารี NanoEdge AI อยู่ใน Arduino IDE อยู่แล้ว:**

ให้เข้าไปที่ document/arduino/library แล้วลบไลบรารีเก่าของ NanoEdge ออก จากนั้นค่อยทำตามขั้นตอนด้านบนเพื่อนำเข้าไลบรารีใหม่

**สำคัญมาก:**

ถ้าเจอ Error เรื่อง RAM นั่นอาจเป็นเพราะไลบรารีจาก NanoEdge ใหญ่เกิน ให้กลับไปที่ขั้นตอน VALIDATION ใน NanoEdge แล้วเลือกไลบรารีขนาดเล็กลง (คลิกที่มงกุฎด้านขวา) จากนั้นคอมไพล์ใหม่แล้วเอามาแทนที่ใน Arduino IDE อีกที

คัดลอกโค้ดด้านล่างไปวางใน Arduino IDE ได้เลย มันมีโค้ดจากก่อนหน้ารวมอยู่แล้ว และมีทุกอย่างที่ต้องใช้สำหรับ NanoEdge:

  1. การเรียกใช้ไลบรารี
  2. ตัวแปรบางตัวสำหรับ NanoEdge
  3. การตั้งค่าเริ่มต้นไลบรารีในฟังก์ชัน setup
  4. การจำแนกประเภทหลังจากเก็บข้อมูลเสียง
  5. การแสดงผลคลาส

/* Libraries ----------------------------------------------------------*/

#include "NanoEdgeAI.h"

#include "knowledge.h"

/* Defines ----------------------------------------------------------*/

#define SENSOR_SAMPLES 1024 //buffer size

#define AXIS 1 //microphone is 1 axis

#define DOWNSAMPLE 32 //microphone as a very high data rate, we downsample it

/* Prototypes ----------------------------------------------------------*/

void get_microphone_data(); //function to collect buffer of sound

/* Global variables ----------------------------------------------------------*/

static uint16_t neai_ptr = 0; //pointers to fill for sound buffer

static

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE 1.8.19"
  - "1x NanoEdge AI Studio"
author: "mad_mcu"
category: "Audio & Sound"
components:
  - "1x MAX4466 microphone"
  - "1x Arduino® UNO R4 WiFi"
description: "AI meets audio! Build a machine learning classifier on a powerful microcontroller capable of distinguishing genres of music by analyzing physical sound waves in real time."
difficulty: "Advanced"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/66c6d7c1-5e3a-4173-bd53-55c2be796d3b.ino"
encryptedPayload: "U2FsdGVkX1+KFFywp0YdPiDgSyRwwQV9XoFOtjcihQXENq8h19BJBWdkaHXnEVcJ0BNr6DOEjZOJtCvdeCoNJbJCjeFPJRnbYeZD6BI+JaNJ//d252MYZwhrEUVIBgxLbgs5BNHnTVBPMx/rPDqdeg=="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/how-to-do-automatic-song-classification-b16f08_cover.gif"
lang: "en"
likes: 6
passwordHash: "03973f12de9001e8cddcb2ece4ec220491f237a339b597a339aa1ec8cfbb4a2f"
price: 2450
seoDescription: "Learn how to build an Automatic Song classification system using Arduino and embedded Artificial Intelligence."
tags:
  - "Arduino User Group"
  - "Data Collection"
  - "Music"
title: "ลงมือทำ! สอน AI แยกเพลงอัตโนมัติ งานง่ายแต่หล่อ"
tools: []
videoLinks: []
views: 13069