Text To Speech ให้ไวใน 5 นาที

Supapong Sakulkoo
supapong
Published in
4 min readSep 26, 2020

สวัสดีครับ ในบทความนี้ผมจะมาแนะนำการแปลงข้อความเป็นเสียง (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 playsound
def speak(t):
tts = gTTS(text=t,lang='th',slow=False)
filename = "sound.mp3"
tts.save(filename)
playsound.playsound(filename)

คำอธิบาย

  1. บรรทัดที่ 1,2 จะเป็นการ import library ที่เราต้องใช้งานมา library playsound เอาไว้เล่นไฟล์เสียง mp3 และlibrary gtts ใช้สำหรับการแปลงข้อความเป็นเสียง (แค่แปลงข้อความเป็นเสียงแต่ยังไม่ได้เล่นเสียงออกมา)
  2. บรรทัดที่ 4 เป็นการสร้างฟังก์ชันชื่อ speak โดนรับ input 1 ตัว )คือ ตัวแปร t เอาไว้รับข้อความที่ผู้ใช้ใส่เข้ามาเพื่อจะแปลงเป็นเสียง แล้วเล่นเสียงนั้นออกมา ()
  3. บรรทัดที่ 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()

คำอธิบาย

  1. เป็นการ import pyttsx3 เข้ามาใช้งาน
  2. คำสั่ง pyttsx3.init()เป็นสร้าง object ของ pyttsx3 และเริ่มการทำงานของ Engine Text To Speech ใน Pyttsx3 จากนั้นเราสร้างตัวแปรอ้างอิงชื่อ engine แล้วอ้างอิงไปที่ object ตัวนี้ (เหมือนตั้งชื่อเล่นให้ pyttsx3.init() ว่า engine เพื่อเรียกใช้ง่ายๆ)
  3. engine.say(ข้อความ) เป็นการสั่งให้ Engine ของ Pyttsx3 แปลงข้อความภาษาอังกฤษ (โดย Default) เป็นเสียงพูดภาษาอังกฤษ
  4. 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

  1. เราจะ import webbrowser มา โดย webbrowser เป็น library ไว้ใช้สำหรับเปิด website โดยใส่
  2. สร้างฟังก์ชัน speak รับ parameter 2 ตัว ได้แก่ text = ข้อความที่ต้องการแปลงเป็นเสียง , charset = รหัสภาษา
  3. Format การเรียกใช้คร่าวๆเป็นแบบนี้
  4. ทำได้ทั้งภาษาไทย ภาษาอังกฤษ อื่นๆอีกมากมาย ถ้าเรารู้รหัสภาษา
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") #เรียกใช้ฟังก์ชัน

สรุป

  1. Pyttsx3 เป็น engine ในตัวเอง เวลาใช้งานไม่ต้องต่ออินเทอร์เน็ต
  2. gtts (Google text to Speech) เป็น api เวลาใช้งานต้องต่ออินเทอร์เน็ต
  3. Pyttsx3 ไม่มีภาษาไทย แต่ gtts มีภาษาไทย และภาษาอื่นอีกมากมาย
  4. Pyttsx3 ไม่ต้องพึ่ง library เพิ่มเติมในการเล่นเสียงอย่าง playsound แต่ gtts ต้องพึ่ง
  5. เราสามารถทำ text to speech ผ่าน url ได้

Follow me on my website:

https://supapongai.com/

References :

--

--

Supapong Sakulkoo
supapong
0 Followers
Editor for

Programmer , DataScientist and Mathematician