Progetto Subtitld
Il file di Subtitld: un pacchetto ZIP che si apre con un documento USF dei sottotitoli, delle loro traduzioni, dei parlanti e dei doppiaggi, poi un manifesto di tutto il resto, un'immagine del punto in cui eri rimasto e, se lo chiedi, il video e il suo audio. Un solo file da spostare, salvare o consegnare, e ogni sua parte leggibile con strumenti standard.
In breve
| Estensione | .usfx |
|---|---|
| Tipo di media | application/x-usfx, una specie di application/zip. Sui sistemi Apple, org.subtitld.usfx. |
| Specifica | Questa pagina. Il pacchetto è lo ZIP di PKWARE (APPNOTE.TXT); il documento è USF 1.0 con gli elementi di Subtitld. |
| Pacchetto | ZIP, con i membri compressi in Deflate (RFC 1951) e verificati con CRC-32; Zip64 per i file oltre 2 GiB |
| Primo membro | subtitles.usf: il suo nome si trova al byte 30 di ogni progetto salvato da Subtitld |
| Precisione temporale | Sottotitoli: millisecondi. Doppiaggi: i secondi esatti, con tutti i decimali che servono. |
| Codifica del testo | UTF-8, nel XML e nei nomi dei membri |
| Stile | Quelli di USF: corsivo, grassetto, sottolineato, barrato, colore e nove posizioni |
| Parlanti | Un nome, un colore, un'immagine e una voce ciascuno |
| Lingue | L'originale e ogni traduzione, un blocco ciascuna, con codice ISO 639-2 e nome |
| Media inclusi | I doppiaggi e le immagini dei parlanti; il video, il suo audio, le voci e lo sfondo separati, e la forma d'onda della timeline, se richiesti |
Anatomia di un file
Un .usfx è uno ZIP. Qualsiasi programma di archiviazione lo apre, rinominato .zip se il programma insiste.
Tears of Steel.usfx subtitles.usf manifest.xml thumbnail.png assets/speakers/Celia.png assets/dubs/77a03e27.wav assets/video/Tears_of_Steel.mkv assets/waveform.npy assets/audio/vocals.flac
- 1 · Documento
Il progetto stesso, in USF: ogni sottotitolo, traduzione, parlante e doppiaggio. Sempre presente, sempre primo.
- 2 · Manifesto
Che cosa ha creato il file, dove si trovava il video, come era mixato l'audio, e un tipo di media per ogni altro membro.
- 3 · Immagine
Ciò che i file manager mostrano del progetto: il fotogramma in cui eri rimasto, il suo sottotitolo e la timeline in quel punto.
- 4 · Risorse
L'audio di ogni doppiaggio e i volti dei parlanti; il video, il suo audio e la forma d'onda solo se lo chiedi.
Il documento dice che cosa succede; le risorse sono ciò che riproduce. Un doppiaggio in subtitles.usf indica la sua clip con il percorso nel pacchetto, assets/dubs/77a03e27.wav, così il pacchetto può passare in un'altra cartella, su un altro disco o un altro computer e restare integro.
I membri
| Percorso | Che cosa contiene | Compressione | Scritto |
|---|---|---|---|
subtitles.usf |
Il documento: sottotitoli, traduzioni, parlanti, voci, doppiaggi | Deflate | Sempre, per primo |
manifest.xml |
Il manifesto | Deflate | Sempre, per secondo |
thumbnail.png |
Una scheda PNG 512 × 384 del progetto | Senza compressione | Quando c'è un'immagine da creare |
assets/speakers/<speaker>.png |
L'immagine di un parlante, al massimo 256 pixel per lato | Deflate | Se non lo disattivi |
assets/dubs/<uid>.<ext> |
L'audio di una ripresa di doppiaggio, con il nome dell'ID della ripresa | Deflate | Sempre, per ogni ripresa con audio |
assets/dubs/<uid>__<n>__<file> |
Un pezzo diviso o stirato di una ripresa, e la sorgente intatta da cui è stato stirato | Deflate | Quando una ripresa è stata divisa o stirata |
assets/video/<file> |
Il video | Deflate | Se lo chiedi |
assets/waveform.npy |
I picchi della forma d'onda della timeline, un array NumPy | Deflate | Se lo chiedi |
assets/audio/original.flac |
L'audio del video | Deflate | Se lo chiedi |
assets/audio/vocals.flac, background.flac |
L'audio separato in voci e resto | Deflate | Se lo chiedi |
I nomi in assets/ sono fatti di lettere, cifre, -, _ e .; tutto il resto diventa _, quindi Tears of Steel.mkv viene salvato come Tears_of_Steel.mkv. Le lettere fuori dall'ASCII restano, con il nome scritto in UTF-8 e segnalato come tale (bit 11 dell'intestazione ZIP), come chiede APPNOTE.
Perché l'immagine è memorizzata, non compressa. Un PNG è già compresso; Deflate costerebbe solo tempo. Memorizzati così, i suoi byte sono nel file esattamente come un PNG, e un generatore di miniature li legge senza decomprimere nulla.
I primi byte
Ogni progetto comincia allo stesso modo: un'intestazione di file locale ZIP, poi il nome del primo membro.
50 4B 03 04 14 00 00 00 08 00 4E 70 51 5D 64 CE 1E 0B 6F 3B 00 00 7F E2 00 00 0D 00 00 00 73 75 62 74 69 74 6C 65 73 2E 75 73 66
- 1 · Firma
PK\3\4, byte da 0 a 3: qui comincia un membro ZIP. - 2 · Intestazione
Versione 2.0 necessaria per estrarre; nessun flag; metodo 8, Deflate; ora e data in stile MS-DOS (qui 17 ottobre 2026, 14:02:28); il CRC-32; le dimensioni compressa e non compressa (15.215 e 57.983 byte).
- 3 · Lunghezza del nome
13, e nessun campo extra.
- 4 · Nome
subtitles.usf, dal byte 30.
Il nome non è mai compresso, anche quando il membro lo è. Questo lo rende una firma: uno ZIP il cui nome al byte 30 è subtitles.usf è un progetto Subtitld. Il Tracker di Haiku distingue i progetti dagli altri archivi esattamente con questa regola, 0.60 ("PK\003\004") [30] ("subtitles.usf" | "manifest.xml"), con priorità sulla regola dello ZIP semplice. ODF ed EPUB fanno lo stesso con un primo membro chiamato mimetype.
Un video può superare il limite originale dello ZIP, 4 GiB. Da 2 GiB in su, Subtitld scrive i campi extra e i record finali di Zip64 (APPNOTE, sezione 4.5), come fa oltre i 65.535 membri; Subtitld, il suo gestore di miniature per Windows e qualsiasi unzip attuale li leggono.
Il manifesto
<?xml version="1.0" encoding="UTF-8"?>
<manifest version="1.0">
<format>USFX</format>
<generator>Subtitld</generator>
<source path="/home/ana/Videos/Tears of Steel.mkv"
basename="Tears of Steel.mkv"/>
<voicemix volume="0.5000"/>
<entry path="subtitles.usf" type="application/x-usf+xml"/>
<entry path="thumbnail.png" type="image/png"/>
<entry path="assets/speakers/Celia.png" type="image/png"/>
<entry path="assets/dubs/77a03e27.wav" type="audio/wav"/>
</manifest>
| Elemento | Che cosa contiene |
|---|---|
<manifest version> |
La versione del manifesto, 1.0 |
<format>, <generator> |
USFX, e che cosa ha scritto il file: Subtitld |
<source path basename> |
Il percorso completo del video quando il progetto è stato salvato, e il solo nome del file |
<voicemix volume> |
Dove si trovava il cursore Musica/Voce: 0 solo lo sfondo, 0.5 l'audio così com'è, 1 solo le voci, con i doppiaggi che sfumano insieme allo sfondo |
<entry path type> |
Uno per ogni membro tranne il manifesto stesso, ciascuno con il suo tipo di media |
I tipi sono application/x-usf+xml, image/png, audio/wav, audio/flac, audio/mpeg, video/mp4, video/x-matroska, video/quicktime, video/webm, video/ogg, e application/octet-stream per la forma d'onda e qualsiasi altra cosa.
Il percorso del video viaggia con il file. <source path> è dove si trovava il video sul computer che ha salvato il progetto, cartelle e nome utente compresi. Tienilo presente prima di condividere un progetto. Se il percorso non porta da nessuna parte, Subtitld cerca il video per nome nella cartella del progetto.
Il documento
subtitles.usf è un file Universal Subtitle Format, UTF-8, come Subtitld lo scrive da solo, con ciò che serve a un progetto aggiunto nello stile di USF: elementi e attributi dove USF non ne ha. Un lettore USF che salta ciò che non conosce ne legge i sottotitoli.
<USFSubtitles version="1.0"
xmlns:subtitldcc="https://subtitld.cc/ns/usf/1">
<metadata>
<title>Tears of Steel</title>
<author><name>Subtitld</name></author>
<language code="eng">English</language>
<subtitldcc:origin share-id="Xk3pQ9aZ2bT" version="3"/>
</metadata>
<styles>
<style name="Celia">
<fontstyle color="#e5484d"/>
<dubbing engine="edge-tts" voice="en-GB-SoniaNeural"
rate="0" pitch="0" fit_to_subtitle="true"/>
</style>
</styles>
<subtitles>
<language code="eng">English</language>
<subtitle start="00:00:23.000" stop="00:00:24.500">
<text speaker="Celia" style="Celia">You're a jerk, Thom.</text>
<dubbing uid="77a03e27" engine="edge-tts"
voice="en-GB-SoniaNeural" rate="0" pitch="0"
path="assets/dubs/77a03e27.wav"
start="23.0" end="24.5"/>
</subtitle>
</subtitles>
<subtitles>
<language code="por">Portuguese (Brazil)</language>
<subtitle start="00:00:23.000" stop="00:00:24.500">
<text speaker="Celia" style="Celia">Você é um idiota, Thom.</text>
</subtitle>
</subtitles>
</USFSubtitles>
Che cosa aggiunge Subtitld a USF
| Dove | Elemento o attributo | Che cosa contiene |
|---|---|---|
<metadata> |
<subtitldcc:origin share-id version> |
Il sottotitolo di subtitld.cc da cui proviene il progetto, così le modifiche possono essere pubblicate come sua versione successiva. Nel suo namespace, https://subtitld.cc/ns/usf/1, scritto solo quando esiste. |
<styles> |
<style name> |
Uno per ogni parlante, con il suo nome. Nessuno stile Default, che cambierebbe lo stile di ogni sottotitolo in un lettore. |
<style> |
<fontstyle color> |
Il colore del parlante, #RRGGBB |
<style> |
<dubbing engine voice rate pitch fit_to_subtitle> |
La voce del parlante: il motore, la voce, velocità e tono da −100 a 100, e se i doppiaggi si adattano alla durata del loro sottotitolo |
<text> |
speaker, style |
Chi lo dice, e il suo stile |
<text> |
alignment |
Una delle nove posizioni di USF, da TopLeft a BottomRight; nessuno per il centro in basso |
<subtitle> |
<dubbing> |
Una ripresa del doppiaggio del sottotitolo, un elemento ciascuna |
<dubbing> |
uid engine voice rate pitch |
L'ID della ripresa, e la voce con cui è stata creata |
<dubbing> |
path, raw_path |
Il suo audio nel pacchetto, e la sorgente da cui è stata creata una ripresa stirata |
<dubbing> |
start, end |
Dove viene riprodotta sulla timeline, in secondi |
<dubbing> |
<subclip type path raw_path start end offset rate> |
I pezzi di una ripresa divisa o stirata |
In un .usf semplice, le immagini dei parlanti e l'audio dei doppiaggi possono viaggiare dentro il XML, in base64 in <avatar> e <data>. Un .usfx non lo fa mai: sono membri a sé, un quarto più piccoli che in base64, e si leggono senza analizzare il XML.
Tempi
start e stop di un sottotitolo sono tempi USF, arrotondati al millisecondo più vicino. I tempi di un doppiaggio sono secondi semplici scritti per intero, 18.01579117916244: il decimale più breve che si rilegge come lo stesso numero a 64 bit, così una clip posizionata trascinandola torna esattamente dov'era.
Le versioni precedenti di Subtitld scrivevano i tempi un millisecondo in anticipo, e un inizio a zero come 23:59:59.999. Subtitld legge quel valore come zero, e lascia il millisecondo com'è.
Riprese e sottoclip
Un sottotitolo può avere più riprese. Il primo <dubbing> è quello che viene riprodotto; gli altri sono alternative, silenziose finché non ne scegli una, che passa allora in testa.
Una ripresa divisa o stirata conserva un elenco di <subclip>, posizionati come clip in un editor audio:
| Attributo | Significato |
|---|---|
start, end |
La parte del file sorgente che viene riprodotta, in secondi dall'inizio del file |
offset |
Dove comincia quella parte, in secondi dallo start della ripresa |
rate |
La velocità a cui è stata stirata: 20 è 120 % |
path, raw_path |
L'audio riprodotto, e l'audio intatto da cui è stato stirato |
Un sottoclip viene riprodotto dallo start della ripresa più il suo offset, per end meno start secondi. I vuoti sono silenzio; le sovrapposizioni vengono mixate. Le sorgenti non vengono mai modificate, quindi ogni divisione e stiramento si può annullare, e uno stiramento viene sempre rifatto da raw_path, mai dallo stiramento di uno stiramento.
Traduzioni
Ogni lingua ha il suo blocco <subtitles>, indicato dal codice ISO 639-2 e, nell'elemento, dal nome della lingua, che distingue il portoghese del Brasile da quello del Portogallo. Ogni blocco contiene ogni sottotitolo agli stessi tempi; solo il primo contiene i doppiaggi. Subtitld abbina una traduzione al suo sottotitolo per tempo di inizio, o a quello con cui si sovrappone di più, quindi i blocchi scritti da altri strumenti non devono per forza allinearsi.
Aprire un progetto
I progetti grandi si aprono subito: Subtitld legge prima ciò che serve all'editor, e il resto mentre lavori.
subtitles.usf, letto per i sottotitoli, i parlanti e le vocimanifest.xml, per il video e il mixassets/speakers/, i volti, decodificati fuori dal thread principale- Un video incluso, estratto una volta
- I doppiaggi, per primi, così puoi riprodurli
- La forma d'onda, poi
- L'audio separato, per ultimo
Ogni doppiaggio sulla timeline è tratteggiato finché il suo audio non arriva, poi suona.
I membri vengono estratti nelle cartelle di Subtitld, mai accanto al progetto: il documento, i volti e i doppiaggi in una cartella di cache chiamata come l'MD5 del percorso del progetto. Ciò che arriva mentre lavori viene trasferito a blocchi di 1 MiB in un file temporaneo, rinominato al suo posto quando è completo, così un crash a metà non lascia nulla scritto a metà. La volta successiva che lo stesso progetto si apre, un file già presente viene riusato solo se ha esattamente la dimensione del membro; altrimenti viene estratto di nuovo.
Il video viene cercato in quest'ordine:
- un video dentro il pacchetto, in
assets/video/; - il percorso in
<source path>, se esiste ancora; - un file con il nome indicato in
<source basename>, nella cartella del progetto; - altrimenti, Subtitld lo chiede.
Un file che non è uno ZIP, è troncato o non supera un controllo CRC non apre nulla: Subtitld lo segnala e lo toglie dall'elenco dei recenti. Si aprono anche i progetti precedenti: uno senza manifesto, o con il suo USF sotto un altro nome alla radice dello ZIP.
Salvare un progetto
Salva non mette mai a rischio il progetto che hai.
- Un'istantanea. Il progetto viene copiato così com'è al momento del salvataggio, così puoi continuare a modificarlo mentre viene scritto. Salvataggi, salvataggi automatici e backup si danno il turno: ne scrive uno alla volta.
- Un file nuovo. Il pacchetto viene scritto in
<project>.usfx.tmpaccanto al progetto. - Niente di mancante. Un doppiaggio il cui audio non è ancora nella cache, perché ancora in arrivo o eliminato, viene copiato dal file che sta per essere sostituito. Un progetto salvato senza video mantiene l'immagine che aveva.
- Verificato. Il nuovo file viene riaperto e il CRC-32 di ogni membro controllato.
- Scambiato. Solo allora sostituisce il progetto, con un'unica rinomina (
os.replace): il nome del progetto non contiene mai mezzo progetto.
Se un passaggio fallisce, il file temporaneo viene eliminato, il progetto su disco è quello che avevi, e le tue modifiche restano aperte in Subtitld. Mentre i doppiaggi di un progetto sono ancora in arrivo, Salva li aspetta.
Che cosa va dentro
Impostazioni globali, poi USFX, sceglie che cos'altro porta un progetto, per ogni progetto che salvi:
- Ritratti dei parlantiI volti dei parlanti. Attivo.
- Cache della forma d'onda della timelineLa forma d'onda, così un progetto si apre su un altro computer senza ricalcolarla. Disattivo.
- Traccia audio originaleL'audio del video, in FLAC. Disattivo.
- Audio elaborato (voci + sfondo)L'audio separato in voci e resto, in FLAC, così la separazione non deve essere rifatta. Disattivo.
- File video originaleIl video stesso: un unico file con tutto, grande quanto il video e oltre. Disattivo.
Ciascuno entra quando Subtitld ne ha uno da inserire: l'audio separato, per esempio, solo dopo che la separazione è stata eseguita. I sottotitoli, le traduzioni, i parlanti, le voci e ogni doppiaggio ci sono sempre. Deflate riduce di circa un sesto il WAV di un doppiaggio; un video e un FLAC si riducono appena.
Salvataggio automatico e backup
- Salva automaticamente il file di progettoScrive il tuo
.usfxstesso, come fa Salva, nello stesso modo sicuro. Per un progetto salvato come USFX. - Backup automaticiUn
.usfxcompleto nella cartella dei backup di Subtitld, separato dal tuo file, chiamato<project>_<YYYYMMDDHHMMSS>.usfx, quando ci sono modifiche da conservare. Oltre Conserva al massimo, 20 se non scegli diversamente, i più vecchi vengono eliminati.
Nei file manager
La miniatura è una scheda nello stile di Subtitld: il fotogramma del video in cui il progetto è stato lasciato, con il suo sottotitolo, e sotto i dodici secondi di timeline intorno alla testina, la forma d'onda e i sottotitoli nei colori dei loro parlanti. 4:3 a 512 × 384, così riempie la cella quadrata di un file manager meglio di un fotogramma largo. Senza video, il marchio di Subtitld prende il posto del fotogramma.
| Sistema | Il tipo | Che cosa offre |
|---|---|---|
| Linux | application/x-usfx in shared-mime-info, una specie di application/zip, riconosciuto da *.usfx |
Un'icona propria; con il pacchetto AUR, miniature da subtitld-thumbnailer, un generatore di miniature freedesktop.org |
| Windows | Un tipo di file nel programma di installazione e nel pacchetto MSIX | Un'icona; un provider di miniature della shell (UsfxThumbnail.dll, IThumbnailProvider) che legge da sé la directory centrale dello ZIP, Zip64 compreso, e decodifica il PNG con WIC alla dimensione richiesta da Esplora file |
| macOS | Il tipo org.subtitld.usfx, conforme a public.zip-archive |
Un'icona propria |
| Haiku | application/x-usfx, con la regola di riconoscimento vista sopra |
Un'icona, e il Tracker che distingue un progetto da uno ZIP |
Con un doppio clic, un progetto si apre in Subtitld su tutti e quattro. Entrambi i generatori di miniature leggono solo thumbnail.png, rifiutano quelle oltre 8 MiB e non accettano nulla che non inizi con la firma del PNG, 89 50 4E 47 0D 0A 1A 0A. Quello di Windows la accetta solo non compressa, come la scrive Subtitld. Quello di Linux usa solo la libreria standard di Python, perché i file manager eseguono i generatori di miniature in sandbox e molti alla volta.
Leggere un .usfx da sé
Niente in un progetto appartiene solo a Subtitld. Per guardarci dentro:
unzip -l "Tears of Steel.usfx"
unzip -p "Tears of Steel.usfx" manifest.xml
Per leggerne i sottotitoli, in ogni lingua, con la libreria standard di Python:
import zipfile
import xml.etree.ElementTree as ET
def text_of(element):
"""A <text>'s words, <br/> as a line break."""
parts = [element.text or '']
for child in element:
parts.append('\n' if child.tag == 'br' else text_of(child))
parts.append(child.tail or '')
return ''.join(parts)
with zipfile.ZipFile('Tears of Steel.usfx') as usfx:
usf = ET.fromstring(usfx.read('subtitles.usf'))
for block in usf.iter('subtitles'):
language = block.find('language')
if language is not None:
print('#', language.get('code'), language.text)
for subtitle in block.iter('subtitle'):
text = subtitle.find('text')
print(subtitle.get('start'), subtitle.get('stop'),
text.get('speaker'), text_of(text))
Per un progetto di qualcun altro, analizzalo con defusedxml al posto di xml.etree, come per qualsiasi XML che non hai scritto tu.
Crearne uno
Il progetto più piccolo che Subtitld apre è uno ZIP che contiene un subtitles.usf. Senza manifesto, Subtitld chiede il video. Per crearne uno che riconoscano anche i file manager, segui ciò che scrive Subtitld:
- prima
subtitles.usf, poimanifest.xml; - ogni membro compresso in Deflate, tranne
thumbnail.png, non compresso; - i doppiaggi sotto
assets/dubs/, indicati nel documento con il loro percorso nel pacchetto; - UTF-8 ovunque.
Subtitld conserva ciò che conosce. Un salvataggio scrive i membri descritti in questa pagina, e un documento creato da ciò che Subtitld ha capito del precedente. Un file che un altro strumento aggiunge al pacchetto, o un suo elemento nell'USF, sparisce appena Subtitld salva il progetto. Tieni i tuoi dati accanto.
Come si confronta
USFX è costruito come i pacchetti di documenti delle suite per ufficio e degli e-book: uno ZIP, un documento principale in XML, un inventario, i media accanto.
ODF (.odt) |
EPUB | Office Open XML (.docx) |
USFX | |
|---|---|---|---|---|
| Standard | OASIS ODF 1.3, Parte 2 | W3C EPUB 3.3, il suo OCF | ECMA-376 Parte 2, OPC | Questa pagina |
| Come lo riconosce uno strumento | Un primo membro mimetype, non compresso |
Un primo membro mimetype, non compresso: application/epub+zip |
[Content_Types].xml |
Il nome del primo membro, subtitles.usf, al byte 30 |
| Inventario | META-INF/manifest.xml, un tipo per ogni file |
META-INF/container.xml, poi il documento del pacchetto |
[Content_Types].xml e _rels/ |
manifest.xml, un tipo per ogni membro |
| Documento principale | content.xml |
Il documento del pacchetto e il suo spine | word/document.xml |
subtitles.usf |
| Media | Pictures/ |
Ovunque nel pacchetto | word/media/ |
assets/ |
| Anteprima | Thumbnails/thumbnail.png |
Un'immagine di copertina | Una parte di miniatura facoltativa | thumbnail.png, non compresso |
Il documento principale è un formato aperto a pieno titolo: estrai il subtitles.usf di un .usfx ed è un file USF, un formato con una specifica pubblica dal 2002.
Curiosità
Il byte in cui comincia il nome del primo membro di ogni progetto, ed è così che Haiku distingue un progetto Subtitld da qualsiasi altro ZIP.
La dimensione dell'immagine di un progetto: 4:3, perché i file manager mostrano i file in quadrati.
La versione che ha dato a .usfx un'icona propria su Linux, Windows, macOS e Haiku, e la sua immagine in Esplora file di Windows e nei file manager di Linux.
Formati correlati
-
.usfUniversal Subtitle Format
-
.jsonJSON subtitles and transcripts
-
.ttmlTimed Text Markup Language
Apri un video in Subtitld, crea i suoi sottotitoli e salva: è un .usfx.