🗣 ️ Thai Text-to-Speech V3 (Kaitom Voice)
⚠️ Alpha Version Notice: This API is currently in alpha testing. The service may experience intermittent availability. For production use, please use TTS V2 (Stable) instead. V3 is FREE during alpha testing.
Welcome to Thai Text-to-Speech API V3 featuring the all-new Kaitom Voice (น้องไข่ต้ม เวอร์ชั่น 3). This next-generation version delivers significantly improved speech naturalness with advanced text normalization, IPA pronunciation support, and automatic Thai-English language handling.
What's New in V3
- Smart Text Normalization - Automatically handles numbers, dates, currency, and special characters
- IPA Pronunciation Support - Use IPA notation for precise pronunciation control
- Automatic Language Detection - No need to specify language mode, V3 handles Thai-English mixing automatically
- Extended Character Limit - Support for up to 10,000 characters per request
- Simplified JSON API - Clean JSON request body instead of form data
- High-Quality Audio - 44.1 kHz WAV output for professional applications
Try Demo
Try Our AI Demo
Login or create a free account to use this AI service demo and explore our powerful APIs.
Get 100 Free Credits (IC) when you sign up!
Offer ends December 31, 2025
V3 automatically handles Thai-English mixed text. No language mode selection needed.
Getting Started
-
Prerequisites
- An API key from iApp Technology
- Text input in Thai and/or English
- Maximum text length: 10,000 characters
- Supported output format: WAV (44.1 kHz)
-
Quick Start
- Fast processing with high-quality output
- Improved natural speech generation
- Automatic Thai-English mixed text support
- No language mode selection required
-
Key Features
- Next-generation speech synthesis engine
- Smart text normalization (numbers, dates, currency)
- IPA pronunciation support for precise control
- Automatic Thai-English language handling
- Emoji and special character support
- Extended 10,000 character limit
-
Security & Compliance
- GDPR and PDPA compliant
- No data retention after processing
Please visit API Key Management page to view your existing API key or request a new one.
- V2: Looking for the POST-based API with language mode selection? See Text-to-Speech V2
- V1: Looking for the legacy GET-based API with Kaitom V1 or Cee voice? See Text-to-Speech V1
API Endpoint
| Endpoint | Method | Content-Type | Description | Cost |
|---|---|---|---|---|
/v3/store/audio/tts/generate | POST | application/json | Thai TTS with Kaitom Voice V3 | 1 IC per 400 characters |
Quick Example
Sample Request
curl -X POST 'https://api.iapp.co.th/v3/store/audio/tts/generate' \
--header 'apikey: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"text": "สวัสดีครับ น้องไข่ต้ม เวอร์ชั่น 3"}' \
--output 'output.wav'
Sample Response
Audio file output (WAV format, 44.1 kHz).
API Reference
Text-to-Speech V3 Endpoint
- Endpoint:
POSThttps://api.iapp.co.th/v3/store/audio/tts/generate - Content-Type:
application/json - Required Parameters:
apikey: Your API key (header)text: Text to convert to speech (JSON body)
Request Body
{
"text": "Your Thai or mixed Thai-English text here"
}
Response
- Content-Type:
audio/wav - Sample Rate: 44.1 kHz
- Format: WAV audio file
Code Examples
Python
import requests
import json
url = "https://api.iapp.co.th/v3/store/audio/tts/generate"
headers = {
"apikey": "YOUR_API_KEY",
"Content-Type": "application/json"
}
data = {
"text": "สวัสดีครับ น้องไข่ต้ม เวอร์ชั่น 3 มาพร้อมเสียงที่เป็นธรรมชาติมากขึ้น"
}
response = requests.post(url, headers=headers, json=data)
with open("output.wav", "wb") as f:
f.write(response.content)
print("Audio saved to output.wav")
JavaScript (Node.js)
const axios = require("axios")
const fs = require("fs")
const url = "https://api.iapp.co.th/v3/store/audio/tts/generate"
const config = {
headers: {
"apikey": "YOUR_API_KEY",
"Content-Type": "application/json"
},
responseType: "arraybuffer"
}
const data = {
text: "สวัสดีครับ น้องไข่ต้ม เวอร์ชั่น 3 มาพร้อมเสียงที่เป็นธรรมชาติมากขึ้น"
}
axios.post(url, data, config)
.then((response) => {
fs.writeFileSync("output.wav", response.data)
console.log("Audio saved to output.wav")
})
.catch((error) => console.error(error))
JavaScript (Fetch API)
const response = await fetch("https://api.iapp.co.th/v3/store/audio/tts/generate", {
method: "POST",
headers: {
"apikey": "YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
text: "สวัสดีครับ น้องไข่ต้ม เวอร์ชั่น 3"
})
});
const blob = await response.blob();
// Use blob for audio playback or download
PHP
<?php
$curl = curl_init();
$data = json_encode([
"text" => "สวัสดีครับ น้องไข่ต้ม เวอร์ชั่น 3 มาพร้อมเสียงที่เป็นธรรมชาติมากขึ้น"
]);
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.iapp.co.th/v3/store/audio/tts/generate',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => array(
'apikey: YOUR_API_KEY',
'Content-Type: application/json'
),
));
$response = curl_exec($curl);
curl_close($curl);
file_put_contents("output.wav", $response);
echo "Audio saved to output.wav";
?>
Swift
import Foundation
let url = URL(string: "https://api.iapp.co.th/v3/store/audio/tts/generate")!
var request = URLRequest(url: url, timeoutInterval: Double.infinity)
request.addValue("YOUR_API_KEY", forHTTPHeaderField: "apikey")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
let body: [String: Any] = [
"text": "สวัสดีครับ น้องไข่ต้ม เวอร์ชั่น 3"
]
request.httpBody = try? JSONSerialization.data(withJSONObject: body)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else {
print(String(describing: error))
return
}
// Save or play audio data
try? data.write(to: URL(fileURLWithPath: "output.wav"))
print("Audio saved to output.wav")
}
task.resume()
Kotlin
val client = OkHttpClient()
val mediaType = "application/json".toMediaType()
val body = """{"text": "สวัสดีครับ น้องไข่ต้ม เวอร์ชั่น 3"}""".toRequestBody(mediaType)
val request = Request.Builder()
.url("https://api.iapp.co.th/v3/store/audio/tts/generate")
.post(body)
.addHeader("apikey", "YOUR_API_KEY")
.addHeader("Content-Type", "application/json")
.build()
val response = client.newCall(request).execute()
// Handle audio response
Java
OkHttpClient client = new OkHttpClient().newBuilder().build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType,
"{\"text\": \"สวัสดีครับ น้องไข่ต้ม เวอร์ชั่น 3\"}");
Request request = new Request.Builder()
.url("https://api.iapp.co.th/v3/store/audio/tts/generate")
.method("POST", body)
.addHeader("apikey", "YOUR_API_KEY")
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
// Handle audio response
Dart
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'dart:io';
void main() async {
var url = Uri.parse('https://api.iapp.co.th/v3/store/audio/tts/generate');
var headers = {
'apikey': 'YOUR_API_KEY',
'Content-Type': 'application/json'
};
var body = jsonEncode({
'text': 'สวัสดีครับ น้องไข่ต้ม เวอร์ชั่น 3'
});
var response = await http.post(url, headers: headers, body: body);
if (response.statusCode == 200) {
File('output.wav').writeAsBytesSync(response.bodyBytes);
print('Audio saved to output.wav');
} else {
print('Error: ${response.statusCode}');
}
}
Go
package main
import (
"bytes"
"encoding/json"
"io"
"net/http"
"os"
)
func main() {
url := "https://api.iapp.co.th/v3/store/audio/tts/generate"
data := map[string]string{
"text": "สวัสดีครับ น้องไข่ต้ม เวอร์ชั่น 3",
}
jsonData, _ := json.Marshal(data)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req.Header.Set("apikey", "YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
audioData, _ := io.ReadAll(resp.Body)
os.WriteFile("output.wav", audioData, 0644)
}
Features & Capabilities
Smart Text Normalization
V3 automatically normalizes various text elements:
| Type | Input | Output (spoken) |
|---|---|---|
| Numbers | 1,234.56 | "หนึ่งพันสองร้อยสามสิบสี่จุดห้าหก" |
| Dates | 27/01/2569 | "วันที่ยี่สิบเจ็ดมกราค มสองพันห้าร้อยหกสิบเก้า" |
| Currency | ฿1,500 | "หนึ่งพันห้าร้อยบาท" |
| Time | 14:30 | "สิบสี่นาฬิกาสามสิบนาที" |
| Percentages | 25% | "ยี่สิบห้าเปอร์เซ็นต์" |
IPA Pronunciation Support
Use IPA (International Phonetic Alphabet) notation for precise pronunciation control:
พูด {IPA: kʰun} ให้ถูกต้อง
Automatic Language Handling
V3 automatically detects and handles mixed Thai-English text without requiring language mode selection:
Hello and Welcome! ยินดีต้อนรับสู่ iApp Technology
Error Codes
| Status Code | Description | Solution |
|---|---|---|
| 400 | Bad Request - Invalid JSON format | Check JSON syntax |
| 402 | Insufficient Credits | Add credits |
| 413 | Payload Too Large | Text exceeds 10,000 characters |
| 429 | Rate Limit Exceeded | Check API key limits |
| 503 | Service Unavailable | Temporary issue, retry later |
Migration Guide
From V2 to V3
| Aspect | V2 | V3 |
|---|---|---|
| Content-Type | multipart/form-data | application/json |
| Request Body | Form data | JSON body |
| Language Mode | Required (TH / TH_MIX_EN) | Auto-detected |
| Max Characters | No limit | 10,000 |
| Audio Quality | Standard WAV | 44.1 kHz WAV |
| Endpoint | /v3/store/speech/text-to-speech/kaitom | /v3/store/audio/tts/generate |
V2 Request (Old):
curl -X POST 'https://api.iapp.co.th/v3/store/speech/text-to-speech/kaitom' \
--header 'apikey: YOUR_API_KEY' \
--form 'text="สวัสดีครับ"' \
--form 'language="TH"'
V3 Request (New):
curl -X POST 'https://api.iapp.co.th/v3/store/audio/tts/generate' \
--header 'apikey: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"text": "สวัสดีครับ"}'
From V1 to V3
| Aspect | V1 | V3 |
|---|---|---|
| Method | GET | POST |
| Request | Query parameters | JSON body |
| Voice Options | Kaitom V1, Cee | Kaitom V3 |
| Output Format | MP3/WAV | WAV (44.1 kHz) |
| Endpoint | /v3/store/speech/text-to-speech/kaitom/v1 | /v3/store/audio/tts/generate |
Limitations
- Thai and English language support only
- Single voice option: Kaitom V3 (male voice)
- Maximum text length: 10,000 characters
- Output format: WAV only (44.1 kHz)
Best Practices
- Use proper punctuation for natural pauses and intonation
- Keep sentences conversational for the most natural output
- Test with small text segments before processing large texts
- Use IPA notation for technical terms or names requiring specific pronunciation
- Monitor character count to stay within the 10,000 character limit
Pricing
| AI API Service Name | Endpoint | IC Per Characters | On-Premise |
|---|---|---|---|
| Thai Text-to-Speech V3 (Kaitom Voice) | /v3/store/audio/tts/generate | 1 IC/400 Characters | Contact |
See Also
- Text-to-Speech V2 - Previous version with language mode selection
- Text-to-Speech V1 - Legacy GET-based API with Kaitom V1 and Cee voice
- Speech-to-Text - Convert speech to text