AgileTTS

La voce sovrana della suite Agile: testo → audio in italiano, clonazione della voce con consenso tracciato. I dati non lasciano mai l'Unione Europea; nessun fornitore esterno parla al posto nostro senza dirlo.

API OpenAI-compatibilechiavi per prodotto e per tenantstreamingmisura d'uso

Per chi è

AgileTTS parla al posto di un prodotto quando serve una voce italiana naturale e i dati non possono uscire dall'Unione Europea:

Chi deve integrare parte dalla documentazione API; chi deve valutare il servizio parte dai piani qui sotto.

Piani e licenze

Una licenza per azienda: dentro la licenza stanno le chiavi (una per prodotto), gli ambiti che possono usare, la quota e il ritmo concordati. I prezzi li stabilisce Agile Software caso per caso — questa pagina non pubblica cifre.

PianoAmbitiQuota mensile di caratteriLimite al minutoDurataPrezzo
provaspeech, stream, voices con tetti bassiridotta, quanto basta per valutareridottoscadenza obbligatoria: dopo, la chiave risponde 403 KEY_EXPIREDsu richiesta
standardspeech, stream, voices; una chiave per prodotto, rotazione e revocaconcordata nel piano dell'aziendaconcordato nel piano dell'aziendaconcordata, rinnovabilesu richiesta
enterprisecome standard, più console per l'azienda, utenti e audit delle operazioniconcordata, con il consumo del mese in consoleconcordato per azienda, non per singola chiaveconcordata, rinnovabilesu richiesta

Quota e ritmo sono i due tetti del piano dell'azienda: li scrive la regia, l'amministratore dell'azienda li legge insieme al consumo del mese, e sono lo stesso numero su cui il servizio rifiuta (429 QUOTA_EXCEEDED, 429 RATE_LIMIT). Un rifiuto resta un rifiuto: nessun ripiego silenzioso verso terzi.

Richiedi una licenza

Il modulo arriva alla regia di Agile Software, che risponde con piano, tetti e chiave. Niente carta di credito e niente attivazione da soli: una licenza la rilascia una persona.

Quanto teniamo questi dati: una richiesta avvisata alla regia si cancella 180 giorni dopo l'avviso, il fatto di una richiesta rifiutata dal campo trappola 30 giorni dopo, e una richiesta non ancora avvisata non si cancella mai — il giro sul box conta e registra ogni cancellazione, senza l'email.

Stato del servizio

lettura in corso…

La pagina legge GET /health del fronte dal tuo browser, senza librerie e senza intermediari: se il servizio non risponde lo dice, e non mostra nulla di inventato. Un 503 è una risposta, non un buco: durante un ridispiego il fronte dichiara la chiusura e dice quando riprovare.

Perché noi

Il riferimento di mercato di AgileTTS è ElevenLabs, che è anche ciò che i prodotti usano oggi. I nostri numeri qui sotto sono misure del repository, ognuna col file che le ha prodotte e la data; la colonna del leader è misura in attesa della chiave del caveau: la copia con ambito nostro (agiletts__elevenlabs__api_key) è bloccata dal 21/9 e sul box manca lo strumento per leggerla, quindi il braccio elevenlabs del banco non ha ancora corso. Un numero non misurato non si scrive.

Cosa si confrontaAgileTTS — misura e fonteElevenLabs
Pronuncia italiana (importi, date, sigle, POD, IBAN)241 casi su 241, 0 errori — banco/lessico/verifica_lessico.py --autoprova, misura del 30/9/2026misura in attesa della chiave del caveau
Il servizio non cambia l'audio del motorestessi byte del motore su blocco e streaming; il sovrappiù del servizio è 10,7 ms p50 in blocco e 3,2 ms in streaming — banco/tts/prova_parita_fronte_motore.py (36/36), misura del 29/9/2026misura in attesa della chiave del caveau
Rifiuto onesto quando la coda è pienail 503 arriva prima del primo byte con Retry-After: 0 stream troncati e 0 errori su 40 prove — banco/tts/prova_carico_fronte.py §F, misura del 29/9/2026misura in attesa della chiave del caveau
Un riavvio del servizio non butta via chi sta parlando3 telefonate su 3 ricevono l'audio (erano 0 su 3), indirizzo muto 0,25 s — banco/tts/capienza_chiusura.py, misura del 30/9/2026 in docs/NOVITA.mdmisura in attesa della chiave del caveau
I testi detti non restano da nessuna parte0 tracce su 9 file del disco del fronte, 26 vie sondate con 12 aghi (giornale compreso) — fronte/prova_ritenzione.py, misura del 29/9/2026misura in attesa della chiave del caveau
Tre conversazioni insieme sopra il tempo realenon ancora: sul motore vero il fattore di tempo reale è 1,41 a una conversazione e 2,83 a tre — docs/OBIETTIVI.md ob. 3, misura del 21/9/2026. L'obiettivo è aperto e il numero sta scritto dove si vedemisura in attesa della chiave del caveau

Le differenze che non hanno bisogno di un banco — si verificano leggendo il repository, non a parole:

Come si usa

Endpoint https://api.agiletts.agile.software. Chiave nell'intestazione Authorization: Bearer ats_… (o X-Api-Key). Il corpo è quello di OpenAI /v1/audio/speech.

curl https://api.agiletts.agile.software/v1/audio/speech \
  -H "Authorization: Bearer $AGILETTS_KEY" -H "Content-Type: application/json" \
  -d '{"model":"agiletts","input":"Buongiorno, come posso aiutarla?","voice":"serena","response_format":"wav"}' \
  -o saluto.wav

Con il client OpenAI ufficiale basta cambiare base_url e la chiave:

from openai import OpenAI
client = OpenAI(base_url="https://api.agiletts.agile.software/v1", api_key=AGILETTS_KEY)
with client.audio.speech.with_streaming_response.create(model="agiletts", voice="serena",
        input="Il corso dura sei mesi.", response_format="pcm") as r:
    r.stream_to_file("frase.pcm")   # pcm = 24 kHz, 16 bit, mono

Endpoint

Metodo e percorsoCosa fa
POST /v1/audio/speechmodel = agiletts, input (≤ 2000 caratteri), voice, response_format = wav | pcm (24 kHz) | pcm16k (telefonia) | mp3, speed 0,5–2,0, stream: true per ricevere l'audio a pezzi mentre si sintetizza (solo pcm/pcm16k)
GET /v1/modelsi modelli disponibili
GET /v1/voicesle voci che la chiave può usare (id, lingua, ritmo)
GET /v1/usagei consumi della propria chiave: richieste, caratteri, millisecondi, audio prodotto — mai i testi
GET /healthstato del fronte e del motore

Errori

HTTPcodicesignificato
401KEY_MISSING, KEY_INVALIDchiave assente o sconosciuta
403KEY_REVOKED, SCOPE_NOT_ALLOWEDchiave revocata o senza il permesso (speech, stream, voices)
404UNKNOWN_VOICE, UNKNOWN_MODELvoce o modello non esistenti
413TEXT_TOO_LONGoltre 2000 caratteri
429RATE_LIMIT, QUOTA_EXCEEDEDtroppe richieste al minuto o quota mensile di caratteri esaurita
503BUSY, ENGINE_DOWNmotore occupato o non disponibile: Retry-After dice quando riprovare. Nessun ripiego silenzioso verso terzi.

Regole

Per chi integra

Per spostare un prodotto sul fronte — uno alla volta, col «vai» del titolare e il rollback pronto — la guida passo passo è in docs/ADOZIONE.md. Per chi preferisce la riga di comando c'è client/agiletts-cli.py, il client in pura libreria standard: sintesi su file, lettura di modelli, voci e uso della propria chiave.