Single TTS
Chuyển một đoạn text thành một file audio qua `CreateBy`, sau đó kiểm tra bằng `Status` hoặc nhận callback qua `CallbackUrl`.
🔒 Dữ liệu bản miễn phí có thể được dùng để cải thiện AI. Nâng cấp Pro để bảo mật tuyệt đối
REST API • Single TTS • Multi Voice • SRT to Speech
Khám phá TTS For Free API — thử demo trực tiếp hoặc xem các ví dụ mã sẵn có bằng nhiều ngôn ngữ.
TTSForFree cung cấp pipeline TTS bất đồng bộ. Bạn tạo job bằng REST API, sau đó lấy file hoàn tất qua polling hoặc callback tùy flow.
Đây là các nhóm API public cho user hiện có trong backend mà frontend có thể bám theo.
Chuyển một đoạn text thành một file audio qua `CreateBy`, sau đó kiểm tra bằng `Status` hoặc nhận callback qua `CallbackUrl`.
Tạo audio nhiều người nói hoặc kiểu podcast qua `CreateMulti` với một `ConnectionId` và nhiều block.
Tạo audio lồng tiếng từ các block subtitle có `StartMs` và `EndMs` qua `CreateSrt`.
Một số flow async có tiến trình xử lý nền và trả kết quả sau, còn phần docs public bên dưới tập trung vào contract request và response.
Lấy lịch sử job đơn, lịch sử theo voice hoặc lịch sử job merge của chính user đã đăng nhập.
Xem schema public mới nhất trong Swagger.
Gửi `X-API-Key` trong header của mọi request public.
Muốn lấy API key thì vào `/`. Ở khu vực voice có nút copy để copy đúng giá trị `Voice` trước khi gọi API. Riêng các API lịch sử cần thêm `Authorization: Bearer YOUR_JWT` vì chúng trả về lịch sử của chính user hiện tại.
X-API-Key: YOUR_API_KEY
Authorization: Bearer YOUR_JWT // chỉ cần cho các API lịch sửHãy gọi các API này trước khi generate để frontend có dữ liệu ngôn ngữ, voice và giới hạn độ dài hiện tại.
`Pitch` phụ thuộc provider. Không phải voice nào cũng hỗ trợ.
curl -X GET "https://api.ttsforfree.com/api/Common/GetListLanguage" \
-H "X-API-Key: YOUR_API_KEY"curl -X GET "https://api.ttsforfree.com/api/Common/GetListVoice?lang=vi&type=multivoice" \
-H "X-API-Key: YOUR_API_KEY"curl -X GET "https://api.ttsforfree.com/api/Common/GetConfigMaxLength" \
-H "X-API-Key: YOUR_API_KEY"Dùng `CreateBy` cho một đoạn text và một voice. `Pitch` là optional. `CallbackUrl` cũng là optional.
Public DTO của `CreateBy` không yêu cầu `ConnectionId`.
curl --location "https://api.ttsforfree.com/api/TTS/CreateBy" \
--header "X-API-Key: YOUR_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"Texts": "Xin chào mọi người",
"Voice": "v1:TldK3n9ei9wctuSlNYhG_cJ4UULVT8ZGjhxcuoaFow2hDTDsuTCuvaOYrVY",
"Pitch": 0,
"CallbackUrl": "https://your-app.com/api/tts/callback"
}'{
"Texts": "Xin chào mọi người",
"Voice": "v1:TldK3n9ei9wctuSlNYhG_cJ4UULVT8ZGjhxcuoaFow2hDTDsuTCuvaOYrVY",
"Pitch": 0,
"CallbackUrl": "https://your-app.com/api/tts/callback"
}{
"Id": 12345,
"Message": "Proccessing",
"Status": "PENDING",
"Data": "",
"ExpectUrl": "https://cdn.ttsforfree.com/20250606/abc.mp3",
"ShareKey": "sha256..."
}Dùng `Id` trả về làm job id cho job đơn. Nếu không dùng `CallbackUrl` thì poll endpoint này.
Nếu request trúng cache thì `Data` có thể có URL ngay. Nếu chưa xong thì chờ `Status` chuyển sang `SUCCESS`.
curl -X GET "https://api.ttsforfree.com/api/TTS/Status/12345" \
-H "X-API-Key: YOUR_API_KEY"{
"Id": 12345,
"Status": "SUCCESS",
"Data": "https://cdn.ttsforfree.com/20250606/abc.mp3"
}Dùng `CreateMulti` cho nội dung nhiều người nói hoặc podcast. `ConnectionId` là bắt buộc.
curl --location "https://api.ttsforfree.com/api/TTS/CreateMulti" \
--header "X-API-Key: YOUR_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"ConnectionId": "signalr-connection-id",
"Blocks": [
{
"Texts": "Chào mừng đến với chương trình",
"Voice": "v1:host_voice",
"Volume": 1,
"Speed": 1,
"Pitch": 0,
"PauseAfterMs": 300
},
{
"Texts": "Cảm ơn vì đã mời tôi",
"Voice": "v1:guest_voice",
"Volume": 1,
"Speed": 1,
"Pitch": 0,
"PauseAfterMs": 500
}
]
}'{
"ConnectionId": "signalr-connection-id",
"Blocks": [
{
"Texts": "Chào mừng đến với chương trình",
"Voice": "v1:host_voice",
"Volume": 1,
"Speed": 1,
"Pitch": 0,
"PauseAfterMs": 300
},
{
"Texts": "Cảm ơn vì đã mời tôi",
"Voice": "v1:guest_voice",
"Volume": 1,
"Speed": 1,
"Pitch": 0,
"PauseAfterMs": 500
}
]
}{
"Id": 6789,
"Message": "Success",
"ExpectUrl": "https://cdn.ttsforfree.com/audio_merge/3f9b5a35-9ac4-4d51-a8fe-2e4d91523a88.mp3"
}Dùng `CreateSrt` khi mỗi block đã có timeline subtitle. `ConnectionId` là bắt buộc.
Hiện tại Gemini voice chưa được hỗ trợ ở mode SRT.
curl --location "https://api.ttsforfree.com/api/TTS/CreateSrt" \
--header "X-API-Key: YOUR_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"ConnectionId": "signalr-connection-id",
"Blocks": [
{
"Texts": "Xin chào mọi người",
"Voice": "v1:voice_1",
"Volume": 1,
"Speed": 0.9,
"Pitch": 0,
"StartMs": 0,
"EndMs": 1800
},
{
"Texts": "Chào mừng quay trở lại",
"Voice": "v1:voice_1",
"Volume": 1,
"Speed": 0.9,
"Pitch": 0,
"StartMs": 2200,
"EndMs": 4200
}
]
}'{
"ConnectionId": "signalr-connection-id",
"Blocks": [
{
"Texts": "Xin chào mọi người",
"Voice": "v1:voice_1",
"Volume": 1,
"Speed": 0.9,
"Pitch": 0,
"StartMs": 0,
"EndMs": 1800
},
{
"Texts": "Chào mừng quay trở lại",
"Voice": "v1:voice_1",
"Volume": 1,
"Speed": 0.9,
"Pitch": 0,
"StartMs": 2200,
"EndMs": 4200
}
]
}{
"Id": 6790,
"Message": "Success",
"ExpectUrl": "https://cdn.ttsforfree.com/audio_merge/f0d4cb65-7d10-4f53-b930-1b231d2414d9.mp3"
}Dùng merged job `Id` trả về từ `CreateMulti` hoặc `CreateSrt`.
curl -X GET "https://api.ttsforfree.com/api/TTS/Multi/Status/6789" \
-H "X-API-Key: YOUR_API_KEY"{
"Id": 6789,
"Status": "SUCCESS",
"Data": "https://cdn.ttsforfree.com/audio_merge/3f9b5a35-9ac4-4d51-a8fe-2e4d91523a88.mp3"
}Với multi voice và SRT, endpoint này trả về job merge cùng toàn bộ block audio con.
Dùng `FinalAudioUrl` cho file merge cuối và `Blocks[].FilePath` cho file của từng block.
curl -X GET "https://api.ttsforfree.com/api/TTS/GetJobTTSDetail?jobId=6789" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Authorization: Bearer YOUR_JWT"{
"Id": 1,
"Message": "Success",
"Data": {
"Id": 6789,
"TotalBlocks": 2,
"StatusId": 200,
"StatusName": "SUCCESS",
"FinalAudioUrl": "https://cdn.ttsforfree.com/audio_merge/3f9b5a35-9ac4-4d51-a8fe-2e4d91523a88.mp3",
"Blocks": [
{
"Id": 12345,
"Text": "Chào mừng đến với chương trình",
"Voice": "v1:host_voice",
"FilePath": "https://cdn.ttsforfree.com/20250606/block1.mp3",
"StatusId": 200
}
]
}
}Các API lịch sử gắn với user account. Chúng trả về job của user hiện tại, vì vậy cần `Authorization: Bearer YOUR_JWT`.
Dùng `GetHistory` cho job single TTS, `GetHistoryVoice` cho lịch sử rút gọn theo voice, và `GetHistoryMulti` cho job merge. Nếu muốn lịch sử SRT merge thì gọi `GetHistoryMulti` với `jobType=Srt`.
curl -X GET "https://api.ttsforfree.com/api/TTS/GetHistory?page=1&pageSize=10" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Authorization: Bearer YOUR_JWT"curl -X GET "https://api.ttsforfree.com/api/TTS/GetHistoryVoice?page=1&pageSize=10" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Authorization: Bearer YOUR_JWT"curl -X GET "https://api.ttsforfree.com/api/TTS/GetHistoryMulti?page=1&pageSize=10&jobType=Tts" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Authorization: Bearer YOUR_JWT"curl -X GET "https://api.ttsforfree.com/api/TTS/GetHistoryMulti?page=1&pageSize=10&jobType=Srt" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Authorization: Bearer YOUR_JWT"{
"Id": 1,
"Message": "Success",
"TotalRows": 1,
"Data": [
{
"Id": 6789,
"TotalBlocks": 2,
"StatusId": 150,
"StatusName": "MERGE_REQUESTED",
"FinalAudioUrl": "",
"Blocks": [
{
"Id": 12345,
"Text": "Chào mừng đến với chương trình",
"Voice": "v1:host_voice",
"FilePath": "https://cdn.ttsforfree.com/20250606/block1.mp3",
"StatusId": 200
}
]
}
]
}Nếu truyền `CallbackUrl` trong `CreateBy`, server sẽ POST payload hoàn tất về URL của bạn khi single TTS hoàn thành.
Hiện tại callback public áp dụng cho `CreateBy`. Với multi voice và SRT, hãy dùng các endpoint create và status ở phía trên.
POST https://your-app.com/api/tts/callback
Content-Type: application/json
{
"Id": 12345,
"Status": "SUCCESS",
"Action": "ResponseTTSNotification",
"FilePath": "https://cdn.ttsforfree.com/20250606/abc.mp3",
"Data": "https://cdn.ttsforfree.com/20250606/abc.mp3",
"Hash": "sha256...",
"CompletedAt": "2026-06-06T10:10:10Z"
}400 Bad Request // thiếu text, block sai dữ liệu, hoặc timeline không hợp lệ
401 Unauthorized // thiếu hoặc sai API key hay user token
403 Forbidden // hết quota hoặc voice không được phép dùng
404 Not Found // không tìm thấy job id
429 Too Many // bị giới hạn tốc độ
500 Server Error // lỗi tạm thời, nên retry với backoffĐây là các giá trị số quan trọng nhất nên giải thích rõ trong docs frontend khi đọc lịch sử merge hoặc job detail.
Job đã được nhận và đang chờ hoặc đang pending trong pipeline xử lý.
Các block đã xử lý xong phần chính và hệ thống đang yêu cầu hoặc đang thực hiện bước ghép audio cuối.
Audio cuối cùng đã sẵn sàng. Lúc này mới nên dùng `Data`, `ExpectUrl` hoặc `FinalAudioUrl`.
Job đã fail. Không nên fetch URL audio cuối cùng cho tới khi có một lượt chạy thành công mới.
A: Trong docs public này, nên ưu tiên polling. Dùng `Status` cho single TTS và `Multi/Status` cho multi voice hoặc SRT. Thông thường poll mỗi 5 giây là đủ cho đa số frontend.
A: Với nhu cầu thực tế, job `multi voice` và `srt` cho một video dài khoảng 2 đến 3 giờ thường có thể xong khoảng 5 phút mỗi job. Thời gian thực tế vẫn phụ thuộc số block, loại voice và tải hàng đợi.
A: Nếu làm workflow dài, nên ưu tiên `multi voice` và `srt` vì linh hoạt hơn cho nội dung dài. Hãy chia block rõ ràng, giữ timeline sạch và poll status thay vì fetch output quá sớm.
A: Gói free sẽ có giới hạn thấp hơn theo phút và theo ngày. Gói đã thanh toán sẽ có hạn mức cao hơn. Chính sách cụ thể có thể thay đổi theo package, vì vậy hãy xử lý an toàn khi gặp 429 và liên hệ đội ngũ nếu cần throughput lớn hơn.
A: Vào trang chủ `/`. Ở khu vực voice sẽ có nút copy key. Bạn có thể test voice trước ngay tại đó rồi copy đúng giá trị `Voice` để đưa vào request API.
Gói miễn phí phù hợp cho test và prototype. Nếu dùng thương mại, phân phối lại hoặc cần quota lớn hơn, hãy liên hệ [email protected].