Skip to content

ประยุกต์สร้างระบบสั่งงานด้วยเสียงใน python

สวัสดีผู้อ่านทุกท่านครับ บทความประยุกต์นี้จะพาผู้อ่านนำความรู้ไปประยุกต์ใช้ทำสร้างระบบสั่งงานด้วยเสียงใน python กันครับ

ผมนำความรู้จากบทความดังต่อไปนี้มาใช้ทำครับ

โค้ดดังต่อไปนี้ผมขอใช้ License: BSD ครับ ผมให้ชื่อว่า "นาดี"
ตอนแรกผมลองเขียนระบบสั่งงานด้วยการพิมพ์คำสั่งลงไปก่อนครับ

__author__ = 'วรรณพงษ์'
#License: BSD
import PyICU #ใช้ในการตัดคำ
import re
import webbrowser #ใช้ในการค้นหาโดยเปิด web browser แล้วค้นผ่านกูเกิล
import time #ดึงเวลา
#ระบบตัดคำไทย
def isThai(chr):
    cVal = ord(chr)
    if(cVal >= 3584 and cVal <= 3711):
        return True
    return False
def warp(txt):
    bd = PyICU.BreakIterator.createWordInstance(PyICU.Locale("th"))
    bd.setText(txt)
    lastPos = bd.first()
    retTxt = ""
    try:
        while(1):
            currentPos = next(bd)
            retTxt += txt[lastPos:currentPos]
            #เฉพาะภาษาไทยเท่านั้น
            if(isThai(txt[currentPos-1])):
                if(currentPos < len(txt)):
                    if(isThai(txt[currentPos])):
                        #คั่นคำที่แบ่ง
                        retTxt += ','
            lastPos = currentPos
    except StopIteration:
        pass
        #retTxt = retTxt[:-1]
    return retTxt
######################
print("สวัสดีค่ะ ฉันชื่อ นาดี ยินดีที่ได้รับใช้ค่ะ :)")
while True:
    a = input("Text : ") #รับข้อความ
    txt = [warp(a)] #ตัดคำจากตัวแปร a
    txt = (','.join(str(x) for x in txt))
    if txt.find("สวัสดี") == 0 or txt.find("ไง") == 0 or txt.find("หวัดดี") == 0: #ถ้าค้นแล้วเจอคำเหล่านี้
        print("สวัสดีค่ะ ฉันชื่อ นาดี ค่ะ")
    elif txt.find("ออก") == 0 & txt.find("ระบบ") == 0: #ถ้าค้นแล้วเจอคำเหล่านี้
        print("ลาก่อน :(")
        break #ออกจากการลูปวน
    elif txt.find("ค้นหา") == 0 & txt.find("ว่า") == 0: #ถ้าค้นแล้วเจอคำเหล่านี้
        s = txt.split("ว่า") #แบ่งคำตรงคำว่า "ว่า"
        a = str(s[1])
        a = a.replace(',', '') #เอา , ออก
        webbrowser.get('windows-default').open_new_tab('https://www.google.co.th/search?q=%s' % a) #ค้นหา
    elif txt.find("เวลา") == 0 & txt.find("เท่า") == 0 or txt.find("ตอน") == 0 & txt.find("นี้") == 0: #ถ้าค้นแล้วเจอคำเหล่านี้
        a = time.strftime("%H - %M :") #บอกเวลาแบบ 24 ชั่วโมง
        a = a.replace('-', 'นาฬิกา') #แทนที่
        a = a.replace(':', 'นาที') #แทนที่
        print("ขณะนี้เป็นเวลา %s ค่ะ" % a) #แสดงผลลัพธ์
    else:
        print("ขออภัยค่ะ\nระบบไม่รู้จักคำสั่งนี้")

โค้ดข้างบนมีคำสั่งดังนี้ครับ

  • สวัสดี หรือ ไง หรือ หวัด จะตอบกลับคำทักทายออกมาครับ
  • ค้นหาคำว่า.... ระบบจะค้นหาตามที่พิมพ์ลงไปครับ แล้วจะเปิด web browser แล้วค้นผ่านกูเกิล
  • ออกจากระบบ คือ ออกจากการทำงาน
  • ตอนนี้เวลาเท่าไร ระบบจะบอกเวลาออกมาครับ
  • หากพูดอะไรที่ไม่รู้จักลงไป ระบบจะตอบกลับว่า "ขออภัยค่ะ ระบบไม่รู้จักคำสั่งนี้ค่ะ"

ต่อไปผมจะดัดแปลงโค้ดให้สั่งงานด้วยเสียง โดยใช้โมดูล speech_recognition ในการรับเสียงแปลงเป็นข้อความกับ gtts ในการสังเคราะห์เสียงและ pyglet ในการเล่นไฟล์เสียงครับ เนื่องจากผมจะทำระบบสั่งงานด้วยเสียง ผมมีความคิดว่า หากเราเขียนโปรแกรมแล้วพูด ให้โปรแกรมแปลงเป็นข้อความแล้วคัดลอกนำไปใช้งานได้เลย ผมเลยเขียนคำสั่งเพิ่มโมดูล pyperclip เข้าไปทำงานด้วยครับ

__author__ = 'วรรณพงษ์'
#License: BSD
import PyICU #ใช้ในการตัดคำ
import re
import webbrowser #ใช้ในการค้นหาโดยเปิด web browser แล้วค้นผ่านกูเกิล
from gtts import gTTS #โมดูลระบบสังเคราะห์เสียงพูด
import pyglet #โมดูลงานระบบเล่นไฟล์เสียง
import speech_recognition as sr #โมดูลรับเสียง
import time #ดึงเวลา
#ระบบตัดคำไทย
def isThai(chr):
    cVal = ord(chr)
    if(cVal >= 3584 and cVal <= 3711):
        return True
    return False
def warp(txt):
    bd = PyICU.BreakIterator.createWordInstance(PyICU.Locale("th"))
    bd.setText(txt)
    lastPos = bd.first()
    retTxt = ""
    try:
        while(1):
            currentPos = next(bd)
            retTxt += txt[lastPos:currentPos]
            #เฉพาะภาษาไทยเท่านั้น
            if(isThai(txt[currentPos-1])):
                if(currentPos < len(txt)):
                    if(isThai(txt[currentPos])):
                        #คั่นคำที่แบ่ง
                        retTxt += ','
            lastPos = currentPos
    except StopIteration:
        pass
        #retTxt = retTxt[:-1]
    return retTxt
#ระบบพูดและรับเสียง
class speak:
    def __init__(self,onetxt):
        self.onetxt = onetxt
        tts = gTTS(text=onetxt,lang='th') # text คือ ข้อความ lang คือ รหัสภาษา
        tts.save('hello-thai.mp3')
        #ระบบเล่นไฟล์เสียง
        music = pyglet.resource.media('hello-thai.mp3') #ดึงไฟล์เสียงเข้ามา
        music.play()
        def exit_callback(dt):
            return
        pyglet.clock.schedule_once(exit_callback,music.duration) #เช็คการทำงานระบบเล่นเสียง ไม่ให้เล่นซ้ำกัน
class text:
    def __init__(self,txtto):
            self.txtto = txtto
            #print(txtto)
            speak(txtto)
hello = text("สวัสดีค่ะ ฉันชื่อ นาดี ยินดีที่ได้รับใช้ค่ะ") #เสียงต้อนรับ
while True:
    r = sr.Recognizer() 
    r.energy_threshold = 4000
    with sr.Microphone() as source:
        audio = r.listen(source)
    try:
        say = r.recognize_google(audio,language = "th-TH") #กำหนดค่าภาษาเป็นภาษาไทย
    except LookupError:
        say = "ไม่สามารถรับเสียงได้ค่ะ"
    txtcom = [warp(say)] #ตัดคำจากข้อความที่แปลงมาจากเสียง
    #ส่วนคำสั่ง
    txt = (','.join(str(x) for x in txtcom))
    if txt.find("สวัสดี") == 0 or txt.find("ไง")==0 or txt.find("หวัดดี") == 0:
        text("สวัสดีค่ะ ฉันชื่อ นาดี ค่ะ")
    elif txt.find("ออก") == 0 & txt.find("ระบบ") == 0:
        break
    elif txt.find("ค้นหา") == 0 & txt.find("ว่า") == 0: #ถ้าค้นแล้วเจอคำเหล่านี้
        s = txt.split("ว่า")
        s = str(s)
        a = s[1]
        a = a.replace(',', '')
        text("ค้นหาคำว่า %s" % a)
        webbrowser.get('windows-default').open_new_tab('https://www.google.co.th/search?q=%s' % a)
    elif txt.find("เวลา") == 0 & txt.find("เท่า") == 0 or txt.find("ตอน") == 0 & txt.find("นี้") == 0:
        a = time.strftime("%H - %M:")
        a = a.replace('-', 'นาฬิกา')
        a = a.replace(':', 'นาที')
        text("ขณะนี้เป็นเวลา %sค่ะ" % a)
    elif txt.find("พิมพ์") == 0 & txt.find("ตาม") == 0:
        import pyperclip
        text("กรุณาพูดออกมาค่ะ")
        with sr.Microphone() as source:
            audio = r.listen(source)
        try:
            say = r.recognize(audio)
        except LookupError:
            say = "ไม่สามารถรับเสียงได้ค่ะ"
        txtcom = [warp(say)]
        txt = (','.join(str(x) for x in txtcom))
        pyperclip.copy(txt)
        text("ระบบได้คัดลอกที่พูดออกมาแล้ว")
    else:
        text("ขออภัยค่ะ ระบบไม่รู้จักคำสั่งนี้ค่ะ")

โค้ดข้างบนผมเขียนคำสั่งด้วยเสียงไว้ดังนี้

  • สวัสดี หรือ ไง หรือ หวัดดี จะพูดคำทักทายออกมาครับ
  • ค้นหาคำว่า.... ระบบจะค้นหาตามที่พูดครับ แล้วจะเปิด web browser แล้วค้นผ่านกูเกิล
  • ออกจากระบบ คือ ออกจากการทำงาน
  • ตอนนี้เวลาเท่าไร ระบบจะบอกเวลาออกมาครับ
  • พิมพ์ตาม ระบบจะรับเสียงแล้วคัดลอกข้อความที่พูดออกมาครับ
  • หากพูดอะไรที่ไม่รู้จักลงไป ระบบจะตอบกลับว่า "ขออภัยค่ะ ระบบไม่รู้จักคำสั่งนี้ค่ะ"

ปัญหาที่พบ

  • การรับเสียงยังทำได้ไม่ดีพอ ถ้าผู้พูดมีปัญหาด้านการออกเสียงภาษาไทย
  • การรับเสียงเป็นเวลานานมาก อาจจะทำให้โปรแกรมมีปัญหาได้ จึงไม่ควรเกิน 20 วินาทีและควรออกเสียงให้ชัดเจน อยู่ในที่เงียบ ไม่ควรพูดเร็ว และควรเช็คอุปกรณ์รับเสียง การเชื่อมต่อเครือข่ายอินเทอร์เน็ตให้เรียบร้อยครับ
  • คำสั่ง พิมพ์ตาม ยังต้องพัฒนาต่อ เนื่องจากผมไม่สามารถใช้คำสั่งนี้ได้ เพราะผมออกเสียงภาษาไทยไม่ค่อนข้างชัด และ ผมไม่มีคนทดสอบโปรแกรมด้วยครับ
  • การเปรียบเทียบค่า True หรือ False ค่อนข้างสับสน และสัญลักษณ์ดำเนินการทาง Boolean ควรศึกษาให้ดี
  • เสียงซ้อนกัน ระบบพูดเสียงซ้อนกัน ควรแบ่งวรรทัดคำสั่งให้ทำงานทีละอย่างให้เสร็จก่อนครับ

การนำไปพัฒนาต่อ

  • เพิ่มคำสั่งเข้าไปในโปรแกรม เช่น สั่งปิดเครื่อง สั่งเปิดโปรแกรมเล่นเพลง เป็นต้น
  • ปรับแต่งให้โต้ตอบกับมนุษย์ได้
  • พัฒนาระบบแปลภาษา โดยรับเสียงภาษาอังกฤษแล้วพูดออกมาเป็นภาษาไทย แปลภาษาด้วย Python
  • เช็คว่าเชื่อมต่อเครือข่ายอินเทอร์เน็ตไหม ถ้าไม่ ให้เปลี่ยนไปใช้ระบบสั่งงานด้วยการพิมพ์คำสั่ง
  • พัฒนา GUI เพื่อจะได้เรียกใช้งานได้สะดวกยิ่งขึ้น หรือไม่ ให้รันโค้ดโดยให้มองเห็นไม่เห็นหน้าต่างคอมมาไลน์
  • พัฒนา AI ที่โต้ตอบกับมนุษย์ได้

ลองนำไปศึกษาและประยุกต์ใช้กันนะครับ

สำหรับท่านใดนำโค้ดไป Fork หรือพัฒนาต่อ ขอความกรุณาท่านแบ่งปันโค้ดกลับมายังต้นฉบับด้วยนะครับ เพื่อจะได้เป็นประโยชน์ในการศึกษาภาษา Python ให้กับผู้สนใจต่อไปครับ

ขอบคุณครับ

1 thought on “ประยุกต์สร้างระบบสั่งงานด้วยเสียงใน python

  1. wannaphong

    หากนำ PyThaiNLP เข้ามาช่วยงานด้านประมวลผลภาษาธรรมชาติของภาษาไทยด้วย จะทำให้พัฒนาโปรแกรมได้ง่ายขึ้นนะครับ

    Reply

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *