Metadata-Version: 2.4
Name: PyThaiTTS
Version: 1.0.0
Summary: Open Source Thai Text-to-speech library in Python
Home-page: https://github.com/pythainlp/pythaitts
Author: Wannaphong
Author-email: wannaphong@yahoo.com
License: Apache Software License 2.0
Project-URL: Documentation, https://github.com/pythainlp/pythaitts
Project-URL: Source, https://github.com/pythainlp/pythaitts
Project-URL: Bug Reports, https://github.com/pythainlp/pythaitts/issues
Keywords: Thai,NLP,natural language processing,text analytics,text processing,localization,computational linguistics,text-to-speech
Classifier: Development Status :: 3 - Alpha
Classifier: Programming Language :: Python :: 3
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Text Processing
Classifier: Topic :: Text Processing :: General
Classifier: Topic :: Text Processing :: Linguistic
Requires-Python: >=3.6
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: huggingface_hub
Requires-Dist: numpy>=1.22
Requires-Dist: onnxruntime
Requires-Dist: soundfile
Requires-Dist: pythainlp
Provides-Extra: vachanatts
Requires-Dist: vachanatts; extra == "vachanatts"
Provides-Extra: vachana
Requires-Dist: vachanatts; extra == "vachana"
Provides-Extra: realtime
Requires-Dist: RealtimeTTS; extra == "realtime"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: keywords
Dynamic: license
Dynamic: license-file
Dynamic: project-url
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

# PyThaiTTS
Open Source Thai Text-to-speech library in Python

[Google Colab](https://colab.research.google.com/github/PyThaiNLP/PyThaiTTS/blob/main/notebook/use_fastthaig2p.ipynb) | [Docs](https://pythainlp.github.io/PyThaiTTS/) | [Notebooks](https://github.com/PyThaiNLP/PyThaiTTS/tree/main/notebook)
<a href="https://pepy.tech/project/pythaitts"><img alt="Download" src="https://pepy.tech/badge/pythaitts/month"/></a>

License: [Apache-2.0 License](https://github.com/PyThaiNLP/pythaitts/blob/main/LICENSE)

## Install

Install by pip:

```sh
pip install pythaitts
```

## Usage

### Basic Usage

```python
from 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.
```

### Using Different TTS Models

PyThaiTTS supports multiple TTS models. You can specify which model to use:

```python
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 MakHamTTS Paradee (standalone, single-voice 8MB quantized INT8 ONNX model, offline without download)
# MakHamTTS Paradee Sample Rate is 24000 Hz
tts = TTS(pretrained="makham_paradee")
file = tts.tts("สวัสดีค่ะ", filename="output.wav")

# Use MakHamTTS (Kokoro-82M Thai base model, voices: newvoice_female, newvoice_male)
# MakHamTTS Sample Rate is 24000 Hz
tts = TTS(pretrained="makham")
file = tts.tts("สวัสดีค่ะ", speaker_idx="newvoice_female", 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")
```

### Real-time / Streaming TTS (FastThaiG2P)

PyThaiTTS supports low-latency, real-time streaming speech synthesis with FastThaiG2P, making it ideal for conversational voice agents and LLM streaming:

#### 1. Streaming Audio from Text

Synthesize chunk-by-chunk in real time:

```python
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
    pass
```

#### 2. Streaming from an LLM Token Stream

Feed tokens directly from an LLM or generator into `tts.stream()`:

```python
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
    pass
```

#### 3. Integration with the RealtimeTTS Library

You can use FastThaiG2P as an engine with [KoljaB/RealtimeTTS](https://github.com/KoljaB/RealtimeTTS):

```sh
pip install pythaitts[realtime]
```

```python
from RealtimeTTS import TextToAudioStream
from pythaitts.realtime import FastThaiG2PEngine

engine = FastThaiG2PEngine()
stream = TextToAudioStream(engine)
stream.feed("สวัสดีครับ วันนี้อากาศดีมาก")
stream.play()
```


### Thai-English Code-Switching (FastThaiG2P)

`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` -> `แผน เอ`):

```python
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:

```python
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̚˨˩/
```


### Custom Word Pronunciation Dictionary

PyThaiTTS supports custom word dictionaries to define custom Thai pronunciation (as Thai text reading or IPA phonemes) for specific words, acronyms, or names.

Dictionaries can be passed as Python dicts, JSON files, or delimited text files (TSV, CSV, or colon-separated):

```python
from pythaitts import TTS

# 1. Provide custom Thai pronunciation (hyphenated or plain text)
custom_dict = {
    "เพชรบุรี": "เพ็ด-ชะ-บุ-รี",
    "สถิติ": "สะ-ถิ-ติ",
    "ChatGPT": "แชตจีพีที",
}

tts = TTS(custom_dict=custom_dict)
tts.tts("ยินดีต้อนรับสู่เพชรบุรี", filename="custom.wav")

# 2. Or pass per-call or with IPA phonemes directly
tts.tts(
    "ผมไปเพชรบุรี",
    custom_dict={"เพชรบุรี": "/pʰet̚˨˩.t͡ɕʰa˦˥.bu˨˩.riː˧/"},
    filename="ipa.wav",
)

# 3. Add or update custom words dynamically
tts.add_custom_dict({"ก.พ.": "กอ-พอ"})

# 4. Load from a JSON or TSV file
tts.set_custom_dict("my_words.json")
```

You can also use custom dictionaries with G2P directly:

```python
from pythaitts.pretrained.fastthaig2p import G2P

g2p = G2P(custom_dict={"เพชรบุรี": "เพ็ด-ชะ-บุ-รี"})
print(g2p.convert("ผมไปเพชรบุรี"))
```


### Text Preprocessing

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:

```python
from pythaitts import TTS

tts = TTS()
# Automatic preprocessing: "มี 5 คนๆ" becomes "มี ห้า คนคน"
file = tts.tts("มี 5 คนๆ", filename="output.wav")
```

You can disable preprocessing if needed:

```python
file = tts.tts("มี 5 คนๆ", preprocess=False, filename="output.wav")
```

You can also use preprocessing functions directly:

```python
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/](https://pythainlp.github.io/PyThaiTTS/).
