Đăng nhập trang tài khoản → tab Tài khoản → mục 🔌 Khoá API cho lập trình viên → bấm Tạo khoá mới.
Khoá có dạng tsv_xxxxxxxx… và chỉ hiện đúng một lần — hãy lưu lại ngay.
Mỗi tài khoản giữ tối đa 5 khoá; xoá khoá cũ bất cứ lúc nào.
Mọi lệnh gọi đều gửi kèm khoá ở header:
Authorization: Bearer tsv_xxxxxxxx…
Hoặc dùng header x-api-key: tsv_xxxxxxxx… — cái nào cũng được.
POST /ttsVí dụ nhanh bằng curl, lưu thẳng ra file MP3:
curl -X POST "https://idnfafxgrbabypfokgve.supabase.co/functions/v1/api/tts" \
-H "Authorization: Bearer tsv_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"text":"Xin chào, đây là Tân Seven Voice.","voice":"Minh Đức","lang":"vi","response":"binary"}' \
--output giong.mp3
| Tên | Bắt buộc | Ý nghĩa |
|---|---|---|
text | Có | Nội dung cần đọc. Tối đa 200.000 ký tự mỗi lần gọi. Tiếng Việt: số, ngày tháng, giờ, tiền được đọc thành chữ tự động. |
voice | Không | Tên giọng, VD "Minh Đức". Mặc định Minh Đức.
Xem đủ 68 giọng ở mục 3. |
lang | Không | Mã ngôn ngữ của giọng: vi, en,
zh, ja, e (Tây Ban Nha), p (Bồ), f (Pháp),
i (Ý), h (Hindi). Mặc định vi. |
speed | Không | Tốc độ đọc, 0.5 – 1.5. Mặc định 1.0. |
format | Không | mp3 (mặc định) hoặc wav. |
response | Không | binary = trả thẳng file audio.
Bỏ trống = trả JSON có audio_base64. |
voice_id | Không | Dùng giọng nhân bản của chính bạn (lấy id ở
tab Nhân bản giọng nói). Có tham số này thì voice bị bỏ qua. |
style | Không | Chỉ cho giọng nhân bản — cảm xúc đọc, VD
"📖 Kể chuyện". |
{
"audio_base64": "SUQzBAAAAAAA…",
"format": "mp3",
"cost": 41,
"credits": 9764,
"seconds": 3.85,
"voice": "Minh Đức"
}
cost — số ký tự lần gọi này tiêu tốn (đúng bằng độ dài text).credits — số ký tự còn lại trong tài khoản sau khi trừ.seconds — độ dài audio tạo ra.Nếu gửi "response":"binary", kết quả là file audio thô; số liệu nằm ở header
X-Cost và X-Credits-Remaining.
GET /voicesTrả về đủ 68 giọng kèm ngôn ngữ, thể loại, giới tính/vùng miền. Không tốn ký tự, không cần khoá.
curl "https://idnfafxgrbabypfokgve.supabase.co/functions/v1/api/voices"
{
"total": 68,
"voices": [
{ "name": "Minh Đức", "lang": "vi", "genre": "📰 Tin tức", "info": "Nam · Bắc" },
{ "name": "Ngọc Linh", "lang": "vi", "genre": "📖 Kể chuyện", "info": "Nữ · Bắc" },
…
]
}
GET /mecurl "https://idnfafxgrbabypfokgve.supabase.co/functions/v1/api/me" \
-H "Authorization: Bearer tsv_xxxxxxxx"
{ "credits": 9764, "name": "Tân" }
import requests
API = "https://idnfafxgrbabypfokgve.supabase.co/functions/v1/api"
KEY = "tsv_xxxxxxxx" # để trong biến môi trường, đừng viết thẳng vào code
r = requests.post(f"{API}/tts",
headers={"Authorization": f"Bearer {KEY}"},
json={
"text": "Chào mừng bạn đến với kênh của Tân Seven.",
"voice": "Ngọc Linh",
"lang": "vi",
"speed": 1.0,
"response": "binary",
}, timeout=300)
r.raise_for_status()
open("giong.mp3", "wb").write(r.content)
print("Còn lại:", r.headers.get("X-Credits-Remaining"), "ký tự")
Một lần gọi nhận tối đa 200.000 ký tự, nhưng bài càng dài thì càng lâu và dễ hết thời gian chờ. Cách chạy êm nhất: cắt thành đoạn ~1.000 ký tự, gọi 2–3 đoạn song song rồi ghép file lại — giống hệt cách trang web đang làm.
| Mã | Nghĩa | Nên làm gì |
|---|---|---|
401 | Thiếu khoá, khoá sai hoặc đã bị xoá | Kiểm tra lại header Authorization |
402 | Hết ký tự trong tài khoản | Nạp thêm ở trang tài khoản |
429 | Gọi quá nhanh (giới hạn 60 lần/phút · 600 lần/giờ · 2.000 lần/ngày) | Chờ số giây ghi ở retry_after rồi gọi lại |
202 | Máy chủ đang khởi động (khoảng 1 phút đầu) | Chờ ~60 giây rồi gọi lại — không bị trừ ký tự |
502 | Máy chủ giọng lỗi | Gọi lại; ký tự đã được hoàn tự động |
/voices và /me miễn phí.