Skip to main content

🗣️ Thai Text-to-Speech V1 (Kaitom & Cee Voice)

🗣️ ระบบแปลงข้อความภาษาไทยเป็นเสียงพูด - เวอร์ชั่น 1

Version Status Legacy Production

Welcome to Thai Text-to-Speech API V1. This version offers two voice options through a simple GET-based API:

  • Kaitom Voice (เสียงน้องไข่ต้ม) - Male voice
  • Cee Voice (เสียงคุณซี) - Female celebrity voice (@ceemeagain)
iApp Text to Speech API V1

Try Demo

Getting Started

  1. Prerequisites

    • An API key from iApp Technology
    • Text input in Thai and/or English
    • Maximum text length: No specific limit
    • Supported output format: MP3, WAV
  2. Quick Start

    • Simple GET request
    • Fast processing (less than 1 second)
    • Natural speech generation
    • Support for Thai-English mixed text
  3. Key Features

    • Natural speech synthesis
    • Mixed language support (Thai-English)
    • Two voice options (Kaitom & Cee)
    • Emoji support
    • Number, date, and currency value conversion
    • Fast processing time
  4. Security & Compliance

    • GDPR and PDPA compliant
    • No data retention after processing
How to get API Key?

Please visit API Key Management page to view your existing API key or request a new one.

V2 Available

Looking for improved speech quality? Try Text-to-Speech V2 with enhanced Kaitom voice

API Endpoints

EndpointMethodDescriptionCost
/v3/store/speech/text-to-speech/kaitom/v1
Legacy: /thai-tts-kaitom/tts
GETThai TTS with Kaitom voice V11 IC per 400 characters
/v3/store/speech/text-to-speech/cee
Legacy: /thai-tts-cee/tts
GETThai TTS with Cee voice1 IC per 400 characters

Quick Examples

Kaitom Voice V1

Request:

curl --location --request GET 'https://uat-api.iapp.co.th/v3/store/speech/text-to-speech/kaitom/v1?text=สวัสดีครับ' \
--header 'apikey: YOUR_API_KEY'

Response:

Cee Voice

Request:

curl --location --request GET 'https://uat-api.iapp.co.th/v3/store/speech/text-to-speech/cee?text=สวัสดีค่ะเสียงซีสังเคราะห์มาแล้วค่ะ' \
--header 'apikey: YOUR_API_KEY'

Response:

note

Replace the text parameter with your desired text. Output format varies: MP3 for Kaitom, WAV for Cee.

API Reference

Text-to-Speech Endpoint (Kaitom V1)

  • Endpoint: GET https://uat-api.iapp.co.th/v3/store/speech/text-to-speech/kaitom/v1
  • Required Parameters:
    • apikey: Your API key (header)
    • text: Text to convert to speech (query parameter)
  • Output Format: MP3

Text-to-Speech Endpoint (Cee Voice)

  • Endpoint: GET https://uat-api.iapp.co.th/v3/store/speech/text-to-speech/cee
  • Required Parameters:
    • apikey: Your API key (header)
    • text: Text to convert to speech (query parameter)
  • Output Format: WAV

Code Examples

Python

Kaitom V1

import requests

url = "https://uat-api.iapp.co.th/v3/store/speech/text-to-speech/kaitom/v1"
headers = {"apikey": "YOUR_API_KEY"}
params = {"text": "สวัสดีครับ"}

response = requests.get(url, headers=headers, params=params)
with open("output.mp3", "wb") as f:
f.write(response.content)

Cee Voice

import requests

url = "https://uat-api.iapp.co.th/v3/store/speech/text-to-speech/cee"
headers = {"apikey": "YOUR_API_KEY"}
params = {"text": "สวัสดีค่ะ"}

response = requests.get(url, headers=headers, params=params)
with open("output.wav", "wb") as f:
f.write(response.content)

JavaScript (Node.js)

Kaitom V1

const axios = require("axios")
const fs = require("fs")

let config = {
method: "get",
url: "https://uat-api.iapp.co.th/v3/store/speech/text-to-speech/kaitom/v1",
params: { text: "สวัสดีครับ" },
headers: { apikey: "YOUR_API_KEY" },
responseType: "arraybuffer",
}

axios(config)
.then((response) => {
fs.writeFileSync("output.mp3", response.data)
})
.catch((error) => console.log(error))

Cee Voice

const axios = require("axios")
const fs = require("fs")

let config = {
method: "get",
url: "https://uat-api.iapp.co.th/v3/store/speech/text-to-speech/cee",
params: { text: "สวัสดีค่ะ" },
headers: { apikey: "YOUR_API_KEY" },
responseType: "arraybuffer",
}

axios(config)
.then((response) => {
fs.writeFileSync("output.wav", response.data)
})
.catch((error) => console.log(error))

PHP

Kaitom V1

<?php
$url = "https://uat-api.iapp.co.th/v3/store/speech/text-to-speech/kaitom/v1?text=สวัสดีครับ";
$headers = array('apikey: YOUR_API_KEY');

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
file_put_contents("output.mp3", $response);
curl_close($ch);
?>

Cee Voice

<?php
$url = "https://uat-api.iapp.co.th/v3/store/speech/text-to-speech/cee?text=สวัสดีค่ะ";
$headers = array('apikey: YOUR_API_KEY');

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
file_put_contents("output.wav", $response);
curl_close($ch);
?>

Swift

import Foundation

let url = URL(string: "https://uat-api.iapp.co.th/v3/store/speech/text-to-speech/kaitom/v1?text=สวัสดีครับ&apikey=YOUR_API_KEY")!
var request = URLRequest(url: url, timeoutInterval: Double.infinity)
request.httpMethod = "GET"

let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else {
print("Error:", String(describing: error))
return
}

// Save the data to an MP3 file
let fileManager = FileManager.default
let outputPath = fileManager.temporaryDirectory.appendingPathComponent("output.mp3")

do {
try data.write(to: outputPath)
print("Audio file saved to:", outputPath.path)
} catch {
print("Failed to save file:", error)
}
}

task.resume()

Kotlin

import okhttp3.OkHttpClient
import okhttp3.Request
import java.io.File
import java.io.FileOutputStream

fun main() {
val client = OkHttpClient()

val request = Request.Builder()
.url("https://uat-api.iapp.co.th/v3/store/speech/text-to-speech/kaitom/v1?text=สวัสดีครับ&apikey=YOUR_API_KEY")
.build()

val response = client.newCall(request).execute()

if (response.isSuccessful) {
// Get response body as bytes
val responseBody = response.body?.bytes()

if (responseBody != null) {
// Save to a file
val outputFile = File("output.mp3")
FileOutputStream(outputFile).use { fos ->
fos.write(responseBody)
println("Audio file saved to: ${outputFile.absolutePath}")
}
} else {
println("Response body is empty.")
}
} else {
println("Request failed with status code: ${response.code}")
}
}

Java

import okhttp3.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class Main {
public static void main(String[] args) throws IOException {
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
.url("https://uat-api.iapp.co.th/v3/store/speech/text-to-speech/kaitom/v1?text=สวัสดีครับ&apikey=YOUR_API_KEY")
.method("GET", body)
.build();
Response response = client.newCall(request).execute();

if (response.isSuccessful()) {
// Get the response body as bytes
byte[] responseBody = response.body().bytes();

// Save the response to a file
File outputFile = new File("output.mp3");
try (FileOutputStream fos = new FileOutputStream(outputFile)) {
fos.write(responseBody);
System.out.println("Audio file saved to: " + outputFile.getAbsolutePath());
} catch (IOException e) {
System.err.println("Failed to save the file: " + e.getMessage());
}
} else {
System.err.println("Request failed with status code: " + response.code());
}

// Close the response
response.close();
}
}

Dart

import 'dart:io';
import 'package:http/http.dart' as http;

void main() async {
// Create the GET request
var request = http.Request(
'GET',
Uri.parse(
'https://uat-api.iapp.co.th/v3/store/speech/text-to-speech/kaitom/v1?text=สวัสดีครับ&apikey=YOUR_API_KEY'),
);

// Send the request
http.StreamedResponse response = await request.send();

if (response.statusCode == 200) {
// Save the response to a file
final file = File('output.mp3');
final bytes = await response.stream.toBytes();
await file.writeAsBytes(bytes);

print('Audio file saved to: ${file.path}');
} else {
print('Request failed: ${response.reasonPhrase}');
}
}

Features & Capabilities

Core Features

  • Natural speech generation
  • Mixed Thai-English text support
  • Two voice options
  • Emoji conversion
  • Number and date formatting
  • Fast processing

Voice Options

VoiceGenderDescriptionOutput Format
Kaitom V1MaleYoung boy voice (น้องไข่ต้ม)MP3
CeeFemaleCelebrity voice (@ceemeagain ฉัตรปวีณ์ ตรีชัชวาลวงศ์)WAV

Supported Fields

  • Thai text
  • English text
  • Emojis
  • Numbers
  • Dates
  • Currency values

Limitations and Best Practices

Limitations

  • Thai and English language support only
  • Two voice options available (Kaitom V1 & Cee)
  • Simple GET-based API (no language mode selection)
  • Output formats vary by voice

Best Practices

  • Use proper punctuation for natural pauses
  • Keep sentences natural and conversational
  • Test with small text segments first
  • Choose appropriate voice for your use case:
    • Kaitom V1: General purpose, male voice
    • Cee: Female voice, celebrity appeal

Accuracy & Performance

Overall Accuracy

  • Natural speech quality
  • Accurate pronunciation for both Thai and English
  • Proper handling of numbers and special characters

Processing Speed

  • Less than 1 second per request
  • Consistent performance regardless of text length

Upgrade to V2

Looking for improved speech quality? Consider upgrading to Text-to-Speech V2:

FeatureV1 (GET)V2 (POST)
Voice OptionsKaitom V1, CeeKaitom V2 (improved)
MethodGETPOST
Language ModeAuto-detectSelectable (TH / TH_MIX_EN)
Speech QualityGoodEnhanced
Mixed LanguageSupportedImproved support

Pricing

AI API Service NameEndpointIC Per CharactersOn-Premise
Thai Text To Speech V1 (Kaitom)iapp_text_to_speech_v1_kaitom1 IC/400 CharactersContact
Thai Text To Speech V1 (Cee)iapp_text_to_speech_v1_cee1 IC/400 CharactersContact

See Also