Il menu dei sottotitoli è il punto in cui molti media server rivelano quanta parte della loro storia di playback sia tenuta insieme con il nastro adesivo.
La versione da lista feature la conosciamo tutti: “sottotitoli supportati”. Poi arriva il venerdì sera, scegli un remux Blu-ray, l’unica traccia decente è PGS, qualcuno ha bisogno di una traduzione e quella casella pulita diventa un video che carica, uno stream che non mostra niente o un sottotitolo che va fuori sincrono a metà film.
In un setup da salotto i sottotitoli sono una catena di scelte: quale traccia serve davvero, se contiene testo o immagini, se il client sa disegnarla, se i suoi tempi resistono lungo il percorso e cosa fare quando nel file non c’è alcuna sorgente utile.
Per questo “supporta i sottotitoli” da solo significa quasi nulla. La domanda vera è quale sorgente arrivi a quale client e cosa faccia il server quando quella sorgente non è semplice testo.
È il cunicolo in cui entra Quven. Quella che sembra una sola funzione diventa tre sistemi che si incontrano nel player: traduzione text-to-text per le tracce già esistenti, OCR-to-text per i sottotitoli a immagini di Blu-ray e DVD e speech-to-text locale quando una variante file selezionata non offre nulla di utilizzabile. Tutti e tre finiscono come una traccia testuale sincronizzata, e la parte difficile è arrivarci.
I sottotitoli testuali non sono automaticamente il caso facile
Una traccia SubRip, WebVTT o ASS incorporata sembra la scorciatoia perfetta: leggi le cue, traduci, salvi una nuova traccia esterna e la agganci al player. Fatto, no?
Non proprio. I problemi iniziano prima ancora che il traduttore legga una parola.
Un file può contenere più lingue, commenti, sole scritte, forced, tracce scarse e stream duplicati con metadati imprecisi. Prendere automaticamente il primo flusso sottotitoli è una politica pessima, e una traccia forced può essere preziosa accanto al dialogo nella lingua originale, ma non sostituisce i dialoghi completi. Una traccia di cartelli sparsi non è una buona sorgente per chi vuole tradurre un film intero.
La selezione deve quindi esaminare ogni candidato, rifiutare fonti inutilizzabili o solo forced quando sono richiesti dialoghi completi e preferire la traccia idonea più densa. Una sorgente scelta esplicitamente ma sbagliata deve fallire in modo visibile; cambiare silenziosamente traccia e passare a qualcosa di non correlato distrugge sia il debug sia la fiducia.
Poi c’è la parte poco glamour: i job. Una traduzione può contenere centinaia o migliaia di cue. Se il server si riavvia, deve riprendere. Se due persone chiedono lo stesso lavoro, non deve consumare due volte la stessa quota. Se chi guarda annulla, il risultato di un worker in ritardo non deve ricomparire con disinvoltura dieci minuti dopo come nuova traccia. E l’avanzamento deve voler dire qualcosa: selezione, estrazione, traduzione, salvataggio, aggancio — non una percentuale allegra inventata.
Nel percorso desktop verificato di Quven, una sorgente testuale idonea viene divisa in slice di traduzione durevoli, passa attraverso la traduzione Cloud soggetta a consenso ed entitlement, viene salvata come sottotitolo esterno localizzato, selezionata come traccia nativa e ripristinata alla successiva apertura del media. Il flusso è stato smoke-testato con un SubRip inglese incorporato tradotto in francese. Non è ingegneria da copertina, ma è la differenza fra una demo e qualcosa su cui contare.
PGS e VobSub sono un problema di elaborazione immagini, non di formato testo
Qui molti setup altrimenti ben curati diventano fragili.
PGS su Blu-ray e VobSub su DVD sono formati bitmap. Non contengono un payload testuale da tradurre. Ogni sottotitolo visualizzato è un’immagine con informazioni temporali, e il renderer deve capire palette, trasparenza, durata di visualizzazione ed eventi di clear prima ancora che possa iniziare l’OCR.
La versione tentatrice è “estrai qualche PNG, lancia OCR, scrivi un SRT”. È anche il modo più rapido per scoprire che i dischi veri non hanno nessun interesse per il tuo happy path.
Per essere affidabile, la pipeline deve selezionare lo stream assoluto richiesto senza sondarne per errore un altro; risolvere i tempi dalle informazioni specifiche di formato; renderizzare il bitmap vero; ignorare frame trasparenti di clear e stato senza perdere cue reali; conservare la parità esatta fra frame e timing; riconoscere testo localmente con il modello linguistico giusto; e serializzare WebVTT validi e monotoni che non crollino dopo due ore di film.
Il testo risultante può poi entrare nello stesso sistema di traduzione di una traccia normale. Riutilizzare quel percorso conta. L’OCR non deve diventare una funzione di serie B, con avanzamento, permessi e persistenza diversi solo perché la sua sorgente arriva come pixel.
C’è anche un confine privacy. Il riconoscimento bitmap avviene sul server self-hosted. Solo il testo derivato può entrare nel percorso Cloud di traduzione e soltanto dopo gli stessi controlli di consenso al trasferimento del testo ed entitlement della traduzione normale. La cache OCR è basata sul contenuto delle cue decodificate e sui tempi esatti, non su titolo o identificativo TMDb. Due edizioni con timing diversi non devono mai diventare la stessa cosa solo perché condividono una locandina.
L’implementazione corrente ha già renderizzato e ripristinato una traccia tradotta derivata da VobSub nel flusso desktop. È un’evidenza utile per il percorso cache OCR-to-text, traduzione e playback. Non significa che ogni formato bitmap, ogni pacchetto di sistema operativo o ogni client nativo sia già rilasciato: OCR a freddo, DVB, validazione dei payload nativi per piattaforma, firma e gate su dispositivi nativi devono ancora chiudersi attorno al motore già implementato.
Lo speech-to-text è l’ultimo fallback, non il rimpiazzo di buoni sottotitoli
C’è un terzo caso: il file non ha testo incorporato utilizzabile, non ha un output bitmap utilizzabile e non ha un sottotitolo esterno locale.
Qui il riconoscimento vocale locale diventa utile. Ma deve essere l’ultima scelta, non una scusa per ignorare sottotitoli che esistono già. Un buon sottotitolo creato da persone ha tempi editoriali, contesto dei parlanti e di solito formulazioni migliori del riconoscimento automatico. Il riconoscimento vocale serve al file che altrimenti lascerebbe chi guarda senza nulla.
Il percorso resta deliberatamente locale:
stream audio selezionato → PCM con timestamp preservati → whisper.cpp → WebVTT normalizzato → traduzione opzionale
Dietro quella riga semplice ci sono requisiti meno evidenti. Lo stream audio scelto conta. Un film con più audio può avere dialogo doppiato, audiodescrizione, commento o una lingua diversa. Il job appartiene alla variante fisica di file selezionata e conserva il legame tra timestamp del contenitore e campioni PCM decodificati. Altrimenti un riconoscitore può produrre parole leggibili che lentamente smettono di coincidere con chi parla.
Nemmeno il suo output può essere scritto direttamente in un file sottotitoli. Va validato e normalizzato: timestamp malformati rifiutati, cue limitate alla durata del media, ordine monotono, rimozione di output vuoti o token speciali, soppressione delle ovvie allucinazioni nei silenzi, righe leggibili e WebVTT sicuro per Unicode. Audio temporaneo, PCM e artefatti del riconoscitore devono sparire alla fine, in errore, in annullamento e in recovery.
Il risultato utile è una sorgente sottotitoli locale validata. Se la traduzione Cloud successiva fallisce o viene annullata, la sorgente generata localmente resta utile invece di essere buttata insieme alla richiesta fallita. Se sorgente e lingua richiesta coincidono, non c’è alcun motivo di chiamare un traduttore Cloud.
Provisioning di Whisper e Silero, derivazione audio sincronizzata, normalizzazione WebVTT, selezione della sorgente e persistenza della trascrizione sono implementati e testati nel codice corrente. Sono usciti con Quven 1.1.0, con attività fra client, validazione pacchetti e accettazione su media reali alle spalle. È uno stato molto più utile di un generico “in arrivo”, e più onesto che farlo passare per disponibile in ogni download già pubblicato.
Il modello utile è una gerarchia di sorgenti
La regola di prodotto non è “usa sempre l’AI”. È più semplice:
- usa un sottotitolo testuale creato dall’autore e idoneo quando esiste;
- altrimenti trasforma localmente in testo un sottotitolo bitmap idoneo;
- solo a quel punto offri riconoscimento vocale locale dall’audio scelto.
Ogni livello deve lasciare una risorsa sottotitoli durevole e ispezionabile, che il player possa elencare, selezionare, salvare e riutilizzare. Ogni livello deve sopravvivere ad annullamento e recovery. E ogni livello deve dire a chi guarda cosa sta facendo, invece di lasciare una rotellina a girare con la sua piccola vita misteriosa.
È questo lo standard che serve a un media server self-hosted se vuole meritarsi una libreria mista del mondo reale: remux, DVD, Blu-ray, release multilingua, forced, vecchie codifiche e l’occasionale file senza alcuna sorgente sottotitoli. Per il flusso pratico nel player, leggi come tradurre i sottotitoli con l’AI in Quven.
Comunità
Commenti
0 commenti
Non ci sono ancora commenti. Inizia la conversazione.