---
url: https://findutils.com/guides/subtitle-cleaner
title: "Clean SRT and VTT Subtitles: Remove Tags, {\\an8}, [music] and Speaker Names"
description: "Strip <i> tags, {\\an8} overrides, SDH brackets and speaker labels from SRT or VTT files without moving a timestamp. What each option removes, with examples."
category: converters
content_type: guide
guide_type: subtopic
cluster: captions
locale: en
read_time: 7
status: published
author: "olgunozoktas"
published_at: 2026-09-27T12:00:00Z
excerpt: "Literal <i> and {\\an8} in your captions, or [DOOR SLAMS] in a track meant for a hearing audience? Here is where that junk comes from, what each cleaning option removes, and why empty cues are dropped."
tag_ids: ["captions", "subtitles", "srt", "video", "media"]
tags: ["Captions", "Subtitles", "SRT", "Video", "Media"]
primary_keyword: "subtitle cleaner"
secondary_keywords: ["remove html tags from srt", "remove an8 from subtitles", "remove sdh from subtitles", "remove speaker names from subtitles", "clean vtt tags"]
tool_tag: "subtitle-cleaner"
related_tool: "subtitle-cleaner"
related_tools: ["subtitle-cleaner", "subtitle-overlap-fixer", "subtitle-shifter", "ass-to-srt", "srt-to-txt"]
og_image: "/images/content/guides/subtitle-cleaner-cover-20260927.webp"
image_alt: "A white eraser gliding across a row of frosted glass tiles laid out like a film strip, with small violet and amber chips lifting away behind it."
updated_at: 2026-09-27T12:00:00Z
---

To remove `<i>` tags, `{\an8}` blocks, `[music]` descriptions or speaker names from a subtitle file, run it through a cleaner that edits only the cue text and copies every timing line unchanged. FindUtils [Subtitle Cleaner](/media/subtitle-cleaner/) does that for SubRip (`.srt`) and WebVTT (`.vtt`) files in your browser: the file is read and cleaned in the tab, not uploaded, and every start and end time comes out exactly as it went in.

This guide covers where the markup comes from, what each of the five options removes (with before and after snippets), why a cue with nothing left is dropped instead of kept blank, and when the problem is timing rather than text.

## Where Subtitle Junk Comes From

Markup in a caption file is rarely typed by hand. It is carried in from the source the file was made from.

- **Ripped and downloaded tracks.** Subtitles extracted from discs, broadcasts or older fansub releases often use HTML-style tags for italics and colour: `<i>`, `<b>`, `<font color="#ffff00">`. Many desktop players render them; many upload platforms and video editors print them as text.
- **ASS/SSA exports.** Advanced SubStation Alpha scripts position and style lines with override blocks in curly braces. `{\an8}` is the alignment override that moves a line to the top centre of the screen (the numbers follow a phone keypad, per the Aegisub ASS override tag reference). When an ASS script is saved as SRT by a tool that copies the text verbatim, those blocks stay in every line.
- **WebVTT from streaming sites.** VTT has its own inline tags: `<c.yellow>` for classes, `<v Roger>` for voices, and `<00:00:01.000>` timestamps for karaoke-style reveals.
- **SDH tracks.** Subtitles for the deaf and hard of hearing describe sound and name speakers: `[DOOR SLAMS]`, `(applause)`, `♪`, `NARRATOR:`. That is correct content for an SDH track, and clutter if you want plain dialogue captions.

## How to Clean a Subtitle File

1. Open [Subtitle Cleaner](/media/subtitle-cleaner/) and drop an `.srt`, `.vtt` or `.txt` file on the input card, or paste the text.
2. Leave the three default options on (HTML tags, ASS overrides, whitespace). Turn on SDH brackets or speaker labels only if you want those words gone.
3. Read the preview. The first 10 cues are shown before and after, with removed markup struck through and the timestamps printed as they are in the file.
4. Download the result. The file keeps its name with `-cleaned` added, for example `episode-04-cleaned.srt`, or you can copy the text.

The summary shows cues processed, tags removed, and empty cues dropped, so you can see what changed without diffing the files.

## What Each Option Removes

### Strip HTML tags (on by default)

Removes any tag that opens with a letter, plus WebVTT karaoke timestamps. The text between the tags stays.

```text
Before:  <i>Where were you?</i>
After:   Where were you?

Before:  <font color="#ffff00">Stay here.</font>
After:   Stay here.
```

A `<` that does not open a tag is left alone, so `3 < 5 and 7 > 2` survives unchanged.

### Strip ASS overrides (on by default)

Removes every curly-brace block that starts with a backslash, including stacked ones such as `{\pos(320,50)\fad(200,200)}`. The ASS escapes are converted rather than deleted: `\N` and `\n` become a real line break and `\h` becomes a space.

```text
Before:  {\an8}{\i1}Previously on...{\i0}
After:   Previously on...

Before:  First line\NSecond line
After:   First line
         Second line
```

A plain `{text}` without a backslash is not an override and is kept.

### Strip SDH brackets (off by default)

Removes anything in square or round brackets and the music notes `♪` and `♫`.

```text
Before:  [music] Hello again
After:   Hello again

Before:  ♪ Sweet dreams are made of this ♪
After:   Sweet dreams are made of this
```

Lyrics between music notes are kept; only the notes go. Because the rule is "anything in brackets", a parenthesis that is part of the dialogue is removed too. Check the preview on a track with a lot of `(...)` asides before downloading.

### Strip speaker labels (off by default)

Removes a label at the very start of a line when it begins with a capital letter, runs to at most four words and ends in a colon followed by text. A dialogue dash is kept.

```text
Before:  JOHN: Hi
         - MARY: Hey there
After:   Hi
         - Hey there
```

`Dr. Smith:` matches; `the time is 10:30 now` does not, because the colon is not after a leading capitalised label.

### Normalize whitespace (on by default)

Collapses repeated spaces and tabs, trims each line, and drops lines left holding nothing a viewer would read, such as a lone `-` after its speaker label and text were removed.

## Why Empty Cues Are Dropped, Not Left Blank

Turn on SDH removal and a cue that held only `[applause]` has no text left. The cleaner drops that cue and counts it under **Empty cues dropped**; it never writes a timing line with an empty body.

The reason is structural. In both formats a blank line marks the end of a cue. The W3C WebVTT specification does not allow a cue payload to contain an empty line, and SubRip files use the blank line as the only separator between blocks. A cue written with an empty body, or a cue with a blank line in the middle, makes parsers merge, split or skip the blocks that follow. The same rule applies inside a cue: if `<i></i>` was the second line, that line is removed rather than left empty.

After a drop, SRT cues are renumbered from 1 so the sequence stays continuous:

```text
Before                              After (SDH on)
1                                   1
00:00:01,000 --> 00:00:04,000       00:00:01,000 --> 00:00:04,000
hello                               hello

2                                   2
00:00:05,500 --> 00:00:08,250       00:00:05,500 --> 00:00:08,250
[music] Hello again                 Hello again

3
00:00:12,000 --> 00:00:13,000
[applause]
```

If the chosen options would empty every cue, as with a file that is all sound descriptions, the page warns you and offers no download instead of producing an empty file.

## VTT Stays VTT

A WebVTT file is written back as WebVTT by default. Cue identifiers and cue settings such as `line:90%` are kept on the timing line:

```text
WEBVTT

00:00:01.000 --> 00:00:04.000 line:90%
<v Roger>{\i1}Hello</v>
```

becomes

```text
WEBVTT

00:00:01.000 --> 00:00:04.000 line:90%
Hello
```

Choose **Force SRT** to clean and convert in one pass; the cue settings are dropped because SubRip has no place for them. Two things to know: WebVTT `NOTE`, `STYLE` and `REGION` blocks are not copied to the cleaned file, and removing `<v Roger>` removes the voice information along with it. If you only need a format change with no cleaning, [SRT to VTT](/convert/srt-to-vtt/) is the direct route.

## When the Problem Is Timing, Not Text

Subtitle Cleaner changes text only. Its timestamps pass through untouched, so it cannot fix a sync problem. Pick the tool by what is wrong:

| Symptom | Tool |
|---|---|
| Tags, `{\an8}`, `[music]` or names show up as text | [Subtitle Cleaner](/media/subtitle-cleaner/) |
| Two lines on screen at once, or a cue flashes by | [Subtitle Overlap Fixer](/media/subtitle-overlap-fixer/) |
| Every line is early or late by the same amount | [Subtitle Shifter](/media/subtitle-shifter/) |
| Starts in sync, drifts further out over time | [Subtitle FPS Converter](/media/subtitle-fps-converter/) |
| The source is a full `.ass` script with styles | [ASS to SRT](/convert/ass-to-srt/) first, then clean |
| You want a plain transcript with no timings at all | [SRT to TXT](/convert/srt-to-txt/) |

When a file needs both a timing fix and cleaning, the order does not matter: cleaning keeps every timestamp, and the timing tools keep the text. For styled ASS sources, the [ASS to SRT guide](/guides/ass-to-srt/) explains what survives the conversion.

## Cleaning Through the API

The same cleaner is available as `subtitle-clean` on the FindUtils REST API and as `subtitle_clean` on the MCP server, with the same five options and an `output_format` of `same` or `srt`. The response includes counts for cues in, cues out, tags removed, labels removed and empty cues dropped. An API call sends the subtitle text to FindUtils over TLS; the browser page does not.

## FAQ

### Will cleaning change my subtitle timing?

No. Timing lines are copied exactly. The only structural change is SRT renumbering after a cue is dropped.

### Why are SDH and speaker removal off by default?

Both remove words, not just markup. On an SDH track they are exactly what you want gone; on a normal track they can delete a bracketed aside that belongs to the dialogue.

### The page says it could not read my file. What now?

One timing line is not in the expected form, and the message gives its line number. Each side needs hours, minutes, seconds and milliseconds, such as `00:00:09,000 --> 00:00:11,300`. Fix that line in the paste area and the file is cleaned straight away.

### Is my file uploaded?

The page reads and cleans the file in your browser tab and does not send the subtitle text to a server. Like other pages on the site, it loads analytics and ads.
