Text To Speech ให้ไวใน 5 นาที
สวัสดีครับ ในบทความนี้ผมจะมาแนะนำการแปลงข้อความเป็นเสียง (Text To Speech) โดยในบทความนี้จะใช้ภาษา Python เป็นสื่อกลางในการทำนะครับ โดย library ที่จะมาแนะนำมี ดังนี้
1. Google Text To Speech
เป็น api ของทาง google ที่เอาไว้แปลงข้อความเป็นเสียง (ต้องต่ออินเทอร์เน็ต)
ข้อดี : สามารถแปลงข้อความภาษาไทยเป็นเสียงไทยได้
ข้อเสีย : เนื่องจาก library นี้จะไปเรียก api ของทาง google มา ทำให้ต้องเชื่อมต่ออินเทอร์เน็ตอยู่ตลอดเวลาขณะกำลังใช้งาน
วิธีติดตั้ง : เปิด Command Prompt แล้วพิมพ์คำสั่งด้านล่างจากนั้นกด Enter
pip install gTTS
เพิ่มเติม : ให้ติดตั้ง library สำหรับเอาไว้เล่นไฟล์เสียง mp3 ด้วย
pip install playsound
จากนั้นขั้นตอนต่อไปเราจะสร้างฟังก์ชันสำหรับการแปลงข้อความเป็นเสียง (Text To Speech บางคนเรียกย่อๆว่า tts) จากนั้น save เก็บเป็นไฟล์ mp3 แล้วก็เล่นไฟล์เสียง mp3 นั้นออกมา ตามโค้ดด้านล่าง
1.1 Code ฟังก์ชัน Text To Speech
from gtts import gTTS
import playsounddef speak(t):
tts = gTTS(text=t,lang='th',slow=False)
filename = "sound.mp3"
tts.save(filename)
playsound.playsound(filename)
คำอธิบาย
- บรรทัดที่ 1,2 จะเป็นการ import library ที่เราต้องใช้งานมา library playsound เอาไว้เล่นไฟล์เสียง mp3 และlibrary gtts ใช้สำหรับการแปลงข้อความเป็นเสียง (แค่แปลงข้อความเป็นเสียงแต่ยังไม่ได้เล่นเสียงออกมา)
- บรรทัดที่ 4 เป็นการสร้างฟังก์ชันชื่อ speak โดนรับ input 1 ตัว )คือ ตัวแปร t เอาไว้รับข้อความที่ผู้ใช้ใส่เข้ามาเพื่อจะแปลงเป็นเสียง แล้วเล่นเสียงนั้นออกมา ()
- บรรทัดที่ 5 gTTS(text=t,lang=’th’,slow=False) จะเป็นการแปลงข้อความที่ผู้ใช้ใส่เข้ามาในฟังก์ชันให้เป็นออบเจ๊คเสียง (gTTS object)โดยเราจะต้องระบุค่าต่างๆในฟังก์ชัน ดังนี้
- text=t หมายถึง ระบุข้อความที่ต้องการแปลงจากข้อความเป็นเสียงพูดให้เป็น input ที่รับมาจากฟังก์ชัน ซึ่งก็คือตัวแปร t ที่เรากำหนดไว้ตอนแรก
- lang = ‘th’ หมายถึง กำหนดภาษาของผลลัพธ์เสียงพูดว่าให้เป็นภาษาไทย ควรกำหนดภาษาให้ตรงกับข้อความที่รับเข้าไปในฟังก์ชัน สามารถเปลี่ยนภาษาอื่นได้ เช่น lang=’en’ (เปลี่ยนเป็นภาษาอังกฤษ) , etc.
- slow = False หมายถึง บอกให้ระบบไม่มีการ Delay
4. บรรทัดที่ 6 ตัวแปร filename เอาไว้เก็บชื่อ ไฟล์เสียง mp3 ที่เป็น output ที่ได้จากการทำแปลง ข้อความเป็นเสียงกรณีนี้ตั้งชื่อให้เป็น sound.mp3
5. บรรทัดที่ 7 tts.save(filename) คือ การเซฟไฟล์ output เสียงที่ได้จากการแปลงจากข้อความเป็นเสียง ให้เป็นชื่อ sound.mp3 (ก็คือค่าที่เก็บไว้ในตัวแปร filename)
6.บรรทัดที่ 8 playsound.playsound(‘ชื่อไฟล์เสียงที่จะเล่น’) เป็นการเล่นไฟล์เสียง mp3 ที่เราเซฟมา ในกรณีนี้เราใส่ตัวแปร filename เข้าไป นั่นหมายความว่าตัว library จะไปเล่นไฟล์เสียงชื่อ sound.mp3 ซึ่งเป็นค่าที่เก็บไว้ในตัวแปร filename นั่นเอง
1.2 Code การเรียกใช้.
if __name__ == '__main__':
speak("สวัสดี กินข้าวหรือยัง")
ก็จะได้เสียงพูดว่า “สวัสดี กินข้าวหรือยัง” ตามต้องการ
Special : การแก้ ValueError : Unable to find token
ถ้าใครเจอปัญหา error แบบนี้ตามด้านล่าง error นี้เกิดจาก google หา token ของตัวแปลภาษาของเราไม่เจอ ให้ทำการติดตั้ง gtts-token เพิ่มก็จะหาย
วิธีแก้ : ให้ทำการติดตั้ง library ตัวนี้เพิ่ม ตามด้านล่าง ก็จะแก้ได้
pip install gTTS-token
Note : ถ้ายังเป็นอยู่อาจจะเป็นเพราะปัญหาด้านการจำกัดจำนวนครั้งในการ request ของ google อาจเพราะเราเรียกใช้ google text to speech api มากไป
แหล่งที่มา : https://pypi.org/project/gTTS-token/
2. Pyttsx3
Pyttsx3 จะเป็น library ที่เป็น engine ในตัวเอง คือ ไม่ต้องไปเรียก api ที่ไหนมาใช้ นั่นหมายความว่า มันสามารถทำงานได้โดยไม่ต้องมีอินเทอร์เน็ต
ข้อดี : ไม่ต้องต่ออินเทอร์เน็ตเวลาใช้งาน
ข้อเสีย : ไม่มีภาษาไทย
วิธีติดตั้ง : เปิด Command Prompt แล้วพิมพ์คำสั่งด้านล่างจากนั้นกด Enter
pip install pyttsx3
2.1 การเรียกใช้งานเบื้องต้น
import pyttsx3if __name__ == '__main__':
engine = pyttsx3.init()
engine.say("Hello I want to eat pizza")
engine.runAndWait()
คำอธิบาย
- เป็นการ import pyttsx3 เข้ามาใช้งาน
- คำสั่ง pyttsx3.init()เป็นสร้าง object ของ pyttsx3 และเริ่มการทำงานของ Engine Text To Speech ใน Pyttsx3 จากนั้นเราสร้างตัวแปรอ้างอิงชื่อ engine แล้วอ้างอิงไปที่ object ตัวนี้ (เหมือนตั้งชื่อเล่นให้ pyttsx3.init() ว่า engine เพื่อเรียกใช้ง่ายๆ)
- engine.say(ข้อความ) เป็นการสั่งให้ Engine ของ Pyttsx3 แปลงข้อความภาษาอังกฤษ (โดย Default) เป็นเสียงพูดภาษาอังกฤษ
- engine.runAndWait() คือ สั่งให้เล่นเสียงนั้นแล้วรอการทำงานต่อไป
Note : จะเห็นได้ว่า Pyttsx3 ไม่จำเป็นต้องพึ่ง library อย่าง playsound เพื่อใช้เล่นเสียงที่เป็น output จากการแปลงข้อความเป็นเสียง (Text To Speech)
2.2 เราสามารถปรับแต่งเพิ่มเติมได้หลายอย่าง ยกตัวอย่างเช่น เปลี่ยนจากเสียงคนพูดจาก ผู้ชายเป็นผู้หญิงได้
Code การเปลี่ยนเป็นเสียงผู้หญิง (เสียงผู้หญิง voice index = 1 )
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id)
Code การเปลี่ยนเป็นเสียงผู้ชาย (เสียงผู้หญิง voice index = 0)
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[0].id)
คำอธิบาย :
- ตัวแปร voices สร้างขึ้นมาเพื่อรับค่า property เสียงทั้งหมดของ engine
- engine.setProperty(‘คุณสมบัติที่จะเซต’,คุณสมบัติใหม่) คำสั่งนี้เป็นการเซตคุณสมบัติ (Property) ใหม่ให้กับ engine โดยในที่นี้เราจะเซต propery เสียง ก็จะใส่เป็น ‘voice’ จากนั้น input ตัวที่ 2 ก็คือ property ที่เราจะเซตให้นั่นก็คือเสียงผู้หญิง voices[1].id หมายถึง เสียงผู้หญิง
- voices[1].id คือ เสียงผู้หญิง
- voices[0].id คือ เสียงผู้ชาย
2.3 เราสามารถปรับความดังของเสียงโดยใช้ propert = ‘volume’ ได้
engine.setProperty('volume',1.0)
คำอธิบาย : เหมือนเดิมเราก็จะเซต property ใหม่ผ่านคำสั่ง engine.setProperty โดยคราวนี้
- input ตัวแรก เราจะใส่เป็น ‘volume’ เพราะเราต้องการเซตคุณสมบัติ volume ใหม่ จากนั้น
- input ตัวที่ 2 ใส่เป็นvolume (ความดังเของสียง) เลขได้แค่ในในช่วง 0–1
2.4 เราสามารถ save ไฟล์เสียงที่เราได้จากการแปลงข้อความเป็นเสียงได้
โดยใช้ฟังก์ชัน save_to_file(‘ข้อความที่จะแปลง’,’ชื่อไฟล์ mp3’)
engine.save_to_file('Hello World', 'test.mp3')
ภาพรวมการทำงานทั้งหมด:
import pyttsx3if __name__ == '__main__':
engine = pyttsx3.init()
engine.setProperty('volume',0.5)
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id)
engine.say("Hello I want to eat pizza")
engine.save_to_file('Hello I want to eat pizza', 'กินพิซซ่า.mp3')
engine.runAndWait()
3. การใช้ Google Text To Speech ผ่าน URL
การใช้ google text to speech อาจทำได้โดยการเรียกใช้ผ่าน url เปิดมาจะเป็น mp3 เล่นบนเว็บได้เลย โดยมีวิธีใช้งาน ดังนี้
https://translate.google.com.vn/translate_tts?ie=UTF-8&q=ข้อความที่ต้องการใส่&tl=รหัสภาษา&client=tw-ob
วิธีมช้งานก็ง่ายๆเปิดใส่ข้อความลงไปในส่วนของ ข้อความที่ต้องการใส่ และใส่รหัสภาษา ลงไปในตำแหน่งที่เป็นตัวหนาของลิงค์ด้านบน เว็บ
Note : tl ย่อมาจาก translate language
ตัวอย่างรหัสภาษา : en = ภาษาอังกฤษ , th = ภาษาไทย
ตัวอย่างการเรียกใช้แบบภาษาไทย
https://translate.google.com.vn/translate_tts?ie=UTF-8&q=บ้านรวยอยากกินหูฉลาม&tl=th&client=tw-ob
อธิบาย : ในเคสนี้เราจะแปลงคำว่า “บ้านรวยอยากกินหูฉลาม” เป็นเสียงพูดที่รหัสภาษาเป็น th ก็คือภาษาไทย แล้วเราเอาลิงค์ไปเปิดก็จะเป็นเสียงพูดภาษาไทย
ตัวอย่างการเรียกใช้แบบภาษาอังกฤษ
https://translate.google.com.vn/translate_tts?ie=UTF-8&q=NoGameNoLife&tl=en&client=tw-ob
อธิบาย : ในเคสนี้เราจะแปลงคำว่า “NoGameNoLife” เป็นเสียงพูดที่รหัสภาษาเป็น en ก็คือภาษาอังกฤษ แล้วเราเอาลิงค์ไปเปิดก็จะเป็นเสียงพูดภาษาอังกฤษได้
Special : การประยุกต์ใช้กับ Code ภาษา Python
- เราจะ import webbrowser มา โดย webbrowser เป็น library ไว้ใช้สำหรับเปิด website โดยใส่
- สร้างฟังก์ชัน speak รับ parameter 2 ตัว ได้แก่ text = ข้อความที่ต้องการแปลงเป็นเสียง , charset = รหัสภาษา
- Format การเรียกใช้คร่าวๆเป็นแบบนี้
- ทำได้ทั้งภาษาไทย ภาษาอังกฤษ อื่นๆอีกมากมาย ถ้าเรารู้รหัสภาษา
import webbrowser
webbrowser.open(r"https://translate.google.com.vn/translate_tts?ie=UTF-8&q=ข้อความที่ต้องการใส่&tl=รหัสภาษา&client=tw-ob")
ตัวอย่างการใช้งาน
import webbrowser
def speak(text,charset):
webbrowser.open(r"https://translate.google.com.vn/translate_tts?ie=UTF-8&q={}&tl={}&client=tw-ob".format(text,charset))speak("No Game No Life","en") #เรียกใช้ฟังก์ชัน
สรุป
- Pyttsx3 เป็น engine ในตัวเอง เวลาใช้งานไม่ต้องต่ออินเทอร์เน็ต
- gtts (Google text to Speech) เป็น api เวลาใช้งานต้องต่ออินเทอร์เน็ต
- Pyttsx3 ไม่มีภาษาไทย แต่ gtts มีภาษาไทย และภาษาอื่นอีกมากมาย
- Pyttsx3 ไม่ต้องพึ่ง library เพิ่มเติมในการเล่นเสียงอย่าง playsound แต่ gtts ต้องพึ่ง
- เราสามารถทำ text to speech ผ่าน url ได้