ถ้าเราต้องการสร้างระบบที่สามารถพูดให้กำลังใจเราเวลาท้อ เหนื่อย หรือเศร้าใจได้
หนึ่งในแนวทางที่น่าสนใจ คือการใช้โมเดล Sentiment Analysis และระบบเสียงแบบง่าย
ในโปรเจกต์นี้ เราได้สร้างแชทบอทที่ชื่อว่า “น้องชมพู” โดยมีจุดประสงค์หลักคือ
ช่วยให้กำลังใจผู้ใช้งานตามอารมณ์ที่ตรวจจับได้จากข้อความ
โดยนำเทคนิค AI ด้าน Natural Language Processing (NLP) มาประยุกต์ใช้งาน
สิ่งที่น้องชมพูสามารถทำได้คือ:
- วิเคราะห์ข้อความของผู้ใช้ด้วย โมเดลวิเคราะห์อารมณ์ (Sentiment Analysis)
- ตอบกลับด้วยข้อความที่เหมาะสมกับอารมณ์นั้น เช่น ปลอบใจ/ให้พลังบวก
- แปลงข้อความให้กำลังใจออกมาเป็นเสียงพูดจริง ด้วยภาษาไทย
- ผู้ใช้สามารถสอนคำตอบใหม่ ๆ ให้น้องชมพูได้เอง (แบบ rule-based learning)
เครื่องมือที่ใช้:
- 🤗 transformers จาก Hugging Face (สำหรับ Sentiment Analysis)
- 🔊 gTTS (Google Text-to-Speech)
- 🎮 pygame (เล่นไฟล์เสียง)
- 📂 json (สำหรับบันทึกคำตอบที่ผู้ใช้สอน)
** หมายเหตุเกี่ยวกับภาษาไทยและโมเดลที่ใช้
โมเดล distilbert-base-uncased-finetuned-sst-2-english ที่ใช้อยู่ เป็นโมเดลภาษาอังกฤษ
แม้จะสามารถวิเคราะห์ข้อความภาษาอังกฤษได้แม่นยำมาก
แต่สำหรับข้อความภาษาไทยนั้นยัง ไม่แม่นยำ 100%
บางครั้งอาจตอบผิดอารมณ์ หรือสุ่มคำตอบไม่ตรงกับที่เราคาดหวัง
ถ้าอยากให้คำตอบแม่นยำ ต้องใช้ภาษาอังกฤษ
แต่เพื่อให้การใช้งานยังคงง่ายและเสถียร จึงเลือกใช้โมเดลนี้ร่วมกับการ “สอนคำตอบด้วยตนเอง” ซึ่งช่วยให้ผู้ใช้สามารถปรับปรุงคำตอบให้เหมาะกับภาษาไทยได้ตามต้องการ
ขั้นตอนที่ 1: ติดตั้งและโหลดไลบรารีที่ต้องใช้
ติดตั้งไลบรารีสำหรับ NLP, การแปลงข้อความเป็นเสียง และเล่นไฟล์เสียง
เราจะใช้ไลบรารีหลัก ๆ ดังนี้:
- 🤗 transformers – โมเดลวิเคราะห์อารมณ์ (Sentiment Analysis)
- 🔊 gTTS – แปลงข้อความเป็นเสียงพูด (Text-to-Speech ภาษาไทย)
- 🎮 pygame – เล่นไฟล์เสียง mp3
- 📦 json – บันทึกข้อความที่ผู้ใช้ “สอน” ให้น้องชมพู
from transformers import pipeline
from gtts import gTTS
import os
import random
import pygame
import time
import json
- transformers → วิเคราะห์อารมณ์
- gTTS → แปลงข้อความเป็นเสียง
- pygame → เล่นเสียง
- json → บันทึกคำตอบที่ผู้ใช้สอนเอง
ขั้นตอนที่ 2: โหลดโมเดลวิเคราะห์อารมณ์
ใช้โมเดล pre-trained ใน HuggingFace ที่ชื่อ distilbert-base-uncased-finetuned-sst-2-english สำหรับวิเคราะห์อารมณ์เป็น 3 กลุ่ม: positive, negative, neutral
sentiment_model = pipeline("sentiment-analysis")
แม้จะเป็นโมเดลภาษาอังกฤษ แต่สามารถนำมาใช้วิเคราะห์อารมณ์ข้อความภาษาไทยเบื้องต้นได้
ขั้นตอนที่ 3: เตรียมคำตอบตามอารมณ์ที่ตรวจจับได้
น้องชมพูจะตอบข้อความให้กำลังใจที่แตกต่างกันไป ตามอารมณ์ที่ระบบวิเคราะห์ได้
replies = {
"positive": ["ดีใจที่ได้ยินแบบนั้นนะ 😊", "คุณเก่งมากเลย! ยิ้มไว้เสมอนะ 💖"],
"negative": [
"ไม่เป็นไรนะ เดี๋ยมันจะผ่านไป 💗 น้องชมพูอยู่ตรงนี้เสมอ",
"วันนี้อาจเหนื่อยหน่อย แต่น้องชมพูเป็นกำลังใจให้นะ 🫶"
],
"neutral": ["น้องชมพูรับฟังเสมอนะคะ 😊", "แม้จะพูดไม่มาก แต่น้องชมพูอยู่ตรงนี้นะ ✨"]
}
ขั้นตอนที่ 4: สร้างฟังก์ชันวิเคราะห์อารมณ์ และแปลงข้อความเป็นเสียง
ฟังก์ชันนี้จะวิเคราะห์อารมณ์ข้อความ เลือกคำตอบที่เหมาะสม แล้วแปลงเป็นเสียงด้วย gTTS จากนั้นเล่นเสียงผ่าน pygame และเมื่อพูดจบจะลบไฟล์เสียงทันที เพื่อไม่ให้ไฟล์สะสมในเครื่อง
gTTS จะสร้างไฟล์ mp3 ใหม่ทุกครั้ง → ถ้าไม่ลบ ไฟล์จะสะสมเรื่อย ๆ จนเปลืองพื้นที่
การใช้ os.remove(filename) จึงเป็นการล้างไฟล์เก่าหลังใช้เสร็จ ทำให้แชทบอททำงานได้สะอาดและปลอดภัย
สร้างโฟลเดอร์และไฟล์ที่ใช้เก็บเสียงตอบกลับ
sound_dir = "chompoo_sound"
os.makedirs(sound_dir, exist_ok=True)
filename = os.path.join(sound_dir, "chompoo_response.mp3")
- สร้างโฟลเดอร์ chompoo_sound หากยังไม่มี
- ระบุชื่อไฟล์เสียงที่ใช้ทุกครั้งคือ chompoo_response.mp3
โหลดคำตอบที่ผู้ใช้เคย “สอน” ไว้
learn_file = "custom_replies.json"
if os.path.exists(learn_file):
with open(learn_file, "r", encoding="utf-8") as f:
custom_replies = json.load(f)
else:
custom_replies = {}
- ถ้ามีไฟล์ custom_replies.json อยู่ → โหลดมาใช้
- ถ้ายังไม่มี → เริ่มจากข้อมูลว่าง
ฟังก์ชันวิเคราะห์อารมณ์ด้วยโมเดล
def analyze_sentiment(message):
result = sentiment_model(message)[0]['label']
if result == 'POSITIVE':
return "positive"
elif result == 'NEGATIVE':
return "negative"
else:
return "neutral"
- ใช้โมเดล sentiment_model วิเคราะห์ว่าเป็น POSITIVE, NEGATIVE, หรือ NEUTRAL
- คืนค่ากลับมาในรูปแบบ lowercase เพื่อใช้งานกับ dictionary คำตอบที่เตรียมไว้
ฟังก์ชันหลัก: ตอบกลับ + แปลงเสียง + เล่นเสียง
def reply_and_speak(message):
if message == "ดูแลตัวเองด้วยนะคะ 🌷":
response = message
else:
found = False
for keyword in custom_replies:
if keyword in message:
response = custom_replies[keyword]
found = True
break
if not found:
mood = analyze_sentiment(message)
response = random.choice(replies[mood])
- ถ้าเป็นข้อความพิเศษ (“ดูแลตัวเอง...”) ให้ตอบตามนั้นเลย
- ถ้ามีคำที่ผู้ใช้เคยสอนไว้ → ดึงคำตอบนั้นมาใช้
- ถ้าไม่พบ → วิเคราะห์อารมณ์ แล้วสุ่มคำตอบจากคลัง replies
แปลงข้อความเป็นเสียง และเล่นเสียงพูด
print("น้องชมพู:", response)
if os.path.basename(filename) == "chompoo_response.mp3" and os.path.exists(filename):
os.remove(filename)
tts = gTTS(text=response, lang='th')
tts.save(filename)
pygame.mixer.init()
pygame.mixer.music.load(filename)
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
time.sleep(0.1)
pygame.mixer.music.unload()
if os.path.basename(filename) == "chompoo_response.mp3" and os.path.exists(filename):
os.remove(filename)
- แปลง response เป็นเสียงพูด
- เล่นไฟล์เสียงที่เพิ่งสร้างด้วย pygame
- หลังเล่นเสร็จ ลบไฟล์เพื่อไม่ให้มีไฟล์สะสมในเครื่อง
แยกส่วนสำคัญออกมาให้เห็นจะได้
แปลงข้อความเป็นเสียงพูดด้วย gTTS
tts = gTTS(text=response, lang='th')
tts.save(filename)
gTTS คือ Google Text-to-Speech
→ รับข้อความในตัวแปร response
→ แปลงเป็นเสียง .mp3 ภาษาไทย
→ บันทึกไฟล์ไว้ใน filename (คือ "chompoo_sound/chompoo_response.mp3")
จากนั้น เล่นไฟล์เสียงด้วย pygame
pygame.mixer.init()
pygame.mixer.music.load(filename)
pygame.mixer.music.play()
รอจนเสียงพูดจบก่อนทำอย่างอื่น
while pygame.mixer.music.get_busy():
time.sleep(0.1)
ใช้ loop เพื่อรอจนเสียงเล่นเสร็จ
→ ป้องกันไม่ให้โค้ดลบไฟล์หรือพูดซ้อนกันก่อนพูดจบ
ล้าง memory และลบไฟล์เสียงออก
pygame.mixer.music.unload()
os.remove(filename)
ขั้นตอนที่ 5: เขียน loop สำหรับใช้งานน้องชมพูแบบโต้ตอบ
รับข้อความจากผู้ใช้แบบเรียลไทม์ และตอบกลับตามอารมณ์ที่ตรวจจับได้ หากผู้ใช้ใช้คำสั่ง “สอน: ... = ...” ระบบจะบันทึกคำตอบลงใน custom_replies.json
เริ่มต้นระบบด้วยข้อความต้อนรับ
print("น้องชมพู: สวัสดีนะคะ พร้อมรับฟังเสมอค่ะ 💗")
print("พิมพ์ 'สอน: คำ = คำตอบ' เพื่อให้น้องชมพูเรียนรู้ค่ะ")
print("พิมพ์ bye, ลาก่อน, ออก, บาย เพื่อออกนะคะ")
วนรับข้อความจากผู้ใช้
while True:
msg = input("คุณ: ").strip()
ถ้าผู้ใช้พิมพ์คำว่า “สอน: ... = ...” → บันทึกลง JSON
if msg.startswith("สอน:"):
try:
content = msg[4:].strip()
key, value = content.split("=")
key = key.strip()
value = value.strip()
custom_replies[key] = value
with open(learn_file, "w", encoding="utf-8") as f:
json.dump(custom_replies, f, ensure_ascii=False, indent=2)
print(f"น้องชมพู: น้องจะจำว่าเมื่อคุณพูดว่า \"{key}\" จะตอบว่า \"{value}\" ค่ะ 😊")
except:
print("น้องชมพู: รูปแบบคำสอนไม่ถูกต้องนะคะ ใช้แบบนี้ค่ะ → สอน: หิว = ไปกินข้าวก่อนนะคะ 🍚")
continue
- ใช้ split("=") เพื่อแยกคำและคำตอบ
- เก็บไว้ในไฟล์ custom_replies.json
คำสั่งออกจากระบบ
if msg.lower() in ["bye", "ลาก่อน", "ออก", "บาย"]:
reply_and_speak("ดูแลตัวเองด้วยนะคะ 🌷")
pygame.mixer.quit()
break
ตอบกลับข้อความตามอารมณ์
reply_and_speak(msg)
ตัวอย่างผลลัพธ์จากการรันโค้ด
ตัวอย่างการรัน: สอนคำตอบใหม่ให้น้องชมพู
นอกจากการวิเคราะห์อารมณ์ด้วยโมเดลแล้ว
ผู้ใช้สามารถสอนน้องชมพูให้จดจำคำที่ต้องการให้ตอบเฉพาะได้
ตัวอย่างเช่น:
คุณ: สอน: หิว = ไปกินข้าวก่อนนะคะ จะได้มีแรงสู้ต่อ
ระบบบันทึกลงjson
ผลลัพธ์:
น้องชมพู: น้องจะจำว่าเมื่อคุณพูดว่า "หิว" จะตอบว่า "ไปกินข้าวก่อนนะคะ จะได้มีแรงสู้ต่อ" ค่ะ
เสียงจะเล่นขึ้นมา หลังจากนั้นไฟล์จะลบอัตโนมัติป้องกันไม่ให้ไฟล์มีเยอะเกิน
ตัวอย่างเพิ่มเติม: น้องชมพูเวอร์ชันแนะนำอาหารตามอารมณ์ของผู้ใช้
ในตัวอย่างนี้ เราจะลองดัดแปลงน้องชมพูให้กลายเป็น AI ผู้ช่วยแนะนำเมนูอาหาร ตามอารมณ์ของผู้ใช้
เช่น ถ้าผู้ใช้รู้สึกเศร้า น้องชมพูจะชวนกินของหวาน ถ้ารู้สึกดี จะชวนกินอะไรสดชื่น ๆ
ขั้นตอนที่ 1: ติดตั้งและเรียกใช้ไลบรารี
from transformers import pipeline
from gtts import gTTS
import os
import random
import pygame
import time
import json
ขั้นตอนที่ 2: โหลดโมเดลวิเคราะห์อารมณ์
sentiment_model = pipeline("sentiment-analysis")
ขั้นตอนที่ 3: คลังเมนูอาหารตามอารมณ์
replies = {
"positive": [
"กินส้มตำแซ่บ ๆ ดีมั้ยคะ สดชื่นแน่นอน 🍊🌶️",
"ลองสลัดผลไม้หรือชาเขียวเย็น ๆ ดูมั้ย สดใสมากค่ะ 🍵🍓"
],
"negative": [
"ลองกินของหวานอย่างชานมไข่มุกหรือบิงซูดูมั้ย หวาน ๆ ช่วยได้เยอะนะคะ 🍧🧋",
"วันนี้ต้องการพลังใจ ลองกินหมูกระทะหรือของโปรดดูนะคะ 🍲❤️"
],
"neutral": [
"อยากลองก๋วยเตี๋ยวร้อน ๆ ซดคล่องคอมั้ยคะ 🍜",
"ลองข้าวผัดไข่หรือข้าวหน้าไก่แบบง่าย ๆ ก็อร่อยดีนะคะ 🍳"
]
}
แต่ละกลุ่มอารมณ์จะมีเมนูที่เหมาะสม เช่น เศร้า → หวาน, ดีใจ → สดชื่น
ขั้นตอนที่ 4: สร้างฟังก์ชันวิเคราะห์อารมณ์ และแปลงข้อความเป็นเสียง
เปลี่ยนข้อความพิเศษตอนลาจากโปรแกรม
if message == "ไว้เจอกันใหม่นะคะ ขอให้อิ่มอร่อยเสมอค่ะ 🍽️":
response = message
เปลี่ยนข้อความแสดงผลให้บอกว่าเป็น “โหมดอาหาร”
print("น้องชมพู (โหมดอาหาร):", response)
ขั้นตอนที่ 5: เขียน loop สำหรับใช้งานน้องชมพูแบบโต้ตอบ
เปลี่ยนข้อความต้อนรับตอนเริ่มระบบ
print("น้องชมพู (โหมดอาหาร): พร้อมแนะนำเมนูอาหารตามอารมณ์ค่ะ 🍱")
print("พิมพ์ 'สอน: คำ = เมนูที่อยากให้แนะนำ' เพื่อให้น้องชมพูจำได้")
print("พิมพ์ bye, ลาก่อน, ออก, บาย เพื่อออกนะคะ")
เปลี่ยนข้อความตอนผู้ใช้ “สอนคำตอบ”
print(f"น้องชมพู: ถ้ามีใครพูดว่า \"{key}\" น้องจะชวนไปกินว่า \"{value}\" ค่ะ 😊")
เปลี่ยนคำตอบลาเมื่อผู้ใช้พิมพ์ “ออก”
reply_and_speak("ไว้เจอกันใหม่นะคะ ขอให้อิ่มอร่อยเสมอค่ะ 🍽️")
ผลลัพธ์ที่ได้
สรุปผล
โปรเจกต์นี้แสดงให้เห็นว่า เราสามารถสร้าง AI chatbot แบบง่าย ๆ ที่เข้าใจอารมณ์ผู้ใช้ และตอบกลับอย่างมีความรู้สึก
โดยไม่จำเป็นต้องใช้เทคนิคซับซ้อนมากนัก เพียงแค่ใช้โมเดล NLP ที่มีอยู่ และไลบรารีเสียงใน Python
สิ่งที่ทำได้แล้วในบทความนี้
- วิเคราะห์อารมณ์ข้อความ
- ตอบกลับด้วยข้อความให้กำลังใจ
- พูดข้อความด้วยเสียงจริง
- รับคำสั่งจากผู้ใช้แบบโต้ตอบทันที
แนวทางต่อยอด
- ให้ผู้ใช้สามารถสอนคำตอบใหม่ ๆ ได้เอง (แบบ rule-based learning)
- เชื่อมต่อกับแอปแชท เช่น LINE หรือ Telegram
- เพิ่มระบบจดจำผู้ใช้หรือสร้างบุคลิกน้องชมพูให้ต่างกันหลายเวอร์ชัน
อ้างอิง