Progetto Subtitld

AperturaSalvataggioZIPXMLProgetto

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 mediaapplication/x-usfx, una specie di application/zip. Sui sistemi Apple, org.subtitld.usfx.
SpecificaQuesta pagina. Il pacchetto è lo ZIP di PKWARE (APPNOTE.TXT); il documento è USF 1.0 con gli elementi di Subtitld.
PacchettoZIP, con i membri compressi in Deflate (RFC 1951) e verificati con CRC-32; Zip64 per i file oltre 2 GiB
Primo membrosubtitles.usf: il suo nome si trova al byte 30 di ogni progetto salvato da Subtitld
Precisione temporaleSottotitoli: millisecondi. Doppiaggi: i secondi esatti, con tutti i decimali che servono.
Codifica del testoUTF-8, nel XML e nei nomi dei membri
StileQuelli di USF: corsivo, grassetto, sottolineato, barrato, colore e nove posizioni
ParlantiUn nome, un colore, un'immagine e una voce ciascuno
LingueL'originale e ogni traduzione, un blocco ciascuna, con codice ISO 639-2 e nome
Media inclusiI 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. 1 · Documento

    Il progetto stesso, in USF: ogni sottotitolo, traduzione, parlante e doppiaggio. Sempre presente, sempre primo.

  2. 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. 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. 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. 1 · Firma

    PK\3\4, byte da 0 a 3: qui comincia un membro ZIP.

  2. 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. 3 · Lunghezza del nome

    13, e nessun campo extra.

  4. 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.

Prima che compaia l'editor
  • subtitles.usf, letto per i sottotitoli, i parlanti e le voci
  • manifest.xml, per il video e il mix
  • assets/speakers/, i volti, decodificati fuori dal thread principale
  • Un video incluso, estratto una volta
Mentre lavori
  • 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:

  1. un video dentro il pacchetto, in assets/video/;
  2. il percorso in <source path>, se esiste ancora;
  3. un file con il nome indicato in <source basename>, nella cartella del progetto;
  4. 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.

  1. 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.
  2. Un file nuovo. Il pacchetto viene scritto in <project>.usfx.tmp accanto al progetto.
  3. 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.
  4. Verificato. Il nuovo file viene riaperto e il CRC-32 di ogni membro controllato.
  5. 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 .usfx stesso, come fa Salva, nello stesso modo sicuro. Per un progetto salvato come USFX.
  • Backup automaticiUn .usfx completo 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, poi manifest.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à

30

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.

512 × 384

La dimensione dell'immagine di un progetto: 4:3, perché i file manager mostrano i file in quadrati.

26.10

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

Inizia un progetto

Apri un video in Subtitld, crea i suoi sottotitoli e salva: è un .usfx.

Scarica Subtitld