ไฟล์นี้อธิบายการทำงานของโค้ด Python สำหรับสร้างระบบผู้ช่วยอัจฉริยะสั่งงานด้วยเสียงแบบง่าย ๆ คล้าย JARVIS โดยระบบจะรับเสียงจากไมโครโฟน แปลงเสียงเป็นข้อความ ส่งข้อความให้ AI คิดคำตอบ แล้วแปลงคำตอบกลับมาเป็นเสียงพูดภาษาไทย
โค้ดนี้คือโปรแกรม Voice AI Assistant Pipeline หรือระบบผู้ช่วย AI แบบสั่งงานด้วยเสียง โดยทำงานเป็นลำดับดังนี้
- อัดเสียงจากไมโครโฟนของผู้ใช้
- บันทึกเสียงเป็นไฟล์
.wav - ส่งไฟล์เสียงไปให้ระบบ Speech-to-Text เพื่อแปลงเสียงพูดเป็นข้อความ
- ส่งข้อความที่ได้ไปให้โมเดล AI ผ่าน OpenRouter
- รับคำตอบจาก AI
- แปลงข้อความคำตอบเป็นเสียงภาษาไทยด้วย gTTS
- เล่นเสียงตอบกลับผ่านลำโพง
พูดง่าย ๆ คือ ผู้ใช้พูดกับคอมพิวเตอร์ แล้ว AI จะตอบกลับเป็นเสียงภาษาไทย
ไมโครโฟน
↓
record_audio()
↓
บันทึกเป็น user_command.wav
↓
speech_to_text()
↓
แปลงเสียงเป็นข้อความด้วย Whisper ผ่าน OpenRouter
↓
ask_jarvis_brain()
↓
ส่งข้อความให้โมเดล AI คิดคำตอบ
↓
text_to_speech()
↓
แปลงคำตอบเป็นเสียง MP3 ด้วย gTTS
↓
เล่นเสียงผ่านลำโพง
โค้ดนี้ใช้ไลบรารีหลักดังนี้
| ไลบรารี | ใช้ทำอะไร |
|---|---|
sounddevice |
อัดเสียงจากไมโครโฟน |
scipy |
บันทึกไฟล์เสียงเป็น .wav |
requests |
ส่งไฟล์เสียงไปยัง API ของ OpenRouter |
openai |
ใช้เรียกโมเดลภาษา AI ผ่าน OpenRouter |
gTTS |
แปลงข้อความเป็นเสียงพูดภาษาไทย |
playsound |
เล่นไฟล์เสียง .mp3 |
base64 |
แปลงไฟล์เสียงเป็น Base64 ก่อนส่ง API |
os, time |
ไลบรารีพื้นฐานของ Python |
k |
ไฟล์แยกสำหรับเก็บ API Key |
ติดตั้งไลบรารีที่จำเป็นด้วยคำสั่งนี้
pip install sounddevice scipy openai gTTS playsound==1.2.2 requestsถ้าใช้ Windows แล้วติดตั้ง sounddevice ไม่ผ่าน อาจต้องติดตั้ง Visual C++ Redistributable หรืออัปเดต Python/pip ให้เรียบร้อยก่อน
python -m pip install --upgrade pipโค้ดนี้ดึง API Key จากไฟล์ชื่อ k.py
ให้สร้างไฟล์ k.py ไว้ในโฟลเดอร์เดียวกับไฟล์ Python หลัก แล้วใส่โค้ดนี้
API_KEY = "ใส่_OPENROUTER_API_KEY_ของคุณตรงนี้"ตัวอย่างโครงสร้างไฟล์
project-folder/
│
├── main.py
└── k.py
ไม่ควรใส่ API Key ตรง ๆ ในไฟล์หลักที่จะแชร์ให้คนอื่น เพราะอาจทำให้ Key รั่วได้
OPENROUTER_API_KEY = API_KEY
MODEL_NAME = "nousresearch/hermes-3-llama-3.1-405b"ส่วนนี้คือการกำหนด API Key และชื่อโมเดล AI ที่จะใช้เป็นสมองของ JARVIS
ถ้าต้องการให้ตอบเร็วขึ้น สามารถเปลี่ยนโมเดลเป็นตัวที่เบากว่า เช่น
MODEL_NAME = "google/gemini-2.5-flash"SAMPLE_RATE = 44100
DURATION = 10
AUDIO_INPUT_FILE = "user_command.wav"
AUDIO_OUTPUT_FILE = "jarvis_response.mp3"ความหมายของแต่ละตัวแปร
| ตัวแปร | ความหมาย |
|---|---|
SAMPLE_RATE |
คุณภาพการอัดเสียง หน่วยเป็น Hz |
DURATION |
ระยะเวลาอัดเสียงต่อครั้ง หน่วยเป็นวินาที |
AUDIO_INPUT_FILE |
ชื่อไฟล์เสียงที่อัดจากไมโครโฟน |
AUDIO_OUTPUT_FILE |
ชื่อไฟล์เสียงตอบกลับจาก AI |
ค่า DURATION = 10 หมายความว่า โปรแกรมจะฟังเสียงผู้ใช้เป็นเวลา 10 วินาทีต่อรอบ
def record_audio():
print(f"\n🎙️ JARVIS กำลังฟัง... (พูดได้เลย {DURATION} วินาที)")
recording = sd.rec(int(DURATION * SAMPLE_RATE), samplerate=SAMPLE_RATE, channels=1, dtype='int16')
sd.wait()
wavfile.write(AUDIO_INPUT_FILE, SAMPLE_RATE, recording)
print("💾 บันทึกเสียงลงเครื่องเรียบร้อยแล้ว...")ฟังก์ชันนี้ทำหน้าที่อัดเสียงจากไมโครโฟนเป็นเวลา 10 วินาที แล้วบันทึกเป็นไฟล์ user_command.wav
ขั้นตอนภายในฟังก์ชัน
- แสดงข้อความว่า JARVIS กำลังฟัง
- ใช้
sounddeviceอัดเสียง - รอจนกว่าอัดเสียงเสร็จ
- บันทึกเสียงเป็นไฟล์
.wav
def speech_to_text():
print("🤖 กำลังแปลงเสียงเป็นข้อความ (ผ่าน Base64 JSON)...")ฟังก์ชันนี้ทำหน้าที่แปลงเสียงพูดเป็นข้อความภาษาไทย โดยส่งไฟล์เสียงไปยัง OpenRouter endpoint
ขั้นตอนการทำงาน
- เปิดไฟล์
user_command.wav - อ่านข้อมูลเสียงเป็น binary
- แปลงไฟล์เสียงเป็น Base64
- ส่งข้อมูลไปยัง API
- รับข้อความที่แปลงแล้วกลับมา
โมเดลที่ใช้สำหรับถอดเสียงคือ
"openai/whisper-large-v3"ใน payload มีการกำหนดภาษาเป็นภาษาไทย
"language": "th"จุดนี้ช่วยให้ระบบพยายามถอดเสียงเป็นภาษาไทยโดยตรง
def ask_jarvis_brain(user_text):
print(f"👤 คุณพูดว่า: '{user_text}'")
print(f"🧠 กำลังส่งให้ {MODEL_NAME} ประมวลผลความคิด...")ฟังก์ชันนี้ส่งข้อความของผู้ใช้ไปให้ AI ประมวลผล แล้วรับคำตอบกลับมา
ในส่วน system prompt มีการกำหนดบุคลิกของ AI ว่า
คุณคือ JARVIS ผู้ช่วยอัจฉริยะในห้องทำงานของ Tony Stark
ตอบกลับสั้นกระชับ เป็นกันเอง สุภาพ และมีไหวพริบ
โดยต้องตอบเป็นภาษาไทยเท่านั้น
ดังนั้น AI จะพยายามตอบกลับเป็นภาษาไทยในโทนแบบ JARVIS
def text_to_speech(ai_response_text):
print(f"🤖 JARVIS คิดคำตอบ: '{ai_response_text}'")
print("🔊 กำลังสังเคราะห์เสียงเพื่อตอบกลับ...")ฟังก์ชันนี้ใช้ gTTS แปลงข้อความคำตอบจาก AI เป็นเสียงพูดภาษาไทย แล้วบันทึกเป็นไฟล์ jarvis_response.mp3
จากนั้นใช้ playsound() เล่นเสียงตอบกลับ
tts = gTTS(text=ai_response_text, lang='th')
tts.save(AUDIO_OUTPUT_FILE)
playsound(AUDIO_OUTPUT_FILE)แนะนำให้ใช้ Python 3.10 ขึ้นไป
ตรวจสอบเวอร์ชัน Python
python --versionหรือ
python3 --versionpip install sounddevice scipy openai gTTS playsound==1.2.2 requestsAPI_KEY = "ใส่_OPENROUTER_API_KEY_ของคุณ"เช่น
main.py
บน Windows
python main.pyบน macOS หรือ Linux
python3 main.pyเมื่อเห็นข้อความนี้
🎙️ JARVIS กำลังฟัง... (พูดได้เลย 10 วินาที)
ให้พูดคำสั่งหรือคำถามใส่ไมโครโฟน เช่น
วันนี้ควรวางแผนงานอย่างไร
หลังจากนั้นระบบจะ
- บันทึกเสียง
- แปลงเสียงเป็นข้อความ
- ส่งให้ AI คิดคำตอบ
- พูดตอบกลับผ่านลำโพง
ผู้ใช้พูดว่า
ช่วยสรุปงานที่ควรทำวันนี้ให้หน่อย
ระบบอาจตอบกลับว่า
ได้ครับ วันนี้ควรเริ่มจากงานสำคัญที่สุดก่อน แบ่งเป็น 3 ส่วนคือ งานเร่งด่วน งานที่ต้องติดต่อคนอื่น และงานที่ต้องใช้สมาธิสูงครับ
แล้วโปรแกรมจะเล่นเสียงคำตอบนี้ออกทางลำโพง
ระบบนี้ต้องใช้อินเทอร์เน็ต เพราะต้องเรียกใช้งาน OpenRouter และ gTTS
ถ้าไม่มีอินเทอร์เน็ต ระบบจะไม่สามารถแปลงเสียงหรือสร้างเสียงตอบกลับได้
ถ้าโปรแกรมอัดเสียงไม่ได้ ให้ตรวจสอบว่า
- เครื่องมีไมโครโฟน
- ระบบปฏิบัติการอนุญาตให้ Python ใช้ไมโครโฟน
- เลือก input device ถูกต้อง
- ไมโครโฟนไม่ได้ถูกใช้งานโดยโปรแกรมอื่นอยู่
ไม่ควรโพสต์ไฟล์ k.py ลง GitHub หรือส่งให้คนอื่น เพราะมี API Key อยู่ข้างใน
ควรเพิ่มไฟล์ .gitignore
k.py
ถ้า playsound เล่นเสียงไม่ได้ ให้ลองติดตั้งเวอร์ชันที่กำหนดไว้
pip install playsound==1.2.2หรือเปลี่ยนไปใช้ไลบรารีอื่น เช่น pygame หรือ pydub
แนวทางแก้ไข
- ตรวจสอบว่าไมโครโฟนเปิดอยู่
- ตรวจสอบ permission ของไมโครโฟน
- ลองพูดใกล้ไมโครโฟนมากขึ้น
- ทดสอบไมโครโฟนด้วยโปรแกรมอัดเสียงของเครื่องก่อน
แนวทางแก้ไข
- ตรวจสอบว่า API Key ถูกต้อง
- ตรวจสอบว่ายังมีเครดิตในบัญชี OpenRouter
- ตรวจสอบชื่อโมเดลว่าถูกต้อง
- ตรวจสอบการเชื่อมต่ออินเทอร์เน็ต
สาเหตุที่เป็นไปได้
- โมเดลที่ใช้มีขนาดใหญ่
- อินเทอร์เน็ตช้า
- ไฟล์เสียงมีขนาดใหญ่
- Server ของ API ตอบช้า
วิธีแก้
- ลด
DURATIONจาก 10 วินาทีเหลือ 5 วินาที - เปลี่ยนไปใช้โมเดลที่เร็วกว่า
- ใช้โมเดลขนาดเล็กลง
- ใช้ระบบฟังแบบกดปุ่มแทนการอัดเสียงยาว
บางครั้งไฟล์ jarvis_response.mp3 อาจยังถูกโปรแกรมเล่นเสียงล็อกไว้อยู่ ทำให้บันทึกทับไม่ได้
แนวทางแก้คือใช้ชื่อไฟล์ใหม่ทุกครั้ง เช่นใส่ timestamp ต่อท้ายชื่อไฟล์
โค้ดนี้เป็นเวอร์ชันเริ่มต้น สามารถพัฒนาต่อได้หลายทาง เช่น
- ทำให้ระบบฟังต่อเนื่องแบบ Wake Word เช่น “Hey JARVIS”
- ลดเวลา delay ให้ตอบเร็วขึ้น
- เพิ่ม memory ให้จำบทสนทนาก่อนหน้าได้
- เพิ่มคำสั่งควบคุมอุปกรณ์ IoT
- เชื่อมกับ Home Assistant
- เชื่อมกับ LINE Notify หรือ Telegram
- เปลี่ยนจาก gTTS เป็นเสียงที่สมจริงกว่า
- เพิ่มหน้าจอ GUI ด้วย Tkinter, PyQt หรือ Web UI
- ทำระบบเลือกไมโครโฟนและลำโพง
- ทำเป็นแอปบน Raspberry Pi
โค้ดนี้คือระบบต้นแบบของผู้ช่วย AI แบบ Voice-First ที่สามารถรับคำสั่งเสียงภาษาไทย แปลงเป็นข้อความ ส่งให้ AI ประมวลผล และตอบกลับเป็นเสียงภาษาไทยได้
เหมาะสำหรับใช้เป็นพื้นฐานในการสอนเรื่อง
- Python Audio Processing
- Speech-to-Text
- Large Language Model
- Text-to-Speech
- Voice Assistant
- Multi-AI Agent
- ระบบ JARVIS ในห้องทำงาน
โดยโค้ดนี้ยังเป็นเวอร์ชันพื้นฐาน แต่สามารถต่อยอดเป็นระบบผู้ช่วยอัจฉริยะในห้องทำงานจริงได้ เช่น สั่งเปิดไฟ วิเคราะห์ข้อมูล เปิดโปรแกรม ควบคุม IoT หรือเชื่อมต่อกับ Agent หลายตัวในอนาคต