🗣️ 泰语文本转语音 V3(Kaitom 声音)
⚠️ Alpha 版本说明: 此 API 目前处于 alpha 测试阶段。服务可能会出现间歇性可用性问题。生产环境请使用 TTS V2(稳定版)。V3 在 alpha 测试期间免费使用至 2026 年 5 月 31 日。
欢迎使用 泰语文本转语音 API V3,全新推出的 Kaitom 声音(น้องไข่ต้ม 第 3 版)。新一代版本通过先进的文本规范化、声音克隆支持以及自动泰英语言处理,显著提升了语音的自然度。
V3 新功能
- 智能文本规范化 - 自动处理数字、日期、货币和特殊字符
- 自动语言检测 - 无需指定语言模式,V3 自动处理泰英混合
- 延长字符限制 - 每次请求最多支持 10,000 字符
- 简化的 JSON API - 使用清晰的 JSON 请求体替代表单数据
- 高质量音频 - 24 kHz WAV 输出,适用于专业应用
试用演示 — 默认声音 (Kaitom)
V3 automatically handles Thai-English mixed text. No language mode selection needed.
Natural range: 0.8 – 1.2. Default 1.0.
试用演示 — 声音克隆(泰语)
🎁 免费至 2026 年 5 月 31 日 ⚠️ ALPHA上传 8–12 秒清晰的泰语语音片段,并提供其逐字对应的文本,模型将以该声音说出您的泰语文本。声音克隆目前仅支持泰语。
📋 How to use this demo
- Step 1: Record yourself (max 10 seconds) speaking any short Thai sentence — OR upload an existing Thai audio clip.
- Step 2: Type the exact Thai words you spoke into the "Reference Transcript" box. (Word-for-word — not a description.)
- Step 3: Type the new Thai text you want the cloned voice to say.
- Step 4: Click Generate Cloned Voice.
💡 Speak a natural Thai sentence such as: "สวัสดีครับ ผมชื่อไข่ต้ม วันนี้อากาศดีมาก". Recording will stop automatically at 10 seconds.
⚠️ This must match your recording word-for-word. Do not write a description like "เสียงผู้ชายพูดทักทาย" — write the actual sentence you spoke. The clone quality depends on this matching the audio exactly.
Natural range: 0.8 – 1.2. Default 1.0.
入门
-
先决条件
- 艾艾普科技 (iApp Technology) 的 API 密钥
- 泰语和/或英语文本输入
- 最大文本长度: 10,000 字符
- 支持的输出格式: WAV (24 kHz)
-
快速入门
- 快速处理,输出高质量
- 改进的自然语音生成
- 自动支持泰英混合文本
- 无需选择语言模式
-
核心功能
- 新一代语音合成引擎
- 智能文本规范化(数字、日期、货币)
- 自动泰英语言处理
- 支持表情符号和特殊字符
- 延长至 10,000 字符限制
-
安全与合规
- 符合 GDPR 和 PDPA 规范
- 处理后不保留任何数据
请访问 API 密钥管理 页面查看现有 API 密钥或申请新密钥。
API 端点
| 端点 | 方法 | Content-Type | 描述 | 价格 (Alpha) |
|---|---|---|---|---|
/v3/store/audio/tts | POST | application/json | 默认声音 (Kaitom) — 泰英混合文本 | |
/v3/store/audio/tts/clone | POST | multipart/form-data | 声音克隆 — 用自定义声音合成泰语文本 | |
/v3/store/audio/tts/detect | POST | multipart/form-data | AI 水印检测 — 验证音频片段是否由 V3 生成 | 免费 |
快速示例
默认声音 — 示例请求
curl -X POST 'https://api.iapp.co.th/v3/store/audio/tts' \
--header 'apikey: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"text": "สวัสดีครับ น้องไข่ต้ม เวอร์ชั่น 3", "speed": 1.0}' \
--output 'output.pcm'
声音克隆 — 示例请求
curl -X POST 'https://api.iapp.co.th/v3/store/audio/tts/clone' \
--header 'apikey: YOUR_API_KEY' \
--form 'text=สวัสดีครับ วันนี้ทดสอบการโคลนเสียง' \
--form 'speed=1.0' \
--form 'ref_text=ฮัลโหล สวัสดีครับ ผมชื่อไข่ต้ม' \
--form 'ref_audio=@reference.wav' \
--output 'output.pcm'
AI 水印检测 — 示例请求
curl -X POST 'https://api.iapp.co.th/v3/store/audio/tts/detect' \
--header 'apikey: YOUR_API_KEY' \
--form 'audio=@suspect.wav'
返回 JSON:
{ "is_ai_generated": true, "confidence": 1.0 }
示例响应
响应主体为 原始 16-bit 小端 PCM, 单声道, 24 kHz, 以 application/octet-stream 流式传输。请用 WAV 头部封装以播放或保存为 .wav:
ffmpeg -f s16le -ar 24000 -ac 1 -i output.pcm output.wav
API 参考
1. 默认声音端点 (Kaitom)
- 端点:
POSThttps://api.iapp.co.th/v3/store/audio/tts - Content-Type:
application/json - Headers:
apikey(必填)
请求体
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
text | string | 是 | — | 每次请求最多约 1,000 个泰文字符。更长的文本将由服务器自动分块 |
speed | float | 否 | 1.0 | 自然区间 0.8–1.2。值越小越慢 |
{
"text": "สวัสดีครับ ยินดีต้อนรับสู่ iApp",
"speed": 1.0
}
2. 声音克隆端点 (仅限泰语)
- 端点:
POSThttps://api.iapp.co.th/v3/store/audio/tts/clone - Content-Type:
multipart/form-data - Headers:
apikey(必填)
表单字段
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
text | string | 是 | — | 要合成的泰语文本 |
speed | float | 否 | 1.0 | 语速 |
ref_text | string | 是 | — | ref_audio 的逐字泰语文字稿(不是描述) |
ref_audio | file | 是 | — | WAV 或 MP3, 8–12 秒 干净的单声道泰语语音 |
约束:
- 参考片段必须 ≤ 15 秒。超过部分将被静默截断;若
ref_text描述了被截断的部分,输出会加速并失真。 ref_text必须与ref_audio中所说的内容逐字一致。- 声音克隆请求在服务器端串行处理。在并发负载下会出现排队延迟。
- 声音克隆目前仅支持泰语。
响应 (TTS + 克隆端点)
- Content-Type:
application/octet-stream - 主体: 原始 16-bit 小端 PCM, 单声道, 24 kHz, 以字节流方式传输
- 计算时长:
duration_seconds = byte_length / 48000 - 要保存为可播放文件, 请用 WAV 头部封装, 或使用
ffmpeg -f s16le -ar 24000 -ac 1 -i out.pcm out.wav
3. AI 水印检测端点
验证给定的音频片段是否由泰语 TTS V3 生成。默认声音和声音克隆端点产生的每一份输出都嵌入了不可听的 AudioSeal 水印;此端点将其读取出来。
- 端点:
POSThttps://api.iapp.co.th/v3/store/audio/tts/detect - Content-Type:
multipart/form-data - Headers:
apikey(必填)
表单字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
audio | file | 是 | WAV(任意采样率, 推荐单声道)或原始 PCM (.pcm, 视为 24 kHz 单声道 int16) |
响应
- Content-Type:
application/json - 主体:
{
"is_ai_generated": true,
"confidence": 1.0
}
| 字段 | 类型 | 说明 |
|---|---|---|
is_ai_generated | boolean | 当 confidence > 0.5 时为 true |
confidence | float | 音频含有 V3 水印的概率 (0..1) |
水印特性
- 不可听 — 嵌入残差约 −30 dBFS, 听众无法感知
- 稳健 抵抗 MP3 / OPUS 重编码、格式转换 (PCM ↔ WAV ↔ MP3) 以及重采样
- 不稳健 抵抗神经编解码器重编码或有意的对抗性移除 — 应将其视为 Responsible AI 信号, 而非防篡改的 DRM
- 实测置信度: TTS V3 输出返回约 1.0; 干净的人声参考音频返回接近 0(在我们的测试中误报率 < 0.001)
- 目的: 让外部内容真实性工具和滥用监测系统能够识别 V3 生成的合成语音, 缓解声音克隆功能的滥用
curl 示例
curl -X POST 'https://api.iapp.co.th/v3/store/audio/tts/detect' \
--header 'apikey: YOUR_API_KEY' \
--form 'audio=@suspect.wav'
Python 示例
import requests
with open("suspect.wav", "rb") as f:
files = {"audio": ("suspect.wav", f, "audio/wav")}
r = requests.post(
"https://api.iapp.co.th/v3/store/audio/tts/detect",
headers={"apikey": "YOUR_API_KEY"},
files=files,
timeout=30,
)
r.raise_for_status()
print(r.json()) # {"is_ai_generated": True, "confidence": 1.0}
JavaScript (Fetch) 示例
const form = new FormData();
form.append("audio", file); // File 或 Blob
const resp = await fetch(
"https://api.iapp.co.th/v3/store/audio/tts/detect",
{
method: "POST",
headers: { "apikey": "YOUR_API_KEY" },
body: form,
}
);
const result = await resp.json();
// { is_ai_generated: true, confidence: 1.0 }
代码示例
Python
import requests
import json
url = "https://api.iapp.co.th/v3/store/audio/tts"
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("音频已保存到 output.wav")
JavaScript (Node.js)
const axios = require("axios")
const fs = require("fs")
const url = "https://api.iapp.co.th/v3/store/audio/tts"
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("音频已保存到 output.wav")
})
.catch((error) => console.error(error))
JavaScript (Fetch API)
端点输出 原始 PCM。播放前请封装 WAV 头部:
async function playThaiTTS(text) {
const resp = await fetch("https://api.iapp.co.th/v3/store/audio/tts", {
method: "POST",
headers: {
"apikey": "YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({ text, speed: 1.0 })
});
if (!resp.ok) throw new Error(`TTS failed: ${resp.status}`);
const pcm = new Uint8Array(await resp.arrayBuffer());
const wav = pcmToWav(pcm, 24000, 1);
const url = URL.createObjectURL(new Blob([wav], { type: "audio/wav" }));
new Audio(url).play();
}
function pcmToWav(pcm, sampleRate, channels) {
const byteRate = sampleRate * channels * 2;
const buf = new ArrayBuffer(44 + pcm.byteLength);
const v = new DataView(buf);
const write = (o, s) => [...s].forEach((c, i) => v.setUint8(o + i, c.charCodeAt(0)));
write(0, "RIFF"); v.setUint32(4, 36 + pcm.byteLength, true);
write(8, "WAVE"); write(12, "fmt ");
v.setUint32(16, 16, true); v.setUint16(20, 1, true);
v.setUint16(22, channels, true); v.setUint32(24, sampleRate, true);
v.setUint32(28, byteRate, true); v.setUint16(32, channels * 2, true);
v.setUint16(34, 16, true); write(36, "data");
v.setUint32(40, pcm.byteLength, true);
new Uint8Array(buf, 44).set(pcm);
return buf;
}
Python — 声音克隆
import requests, wave
with open("reference.wav", "rb") as f:
files = {"ref_audio": ("reference.wav", f, "audio/wav")}
data = {
"text": "สวัสดีครับ วันนี้ทดสอ บการโคลนเสียง",
"speed": "1.0",
"ref_text": "ฮัลโหล สวัสดีครับ ผมชื่อไข่ต้ม",
}
r = requests.post(
"https://api.iapp.co.th/v3/store/audio/tts/clone",
headers={"apikey": "YOUR_API_KEY"},
data=data, files=files, stream=True, timeout=60,
)
r.raise_for_status()
with wave.open("cloned.wav", "wb") as wf:
wf.setnchannels(1); wf.setsampwidth(2); wf.setframerate(24000)
for chunk in r.iter_content(chunk_size=None):
if chunk:
wf.writeframes(chunk)
print("已保存到 cloned.wav")
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',
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 "音频已保存到 output.wav";
?>
Swift
import Foundation
let url = URL(string: "https://api.iapp.co.th/v3/store/audio/tts")!
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
}
// 保存或播放音频数据
try? data.write(to: URL(fileURLWithPath: "output.wav"))
print("音频已保存到 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")
.post(body)
.addHeader("apikey", "YOUR_API_KEY")
.addHeader("Content-Type", "application/json")
.build()
val response = client.newCall(request).execute()
// 处理音频响应
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")
.method("POST", body)
.addHeader("apikey", "YOUR_API_KEY")
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
// 处理音频响应
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');
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('音频已保存到 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"
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)
}
功能与特性
智能文本规范化
V3 自动规范化各种文本元素:
| 类型 | 输入 | 输出(朗读) |
|---|---|---|
| 数字 | 1,234.56 | "หนึ่งพันสองร้อยสามสิบสี่จุดห้าหก" |
| 日期 | 27/01/2569 | "วันที่ยี่สิบเจ็ดมกราคมสองพันห้าร้อยหกสิบเก ้า" |
| 货币 | ฿1,500 | "หนึ่งพันห้าร้อยบาท" |
| 时间 | 14:30 | "สิบสี่นาฬิกาสามสิบนาที" |
| 百分比 | 25% | "ยี่สิบห้าเปอร์เซ็นต์" |
自动语言处理
V3 自动检测并处理泰英混合文本, 无需选择语言模式:
Hello and Welcome! ยินดีต้อนรับสู่ iApp Technology
错误代码
| 状态码 | 描述 | 解决方法 |
|---|---|---|
| 400 | Bad Request - JSON 格式错误 | 检查 JSON 语法 |
| 402 | 余额不足 | 充值 |
| 413 | Payload 过大 | 文本超过 10,000 字符 |
| 429 | 超出请求频率限制 | 检查 API 密钥限额 |
| 503 | 服务不可用 |