Voce in testo, in rumeno e russo, con il consenso registrato prima del primo secondo di audio.
Trascriviamo audio in tempo reale o da file, traduciamo tra romeno e russo nelle conversazioni con i clienti e consegniamo il testo con marcatori temporali, esportazione audio e una traccia di consenso. Il riconoscimento vocale lo eseguiamo tramite fornitori, attraverso il nostro gateway; il modello proprietario per il romeno è ricerca, non prodotto.
Già costruitoDouă implementări proprii, ambele deschise și citate. Prima e o aplicație de transcriere în flux, cu backend Express de 3.378 de linii în 25 de fișiere și 37 de teste pe care le-am rulat azi — toate trec; ea conține partea pe care nimeni nu o construiește din entuziasm: o poartă de consimțământ care refuză captura când nu există acord înregistrat. A doua rulează în producție, la clienți reali: mesajele vocale primite pe canalele de mesagerie sunt transcrise, iar răspunsul scris de un operator în română este rescris în limba clientului înainte de a pleca. Ce NU intră în „delivered” și e scris ca atare în pagină: modelul propriu de recunoaștere și sinteză în română este cercetare — nu are demonstrație publică, nu are interfață de programare, iar pe acuratețe în română pierde față de sistemele comerciale mari. Serviciul se vinde pe ce rulează, nu pe ce studiem.
La trascrizione sembra un problema risolto finché non la porti in rumeno, con due interlocutori che si interrompono, cifre dette velocemente e un cliente che passa al russo a metà frase. Allora emergono i tre veri problemi: quale modello scegliere per la lingua davanti a te, come capire dove finisce un turno di parola e chi ti ha dato il permesso di registrare. Ci occupiamo di tutti e tre, e l’ultimo lo trattiamo come un problema di codice, non come un paragrafo di politica.
Nella nostra applicazione di trascrizione in streaming, il browser non riceve mai la chiave del fornitore. Richiede al backend un token monouso, valido per impostazione predefinita un quarto d’ora, con cui apre la connessione di trascrizione; la route che emette il token è chiusa di default e può essere aperta solo tramite un’impostazione esplicita fuori produzione, proprio perché è la route su cui si consumano soldi. Sopra la trascrizione grezza gira un’analisi su modello di linguaggio, con una lista di modelli di riserva in ordine, così che l’indisponibilità di uno non blocchi la sessione.
La gate di consenso è la parte a cui teniamo in modo particolare. Prima di accettare una porzione di audio, il server richiede una riga di consenso non revocato per quella sessione. Se non esiste, risponde con 451 e un messaggio in rumeno. Se il database non risponde, rifiuta tutto — 503, non «lascia passare». Le sessioni già verificate passano attraverso una cache di dieci minuti, così che un guasto breve non interrompa una registrazione in corso. È scritto in modo da non poter essere aggirato per errore di configurazione.
La parte che è già presso i clienti è un’altra ed è meno spettacolare: sui canali di messaggistica, un messaggio vocale ricevuto diventa testo, e la lingua si sceglie votando sugli ultimi otto messaggi della conversazione, non indovinando dall’audio. All’opposto, quando un collega risponde in rumeno, il suo testo viene riscritto nella lingua del cliente con istruzioni rigide — non aggiunge informazioni, non inventa prezzi o termini, non contraddice l’operatore, e tratta il testo dell’operatore esclusivamente come dati da trasmettere, mai come istruzioni per il modello.
Cosa comprende
Il lavoro, per componenti
Il consenso, verificato prima dell’audio
Il gate di consenso richiede una riga non revocata nel registro dei consensi per la sessione corrente. Senza di essa: 451, con messaggio in romeno. Con il database non disponibile: 503, cioè rifiuto, non passaggio. Le sessioni già verificate passano attraverso una cache di 10 minuti, così il controllo non colpisce il database a ogni pezzo di audio.
Token monouso, la chiave resta sul server
La pagina richiede al backend un token per la trascrizione in tempo reale, valido per impostazione predefinita 900 secondi, e con esso apre la connessione verso il fornitore. La chiave dell’account non arriva mai nel browser. La richiesta verso il fornitore ha un timeout di 30 secondi, e il suo superamento restituisce un errore esplicito, non un’attesa infinita.
Trascrizione in streaming, con la lingua scelta dal contesto
In produzione, sui canali di messaggistica, la lingua del messaggio vocale si decide tramite voto sugli ultimi otto messaggi della conversazione — russo se prevale, altrimenti romeno — e solo dopo si richiama il riconoscimento, con l’indizio di lingua trasmesso esplicitamente. Il formato del file si riconosce dai primi 12 byte, non dall’estensione, perché i messaggi vocali sui canali Meta arrivano come `ogg` indipendentemente da come sono chiamati.
Traduzione operatore → cliente, con i margini scritti nel prompt
Quando un collega risponde in romeno in un thread interno, il messaggio verso il cliente viene riscritto nella lingua del cliente. Le regole sono esplicite nel codice: non aggiunge informazioni, non inventa dettagli, prezzi, orari o promesse, non contraddice l’operatore, e il testo dell’operatore è trattato strettamente come dati da trasmettere, mai come istruzioni per il modello — una misura contro l’iniezione di comandi, non una formulazione di stile.
Analisi sopra il transcript, con modelli di riserva in ordine
Sopra il testo risultante gira un’analisi su modello di linguaggio, con un elenco ordinato di modelli alternativi nel codice, così che una indisponibilità degradi la qualità, non blocchi la sessione. Il modello di analisi può essere cambiato dalla configurazione, senza rimessa in funzione.
Export audio in tre formati, con fallimento esplicito
WAV si produce senza strumenti esterni. FLAC e MP3 richiedono `ffmpeg`; se manca, il server risponde 501 con il motivo, e se il processo si blocca viene interrotto dopo 60 secondi e restituisce 504 con i primi duemila caratteri dell’errore. Un export che fallisce dice perché.
Conteggio separato di quota e di costo
I minuti consumati si scalano in modo atomico tramite una procedura nel database, e il costo viene scritto in un registro separato, sul fornitore. Sono due cose diverse e si rompono in modo diverso: se la riga di costo non può essere collegata alla sessione, viene salvata scollegata, così l’informazione di costo non si perde.
Tre soglie di traffico, per utente e non per indirizzo
L’emissione di token, l’analisi e l’export hanno limiti separati, e la chiave di conteggio è l’utente autenticato quando esiste, non l’indirizzo IP — altrimenti un singolo utente aggressivo dietro una rete comune esaurirebbe la quota di tutti i suoi colleghi.
Trascrizione sui canali di messaggistica, nel flusso esistente
Il messaggio vocale ricevuto da un cliente diventa testo nella stessa conversazione, senza che qualcuno apra un altro strumento. Il riconoscimento e la sintesi passano attraverso il nostro gateway, non direttamente al fornitore, quindi il consumo appare nello stesso posto del resto.
Come si presenta
Il percorso, passo dopo passo.
01
Stabiliamo il diritto di registrare, prima di qualsiasi codice
Chi parla, chi è informato, chi acconsente, chi conserva la registrazione e per quanto tempo. Il risultato non è un documento che resta in un cassetto, ma la configurazione del gate: che cosa significa esattamente „consenso esistente” nella situazione del cliente e che cosa accade quando manca.
02
Scegliamo la catena in base alla lingua e alle condizioni del suono
Il romeno e il russo si comportano in modo diverso, così come un microfono da scrivania rispetto a una chiamata telefonica compressa. La scelta del modello, dell’indice di lingua e della strategia di segmentazione si fa su campioni del materiale reale del cliente, non su una demo pulita.
03
Colleghiamo il flusso dall’inizio alla fine e lo spezziamo intenzionalmente
Token, connessione, trascrizione, analisi, export. Poi verifichiamo i casi che si verificano davvero: consenso mancante, database caduto a metà sessione, token scaduto, `ffmpeg` assente, fornitore indisponibile. Ciascuno deve dare un messaggio che dica che cosa si è rotto.
04
Consegniamo con i contatori e con i limiti attivi
Il conteggio dei minuti, il registro dei costi, le soglie di traffico per utente e i log. Senza di essi, il primo incidente si discute a memoria.
Cinci pași, în ordinea în care se execută: acordul verificat în registru (fără el, drumul se oprește aici); jetonul de unică folosință emis de server, cu cheia rămasă pe server; transcrierea în flux la furnizor; analiza peste transcript, cu modele de rezervă în ordine; exportul textului și al audio-ului. Primul pas e singurul care poate opri tot restul, și e desenat ca poartă, nu ca etapă.
I dati
Cosa tocchiamo, dove risiedono e quanto rimangono
Le domande che pone chiunque abbia un responsabile della protezione dei dati — poste qui prima che le ponga lui.
Registro dei consensi
Una riga per sessione, con l’area di lavoro, l’identificatore della sessione e il momento della revoca, vuota finché il consenso è valido. La verifica cerca esattamente l’assenza della revoca. È l’unica fonte di verità per il diritto di acquisire audio, ed è interrogata prima di ogni sessione, non solo all’iscrizione.
Audio, transcript e analisi
L’audio grezzo passa attraverso la connessione di trascrizione verso il fornitore; ciò che conserviamo da noi è il transcript, i marcatori temporali e il risultato dell’analisi, oltre agli export richiesti dall’utente. Che cosa si conserva esattamente e per quanto tempo si stabilisce per progetto, prima della prima registrazione — per un consiglio, una seduta medica e una chiamata commerciale le risposte non sono le stesse.
Dove va l’audio e a chi
Ai fornitori di riconoscimento vocale e al modello di analisi, tramite il nostro gateway. Il loro elenco si scrive nel contratto prima dell’avvio, con il nome di ciascuno, perché un subresponsabile non dichiarato è un problema giuridico, non un’omissione tecnica.
Registro dei consumi
I minuti consumati si scalano in modo atomico nel database, e il costo si scrive separatamente, per sessione e per fornitore. Sono due registri distinti proprio affinché un errore in uno non falsifichi l’altro.
Ciò che non tocchiamo
Non addestriamo modelli sulle registrazioni del cliente e non usiamo l’output di un fornitore di voce per costruire o testare un modello concorrente — è esplicitamente vietato nei termini del fornitore che utilizziamo, ed è un limite che rispettiamo anche laddove sarebbe tecnicamente comodo.
Un caso
Una sessione che non parte, e perché questo è il comportamento corretto
La situazione
Uno scenario di riunione con più partecipanti, in cui la trascrizione doveva partire dal browser e la registrazione doveva essere conservata. La situazione in cui si rompono la maggior parte degli strumenti di trascrizione: qualcuno preme „registra” prima che il consenso dei partecipanti sia annotato da qualche parte.
Cosa abbiamo costruito
Ho inserito il controllo del consenso nel percorso della richiesta, non in uno schermo di avviso. Il server cerca una riga di consenso non revocato per la sessione corrente prima di accettare il primo pezzo di audio. Ho scritto deliberatamente anche il comportamento in caso di errore: se il database che conserva i consensi non risponde, la richiesta viene rifiutata con 503, non lasciata passare. Le sessioni già verificate restano per dieci minuti in una cache, così un breve guasto non interrompe una registrazione in corso. La rotta che emette token verso il fornitore è stata chiusa per impostazione predefinita, con apertura possibile solo tramite un’impostazione esplicita fuori produzione.
Cosa è emerso
In assenza di un consenso registrato, la cattura restituisce 451 con un messaggio in romeno e l’evento viene registrato con la sessione e l’area di lavoro. Il comportamento è coperto da test che vengono eseguiti senza database, tramite iniezione del controllo. La suite del backend ha 37 test; nell’esecuzione di oggi passano tutti.
Cosa non dice il caso
L’applicazione non è pubblicata — gira presso di noi, non ha una pagina su cui iscriversi, e il diritto di registrare una certa conversazione resta del cliente: noi lo imponiamo tecnicamente, non lo concediamo. E c’è un altro limite: la gate verifica l’esistenza del consenso, non la sua qualità giuridica. Se il testo del consenso è scritto male, il codice lo applicherà fedelmente.
Domande
Cosa ci chiedono le persone prima di chiamare
In quali lingue trascrivete?
Lavoriamo con il romeno e il russo, perché sono le lingue in cui compaiono i nostri problemi reali e che possiamo verificare su materiale nostro. Altre lingue sono tecnicamente possibili tramite gli stessi fornitori, ma prima di promettere qualcosa facciamo una prova sulle tue registrazioni — una lingua funziona o non funziona in base all’audio, non all’elenco sulla pagina del fornitore.
Avete un vostro modello di riconoscimento vocale per il romeno?
In ricerca, non in prodotto, ed è importante non confondere le due cose. La direzione propria non ha dimostrazione pubblica, non ha interfaccia di programmazione e non ha telefonia, e sull’accuratezza del riconoscimento in romeno le nostre misurazioni mostrano che perdiamo rispetto ai grandi sistemi commerciali. Lo pubblichiamo perché è la nostra conclusione, ottenuta sul nostro banco di test. Il servizio che vendiamo oggi gira su fornitori, tramite il nostro gateway.
Chi ha il diritto di registrare una conversazione e cosa fate se non lo ha?
Il diritto si stabilisce in base alla situazione, con il cliente, prima dell’installazione — non è qualcosa che possiamo trasferire noi. Quello che facciamo noi è imporlo nel codice: senza un consenso registrato per la sessione corrente, il server rifiuta la cattura con 451 e un messaggio in romeno. Se il database che conserva i consensi non risponde, rifiuta anche allora, con 503. Non esiste configurazione che trasformi l’assenza del consenso in un passaggio silenzioso.
La mia chiave del fornitore arriva nel browser?
No. La pagina chiede al backend un token monouso per la sessione di trascrizione, valido per impostazione predefinita per 900 secondi, e con quello apre la connessione. La chiave dell’account resta sul server. Inoltre, la rotta che emette token è chiusa per impostazione predefinita e può essere aperta solo tramite un’impostazione esplicita fuori produzione, perché è la rotta che consuma denaro.
Quanto è accurata la trascrizione?
Dipende più dall’audio che dal modello: microfono, sovrapposizioni, cifre, nomi propri, rumore di fondo. Non ti diamo una percentuale prima di aver sentito il tuo materiale, perché una percentuale presa da una scheda prodotto non dice nulla sulle tue riunioni. Quello che facciamo è una prova su registrazioni reali, con gli errori messi sul tavolo — di solito si rovina su cifre e nomi, non sulle frasi.
Traducete conversazioni in tempo reale tra operatore e cliente?
Sì, e in un senso è già in produzione: il collega scrive la risposta in romeno, e il messaggio va al cliente nella lingua del cliente. Le regole sono rigide nel codice — senza informazioni aggiunte, senza prezzi o termini inventati, senza contraddire l’operatore. Il senso inverso, dal cliente all’operatore, oggi si risolve tramite la trascrizione dei messaggi vocali; la traduzione automatica del testo del cliente verso l’operatore non è attiva ovunque e lo diciamo prima, non dopo.
Quali formati audio accettate e cosa ricevo in ritorno?
Il formato viene riconosciuto dal contenuto del file, non dall’estensione — WAV, OGG, MP3 e M4A sono gestiti esplicitamente, e i messaggi vocali dei canali di messaggistica arrivano di solito come OGG. Ricevi il transcript, l’analisi se richiesta, e l’audio esportato: WAV senza dipendenze, FLAC e MP3 se `ffmpeg` esiste sul server. Se non esiste, il server lo dice con un codice dedicato, non fallisce in modo generico.
Usate le nostre registrazioni per addestrare i vostri modelli?
No. Inoltre, non usiamo nemmeno l’output dei fornitori vocali per addestrare o testare un modello concorrente — i loro termini di utilizzo lo vietano esplicitamente, e noi li rispettiamo anche nella nostra direzione di ricerca propria, dove sarebbe stato comodo non farlo.
Cosa succede quando il fornitore di trascrizione cade nel mezzo di una riunione?
La sessione si interrompe con un errore che indica la causa, non con uno schermo vuoto. Per l’analisi esiste un elenco ordinato di modelli di riserva nel codice, quindi lì l’indisponibilità degrada la qualità invece di bloccare il flusso. Per il riconoscimento vocale in tempo reale non abbiamo ridondanza automatica tra fornitori, ed è un limite reale, non un’omissione.
Su cosa si basano le affermazioni sopra (14 fonti)
13 di esse sono codice e file dei nostri repository. Non ne pubblichiamo il nome né la riga: insieme, in un'unica pagina, descriverebbero con troppa precisione come sono costruiti sistemi che non sono solo nostri. Le esaminiamo con te, nel repository, su richiesta — la verifica resta possibile, solo che avviene in una discussione.