Tài liệu API
Tạo API key ở trang API keys. Mỗi ký tự tốn 1 đến 5 credit tuỳ ngôn ngữ (xem mục Ngôn ngữ); credit được hoàn lại nếu tạo audio thất bại.
Dành cho AI agent
Ba cách tích hợp, chọn cách agent của bạn hỗ trợ. Đọc tự động: /llms.txt (hướng dẫn cho LLM) và /api/v1/openapi.json (OpenAPI 3.1).
1. MCP server
URL https://voicewrap247.com/api/mcp. Tool: list_voices, text_to_speech, get_job, dub_media, get_dubbing, get_balance. Xác thực bằng OAuth (đăng nhập, không cần key) hoặc API key. Tool list_voices và text_to_speech nhận trường language tuỳ chọn (xem mục Ngôn ngữ). dub_media lồng tiếng một file video/audio từ source_url công khai, get_dubbing lấy tiến độ và file kết quả (xem mục Lồng tiếng).
Claude.ai / Claude Desktop: không cần API key
- Settings → Connectors → Add custom connector.
- Đặt tên VoiceWrap, dán URL
https://voicewrap247.com/api/mcp, bấm Add. - Bấm Connect, đăng nhập Google và chọn Cho phép. Ngắt kết nối ở mục API keys & kết nối.
Các client khác dùng API key:
claude mcp add --transport http voicewrap https://voicewrap247.com/api/mcp \ --header "Authorization: Bearer sk_live_..."
{
"mcpServers": {
"voicewrap": {
"url": "https://voicewrap247.com/api/mcp",
"headers": { "Authorization": "Bearer sk_live_..." }
}
}
}{
"mcpServers": {
"voicewrap": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://voicewrap247.com/api/mcp",
"--header", "Authorization: Bearer sk_live_..."]
}
}
}2. SDK OpenAI (đổi base_url)
from openai import OpenAI
client = OpenAI(api_key="sk_live_...", base_url="https://voicewrap247.com/api/v1")
client.audio.speech.create(
model="voicewrap", voice="Ngọc Huyền", input="Xin chào!"
).write_to_file("speech.mp3")import OpenAI from "openai";
const client = new OpenAI({ apiKey: "sk_live_...", baseURL: "https://voicewrap247.com/api/v1" });
const res = await client.audio.speech.create({ model: "voicewrap", voice: "nova", input: "Xin chào!" });
await fs.promises.writeFile("speech.mp3", Buffer.from(await res.arrayBuffer()));3. REST API
Xem các mục bên dưới.
Xác thực
Authorization: Bearer sk_live_...
Giới hạn 30 request/phút cho mỗi tài khoản. Văn bản tối đa 5.000 ký tự mỗi request.
Tương thích OpenAI: POST /api/v1/audio/speech
Cùng định dạng với OpenAI. Trả về thẳng file audio; văn bản dài được chờ tới khi xong (tối đa khoảng 4,5 phút). Trường model được bỏ qua. Trường tuỳ chọn language là phần mở rộng của VoiceWrap (xem mục Ngôn ngữ).
curl https://voicewrap247.com/api/v1/audio/speech \
-H "Authorization: Bearer $VOICEWRAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input": "Xin chào, đây là VoiceWrap.", "voice": "Ngọc Huyền", "response_format": "mp3"}' \
--output speech.mp3Tên giọng OpenAI cũng dùng được. Với tiếng Việt: alloy → Ngọc Huyền, ash → Minh Triết, ballad → Ngọc Linh, coral → Thùy Dung, echo → Hải Đăng, fable → Thiện Minh, nova → Mai Anh, onyx → Thiền Tâm Đức, sage → Quỳnh Anh, shimmer → Trúc Ly, verse → Thanh Bình. Với ngôn ngữ khác, mỗi tên ứng với một giọng bản xứ cùng giới tính.
Tạo giọng nói (job): POST /api/v1/tts
Trả về job kèm link audio (hết hạn sau 1 giờ). Tới 500 ký tự trả về ngay (200); dài hơn, hoặc gửi "async": true, trả về 202, sau đó hỏi lại GET /api/v1/tts/:id mỗi 2–5 giây.
curl https://voicewrap247.com/api/v1/tts \
-H "Authorization: Bearer $VOICEWRAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "Giá gói Pro là 100.000 đồng.", "voice": "Hải Đăng", "speed": 1.0, "format": "mp3"}'{
"id": "f0b2...",
"status": "succeeded", // queued | running | succeeded | failed
"progress": 1, // 0..1 khi đang chạy
"queue_position": null, // số job phía trước nếu đang xếp hàng
"language": "vi", // ngôn ngữ đọc; nếu không gửi thì theo giọng hoặc tự nhận diện
"audio_url": "https://...", // nghe, hết hạn sau 1 giờ
"download_url": "https://...", // tải file
"duration_seconds": 3.4,
"chars": 28, // số ký tự của văn bản
"cost": 28 // credit đã trừ: ký tự × hệ số ngôn ngữ
}Ngôn ngữ
API đọc 11 ngôn ngữ. Mỗi giọng có sẵn là người bản xứ và chỉ đọc ngôn ngữ của mình; giọng bạn clone đọc được mọi ngôn ngữ trong số đó. Gửi trường tuỳ chọn language (mã ISO 639-1) ở POST /api/v1/tts, POST /api/v1/audio/speech (phần mở rộng của VoiceWrap so với định dạng OpenAI) và tool MCP text_to_speech. Bỏ trống thì giọng có sẵn quyết định ngôn ngữ; với giọng clone hoặc khi không chọn giọng, ngôn ngữ được nhận diện từ văn bản, và nếu không chọn giọng thì dùng giọng mặc định của ngôn ngữ đó (danh sách dưới). Số, phần trăm, tiền tệ được đọc thành chữ theo cách của từng ngôn ngữ.
Các mã được hỗ trợ, kèm giọng mặc định:
viTiếng Việt · Hải ĐăngenEnglish · Emmazh中文 · Vivianja日本語 · Annako한국어 · SoheefrFrançais · CamilledeDeutsch · LenaesEspañol · LucíaitItaliano · GiuliaptPortuguês · BeatrizruРусский · Natasha
Mã khác (kể cả ngôn ngữ nhận diện được từ văn bản) trả về 400 unsupported_language. Dùng giọng có sẵn với language khác ngôn ngữ của giọng trả về 400 voice_language_mismatch, kèm danh sách giọng của ngôn ngữ đó.
Số credit mỗi ký tự tuỳ ngôn ngữ đọc: cost = số ký tự × hệ số (nhiều dấu cách liền nhau tính một ký tự). Mỗi chữ Trung, Nhật, Hàn là cả một âm tiết nên tốn nhiều hơn.
| Credit / ký tự | Ngôn ngữ |
|---|---|
| ×1 | vi Tiếng Việt |
| ×2 | en English, fr Français, de Deutsch, es Español, it Italiano, pt Português, ru Русский |
| ×5 | zh 中文, ja 日本語, ko 한국어 |
curl https://voicewrap247.com/api/v1/tts \
-H "Authorization: Bearer $VOICEWRAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "こんにちは、VoiceWrap です。", "voice": "Anna", "language": "ja"}'curl https://voicewrap247.com/api/v1/audio/speech \
-H "Authorization: Bearer $VOICEWRAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input": "Hello from VoiceWrap.", "voice": "nova", "language": "en"}' \
--output hello.mp3client.audio.speech.create(
model="voicewrap", voice="nova", input="Hello from VoiceWrap.",
extra_body={"language": "en"}, # language là phần mở rộng của VoiceWrap nên gửi qua extra_body
).write_to_file("hello.mp3")Giọng: GET /api/v1/voices
Truyền voice bằng tên (có dấu hoặc không, ví dụ "ngoc-huyen"), id, hoặc tên giọng OpenAI. Bỏ trống thì dùng giọng mặc định của ngôn ngữ. Thêm ?language=ja để chỉ lấy các giọng đọc ngôn ngữ đó (kèm giọng bạn clone). Mỗi giọng có language (null với giọng clone, vốn đọc được mọi ngôn ngữ) và gender.
curl "https://voicewrap247.com/api/v1/voices?language=vi" -H "Authorization: Bearer $VOICEWRAP_API_KEY"
{ "voices": [ { "id": "...", "name": "Ngọc Huyền", "key": "ngoc-huyen",
"description": "Nữ · Miền Bắc · Tự nhiên", "type": "system",
"language": "vi", "gender": "female",
"preview_url": "https://..." } ] }Clone giọng: POST /api/v1/voices
3 đến 15 giây giọng nói rõ, kèm lời đọc chính xác. Chỉ dùng giọng của bạn hoặc người đã đồng ý.
curl https://voicewrap247.com/api/v1/voices \ -H "Authorization: Bearer $VOICEWRAP_API_KEY" \ -F name="Giọng của tôi" \ -F ref_text="Nội dung chính xác của đoạn ghi âm" \ -F consent=true \ -F file=@sample.wav
Lồng tiếng: POST /api/v1/dubbing
Lồng tiếng video hoặc audio sang ngôn ngữ khác: lời nói được chép lại, dịch và đọc từng câu bằng ngôn ngữ đích, rồi ghép lên nền gốc (giữ nhạc và hiệu ứng). Kết quả gồm MP4 đã lồng tiếng (với video), MP3 và phụ đề SRT đã dịch. Giá 20.000 credit mỗi phút của file gốc, tính theo giây, tối thiểu 1 phút mỗi file; tối đa 15 phút; job lỗi được hoàn credit.
1. Tải file lên
POST /api/v1/dubbing/uploads với tên, loại và dung lượng file (tối đa 50 MB) trả về upload_url đã ký; PUT file lên đó (kèm Content-Type), rồi dùng upload_path ở bước 2. Với file công khai hoặc lớn hơn, bỏ qua bước này và gửi source_url.
curl https://voicewrap247.com/api/v1/dubbing/uploads \
-H "Authorization: Bearer $VOICEWRAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"filename": "intro.mp4", "content_type": "video/mp4", "size": 18874368}'
{ "upload_path": "…/source.mp4", "upload_url": "https://…", "token": "…" }
curl -X PUT "$UPLOAD_URL" -H "Content-Type: video/mp4" --data-binary @intro.mp42. Tạo job
POST /api/v1/dubbing trả về 202 kèm job. Gửi đúng một trong hai: upload_path hoặc source_url.
curl https://voicewrap247.com/api/v1/dubbing \
-H "Authorization: Bearer $VOICEWRAP_API_KEY" \
-H "Content-Type: application/json" \
-d @- <<'EOF'
{
"upload_path": "…/source.mp4", // từ bước 1 (hoặc source_url)
"source_name": "intro.mp4", // tuỳ chọn, tên hiển thị
"target_language": "en", // ngôn ngữ lồng tiếng
"source_language": "vi", // tuỳ chọn; tự nhận diện
"voice": "clone", // "clone" hoặc tên/id giọng
"consent": true // bắt buộc với "clone"
}
EOF"voice": "clone" (mặc định) giữ giọng người nói và cần "consent": true: bạn xác nhận có quyền sử dụng giọng nói của người trong file. Hoặc gửi tên/id một giọng có sẵn đọc ngôn ngữ đích (GET /api/v1/voices?language=...), hay một giọng bạn đã clone.
3. Hỏi kết quả
Hỏi GET /api/v1/dubbing/:id mỗi 5–10 giây tới khi status là succeeded hoặc failed; mỗi job mất vài phút. Link file đã ký, hết hạn sau 1 giờ; gọi lại để lấy link mới. GET /api/v1/dubbing liệt kê 20 job gần nhất (không kèm lines).
curl https://voicewrap247.com/api/v1/dubbing/8c1e... -H "Authorization: Bearer $VOICEWRAP_API_KEY"
{
"id": "8c1e...",
"status": "succeeded", // queued | running | succeeded | failed
"progress": 1, // 0..1
"source_name": "intro.mp4",
"is_video": true,
"source_language": "vi",
"target_language": "en",
"voice": "clone",
"duration_seconds": 92.4,
"cost": 30800, // credit đã trừ, theo giây
"files": { // link đã ký, hết hạn sau 1 giờ
"video": "https://...", // MP4, null với audio
"audio": "https://...", // MP3
"subtitles": "https://..." // SRT đã dịch
},
"lines": [ // từng câu: gốc và bản dịch
{ "start": 0.4, "end": 3.1, "text": "Xin chào các bạn", "translation": "Hi everyone" }
],
"error": null,
"created_at": "2026-10-25T08:00:00Z",
"finished_at": "2026-10-25T08:03:12Z"
}Giới hạn: tải lên tối đa 50 MB, file dài tối đa 15 phút, 20 job mỗi giờ. Mã lỗi riêng: 400 consent_required, unreadable_media, too_long; 404 upload_not_found; 502 dubbing_failed (credit đã được hoàn).
Mã lỗi
{ "error": { "code": "insufficient_credits", "message": "..." } }- 400
invalid_request(ví dụ thiếu trường hoặc giá trị không hợp lệ) - 400
unsupported_language(mã ngoài 11 ngôn ngữ, kể cả ngôn ngữ nhận diện từ văn bản) - 400
voice_language_mismatch(giọng có sẵn vớilanguagekhác; thông báo kèm danh sách giọng của ngôn ngữ đó) - 401
invalid_api_key,unauthorized - 402
insufficient_credits - 404
voice_not_found(kèm danh sách giọng),job_not_found - 429
rate_limited - 400
consent_required,unreadable_media,too_long, 404upload_not_found, 502dubbing_failed(Lồng tiếng) - 502
synthesis_failed(credit đã được hoàn) - 504
still_running(chỉ ở /audio/speech; hỏi lại job theo id)