Open Source Thai Text-to-speech library in Python
Google Colab | Docs | Notebooks
License: Apache-2.0 License
Install by pip:
pip install pythaittsfrom pythaitts import TTS
tts = TTS()
file = tts.tts("ภาษาไทย ง่าย มาก มาก", filename="cat.wav") # It will get wav file path.
wave = tts.tts("ภาษาไทย ง่าย มาก มาก",return_type="waveform") # It will get waveform.PyThaiTTS supports multiple TTS models. You can specify which model to use:
from pythaitts import TTS
# Use FastThaiG2P (default) (default voice: thai_som)
# FastThaiG2P Sample Rate is 24000 Hz
tts = TTS(pretrained="fastthaig2p")
file = tts.tts("สวัสดีครับ", speaker_idx="thai_som", filename="output.wav")
# Use Lunarlist ONNX
# Sample Rate is 22050 Hz
tts = TTS(pretrained="lunarlist_onnx")
file = tts.tts("ภาษาไทย ง่าย มาก", filename="output.wav")
# Use VachanaTTS (default voices: th_f_1, th_m_1, th_f_2, th_m_2)
# Sample Rate is 22050 Hz
tts = TTS(pretrained="vachana")
file = tts.tts("สวัสดีครับ", speaker_idx="th_f_1", filename="output.wav")
# Use KhanomTan
# Sample Rate is 16000 Hz
tts = TTS(pretrained="khanomtan")
file = tts.tts("ภาษาไทย", speaker_idx="Linda", filename="output.wav")PyThaiTTS supports low-latency, real-time streaming speech synthesis with FastThaiG2P, making it ideal for conversational voice agents and LLM streaming:
Synthesize chunk-by-chunk in real time:
from pythaitts import TTS
tts = TTS(pretrained="fastthaig2p")
# Stream audio chunks as 24kHz float32 NumPy arrays
for audio_chunk in tts.stream("สวัสดีครับ ยินดีต้อนรับสู่ระบบเรียลไทม์ทีทีเอส"):
print(f"Audio chunk shape: {audio_chunk.shape}")
# Stream raw 16-bit PCM bytes (for WebSockets or PyAudio)
for pcm_bytes in tts.stream("สวัสดีครับ", return_type="bytes"):
# send over websocket or write to audio stream
passFeed tokens directly from an LLM or generator into tts.stream():
from pythaitts import TTS
tts = TTS()
def token_stream():
tokens = ["สวัสดี", "ครับ", " ", "นี่", "คือ", "การ", "สตรีม", "มิ่ง"]
for tok in tokens:
yield tok
for audio_chunk in tts.stream(token_stream()):
# Process or play chunk with low latency
passYou can use FastThaiG2P as an engine with KoljaB/RealtimeTTS:
pip install pythaitts[realtime]from RealtimeTTS import TextToAudioStream
from pythaitts.realtime import FastThaiG2PEngine
engine = FastThaiG2PEngine()
stream = TextToAudioStream(engine)
stream.feed("สวัสดีครับ วันนี้อากาศดีมาก")
stream.play()FastThaiG2P automatically supports Thai-English code-switching text by converting English words into English IPA and adapting them into Thai IPA phonemes (Thai-style English pronunciation), while spelling out English acronyms and single letters in Thai (e.g., SMS -> เอสเอ็มเอส, แผน A -> แผน เอ):
from pythaitts import TTS
tts = TTS(pretrained="fastthaig2p")
file = tts.tts("วันนี้เรามี meeting เรื่อง project ใหม่", filename="code_switch.wav")You can also use the English-to-Thai-IPA G2P utilities directly:
from pythaitts import EnglishG2P, en_g2p, en_to_ipa, en_ipa_to_thai_ipa
# Convert English word -> English IPA -> Thai IPA
print(en_to_ipa("computer")) # Output: /kəmˈpjuː.tɚ/
print(en_ipa_to_thai_ipa("/kəmˈpjuː.tɚ/")) # Output: /kʰɔm˧.pʰiw˧.tɤː˥˩/
print(en_g2p("computer")) # Output: /kʰɔm˧.pʰiw˧.tɤː˥˩/
# Or use the EnglishG2P class
eng = EnglishG2P()
print(eng("project")) # Output: /proː˧.t͡ɕek̚˨˩/PyThaiTTS includes automatic text preprocessing to improve TTS quality:
- Number to Thai text conversion: Converts digits (e.g., "123") to Thai text (e.g., "หนึ่งร้อยยี่สิบสาม")
- Mai yamok (ๆ) expansion: Expands the Thai repetition character (e.g., "ดีๆ" becomes "ดีดี")
Preprocessing is enabled by default:
from pythaitts import TTS
tts = TTS()
# Automatic preprocessing: "มี 5 คนๆ" becomes "มี ห้า คนคน"
file = tts.tts("มี 5 คนๆ", filename="output.wav")You can disable preprocessing if needed:
file = tts.tts("มี 5 คนๆ", preprocess=False, filename="output.wav")You can also use preprocessing functions directly:
from pythaitts import num_to_thai, expand_maiyamok, preprocess_text
# Convert numbers to Thai text
print(num_to_thai("123")) # Output: หนึ่งร้อยยี่สิบสาม
# Expand mai yamok
print(expand_maiyamok("ดีๆ")) # Output: ดีดี
# Full preprocessing
print(preprocess_text("มี 5 คนๆ")) # Output: มี ห้า คนคนYou can see more at https://pythainlp.github.io/PyThaiTTS/.