Skip to main content

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

1 ICper 400 characters
v1.0 Active🎙️ Speech

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

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

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://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://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://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://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://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://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://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://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://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://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://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://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://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://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