เราได้เขียนบทความเกี่ยวกับโมดูลรู้จำเสียงพูด (Voice recognition) แบบออฟไลน์ ที่มีราคาไม่แพง ซึ่งใช้ไมโครคอนโทรลเลอร์ US516P6 หรือ TW-ASR ONE เพื่อช่วยให้สามารถเพิ่มฟังก์ชั่นอัจฉริยะไปยังโครงการโดยไม่ต้องเชื่อมต่อกับเครือข่ายเพื่อเพิ่มความเป็นส่วนตัวและลดเวลาในการส่งข้อมูล (latency)
การใช้งานดูเหมือนจะดีในทฤษฎี แต่ช่วงเวลานั้น (เมษายน 2022) มีความคิดเห็นความคิดเห็นบางส่วนในโพสต์ ไม่มีเอกสารประกอบที่ละเอียดหรือมีแต่ภาษาจีน และค่อนข้างใช้งานยาก แต่ตอนนี้ฉันเห็น DFRobot กำลังขายโมดูล “Gravity: Offline Voice Recognition Sensor – I2C & UART” พร้อมรองรับการเขียนโปรแกรม Arduino และค่อนข้างง่ายที่จะปรับเปลี่ยนไปตามที่ต้องการ
สเปคโมดูล Gravity Voice Recognition DF2301QG:
- โมดูลจดจำเสียง (Voice recognition module) – โมดูล WS-2520-TR พร้อม
- MCU – TBD
- คำสั่งเสียงที่ใช้บ่อย 121 เสียง, คำสั่ง Wake word 1 เสียง
- รองรับ learned Wake word 1 เสียง, คำสั่งที่กำหนดเอง User-defined 17 เสียง
- Audio
- เอาต์พุต – ลำโพงในตัวและอินเทอร์เฟสสำหรับลำโพงภายนอก
- อินพุต – ไมโครโฟนคู่ที่มีความไว -28dB
- อินเทอร์เฟสโฮสต์ – I2C (address 0x64) และ UART ผ่านตัวเชื่อมต่อ “Gravity” 4 พิน รองรับ 3.3V และ 5V
- อื่นๆ – ไฟ LED แสดงสถานะพลังงาน (สีแดง), LED แสดงสถานะรับคำสั่งเสียง (สีน้ำเงิน)
- แรงดันไฟฟ้า– 3.3 ถึง 5V
- กระแสไฟสูงสุด – ≤370 mA (5V)
- ขนาด – 49 x 32 มม.
สิ่งที่สำคัญคือการทำงานกับโมดูลเสียงแบบออฟไลน์รุ่นนี้มีความสะดวกมากกว่าโมดูลเสียงแบบออฟไลน์รุ่นเก่า คำสั่ง Wake word ค่าเริ่มต้นคือ “Hello robot” แต่สามารถเปลี่ยนเป็นคำอื่นได้ด้วยคำสั่งเสียง “learning wake word” และต้องพูดคำสั่ง wake word ใหม่ซ้ำกัน เช่น “hello, there” สามครั้ง
โมดูลนี้มาพร้อมกับคำสั่งเสียงที่ตั้งไว้ล่วงหน้ามากกว่า 100 เสียง เช่น “เลี้ยวซ้าย 90 องศา”, “การจดจำแท็ก (Tag) ” “ลืม”, “ปิดไฟ” ฯลฯ และอื่น ๆ แต่ผู้ใช้ยังสามารถให้โมดูลเรียนรู้คำสั่งเสียงที่กำหนดเองได้ถึง 17 เสียงโดยใช้คำสั่งเสียง “Learning command word” สำหรับ ID, จะต้องพูดคำสั่งเสียงซ้ำกันสามครั้งเพื่อลงทะเบียน มีคำอธิบายทุกอย่างโดยละเอียดใน wiki
โมดูลรู้จำเสียงพูดแบบออฟไลน์ DF2301QG แสดงการเชื่อมต่อกับบอร์ด Arduino clone ผ่านบอร์ด I2C แต่มันสามารถรองรับอุปกรณ์อื่นๆที่มีพอร์ต UART หรือ I2C ได้ รวมถึงบอร์ด Arduino อื่น ๆ บอร์ด Raspberry Pi หรือ SBC โมดูล ESP32 และบอร์ด ฯลฯ …
จนถึงตอนนี้เรายังไม่ได้เขียนโปรแกรมใดๆ และใช้เสียงในกำหนดค่าโมดูลเท่านั้น แต่ละ wake word และ voice มี ID ของตัวเอง และนั่นคือสิ่งที่เราใช้ใน Arduino Sketch ตามที่แสดงด้านล่างหลังจากติดตั้งไลบรารี DF2301Q Arduino แล้ว :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
#include "DFRobot_DF2301Q.h" #define Led 8 //I2C communication DFRobot_DF2301Q_I2C asr; void setup() { Serial.begin(115200); pinMode(Led, OUTPUT); //Init LED pin to output mode digitalWrite(Led, LOW); //Set LED pin to low // Init the sensor while (!(asr.begin())) { Serial.println("Communication with device failed, please check connection"); delay(3000); } Serial.println("Begin ok!"); /** * @brief Set voice volume * @param voc - Volume value(1~7) */ asr.setVolume(4); /** @brief Set mute mode @param mode - Mute mode; set value 1: mute, 0: unmute */ asr.setMuteMode(0); /** @brief Set wake-up duration @param wakeTime - Wake-up duration (0-255) */ asr.setWakeTime(20); /** @brief Get wake-up duration @return The currently-set wake-up period */ uint8_t wakeTime = 0; wakeTime = asr.getWakeTime(); Serial.print("wakeTime = "); Serial.println(wakeTime); // asr.playByCMDID(1); // Wake-up command /** @brief Play the corresponding reply audio according to the ID @param CMDID - command word ID */ //asr.playByCMDID(23); // Command word ID } void loop() { /** @brief Get the ID corresponding to the command word @return Return the obtained command word ID, returning 0 means no valid ID is obtained */ uint8_t CMDID = asr.getCMDID(); switch (CMDID) { case 103: //If the command is “Turn on the light” digitalWrite(Led, HIGH); //Turn on the LED Serial.println("received'Turn on the light',command flag'103'"); //Serial transmits "received"Turn on the light",command flag"103 break; case 104: //If the command is “Turn off the light” digitalWrite(Led, LOW); //Turn off the LED Serial.println("received'Turn off the light',command flag'104'"); //The serial transmits "received"Turn off the light",command flag"104"" break; default: if (CMDID != 0) { Serial.print("CMDID = "); //Printing command ID Serial.println(CMDID); } } delay(300); } |
โมดูล DFRobot DF2301QG ราคา $16.90 (~580฿) ซึ่งมีราคาประมาณสองเท่าของโมดูลอื่นๆ ที่เคยเขียนบทความก่อนหน้านี้ แต่มันก็คุ้มค่าเพราะมันดูใช้งานง่ายกว่าโมดูลอื่นๆ มาก
แปลจากบทความภาษาอังกฤษ : Offline voice recognition module supports Arduino programming, custom voice commands
บรรณาธิการข่าวและบทความภาษาไทย CNX Software ได้มีความสนใจในด้านเทคโนโลยี โดยเฉพาะ Smart Home และ IoT