สั่งให้ Google Nest พูดตามที่ต้องการด้วย Node-Red บน Raspberry Pi

Cytron Thailand
4 min readFeb 28, 2022

--

ในปัจจุบัน บ้านของเพื่อนๆหลายคนก็คงจะมีการใช้งานอุปกรณ์ IoT กันบ้างแล้ว ไม่ว่าจะเป็นหลอดไฟ หรือเซนเซอร์ต่างๆให้บ้านของเรานั้นฉลาดขึ้น และสิ่งที่ผมคิดว่าเพื่อนๆทุกคนน่าจะมีนั่นก็คือ Smart Speaker อย่าง Google Nest นั่นเอง โดยที่เพื่อนๆหลายๆคนอาจจะใช้งานลำโพงในการสั่งการอุปกรณ์ภายในบ้าน หรือแจ้งเตือน จับเวลา อะไรต่างๆนาๆตามที่อุปกรณ์ในบ้านของเราสามารถทำงานร่วมกันกับลำโพงได้

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

โดยพระเอกที่จะมาทำหน้าที่ประสานงานระหว่าง Google Nest ของเราและอุปกรณ์อื่นๆภายในบ้าน และเป็นผู้สั่งการให้ Google Nest พูดสิ่งที่เราต้องการออกมานั่นคือ Node-Red นั่นเอง

โดย Node-Red ของเรานั้นจะทำงานอยู่บน Raspberry Pi ที่เรามีนั่นเอง ซึ่ง Node-Red นั้นเป็น Service ที่ไม่ได้มีการใช้งานทรัพยากรของอุปกรณ์มาก ดังนั้น Raspberry Pi ที่จะมารัน Node-Red นั้น สามารถใช้งานได้แทบทุกรุ่น ขอให้ Raspberry Pi ของคุณสามารถต่ออินเตอร์เน็ตได้ก็เพียงพอแล้ว

ขั้นตอนการสร้างระบบ

ขั้นตอนที่ 1

เริ่มต้นการทำงานของ Node-Red บน Raspberry Pi และตั้งค่าให้ Node-Red เริ่มต้นการทำงานโดยอัตโนมัติเมื่อบอร์ดเริ่มทำงาน โดยสามารถทำได้โดยใช้คำสั่ง

sudo systemctl enable nodered.service

โดย Raspberry Pi จะต้องมีการติดตั้ง Node-Red ไว้แล้ว โดยหลังจากพิมพ์คำสั่งนี้แล้ว ให้ทำการ reboot Raspberry Pi อีกครั้งโดยใช้คำสั่ง

sudo reboot now

ขั้นตอนที่ 2

ไปที่ Browser ของ Raspberry Pi หรือ Browser ของคอมพิวเตอร์เครื่องอื่นที่อยู่ในวงเครือข่ายเดียวกันกับ Raspberry Pi เพื่อเข้าถึง Node-Red flow

โดยหากเข้าถึงผ่าน Browser ของ Raspberry Pi ที่ติดตั้ง Node-Red ไว้ ให้ใช้ domain ในการเข้าถึง Node-Red flow เป็น

127.0.0.1:1880 หรือ localhost:1880

แต่หากเข้าถึงผ่านคอมพิวเตอร์เครื่องอื่นที่อยู่ในวงเครือข่ายเดียวกันกับ Raspberry Pi เพื่อเข้าถึง Node-Red flow ให้ใช้ domain ในการเข้าถึง Node-Red flow เป็น

<Raspberry Pi IP Address>:1880 หรือ <Raspberry Pi Domain>:1880

ขั้นตอนที่ 3

โดยเมื่อเข้าถึง Node-Red flow ได้แล้วให้ไปทำการติดตั้ง Node สำหรับการสั่งการให้ Google Nest ของเราพูดก่อน โดยไปที่เครื่องหมาย 3 ขีดทางด้านขวาบนของ flow เลือก Manage palette แล้วทำการค้นหาในช่องค้นหาโดยใช้คีย์เวิร์ดว่า cast โดยจะพบกับ node ที่มีชื่อว่า node-red-contrib-cast ให้ทำการกด Install เพื่อติดตั้งได้เลย

ขั้นตอนที่ 4

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

IP : IP address ของลำโพง Google Nest ที่อยู่ในบ้าน โดยเราสามารถกดเครื่องหมายแว่นขยายด้านหลังช่องว่างเพื่อค้นหาลำโพง Google Nest ที่ติดตั้งอยู่ในบ้านได้อย่างอัตโนมัติ หรือจะใช้โปรแกรมจำพวก IP scanner ในการค้นหา IP Address ของลำโพง Google Nest แต่ละตัวก็สามารถทำได้

Port : Port ที่ใช้ในการสื่อสารกับลำโพง Google Nest โดยค่ามาตรฐานคือ 8009

Media Url : สำหรับใส่ลิงก์ของแหล่งที่มาสื่อ เช่น เสียง หรือวิดีโอ (ยังไม่ใช้งาน)

Media Type : ประเภทของสื่อและการเข้ารหัส เช่น เสียง(mp3, etc.) หรือวิดีโอ(mp4,mov, etc.) (ยังไม่ใช้งาน)

Image Url : สำหรับใส่ลิงก์ของแหล่งที่มาสื่อประเภทรูปภาพ (ยังไม่ใช้งาน)

Message : ข้อความที่ต้องการแปลงเป็นเสียงโดยใช้ tts service ของ Google เพื่อส่งไปให้ลำโพง Google Nest ส่งเสียงพูดออกมา

language : ภาษาของข้อความที่ต้องการใช้งาน tts service ของ Google เพื่อส่งไปให้ลำโพง Google Nest ส่งเสียงพูดออกมา

Volume : ระดับเสียงที่ต้องการให้ลำโพง Google Nest ส่งเสียงที่ได้จาก TTS ออกมา

ขั้นตอนที่ 5

เราลองมาทดสอบใช้งานเบื้องต้นหลังจากที่ได้ทำการตั้งค่า cast node เสร็จสิ้นกัน

โดยไปที่ช่อง Message ใส่ข้อความที่ต้องการให้ลำโพง Google Nest ของเราพูดออกมา และที่ช่อง language ให้ใส่ตัวย่อของภาษาที่เราต้องการให้ลำโพง Google Nest พูด อาทิ ภาษาไทย คือ th หรือ ภาษาอังกฤษ คือ en เป็นต้น

หลังจากนั้น นำ Inject node มาเชื่อมต่อที่ด้านหน้าของ cast node แล้วทำการกด deploy โดยเมื่อ deploy flow แล้ว ให้กดปุ่มด้านหน้า Inject node เพื่อสั่งให้ลำโพง Google Nest ที่เรากำหนดไว้พูดออกมา

โดยหากไม่มีข้อผิดพลาด ลำโพง Google Nest ของเราก็จะพูดตามข้อความที่เราได้พิมพ์ไว้ในช่อง Message นั่นเอง

ขั้นตอนที่ 6

ในกรณีที่เราต้องการดึงข้อมูลจากที่อื่นเพื่อมาให้ Google Nest ของเราพูด เราสามารถทำได้หลากหลายวิธี ในกรณีนี้ เราจะลองดึงข้อมูลผู้ติดเชื้อ covid-19 จากทางกระทรวงสาธารณะสุขที่มีการเปิด API ให้ดึงข้อมูล มาให้ Google Nest ของเราพูดกัน

โดยหากไปที่เว็บไซต์ https://covid19.ddc.moph.go.th/ เราก็จะพบกับรายการ API เกี่ยวกับ covid-19 ที่เราสามารถดึงข้อมูลไปใช้งานได้ โดยเราจะเลือกใช้ API ที่รายงานสถานการณ์ covid-19 ประจำวันมาให้ลำโพง Google Nest ของเราพูดกัน

โดยเราจะใช้ http request node ในการสร้าง request ไปยัง API ของกระทรวงสาธารณะสุข ซึ่งจะปล่อยข้อมูลออกมาเป็นแบบ JSON ซึ่ง เราสามารถ parsed ข้อมูลจาก JSON ให้ไปอยู่ในรูป object เพื่อง่ายต่อการเข้าถึงได้ โดยใช้ฟังก์ชัน a parsed JSON object ที่มีอยู่ในช่อง Return ของ http request node

โดยหากเราลองใช้ debug node ในการดูผลลัพธ์ที่ได้จากการทำ http request ไปยัง API ของกระทรวงสาธารณะสุข ผลลัพธ์ที่ได้จะถูก parsed และจัดเก็บในรูปแบบของ object แล้ว ซึ่งจะทำให้การเข้าถึงและอ้างอิงนั้นทำได้ง่ายกว่า

ขั้นตอนที่ 7

การเตรียมประโยคข้อความสำหรับ Node-Red เพื่อรายงานสถานการณ์ covid-19 รายวันที่เราดึงมาจาก API ของกระทรวงสาธารณะสุข

โดยเราจะใช้งาน function node ในการสร้างประโยค โดยภายใน function node มีรายละเอียดดังนี้

var new_case = msg.payload[0].new_case
var total_case = msg.payload[0].total_case
var new_death = msg.payload[0].new_death
var total_death = msg.payload[0].total_death
msg.payload = "รางานผู้ติดเชื้อโควิด 19 วันนี้ ผู้ติดเชื้อใหม่ " + new_case + " คน ผู้ติดเชื้อสะสม " + total_case + " คน ผู้เสียชีวิตวันนี้ " + new_death + " คน ผู้เสียชีวิตสะสม " + total_death + " คน"
return msg;

โดยตัวแปรที่เราสร้างขึ้นมาโดยคำสั่ง var นั้น สร้างขึ้นมาเพื่อดึงค่าจาก object ข้อมูลที่เก็บข้อมูลตัวเลขแต่ละส่วนไว้ที่เราเห็นใน debug window ทางขวามือ โดยหากเราต้องการอ้างอิงถึงตัวแปรตัวไหน เราก็สามารถกด copy path ทางด้านหลังของข้อมูลที่อยู่ใน debug window มาวางใน function node ได้เลย โดยต้องมี “msg.” นำหน้าเสมอ

โดยใน msg.payload คือข้อความที่เราจะส่งไปที่ cast node เพื่อให้ลำโพง Google Nest ของเราพูด โดยที่จะเห็นว่าใน msg.payload จะมีทั้งข้อความแบบ string และ ตัวแปรแบบ dynamic รวมกันอยู่ โดยเราสามารถนำมารวมกันได้ โดยใช้เครื่องหมายบวก (+) และ เครื่องหมายคำพูด (“ ”) โดยหากเป็น string ธรรมดาให้ใส่ไว้ในเครื่องหมายคำพูด แต่หากเป็นตัวแปรแบบ dynamic ไม่ต้องใส่ไว้ในเครื่องหมายคำพูด โดยหากนำมารวมกัย ให้ใช้เครื่องหมายบวก (+) ขั้นข้อมูลแต่ละประเภทไว้

ใน cast node ที่เราได้ทดสอบใช้งานไว้ อย่าลืมไปลบในส่วนของ Message ออกให้เป็นช่องว่างๆด้วยนะครับ

ขั้นตอนที่ 8

เรามาทดสอบให้ Google พูดใช้งานกันครับ โดยให้ทำการนำ Node ทั้งหมดที่เราเขียนไว้มาทำการเชื่อมต่อกัน ดังภาพ

โดยหลังจากทำการเชื่อมต่อกันเรียบร้อยแล้ว ทำการกด deploy ได้เลย

หลังจากนั้นกดปุ่มด้านหน้า Inject node ซึ่งหากไม่มีอะไรผิดพลาด ลำโพง Google Nest ของเราก็จะเริ่มพูดข้อความที่เราเตรียมไว้แล้ว เจ๋งสุดๆไปเลยใช่ไหมละ!

--

--

Cytron Thailand

More from Cytron Thailand