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:
- Centralini e risposte al telefono — formato telefonico e
stream: true: il primo pezzo di audio parte mentre la frase si sta ancora sintetizzando. - Avatar e video parlanti — traccia audio da sincronizzare con le labbra, stesso motore e stesse voci del telefono.
- Corsi, e-learning, notifiche vocali — testi lunghi letti interi, spezzati sulle pause e ricuciti dal servizio.
- Accessibilità e lettura di documenti — lessico italiano corretto su importi, date, sigle, POD e IBAN.
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.
| Piano | Ambiti | Quota mensile di caratteri | Limite al minuto | Durata | Prezzo |
|---|---|---|---|---|---|
prova | speech, stream, voices con tetti bassi | ridotta, quanto basta per valutare | ridotto | scadenza obbligatoria: dopo, la chiave risponde 403 KEY_EXPIRED | su richiesta |
standard | speech, stream, voices; una chiave per prodotto, rotazione e revoca | concordata nel piano dell'azienda | concordato nel piano dell'azienda | concordata, rinnovabile | su richiesta |
enterprise | come standard, più console per l'azienda, utenti e audit delle operazioni | concordata, con il consumo del mese in console | concordato per azienda, non per singola chiave | concordata, rinnovabile | su 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 confronta | AgileTTS — misura e fonte | ElevenLabs |
|---|---|---|
| Pronuncia italiana (importi, date, sigle, POD, IBAN) | 241 casi su 241, 0 errori — banco/lessico/verifica_lessico.py --autoprova, misura del 30/9/2026 | misura in attesa della chiave del caveau |
| Il servizio non cambia l'audio del motore | stessi 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/2026 | misura in attesa della chiave del caveau |
| Rifiuto onesto quando la coda è piena | il 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/2026 | misura in attesa della chiave del caveau |
| Un riavvio del servizio non butta via chi sta parlando | 3 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.md | misura in attesa della chiave del caveau |
| I testi detti non restano da nessuna parte | 0 tracce su 9 file del disco del fronte, 26 vie sondate con 12 aghi (giornale compreso) — fronte/prova_ritenzione.py, misura del 29/9/2026 | misura in attesa della chiave del caveau |
| Tre conversazioni insieme sopra il tempo reale | non 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 vede | misura in attesa della chiave del caveau |
Le differenze che non hanno bisogno di un banco — si verificano leggendo il repository, non a parole:
- Sovranità: motore Qwen3-TTS (Apache-2.0) su hardware di Agile Software in UE; i testi e l'audio non lasciano l'Unione Europea.
- Nessun ripiego silenzioso: quando il motore non c'è arriva un errore onesto, non un fornitore fuori UE al posto nostro; l'intestazione
X-AgileTTS-Viadice sempre chi ha parlato. - Consenso tracciato: ogni voce porta la sua provenienza, il suo ambito d'uso e la scadenza del consenso, con l'audit del catalogo (
banco/catalogo/audit_catalogo.py); nel catalogo pubblico solo voci sintetiche. - Uso misurato, testi mai: si contano richieste, caratteri, millisecondi e audio prodotto — il testo non entra nei registri.
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 percorso | Cosa fa |
|---|---|
POST /v1/audio/speech | model = 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/models | i modelli disponibili |
GET /v1/voices | le voci che la chiave può usare (id, lingua, ritmo) |
GET /v1/usage | i consumi della propria chiave: richieste, caratteri, millisecondi, audio prodotto — mai i testi |
GET /health | stato del fronte e del motore |
Errori
| HTTP | codice | significato |
|---|---|---|
| 401 | KEY_MISSING, KEY_INVALID | chiave assente o sconosciuta |
| 403 | KEY_REVOKED, SCOPE_NOT_ALLOWED | chiave revocata o senza il permesso (speech, stream, voices) |
| 404 | UNKNOWN_VOICE, UNKNOWN_MODEL | voce o modello non esistenti |
| 413 | TEXT_TOO_LONG | oltre 2000 caratteri |
| 429 | RATE_LIMIT, QUOTA_EXCEEDED | troppe richieste al minuto o quota mensile di caratteri esaurita |
| 503 | BUSY, ENGINE_DOWN | motore occupato o non disponibile: Retry-After dice quando riprovare. Nessun ripiego silenzioso verso terzi. |
Regole
- Sovranità: motore Qwen3-TTS (Apache-2.0) su hardware nostro in UE. L'intestazione
X-AgileTTS-Viadice sempre chi ha parlato. - Consenso: ogni voce ha una provenienza (persona con consenso, sintetica o blend), un ambito d'uso e il riferimento cifrato a riposo. Nel catalogo pubblico solo voci sintetiche.
- Riservatezza: i testi non vengono registrati; si contano solo richieste, caratteri e tempi.
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.