Endpoints

v1 • updated

Chú ý: Router này mount tại /voice (tuỳ app), vì vậy full path là $BASE/create, $BASE/status/parts/by-request, v.v.

Flow: (1) POST $BASE/create hoặc POST $BASE/srt → (2) Poll $BASE/status/parts/by-request?requestKey=... để lấy các audioUrl dần → (3) Poll $BASE/status/by-request?requestKey=... để lấy file cuối sau merge.

BodyBắt buộcMô tả
text | orgHtml | orgNội dung cần đọc (HTML hợp lệ theo sanitize).
voiceKhôngVoice ID (số), mặc định 0.
speedKhôngTốc độ đọc (float), mặc định 1.0.
typeKhôngpaid | free (đăng nhập — chỉ cắt preview, không trừ ký tự) | guest.
curl -X POST "$BASE/create?token=$TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "

Xin chào mọi người!

Đây là bản demo.

", "voice": 402, "speed": 1, "type": "paid" }'
{}
// Response
{
  "success": true,
  "requestKey": "sha256(text+voice+speed)",
  "status": "processing",
  "parts": 1
}

QueryBắt buộcMô tả
requestKeyKey từ bước tạo.
tokenKhuyến nghịAPI key (query hoặc header).
curl "$BASE/status/parts/by-request?token=$TOKEN&requestKey=YOUR_KEY"
{}
// processing
{ "success":true, "requestKey":"...", "status":"processing", "data":[ "https://.../part0.mp3" ] }

// done
{ "success":true, "requestKey":"...", "status":"done", "data":[ "https://.../part0.mp3","https://.../part1.mp3" ] }

// error
{ "success":false, "requestKey":"...", "status":"error", "data":[...], "message":"..." }

QueryBắt buộcMô tả
requestKeyKey từ bước tạo.
tokenKhuyến nghịAPI key.
curl "$BASE/status/by-request?token=$TOKEN&requestKey=YOUR_KEY"
{}
// processing
{ "success": true, "requestKey":"...", "status":"processing" }

// done
{ "success": true, "requestKey":"...", "status":"done", "audioUrl":"https://cdn.../final_req_xxx.mp3" }

// error
{ "success": false, "requestKey":"...", "status":"error", "message":"..." }

QueryBắt buộcMô tả
projectIdProject ID khi tạo job.
sessionIdSession ID khi tạo job.
sceneIdKhôngNếu cần.
tokenKhuyến nghịAPI key.
curl "$BASE/status?token=$TOKEN&projectId=P123&sessionId=S456"
curl "$BASE/status/parts?token=$TOKEN&projectId=P123&sessionId=S456"

BodyBắt buộcMô tả
srt (text) hoặc file (multipart)Nội dung phụ đề SRT.
voiceKhôngMặc định 0.
speedKhôngMặc định 1.0.
typeKhôngpaid | free.
curl -X POST "$BASE/srt?token=$TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "voice": 402,
    "speed": 1,
    "type": "paid",
    "srt": "1\n00:00:00,000 --> 00:00:02,000\nXin chào mọi người!\n\n2\n00:00:03,500 --> 00:00:05,000\nRất vui được gặp bạn."
  }'
curl -X POST "$BASE/srt?token=$TOKEN" \
  -H "Accept: application/json" \
  -F "voice=0" \
  -F "speed=1" \
  -F "type=paid" \
  -F "file=@/path/to/subtitle.srt;type=text/plain"
{}

BodyBắt buộcMô tả
tokenAPI key (cũng có thể gửi qua header).
curl -X POST "$BASE/user" \
  -H "Content-Type: application/json" \
  -d '{ "token": "$TOKEN" }'
{}

QueryBắt buộcMô tả
tokenAPI key (hoặc qua header X-API-Key/Authorization).
curl "$BASE/user?token=$TOKEN"
{}

QueryBắt buộcMô tả
tokenAPI key (query hoặc header).
languageKhôngVD: vi-VN, en-US
genderKhôngmale | female
typeKhôngVD: google, studio, ...
curl "$BASE/voices?token=$TOKEN&language=vi-VN&gender=female&type=google"
{}
Ghi chú kỹ thuật
  • Sanitize: chỉ giữ <p>, <br>, <div data-wordtype="pause">x</div>; <break time="Xs"/> tự đổi sang pause-div.
  • FREE (đăng nhập): không trừ ký tự, nhưng cắt preview theo cấu hình; giới hạn lượt/ngày.
  • PAID: trừ tts_number theo ký tự khi tạo job thành công; hoàn khi job/merge lỗi.
  • GUEST: quota theo IP/UA.
  • SRT: merge theo start_ms/end_ms mỗi cue, chèn im lặng cho gap, có time-stretch trong ngưỡng.
  • Dọn file: chỉ giữ MP3 cuối; workdir/WAV tạm bị xoá.
© 2025 VTM_TTS — Bootstrap & Font Awesome • Updated to match router /voice