Python “BOT พูดได้เพื่อนคุยยามเหงา”
…กำลังจะพูดถึง “จาวิส” ของไอรอนแมน แล้วคำคมของธานอสมาได้ไง จั่วหัวมาให้คิดกันเล่นเฉยๆครับ สมมุติถ้าคนหายไปครึ่งจักรวาลจริง แล้วเราจะเหลือใครให้เราคุยด้วย?? คงเหงาแย่!! อย่ากระนั้นเลย มาลองสร้าง บอท ไว้คุยแก้เหงากันดีกว่า?
ที่จริงโปรเจคนี้ลองทำเพื่อทดสอบแนวคิดเฉยๆ นะครับ จุดบกพร่องยังมีอีกเยอะ แต่ก็อยากรวบรวม code ไว้ กันตัวเองลืม เรามาเริ่มกันเลยดีกว่า
แนวคิด :
เนื่องจากผมลองหา Bot ฟรี ที่เป็นแบบไทย ๆ คุยภาษาไทยเก่ง ๆ ไม่ได้ ส่วนที่ได้ก็มีค่าใช้จ่าย ไม่ก็ไม่ได้รองรับ python (หรือผมยังหาไม่เจอก็ไม่รู้ ไปดูของ aiforthai ก็รองรับ android) ดังนั้นเลยเลือกใช้ Bot ฟรี ที่เป็นภาษาอังกฤษไปพลางๆก่อน แล้วก็แก้ปัญหาให้คุยกับคนไทยอย่างเรา ๆ ได้รู้เรื่องโดยใช้ล่ามแปลภาษาอย่าง Google Translate
หลักการทำงาน มี 6 ขั้นตอน:
1. รับเสียงพูด (ภาษาไทย) จากไมค์โครโฟน
2. ใช้วิธี Speech To Text แปลงเสียงพูดเป็นข้อความภาษาไทย
3. ใช้ Google Translate แปลข้อความภาษาไทยเป็นภาษาอังกฤษ
4. ส่งภาษาอังกฤษไปคุยกับ Bot ในที่นี้ใช้ ChatterBot
5. นำข้อความภาษาอังกฤษที่ได้รับจาก ChatterBot ไปใช้ Google Translate แปลเป็นภาษาไทย
6. แปลงข้อความภาษาไทยเป็นไฟล์เสียง แล้ว เล่นออกลำโพง (*ถ้าใครใช้ windows10 ก็เลือกวิธีที่ไม่ต้องสร้างไฟล์เสียง และทำงานแบบ offline ซึ่งจะเร็วกว่ามาก)
ตัวอย่าง Code Python
(ผมเขียนบน windows10 ตัวที่ติดตั้งค่อนข้างยากคือ chatterbot)
"""code แค่พอเล่นได้เป็นแนวทาง ซึ่งยังมีจุดอ่อนอีกเยอะนะครับ แต่ก็หวังว่าคงมีประโยชน์บ้างไม่มาก็น้อย@PayayamDev"""import speech_recognition as srimport osimport playsoundimport randomimport timeimport pyttsx3from datetime import datetimefrom googletrans import Translatorfrom chatterbot import ChatBotfrom chatterbot.trainers import ChatterBotCorpusTrainerfrom gtts import gTTSprint(str(datetime.now()) + ' Start')# ตั้งชื่อเรียนแบบ จาวิส เป็น จาริต หรือ จริต (ลองหาความหมายของคำว่า "จริต" ใน google ดูครับ)chatbot = ChatBot('Jarit')# สร้าง trainer ไว้คอยสอน bot ให้รู้จักคำพูด คล้าย trainer ตามฟิตเนส ที่สอนออกกำลังกายtrainer = ChatterBotCorpusTrainer(chatbot)# สอนบอทด้วยภาษาอังกฤษ เพราะภาษาไทยที่อยู่ใน github มีคำพูดน้อยไปprint(str(datetime.now()) + ' สอนบอทให้เรียนรู้ภาษาอังกฤษ')trainer.train("chatterbot.corpus.english")# สำหรับพูดเสียงออกลำโพง (สำหรับ windows 10 จะทำงานแบบ offline และทำงานได้เร็ว)def winSpeak(word):engine = pyttsx3.init()TH_voice_id = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_THAI"engine.setProperty('volume', 0.9) # Volume 0-1engine.setProperty('rate', 120) #148engine.setProperty('voice', TH_voice_id)engine.say(word)engine.runAndWait()# สำหรับพูดเสียงออกลำโพงdef Speak(word):# ใช้ timestamp เพื่อเอาไปสร้างชื่อไฟล์ จะได้ไม่ซ้ำ และไม่ติดสิทธิ์เวลาลบไฟล์now = datetime.now()timestamp = datetime.timestamp(now)# สร้างเสียงพูดtts=gTTS(text=word,lang='th')# บันทึกเป็นไฟล์ mp3mp3 = str(timestamp) + '.mp3'tts.save(mp3)# เล่นไฟล์ mp3playsound.playsound(mp3 , True)# เล่นเสร็จแล้วก็ลบไฟล์ จะได้ไม่รก folderos.remove(mp3)# เตรียมตัวแปรไว้แปลภาษา ด้วย google translatetranslator = Translator()# เตรียมตัวแปรไว้คอยรับเสียงจากไมค์r = sr.Recognizer()with sr.Microphone() as source:while True:# 1. รอรับเสียงพูดจากไมค์print(str(datetime.now()) + ' 1.รอรับเสียงพูดจากไมค์')audio = r.listen(source)try:# 2. แปลงเสียงเป็นข้อความภาษาไทยprint(str(datetime.now()) + ' 2.แปลงเสียงเป็นข้อความภาษาไทย')said = r.recognize_google(audio, None,'th')print(str(datetime.now()) + ' ข้อความที่ได้ : ' + said)# 3. แปลงไทยเป็นภาษาอังกฤษprint(str(datetime.now()) + ' 3. แปลงไทยเป็นภาษาอังกฤษ')thai2english = translator.translate(said,src='th',dest='en')print(str(datetime.now()) + ' ข้อความที่ได้ : ' + thai2english.text)# 4. เรียก chat bot (เราสอน bot ให้รู้จักแต่ภาษาอังกฤษ เราเลยต้องแปลงไทยเป็นอังกฤษก่อนคุยกับ bot)print(str(datetime.now()) + ' 4.เรียก chat bot')response = chatbot.get_response(thai2english.text)print(str(datetime.now()) + ' ข้อความที่ได้ : ' + str(response))# xxx = '' + str(response)# 5. แปลอังกฤษเป็นภาษาไทยprint(str(datetime.now()) + ' 5.แปลอังกฤษเป็นภาษาไทย')english2thai = translator.translate(str(response),src='en',dest='th')print(str(datetime.now()) + ' ข้อความที่ได้ : ' + english2thai.text)# 6. นำข้อความแปลงเป็นเสียงออกลำโพงprint(str(datetime.now()) + ' 6. นำข้อความแปลงเป็นเสียงออกลำโพง')#winSpeak("english2thai.text) # สำหรับ windows 10 ทำงานแบบ offline ตอบสนองได้เร็วกว่าSpeak(english2thai.text)print(str(datetime.now()) + '------------------------------------------------')except Exception as e:print(str(datetime.now()) + ' Error! ' + str(e))
ผลลัพธ์เมื่อ run code
ขอบคุณ link เหล่านี้ด้วยนะครับ ที่มีข้อมูลให้ได้ศึกษาครับ
#Speech to Text
#Text to Speech (offline for windows)
#google translate
#Chatterbot