{
    "@context": "https://schema.org",
    "@type": "Dataset",
    "name": "Subtitle format reference",
    "description": "What each subtitle format can express, how its timestamps are written, and what is lost converting it to another.",
    "source": "https://sozai.app/tools/subtitle-converter/",
    "generated": "2026-09-21T09:51:21+00:00",
    "licence": {
        "name": "Creative Commons Attribution 4.0 International",
        "id": "CC-BY-4.0",
        "url": "https://creativecommons.org/licenses/by/4.0/",
        "attribution": "SozAI — https://sozai.app"
    },
    "formats": [
        {
            "id": "srt",
            "name": "SubRip",
            "extensions": [
                ".srt"
            ],
            "media_type": "application/x-subrip",
            "summary": "The lowest common denominator and the most widely accepted: a numbered cue, a timecode line, one or more lines of text, and a blank line.",
            "cue_shape": "sequence number\nstart --> end\ntext\n(blank line)",
            "timestamp_format": "hh:mm:ss,mmm --> hh:mm:ss,mmm",
            "decimal_separator": ",",
            "cue_numbering": "required",
            "supports": [
                "plain text",
                "line breaks",
                "de-facto <i>/<b>/<u> in some players"
            ],
            "does_not_support": [
                "positioning",
                "styling",
                "karaoke timing",
                "metadata",
                "regions"
            ],
            "lost_converting_to_srt": [],
            "source_url": "https://sozai.app/what-is-an-srt-file/"
        },
        {
            "id": "vtt",
            "name": "WebVTT",
            "extensions": [
                ".vtt"
            ],
            "media_type": "text/vtt",
            "summary": "The HTML5 format. Its first line is the literal word WEBVTT, milliseconds follow a period rather than a comma, and cue numbering is optional — which is the single most common mistake in hand-written converters.",
            "cue_shape": "WEBVTT\n\n[optional cue identifier]\nstart --> end [cue settings]\ntext",
            "timestamp_format": "hh:mm:ss.mmm --> hh:mm:ss.mmm",
            "decimal_separator": ".",
            "cue_numbering": "optional",
            "supports": [
                "positioning",
                "alignment",
                "CSS styling via ::cue",
                "regions",
                "metadata blocks",
                "comments",
                "chapters"
            ],
            "does_not_support": [
                "karaoke effects of the ASS kind"
            ],
            "lost_converting_to_srt": [
                "positioning",
                "styling",
                "regions",
                "metadata",
                "cue identifiers"
            ],
            "source_url": "https://sozai.app/vtt-vs-srt/"
        },
        {
            "id": "sbv",
            "name": "SubViewer",
            "extensions": [
                ".sbv"
            ],
            "media_type": "text/plain",
            "summary": "What YouTube Studio exports. No cue numbers, the two timestamps are separated by a comma rather than an arrow, and the hour field is not zero-padded.",
            "cue_shape": "start,end\ntext\n(blank line)",
            "timestamp_format": "h:mm:ss.mmm,h:mm:ss.mmm",
            "decimal_separator": ".",
            "cue_numbering": "none",
            "supports": [
                "plain text",
                "line breaks"
            ],
            "does_not_support": [
                "positioning",
                "styling",
                "cue numbering"
            ],
            "lost_converting_to_srt": [],
            "source_url": "https://sozai.app/tools/sbv-to-srt/"
        },
        {
            "id": "ass",
            "name": "Advanced SubStation Alpha",
            "extensions": [
                ".ass",
                ".ssa"
            ],
            "media_type": "text/x-ssa",
            "summary": "A styling format with a sectioned, INI-like body. The column order of the [Events] section is declared by that section's own Format line and must be read from it rather than assumed.",
            "cue_shape": "[Events] Format: …  /  Dialogue: Layer,Start,End,Style,Name,MarginL,MarginR,MarginV,Effect,Text",
            "timestamp_format": "h:mm:ss.cc (centiseconds)",
            "decimal_separator": ".",
            "cue_numbering": "none",
            "supports": [
                "named styles",
                "positioning and {\\an8}-style override tags",
                "karaoke timing",
                "fonts and colours",
                "layers",
                "comment lines"
            ],
            "does_not_support": [],
            "lost_converting_to_srt": [
                "styles",
                "positioning",
                "karaoke timing",
                "fonts",
                "colours",
                "layers"
            ],
            "source_url": "https://sozai.app/tools/ass-to-srt/"
        }
    ],
    "conversion_rules": {
        "note": "These are the constants the tools on sozai.app actually use, published so an answer computed elsewhere matches the answer the page gives.",
        "text_to_subtitle": {
            "words_per_minute": 150,
            "words_per_second": 2.5,
            "min_cue_seconds": 2,
            "max_cue_seconds": 8,
            "gap_between_cues_seconds": 0.2,
            "caveat": "A timing derived from a word count is an estimate, not a sync. Against real audio, transcribe the audio.",
            "tool": "https://sozai.app/tools/txt-to-srt/"
        },
        "merge_subtitles": {
            "gap_between_files_seconds": 1,
            "renumbers": true,
            "tool": "https://sozai.app/tools/merge-srt/"
        },
        "speech_rates_wpm": {
            "slow": 100,
            "conversational": 130,
            "presentation": 150,
            "fast": 180,
            "silent_reading": 238,
            "tool": "https://sozai.app/tools/speech-time-calculator/"
        },
        "frame_rates_supported": [
            24,
            25,
            30
        ]
    }
}
