Αναφορά
API v1 — endpoints
GET/api/v1/voicesΚατάλογος φωνών: id, γλώσσα, φύλο, στυλ, άδεια, δείγμα
GET/api/v1/voices/{voice}/avatarAvatar φωνής (ανεβασμένη εικόνα ή παραγόμενο gradient)
GET/api/v1/languagesΥποστηριζόμενες γλώσσες: κωδικός, όνομα, βαθμίδα, αριθμός φωνών
POST/api/v1/ttsΣύνθεση ομιλίας → WAV ή MP3 (παράμετρος format)
POST/api/v1/tts_streamΣυνθετική ροή (chunked PCM) για χαμηλή καθυστέρηση — καθαρή ροή χωρίς post-effects και χωρίς mp3
POST/api/v1/voices/createΔημιούργησε μια φωνή: name, audio_b64 (≤10 MB base64), ref_text (=audio λέξη προς λέξη), consent="voice-data-consent,privacy", language? → voice id
GET/api/v1/voices/mineΟι δικές σου φωνές (δημιουργημένα clones + αγορασμένες): voice (slug), name, language, kind, sample_url — απαιτείται API key
POST/api/v1/transcribeΜεταγραφή ενός σύντομου αποσπάσματος: audio_b64, language? (πλήρες όνομα) → text. Η διάρκεια μετρά στο μηνιαίο όριο minutes μεταγραφής του πλάνου
GET/api/v1/statusΕτοιμότητα μηχανής (πράκτορες σε πραγματικό χρόνο): ready, model_ready, engine_up, latency_ms
POST/api/v1/warmupΠροθέρμανε τη μηχανή πριν από μια κλήση (χωρίς χρέωση χαρακτήρων)
GET /api/v1/voices — φίλτρα: q (αναζήτηση με όνομα/style), language (ru, en, de…), gender (male/female), limit (προεπιλογή 200, μέγιστο 500), offset. Πέρασε το πεδίο voice από την απάντηση στο POST /tts.
# GET /api/v1/voices?language=ru&gender=male&limit=200
{
"object": "list",
"total": 152,
"count": 152,
"voices": [
{
"voice": "de_at_f1",
"name": "Greta",
"language": "de-AT",
"gender": "female",
"style": "Jung",
"license": "commercial",
"badge": null, // null | "beta" | "soon" (soon = synthesis disabled)
"sample_url": "https://hancvoice.com/api/v1/voices/de_at_f1/sample", // permanent link, redirects to the current file
"avatar_url": "https://hancvoice.com/api/v1/voices/de_at_f1/avatar"
}
]
}
Άβαταρ & γλώσσες. Άβαταρ: 302 στην εικόνα ή σε μια SVG gradient — βάλ’ το απευθείας στο <img>. Γλώσσες: tier = main (ready) | beta | soon.
# GET /api/v1/languages — supported languages (code, name, tier, voice count)
{
"object": "list",
"total": 24,
"languages": [
{
"code": "de",
"name": "German",
"native_name": "Deutsch",
"tier": "main",
"voice_count": 32
}
]
}
# GET /api/v1/voices/{voice}/avatar → 302 to image, or a generated SVG. Use directly in <img src>.
<img src="https://hancvoice.com/api/v1/voices/de_at_f1/avatar" width="64" />
Πρόσβαση
Ταυτοποίηση
Όλα τα endpoints απαιτούν ένα API key: την κεφαλίδα X-API-Key: <key> ή Authorization: Bearer <key> (εκτός από GET /api/v1/voices, GET /api/v1/status, GET /api/v1/languages και GET /api/v1/voices/{voice}/avatar — open). Το κλειδί δημιουργείται στον λογαριασμό σου → στην ενότητα “API”; το API είναι διαθέσιμο από το Starter plan και πάνω (αλλιώς 403). Η σύνθεση χρεώνει χαρακτήρες στο πλάνο του κλειδιού — με μηδενικό υπόλοιπο επιστρέφει 402. Το rate limit είναι ανά πλάνο: Starter — 30 αιτήσεις/λεπτό, Pro — 120, Business — 300, Scale — 600 (fallback 60); αν το ξεπεράσεις → 429, η κεφαλίδα Retry-After.
POST /api/v1/tts
Παράμετροι
voiceID φωνής από το GET /api/v1/voices. ⚠️ Αν το πεδίο λείπει, η σύνθεση επιστρέφει στην προεπιλεγμένη φωνή (de_at_n1) και οι χαρακτήρες χρεώνονται κανονικά — πέρασε πάντα το ID ρητά.
textκείμενο προς φωνή; το μέγιστο μήκος εξαρτάται από το πλάνο του κλειδιού (απαιτείται)
languagede, en, ru, fr, es, it, pt, zh, ja, ko (επίσης de-DE, en-US …) και πλήρη ονόματα (German, English …). Επίσης Auto: η μηχανή ανιχνεύει τη γλώσσα από το κείμενο — ο μόνος τρόπος να συνθέσεις μια beta γλώσσα με τη δική σου φωνή.
instructσυναίσθημα/style στα Αγγλικά, π.χ. "calm, friendly" (προαιρετικό)
emotionσυναίσθημα studio-voice (για φωνές με ηχογραφημένες συναισθηματικές αναφορές): χαρούμενο, ενθουσιασμένο, τρυφερό, ήρεμο, λυπημένο, σοβαρό, τεταμένο, θυμωμένο, φοβισμένο, έκπληκτο (προαιρετικό· χωρίς την παράμετρο — ουδέτερο)
saturationκορεσμός/αρμονικό «χρωματισμό» του ηχοχρώματος (μεταεπεξεργασία): {"preset":"tube"|"tape"|"air","intensity":0–1} (προαιρετικό)
speedρυθμός ομιλίας 0.5–2.0 (προαιρετικό) Τιμές εκτός εύρους περικόπτονται στο πλησιέστερο όριο· η απάντηση τότε περιέχει X-Effects-Failed: speed_clamped_to_….
gain_dbένταση −24…+24 dB (προαιρετικό)
eqισοσταθμιστής ηχοχρώματος: {"bands":[{"hz":80,"db":4}, …]} (προαιρετικό)
effectπροεπιλογή ήχου: radio, audiobook, podcast, phone, cinematic, megaphone, vintage, deep, bright, warm, narrator_warm, intimate, spacious, whisper, concert; χαρακτήρες: robot, cartoon, chipmunk, monster, villain, echo_hall; studio: studio_announcer, studio_natural, studio_rich. Premium εφέ (characters, studio, cinematic, concert, megaphone, vintage) — μόνο στα επί πληρωμή πλάνα, αλλιώς αγνοούνται (προαιρετικό)
seedένας αριθμός για ντετερμινιστική επανάληψη του ίδιου voiceover (προαιρετικό)
cleantrue — νευρωνική αποθορυβοποίηση (ξεχωριστά από το effect, προαιρετικό)
backgroundφόντο/ατμόσφαιρα: rain, thunder, sea, forest, birds, wind, stream, night, street, cafe, crowd, fire (προαιρετικό)
bg_levelένταση φόντου 0.05–0.8 (προαιρετικό, προεπιλογή 0.25)
lead_silence_msσιωπή στην αρχή του ήχου, ms (προαιρετικό, για agents· προεπιλογή 0)
format"wav" (προεπιλογή) ή "mp3" (προαιρετικό)
response_formatΈξοδος τηλεφωνίας (B2B/IVR): g711_alaw_8k, g711_ulaw_8k, g722_16k, opus, pcm_s16le_24k. Η απάντηση είναι η ροή κωδικοποιητή + κεφαλίδα X-Audio-Format (προαιρετικό)
containerμόνο με response_format: wav (container, προεπιλογή) ή raw (ακατέργαστα frames για SIP/RTP) (προαιρετικό)
Η απάντηση είναι ένα δυαδικό αρχείο ήχου: audio/wav ή audio/mpeg (αν format=mp3)· για τηλεφωνικό response_format, το αντίστοιχο container του κωδικοποιητή (δείτε X-Audio-Format).
POST /api/v1/tts_stream
Σύνθεση streaming
Δέχεται voice, text, language, instruct, speed, gain_db, eq, effect, background, bg_level, saturation, seed και segments (έως 40 στοιχεία: text, instruct έως 200 χαρακτήρες, silence 0–3000 ms). Απάντηση: ακατέργαστο PCM — 24 kHz, 16-bit, μονοφωνικό, little-endian (application/octet-stream, chunked)· δεν υπάρχει WAV header, ορίστε εσείς το sample rate.
# POST /api/v1/tts_stream → PCM stream (application/octet-stream, chunked)
{
"voice": "de_at_f1",
"text": "Hallo! Das ist Streaming-Synthese.",
"language": "de"
}
POST /api/v1/voices/create
Δημιουργία φωνής
nameόνομα φωνής (απαιτείται)
audio_b64δείγμα ηχογράφησης σε base64, ≤10 MB (απαιτείται)
ref_textΑπομαγνητοφώνηση της ηχογράφησης — λέξη προς λέξη, μέγιστο 2000 χαρακτήρες (περισσότερο → 400 ref_text_too_long). Αν το κείμενο δεν ταιριάζει με τον ήχο, η φωνή ακούγεται παραμορφωμένη.
consentσυμβολοσειρά συναίνεσης — περάστε ακριβώς "voice-data-consent,privacy" (δεδομένα φωνής, GDPR); χωρίς αυτό — 400 (απαιτείται)
languageγλώσσα δείγματος, πλήρες όνομα (Russian, English…) ή κωδικός ISO· προεπιλογή German (προαιρετικό)
Περάστε το πεδίο voice από την απόκριση στο POST /tts. Η τιμή voice παρακάτω είναι ενδεικτικό παράδειγμα· το πραγματικό αναγνωριστικό προέρχεται από την απόκριση. Η δημιουργία δικής σας φωνής είναι διαθέσιμη σε επί πληρωμή πλάνο· ο αριθμός των δικών σας φωνών είναι απεριόριστος — η δημιουργία μίας κοστίζει 10.000 χαρακτήρες από το υπόλοιπό σας (η αποθήκευση και η χρήση της είναι δωρεάν).
# Response — 200 OK (voice value is an example)
{
"ok": true,
"voice": "usr_a1b2c3",
"name": "My voice",
"language": "German"
}
GET /api/v1/voices/mine
Οι δικές σας φωνές
Το GET /api/v1/voices επιστρέφει μόνο το δημόσιο κατάλογο. Για να δείτε ΤΙΣ ΔΙΚΕΣ ΣΑΣ φωνές — τόσο όσες δημιουργήθηκαν μέσω API όσο και όσες δημιουργήθηκαν στον λογαριασμό/στούντιό σας — κάντε αυθεντικοποίηση με το API key σας και καλέστε αυτό το endpoint. Επιστρέφει τα δικά σας κλώνους (kind="own") και φωνές που αγοράστηκαν στο Marketplace (kind="marketplace"). Περάστε το πεδίο voice (slug) στο POST /api/v1/tts.
# GET /api/v1/voices/mine — your own voices (API key required)
curl https://hancvoice.com/api/v1/voices/mine \
-H "X-API-Key: $HANCVOICE_KEY"
# Response — 200 OK
{
"object": "list",
"count": 1,
"voices": [
{
"voice": "usr_a1b2c3",
"name": "My voice",
"language": "German",
"gender": null,
"kind": "own",
"sample_url": "https://hancvoice.com/voice-samples/usr_a1b2c3.wav",
"avatar_url": "https://hancvoice.com/generated-audio/voice-avatars/usr_a1b2c3.webp"
}
]
}
Το gender είναι null για τις δικές σας φωνές (δεν αποθηκεύεται)· το sample_url μπορεί να είναι null αν δεν υπάρχει δείγμα. Όταν γίνεται σύνθεση με τη δική σας φωνή, η γλώσσα λαμβάνεται από τη φωνή και υπερισχύει της παραμέτρου language στο POST /tts.
Πλήρης ροή copy-paste — δημιουργία, λίστα, σύνθεση (αντικαταστήστε το παράδειγμα κλειδιού με το δικό σας από Account → API):
# Full own-voice flow — create → list (mine) → synthesize.
# Example key below — replace it with your own key from Account → API.
KEY="sk-live-9f3c1a7b4e2d8c6f0a5b3e1d7c9f2a4b6d8e0c1a3f5b7d9e"
# 1) Create your voice (skip if you already have one in your account)
curl -X POST https://hancvoice.com/api/v1/voices/create \
-H "X-API-Key: $KEY" -H "Content-Type: application/json" \
-d '{"name":"My voice","ref_text":"exact transcript of the recording","audio_b64":"<24kHz sample, base64>","consent":"voice-data-consent,privacy"}'
# → {"ok":true,"voice":"usr_a1b2c3","name":"My voice","language":"German"}
# 2) List your own voices → take the "voice" (slug)
curl https://hancvoice.com/api/v1/voices/mine -H "X-API-Key: $KEY"
# 3) Synthesize with your voice
curl -X POST https://hancvoice.com/api/v1/tts \
-H "X-API-Key: $KEY" -H "Content-Type: application/json" \
-d '{"voice":"usr_a1b2c3","text":"Hallo, das ist meine eigene Stimme.","language":"de"}' --output out.wav
POST /api/v1/transcribe
Απομαγνητοφώνηση
audio_b64ήχος σε base64· προορίζεται για σύντομο απόσπασμα (απαιτείται)
languageμόνο το ΠΛΗΡΕΣ όνομα της γλώσσας: Russian, English, German, French, Italian, Spanish, Portuguese, Chinese, Japanese, Korean — συν 14 beta γλώσσες (Bulgarian, Czech, Greek, Ukrainian, Polish και άλλες) ως υπόδειξη αναγνώρισης, και το κυριολεκτικό "auto" (οι κωδικοί ISO ΔΕΝ γίνονται δεκτοί εδώ, σε αντίθεση με το /tts· χωρίς την παράμετρο — αυτόματη ανίχνευση) (προαιρετικό)
Οι χαρακτήρες χρεώνονται ανά πλάνο (≈1 λεπτό ήχου = 1000 χαρακτήρες)· ισχύει το μηνιαίο όριο του πλάνου σε λεπτά απομαγνητοφώνησης.
# Response — language = vom Engine erkannter ISO-Code (z. B. de, en, ru)
{
"text": "Transkribierter Text des Fragments.",
"language": "de"
}
GET /api/v1/status · POST /api/v1/warmup
Κατάσταση και προθέρμανση
GET /api/v1/status (χωρίς κλειδί) — ετοιμότητα του κινητήρα για πραγματικό χρόνο. POST /api/v1/warmup (με κλειδί· δεν χρεώνει χαρακτήρες) προθερμαίνει τον κινητήρα πριν από μια σειρά κλήσεων.
# GET /api/v1/status
{
"ready": true,
"model_ready": true,
"engine_up": true,
"latency_ms": 42
}
# POST /api/v1/warmup
{
"ok": true,
"warmed": true,
"warm_ms": 318
}
Απόκριση
Κεφαλίδες και το πεδίο code
Content-Typeaudio/wav ή audio/mpeg (ανάλογα με την παράμετρο format)· για /tts_stream — application/octet-stream
X-Effects-Failedεφέ που ΔΕΝ εφαρμόστηκαν (στην μηχανή ή περικόπηκαν από το πλάνο), χωρισμένα με κόμματα — ο ήχος επιστρέφει χωρίς αυτά
X-CacheHIT / MISS — αν η απόκριση προήλθε από την κρυφή μνήμη. Σημείωση: με API key, ένα cache HIT χρεώνεται όπως ένα MISS (η κρυφή μνήμη εξοικονομεί χρόνο δημιουργίας, όχι χαρακτήρες).
Retry-Afterσε 429 — σε πόσα δευτερόλεπτα να γίνει νέα προσπάθεια του αιτήματος
Το πεδίο code στο σώμα σφάλματος (αναγνώσιμο από μηχανή): plan_required — χρειάζεται ανώτερο πλάνο· voice_limit — το όριο φωνών του πλάνου· plan_quota — το μηνιαίο όριο λεπτών μεταγραφής έχει εξαντληθεί· email_unverified — επαληθεύστε το email σας· voice_conflict — το όνομα της φωνής είναι ήδη σε χρήση (κατά τη δημιουργία φωνής).
Κωδικοί απόκρισης
Σφάλματα
200Επιτυχία — το σώμα της απόκρισης περιέχει το αρχείο ήχου
400Κατεστραμμένο JSON ή κενό κείμενο. Άγνωστη γλώσσα επιστρέφει το 4xx του engine (π.χ. 400) με κωδικό engine_bad_request — το ίδιο και στα /v1/tts και /v1/tts_stream
401Λείπει ή είναι άκυρο το API key (X-API-Key / Authorization header)
402Δεν υπάρχουν αρκετοί χαρακτήρες στο υπόλοιπο του κλειδιού — ανανεώστε το πλάνο
403Η λειτουργία δεν είναι διαθέσιμη στο τρέχον πλάνο (π.χ. API — από Starter, custom voice — από επί πληρωμή πλάνο) ή δεν υπάρχει πρόσβαση στη φωνή
409Σύγκρουση (voice_conflict): μια φωνή με αυτό το όνομα υπάρχει ήδη — επιλέξτε άλλο όνομα κατά τη δημιουργία φωνής
413Το αρχείο είναι πολύ μεγάλο: για custom voice ο ήχος είναι >10 MB (base64)
429Υπέρβαση ορίου ρυθμού (ανά πλάνο: Starter 30, Pro 120, Business 300, Scale 600 ανά λεπτό· /voices/create 5/min, /warmup 20/min). Τηρήστε την κεφαλίδα Retry-After. Κωδικός: rate_limited.
500Εσωτερικό σφάλμα (π.χ. η βάση δεδομένων δεν είναι διαθέσιμη στο GET /v1/voices) — δοκιμάστε ξανά αργότερα.
502Ο engine σύνθεσης/μεταγραφής δεν απάντησε (Bad Gateway) — περιμένετε λίγο και δοκιμάστε ξανά
503Ο engine κοιμάται/δεν είναι διαθέσιμος ή η υπηρεσία είναι υπερφορτωμένη — δοκιμάστε ξανά σε λίγα δευτερόλεπτα
Το σώμα του σφάλματος είναι JSON { "error": "description", "code": "machine-readable" }. Πιθανές τιμές code: auth_required, plan_required, rate_limited, no_credits, voice_create_credits, bad_request, empty_text, text_too_long, ref_text_too_long, name_too_long, voice_limit, voice_conflict, voice_access, plan_quota, no_audio, engine_busy, engine_unavailable, engine_error, billing_unavailable, temporarily_unavailable. Σε αποτυχία δεν χρεώνονται χαρακτήρες — εκτός αν ο πελάτης διακόψει ένα stream (ο ήχος που παραδόθηκε χρεώνεται αναλογικά).
Όλοι οι κωδικοί σφάλματος
Πλήρης λίστα μηχανικών κωδικών στο πεδίο code: auth_required (401) · plan_required (403, API από Starter) · text_too_long, bad_request, name_required, ref_text_required, ref_text_too_long, name_too_long, audio_b64_required, consent_required, voice_required (400) · voice_access · voice_not_found (404) · no_credits (402) · body_too_large, audio_too_large (413) · rate_limited (429, με Retry-After) · engine_bad_request (engine 4xx) · engine_error, engine_unavailable, engine_not_configured, temporarily_unavailable, mp3_failed, telephony_failed, transcribe_failed (5xx) · client_abort (499, ο πελάτης διέκοψε τη σύνδεση).
Λεπτομέρειες
Πρακτικές λεπτομέρειες που είναι εύκολο να σας ξεφύγουν: το σώμα του αιτήματος περιορίζεται σε 2 MB για τα /v1/tts και /v1/tts_stream (αλλιώς 413) και σε base64 30 MB για το /v1/transcribe · το speaker είναι συνώνυμο του voice · ο δείκτης παύσης ‖ (U+2016) που τοποθετείται στο κείμενο δίνει ακριβώς 400 ms σιωπής · το instruct περικόπτεται σιωπηλά σε 500 χαρακτήρες και το lead_silence_ms περιορίζεται σε 5000 · χωρίς seed χρησιμοποιείται η τιμή 4242, ώστε η έξοδος να είναι αναπαραγώγιμη από προεπιλογή (αλλάξτε μόνοι σας το seed αν θέλετε διαφοροποίηση) · χωρίς language θεωρείται τα Γερμανικά · το GET /v1/languages δέχεται ?locale · το όριο ρυθμού μετράται ξεχωριστά ανά endpoint· τα δικά του όρια: /voices/create 5/min, /warmup 20/min, /voices/mine 60/min, ανοιχτά GET endpoints 120/min ανά IP · το POST /v1/voices/clone είναι ψευδώνυμο του /voices/create.
Κατάλογος
Εφέ και φόντα
Η παράμετρος effect — μία προεπιλογή ανά αίτημα. Τα δωρεάν είναι διαθέσιμα σε όλους· τα premium — σε επί πληρωμή πακέτα.
Παράδοση (δωρεάν)radio — ξηρή μετάδοση · audiobook — audiobook · narrator_warm — θερμός αφηγητής · podcast — podcast · phone — τηλέφωνο · intimate — κοντινό · spacious — ευρύ · whisper — ψίθυρος · deep — πιο χαμηλό · bright — πιο φωτεινό · warm — πιο θερμό
Στούντιο (premium)studio_announcer — εκφωνητής μετάδοσης · studio_natural — φυσικό στούντιο · studio_rich — πλούσιο «ακριβό» · cinematic — κινηματογραφικό · concert — αίθουσα · megaphone — μεγαφωνο · vintage — vintage
Χαρακτήρες (premium)robot — ρομπότ · cartoon — καρτουνίστικο · chipmunk — chipmunk · monster — τέρας · villain — κακός · echo_hall — αίθουσα ηχούς
Φόντα (φόντο)Φύση: rain (βροχή) · thunder (καταιγίδα) · sea (θάλασσα) · forest (δάσος) · birds (πουλιά) · wind (αέρας) · stream (ρυάκι) · night (νύχτα). Πόλη: street (δρόμος) · cafe (καφέ) · crowd (πλήθος). Ζεστό: fire (τζάκι). Ένταση — bg_level 0.05–0.8
eq (ηχόχρωμα)8 ζώνες: 80, 160, 300, 600, 1500, 3500, 6500, 10500 Hz, καθεμία −12…+12 dB. Παράδειγμα: {"bands":[{"hz":80,"db":-4},{"hz":3500,"db":3}]} — αφαιρέστε το βούισμα, προσθέστε καθαρότητα
Ποσοστώσεις
Όρια
Ρυθμός αιτημάτωνανάλογα με το πλάνο του κλειδιού: Starter — 30/λεπτό, Pro — 120/λεπτό, Business — 300/λεπτό, Scale — 600/λεπτό. Τερματικά με δικό τους σκληρό όριο, ανεξάρτητα από το πλάνο: POST /v1/voices/create — 5/λεπτό, POST /v1/warmup — 20/λεπτό, GET /v1/status — 60/λεπτό ανά IP, GET /v1/voices — 120/λεπτό ανά IP.
Μήκος κειμένουοι μέγιστοι χαρακτήρες ανά POST /api/v1/tts εξαρτώνται από το πλάνο του κλειδιού
Υπόλοιπο χαρακτήρωνη σύνθεση χρεώνει χαρακτήρες στο πλάνο του κλειδιού· με μηδενικό υπόλοιπο — 402
Απομαγνητοφώνηση≈1 λεπτό ήχου = 1000 χαρακτήρες· ισχύουν οι μηνιαίες μονάδες του πλάνου: Pro 100, Business 300, Scale 800 λεπτά. Τα Free και Starter ΔΕΝ περιλαμβάνουν απομαγνητοφώνηση — το API απαντά 403 (plan_required). Εξαντλημένη ποσόστωση → 403 (plan_quota).
Μέγεθος αρχείουδημιουργία φωνής: δείγμα ≤10 MB (base64), αλλιώς 413
Παράδειγμα
Πλήρες αίτημα
POST /api/v1/tts
{
"voice": "cml_de",
"text": "Heute ist das Wetter wunderbar.",
"language": "de",
"instruct": "calm, friendly",
"speed": 1.0,
"effect": "podcast",
"eq": { "bands": [ { "hz": 3500, "db": 3 } ] },
"background": "rain",
"bg_level": 0.2,
"format": "mp3"
}
→ 200 OK, Content-Type: audio/mpeg (binary file)