🗣️ 泰语文本转语音 V3 (Kaitom Voice)
⚠️ Alpha 版本须知: 此 API 目前处于 alpha 测试阶段。服务可能会出现间歇性可用。如需生产使用,请使用 TTS V2 (稳定版)。
欢迎使用 泰语文本转语音 API V3,它拥有全新的 Kaitom Voice(น้องไข่ต้ม เวอร์ชั่น 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.
试用演示 — 语音克隆 (泰语)
⚠️ 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.
入门指南
-
先决条件
- 艾艾普科技的 API 密钥
- 泰语和/或英语文本输入
- 最大文本长度:10,000 个字符
- 支持的输出格式:WAV (24 kHz)
-
快速入门
- 快速处理,高质量输出
- 改进的自然语音生成
- 自动泰语-英语混合文本支持
- 无需选择语言模式
-
主要功能
- 新一代语音合成引擎
- 智能文本标准化(数字、 日期、货币)
- 自动泰语-英语语言处理
- 表情符号和特殊字符支持
- 扩展的 10,000 字符限制
-
安全与合规
- 符合 GDPR 和 PDPA
- 处理后不保留数据
请访问 API 密钥管理 页面查看您现有的 API 密钥或申请新密钥。
API 端点
| 端点 | 方法 | Content-Type | 描述 | 费用 |
|---|---|---|---|---|
/v3/store/audio/tts | POST | application/json | 默认语音 (Kaitom) — 泰语/英语混合文本 | 每 400 个字符 1 IC |
/v3/store/audio/tts/clone | POST | multipart/form-data | 语音克隆 — 用自定义语音合成泰语文本 | 每 400 个字符 1 IC |
/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 位小端 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:您的 API 密钥(必需)
请求体
| 字段 | 类型 | 必需 | 默认 | 备注 |
|---|---|---|---|---|
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:您的 API 密钥(必需)
表单字段
| 字段 | 类型 | 必需 | 默认 | 备注 |
|---|---|---|---|---|
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 + Clone 端点)
- Content-Type:
application/octet-stream - Body: 原始签名的 16 位小端 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:您的 API 密钥(必需)
表单字段
| 字段 | 类型 | 必需 | 备注 |
|---|---|---|---|
audio | file | 是 | WAV(任何采样率;建议单声道)或原始 PCM (.pcm,视为 24 kHz 单声道 int16) |
响应
- Content-Type:
application/json - Body:
{
"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)和重采样。
- 不鲁棒,无法抵抗神经编解码器再编码或有针对性的对抗性移除 — 请将其视为负责任 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); // a File or 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("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"
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)
该端点流式传输原始 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("Saved 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 "Audio saved to 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
}
// 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")
.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")
.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');
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"
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 | 请求错误 - 无效的 JSON 格式 | 检查 JSON 语法 |
| 402 | 积分不足 | 添加积分 |
| 413 | 载荷过大 | 文本超过 10,000 个字符 |
| 429 | 速率限制超出 | 检查 API 密钥限制 |
| 503 | 服务不可用 | 暂时性问题,稍后重试 |
迁移指南
从 V2 到 V3
| 方面 | V2 | V3 |
|---|---|---|
| Content-Type | multipart/form-data | application/json |
| 请求体 | 表单数据 | JSON 体 |
| 语言模式 | 必需 (TH / TH_MIX_EN) | 自动检测 |
| 最大字符数 | 无限制 | 10,000 |
| 音频质量 | 标准 WAV | 24 kHz WAV |
| 端点 | /v3/store/speech/text-to-speech/kaitom | /v3/store/audio/tts |
V2 请求(旧):
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 请求(新):
curl -X POST 'https://api.iapp.co.th/v3/store/audio/tts' \
--header 'apikey: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"text": "สวัสดีครับ"}'
从 V1 到 V3
| 方面 | V1 | V3 |
|---|---|---|
| 方法 | GET | POST |
| 请求 | 查询参数 | JSON 体 |
| 语音选项 | Kaitom V1, Cee | Kaitom V3 |
| 输出格式 | MP3/WAV | WAV (24 kHz) |
| 端点 | /v3/store/speech/text-to-speech/kaitom/v1 | /v3/store/audio/tts |
限制
- 支持泰语和英语(默认语音);语音克隆仅支持泰语
- 默认语音:Kaitom V3(男声)。语音克隆允许您使用任何参考语音。
- 推荐单次请求长度:约 1,000 个泰语字符(较长文本会自动分块,会增加延迟)
- 输出:原始 16 位 PCM 单声道 @ 24 kHz(在客户端包装成 WAV)
- 语音克隆参考音频:≤ 15 秒,推荐 8-12 秒单声道纯净语音
- 速率限制:每个 API 密钥 100 请求/秒
最佳实践
- 使用正确的标点符号以实现自然的停顿和语调
- 保持句子口语化以获得最自然的发音
- 在处理大量文本之前,先用小段文本进行测试
- 如果您需要特定的发音,预先音译品牌名称或首字母缩略词为泰语脚本(例如,发送
ไอแอป而不是iApp) - 监控字符数以保持在 10,000 字符限制内
负责任的 AI
由默认语音和语音克隆端点生成的每个音 频都嵌入了听不见的AudioSeal(Meta,MIT 许可)神经网络水印。这使得下游内容真实性工具——以及上面的 /v3/store/audio/tts/detect 端点——能够识别由 V3 生成的合成语音,从而减轻语音克隆功能的滥用。
该水印:
- 听不见(约 -30 dBFS 残差)
- 鲁棒性强,可抵抗 MP3 / OPUS 再编码、格式转换和重采样
- 不鲁棒,无法抵抗神经编解码器再编码或有针对性的对抗性移除 — 请视为负责任 AI 的信号,而非防篡改的 DRM
如果您运营一个发布用户生成音频的平台,我们建议定期将上传的剪辑通过 /v3/store/audio/tts/detect 进行运行,作为合成媒体审核的众多信号之一。
定价
| AI API 服务名称 | 端点 | 价格 | 内部部署 |
|---|---|---|---|
| 泰语 TTS V3 (Kaitom Voice) | /v3/store/audio/tts | 每 400 个字符 1 IC | 联系我们 |
| 泰语语音克隆 V3 | /v3/store/audio/tts/clone | 每 400 个字符 1 IC | 联系我们 |
| AI 水印检测 | /v3/store/audio/tts/detect | 免费 | 联系我们 |