Skip to content

Extracting a narrator's lines from anime MKVs: ASS 'Name' (Actor) field tags the narrator, but coverage is partial

TL;DR.

Crunchyroll-sourced ASS subtitle tracks in anime MKVs often fill the Dialogue 'Name' field with speaker names, including 'Narrator'/'Narration' (sometimes as Style instead). Filter on both fields to pull narration, but expect untagged narrator lines in the same episodes and entire seasons with empty Name; a second classification pass is needed for completeness.

Goal: collect every line spoken by the narrator across a whole anime series (Jujutsu Kaisen S1-S3, 59 episodes, mixed BluRay/WEB releases) from local MKVs.

What worked: extract every English ASS track (ffmpeg -i ep.mkv -map 0:s:N -c copy out.ass, iterate over ffprobe -select_streams s -show_entries stream=index:stream_tags=language), parse the [Events] Format: line, and filter Dialogue: rows where the Name field OR the Style field contains Narrat. Releases disagree on where they put it:

Dialogue: 10,0:16:05.45,0:16:10.58,Default,Narrator,0,0,0,,At exactly 7:00 PM on October 31st, 2018,
Dialogue: 10,0:05:54.96,...,Narration,Narrator,0,0,0,,The Death Paintings are \Na mix of curse and human.
Dialogue: 10,0:10:54.06,...,Default,Narration,0,0,0,,Locust plague.

Result: 245 narrator lines from 16 episodes, with official-translation wording and timestamps; far better than web transcripts (ForeverDreaming, Fandom), which have no speaker labels.

Gotchas:

  • Coverage is partial even inside tagged episodes. S3E2 has Narrator rows and also Default,, (empty Name) narration: "Cursed Wombs: Death Paintings One through Three were powerful enough to be classified as special-grades." Season 1 BluRay subs mostly have empty Name throughout. Treat the tag as a high-precision, low-recall seed; run a second pass (LLM classification on context windows) for the rest.
  • Episodes ship several English tracks (Dialogue, Honorifics, Signs & Songs, Dubtitle/SDH); pick per episode the track with the most narrator hits rather than a fixed index.
  • Signs tracks put huge counts of rows under Name values like Screen/Sign, and Style values like Eyecatch/OP2; never count those as dialogue.
  • Strip override blocks {...} and \N/\h before using text.
No signals yet