ถ้าเราต้องการสร้างระบบที่สามารถพูดให้กำลังใจเราเวลาท้อ เหนื่อย หรือเศร้าใจได้
หนึ่งในแนวทางที่น่าสนใจ คือการใช้โมเดล 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)

ตัวอย่างผลลัพธ์จากการรันโค้ด

Image description

Image description

ตัวอย่างการรัน: สอนคำตอบใหม่ให้น้องชมพู

นอกจากการวิเคราะห์อารมณ์ด้วยโมเดลแล้ว
ผู้ใช้สามารถสอนน้องชมพูให้จดจำคำที่ต้องการให้ตอบเฉพาะได้
ตัวอย่างเช่น:

คุณ: สอน: หิว = ไปกินข้าวก่อนนะคะ จะได้มีแรงสู้ต่อ

ระบบบันทึกลงjson
Image description

ผลลัพธ์:

น้องชมพู: น้องจะจำว่าเมื่อคุณพูดว่า "หิว" จะตอบว่า "ไปกินข้าวก่อนนะคะ จะได้มีแรงสู้ต่อ" ค่ะ

Image description

เสียงจะเล่นขึ้นมา หลังจากนั้นไฟล์จะลบอัตโนมัติป้องกันไม่ให้ไฟล์มีเยอะเกิน
Image description

Image description

ตัวอย่างเพิ่มเติม: น้องชมพูเวอร์ชันแนะนำอาหารตามอารมณ์ของผู้ใช้

ในตัวอย่างนี้ เราจะลองดัดแปลงน้องชมพูให้กลายเป็น 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("ไว้เจอกันใหม่นะคะ ขอให้อิ่มอร่อยเสมอค่ะ 🍽️")

ผลลัพธ์ที่ได้

Image description

Image description

สรุปผล

โปรเจกต์นี้แสดงให้เห็นว่า เราสามารถสร้าง AI chatbot แบบง่าย ๆ ที่เข้าใจอารมณ์ผู้ใช้ และตอบกลับอย่างมีความรู้สึก
โดยไม่จำเป็นต้องใช้เทคนิคซับซ้อนมากนัก เพียงแค่ใช้โมเดล NLP ที่มีอยู่ และไลบรารีเสียงใน Python

สิ่งที่ทำได้แล้วในบทความนี้

  • วิเคราะห์อารมณ์ข้อความ
  • ตอบกลับด้วยข้อความให้กำลังใจ
  • พูดข้อความด้วยเสียงจริง
  • รับคำสั่งจากผู้ใช้แบบโต้ตอบทันที

แนวทางต่อยอด

  • ให้ผู้ใช้สามารถสอนคำตอบใหม่ ๆ ได้เอง (แบบ rule-based learning)
  • เชื่อมต่อกับแอปแชท เช่น LINE หรือ Telegram
  • เพิ่มระบบจดจำผู้ใช้หรือสร้างบุคลิกน้องชมพูให้ต่างกันหลายเวอร์ชัน

อ้างอิง