Skip to content
generalBeta

Transcript Keyword Index- Deterministic keyword index with timestamps

Build a deterministic keyword + phrase index from transcripts or subtitles. The tool maps exact-match tokens and phrases to timestamped occurrences with bounded context.

How it works

  1. 1

    Provide Transcript Text, Subtitle Cues (optional), Artifact JSON (optional).

  2. 2

    Run the tool to generate the output.

  3. 3

    Copy or download the result for immediate use.

Examples

Transcript-only index

Input
{
  "transcript": "Fast-paced co-op speed runs demand tight teamwork. Speed matters, teamwork wins."
}
Expected output
{
  "schemaVersion": "1.0",
  "policyVersion": "transcript-index-v1",
  "tokenIndex": [
    {
      "key": "co",
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 10,
          "snippetMatchEnd": 12
        }
      ]
    },
    {
      "key": "demand",
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 27,
          "snippetMatchEnd": 33
        }
      ]
    },
    {
      "key": "fast",
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 4
        }
      ]
    },
    {
      "key": "matters",
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "Speed matters, teamwork wins",
          "snippetMatchStart": 5,
          "snippetMatchEnd": 12
        }
      ]
    },
    {
      "key": "op",
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 13,
          "snippetMatchEnd": 15
        }
      ]
    },
    {
      "key": "paced",
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 4,
          "snippetMatchEnd": 9
        }
      ]
    },
    {
      "key": "runs",
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 22,
          "snippetMatchEnd": 26
        }
      ]
    },
    {
      "key": "speed",
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 16,
          "snippetMatchEnd": 21
        },
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "Speed matters, teamwork wins",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 5
        }
      ]
    },
    {
      "key": "teamwork",
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 40,
          "snippetMatchEnd": 48
        },
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "Speed matters, teamwork wins",
          "snippetMatchStart": 13,
          "snippetMatchEnd": 21
        }
      ]
    },
    {
      "key": "tight",
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 34,
          "snippetMatchEnd": 39
        }
      ]
    },
    {
      "key": "wins",
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "Speed matters, teamwork wins",
          "snippetMatchStart": 22,
          "snippetMatchEnd": 26
        }
      ]
    }
  ],
  "phraseIndex": [
    {
      "key": "co",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 10,
          "snippetMatchEnd": 12
        }
      ]
    },
    {
      "key": "co op",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 10,
          "snippetMatchEnd": 15
        }
      ]
    },
    {
      "key": "co op speed",
      "ngram": 3,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 10,
          "snippetMatchEnd": 21
        }
      ]
    },
    {
      "key": "demand",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 27,
          "snippetMatchEnd": 33
        }
      ]
    },
    {
      "key": "demand tight",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 27,
          "snippetMatchEnd": 39
        }
      ]
    },
    {
      "key": "demand tight teamwork",
      "ngram": 3,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 27,
          "snippetMatchEnd": 48
        }
      ]
    },
    {
      "key": "fast",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 4
        }
      ]
    },
    {
      "key": "fast paced",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 9
        }
      ]
    },
    {
      "key": "fast paced co",
      "ngram": 3,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 12
        }
      ]
    },
    {
      "key": "matters",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "Speed matters, teamwork wins",
          "snippetMatchStart": 5,
          "snippetMatchEnd": 12
        }
      ]
    },
    {
      "key": "matters teamwork",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "Speed matters, teamwork wins",
          "snippetMatchStart": 5,
          "snippetMatchEnd": 21
        }
      ]
    },
    {
      "key": "matters teamwork wins",
      "ngram": 3,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "Speed matters, teamwork wins",
          "snippetMatchStart": 5,
          "snippetMatchEnd": 26
        }
      ]
    },
    {
      "key": "op",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 13,
          "snippetMatchEnd": 15
        }
      ]
    },
    {
      "key": "op speed",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 13,
          "snippetMatchEnd": 21
        }
      ]
    },
    {
      "key": "op speed runs",
      "ngram": 3,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 13,
          "snippetMatchEnd": 26
        }
      ]
    },
    {
      "key": "paced",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 4,
          "snippetMatchEnd": 9
        }
      ]
    },
    {
      "key": "paced co",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 4,
          "snippetMatchEnd": 12
        }
      ]
    },
    {
      "key": "paced co op",
      "ngram": 3,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 4,
          "snippetMatchEnd": 15
        }
      ]
    },
    {
      "key": "runs",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 22,
          "snippetMatchEnd": 26
        }
      ]
    },
    {
      "key": "runs demand",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 22,
          "snippetMatchEnd": 33
        }
      ]
    },
    {
      "key": "runs demand tight",
      "ngram": 3,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 22,
          "snippetMatchEnd": 39
        }
      ]
    },
    {
      "key": "speed",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 16,
          "snippetMatchEnd": 21
        },
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "Speed matters, teamwork wins",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 5
        }
      ]
    },
    {
      "key": "speed matters",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "Speed matters, teamwork wins",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 12
        }
      ]
    },
    {
      "key": "speed matters teamwork",
      "ngram": 3,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "Speed matters, teamwork wins",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 21
        }
      ]
    },
    {
      "key": "speed runs",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 16,
          "snippetMatchEnd": 26
        }
      ]
    },
    {
      "key": "speed runs demand",
      "ngram": 3,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 16,
          "snippetMatchEnd": 33
        }
      ]
    },
    {
      "key": "teamwork",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 40,
          "snippetMatchEnd": 48
        },
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "Speed matters, teamwork wins",
          "snippetMatchStart": 13,
          "snippetMatchEnd": 21
        }
      ]
    },
    {
      "key": "teamwork wins",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "Speed matters, teamwork wins",
          "snippetMatchStart": 13,
          "snippetMatchEnd": 26
        }
      ]
    },
    {
      "key": "tight",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 34,
          "snippetMatchEnd": 39
        }
      ]
    },
    {
      "key": "tight teamwork",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Fast-paced co-op speed runs demand tight teamwork",
          "snippetMatchStart": 34,
          "snippetMatchEnd": 48
        }
      ]
    },
    {
      "key": "wins",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "Speed matters, teamwork wins",
          "snippetMatchStart": 22,
          "snippetMatchEnd": 26
        }
      ]
    }
  ],
  "diagnostics": [
    {
      "severity": "warning",
      "code": "WARN_NO_TIMESTAMPS",
      "message": "No subtitle timestamps provided; occurrences use null timestamps.",
      "segmentOrdinal": null,
      "startMs": null,
      "endMs": null
    }
  ]
}

Mixed scripts

Input
{
  "transcript": "Tokyo 東京 highlights. MixedCase tokens stay searchable."
}
Expected output
{
  "schemaVersion": "1.0",
  "policyVersion": "transcript-index-v1",
  "tokenIndex": [
    {
      "key": "highlights",
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Tokyo 東京 highlights",
          "snippetMatchStart": 8,
          "snippetMatchEnd": 18
        }
      ]
    },
    {
      "key": "mixedcase",
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "MixedCase tokens stay searchable",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 9
        }
      ]
    },
    {
      "key": "searchable",
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "MixedCase tokens stay searchable",
          "snippetMatchStart": 21,
          "snippetMatchEnd": 31
        }
      ]
    },
    {
      "key": "stay",
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "MixedCase tokens stay searchable",
          "snippetMatchStart": 16,
          "snippetMatchEnd": 20
        }
      ]
    },
    {
      "key": "tokens",
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "MixedCase tokens stay searchable",
          "snippetMatchStart": 9,
          "snippetMatchEnd": 15
        }
      ]
    },
    {
      "key": "tokyo",
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Tokyo 東京 highlights",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 5
        }
      ]
    },
    {
      "key": "東京",
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Tokyo 東京 highlights",
          "snippetMatchStart": 5,
          "snippetMatchEnd": 7
        }
      ]
    }
  ],
  "phraseIndex": [
    {
      "key": "highlights",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Tokyo 東京 highlights",
          "snippetMatchStart": 8,
          "snippetMatchEnd": 18
        }
      ]
    },
    {
      "key": "mixedcase",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "MixedCase tokens stay searchable",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 9
        }
      ]
    },
    {
      "key": "mixedcase tokens",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "MixedCase tokens stay searchable",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 15
        }
      ]
    },
    {
      "key": "mixedcase tokens stay",
      "ngram": 3,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "MixedCase tokens stay searchable",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 20
        }
      ]
    },
    {
      "key": "searchable",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "MixedCase tokens stay searchable",
          "snippetMatchStart": 21,
          "snippetMatchEnd": 31
        }
      ]
    },
    {
      "key": "stay",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "MixedCase tokens stay searchable",
          "snippetMatchStart": 16,
          "snippetMatchEnd": 20
        }
      ]
    },
    {
      "key": "stay searchable",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "MixedCase tokens stay searchable",
          "snippetMatchStart": 16,
          "snippetMatchEnd": 31
        }
      ]
    },
    {
      "key": "tokens",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "MixedCase tokens stay searchable",
          "snippetMatchStart": 9,
          "snippetMatchEnd": 15
        }
      ]
    },
    {
      "key": "tokens stay",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "MixedCase tokens stay searchable",
          "snippetMatchStart": 9,
          "snippetMatchEnd": 20
        }
      ]
    },
    {
      "key": "tokens stay searchable",
      "ngram": 3,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": null,
          "endMs": null,
          "snippet": "MixedCase tokens stay searchable",
          "snippetMatchStart": 9,
          "snippetMatchEnd": 31
        }
      ]
    },
    {
      "key": "tokyo",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Tokyo 東京 highlights",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 5
        }
      ]
    },
    {
      "key": "tokyo 東京",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Tokyo 東京 highlights",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 7
        }
      ]
    },
    {
      "key": "tokyo 東京 highlights",
      "ngram": 3,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Tokyo 東京 highlights",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 18
        }
      ]
    },
    {
      "key": "東京",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Tokyo 東京 highlights",
          "snippetMatchStart": 5,
          "snippetMatchEnd": 7
        }
      ]
    },
    {
      "key": "東京 highlights",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": null,
          "endMs": null,
          "snippet": "Tokyo 東京 highlights",
          "snippetMatchStart": 5,
          "snippetMatchEnd": 18
        }
      ]
    }
  ],
  "diagnostics": [
    {
      "severity": "warning",
      "code": "WARN_NO_TIMESTAMPS",
      "message": "No subtitle timestamps provided; occurrences use null timestamps.",
      "segmentOrdinal": null,
      "startMs": null,
      "endMs": null
    }
  ]
}

Subtitle cues + transcript

Input
{
  "transcript": "Intro segment. Main topic. Closing thoughts.",
  "subtitles": "00:00 --> 00:05\nIntro segment\n\n00:05 --> 00:10\nMain topic"
}
Expected output
{
  "schemaVersion": "1.0",
  "policyVersion": "transcript-index-v1",
  "tokenIndex": [
    {
      "key": "closing",
      "occurrences": [
        {
          "segmentOrdinal": 4,
          "startMs": null,
          "endMs": null,
          "snippet": "Closing thoughts",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 7
        }
      ]
    },
    {
      "key": "intro",
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": 0,
          "endMs": 5000,
          "snippet": "Intro segment",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 5
        },
        {
          "segmentOrdinal": 2,
          "startMs": null,
          "endMs": null,
          "snippet": "Intro segment",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 5
        }
      ]
    },
    {
      "key": "main",
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": 5000,
          "endMs": 10000,
          "snippet": "Main topic",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 4
        },
        {
          "segmentOrdinal": 3,
          "startMs": null,
          "endMs": null,
          "snippet": "Main topic",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 4
        }
      ]
    },
    {
      "key": "segment",
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": 0,
          "endMs": 5000,
          "snippet": "Intro segment",
          "snippetMatchStart": 5,
          "snippetMatchEnd": 12
        },
        {
          "segmentOrdinal": 2,
          "startMs": null,
          "endMs": null,
          "snippet": "Intro segment",
          "snippetMatchStart": 5,
          "snippetMatchEnd": 12
        }
      ]
    },
    {
      "key": "thoughts",
      "occurrences": [
        {
          "segmentOrdinal": 4,
          "startMs": null,
          "endMs": null,
          "snippet": "Closing thoughts",
          "snippetMatchStart": 7,
          "snippetMatchEnd": 15
        }
      ]
    },
    {
      "key": "topic",
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": 5000,
          "endMs": 10000,
          "snippet": "Main topic",
          "snippetMatchStart": 4,
          "snippetMatchEnd": 9
        },
        {
          "segmentOrdinal": 3,
          "startMs": null,
          "endMs": null,
          "snippet": "Main topic",
          "snippetMatchStart": 4,
          "snippetMatchEnd": 9
        }
      ]
    }
  ],
  "phraseIndex": [
    {
      "key": "closing",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 4,
          "startMs": null,
          "endMs": null,
          "snippet": "Closing thoughts",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 7
        }
      ]
    },
    {
      "key": "closing thoughts",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 4,
          "startMs": null,
          "endMs": null,
          "snippet": "Closing thoughts",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 15
        }
      ]
    },
    {
      "key": "intro",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": 0,
          "endMs": 5000,
          "snippet": "Intro segment",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 5
        },
        {
          "segmentOrdinal": 2,
          "startMs": null,
          "endMs": null,
          "snippet": "Intro segment",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 5
        }
      ]
    },
    {
      "key": "intro segment",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": 0,
          "endMs": 5000,
          "snippet": "Intro segment",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 12
        },
        {
          "segmentOrdinal": 2,
          "startMs": null,
          "endMs": null,
          "snippet": "Intro segment",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 12
        }
      ]
    },
    {
      "key": "main",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": 5000,
          "endMs": 10000,
          "snippet": "Main topic",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 4
        },
        {
          "segmentOrdinal": 3,
          "startMs": null,
          "endMs": null,
          "snippet": "Main topic",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 4
        }
      ]
    },
    {
      "key": "main topic",
      "ngram": 2,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": 5000,
          "endMs": 10000,
          "snippet": "Main topic",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 9
        },
        {
          "segmentOrdinal": 3,
          "startMs": null,
          "endMs": null,
          "snippet": "Main topic",
          "snippetMatchStart": 0,
          "snippetMatchEnd": 9
        }
      ]
    },
    {
      "key": "segment",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 0,
          "startMs": 0,
          "endMs": 5000,
          "snippet": "Intro segment",
          "snippetMatchStart": 5,
          "snippetMatchEnd": 12
        },
        {
          "segmentOrdinal": 2,
          "startMs": null,
          "endMs": null,
          "snippet": "Intro segment",
          "snippetMatchStart": 5,
          "snippetMatchEnd": 12
        }
      ]
    },
    {
      "key": "thoughts",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 4,
          "startMs": null,
          "endMs": null,
          "snippet": "Closing thoughts",
          "snippetMatchStart": 7,
          "snippetMatchEnd": 15
        }
      ]
    },
    {
      "key": "topic",
      "ngram": 1,
      "occurrences": [
        {
          "segmentOrdinal": 1,
          "startMs": 5000,
          "endMs": 10000,
          "snippet": "Main topic",
          "snippetMatchStart": 4,
          "snippetMatchEnd": 9
        },
        {
          "segmentOrdinal": 3,
          "startMs": null,
          "endMs": null,
          "snippet": "Main topic",
          "snippetMatchStart": 4,
          "snippetMatchEnd": 9
        }
      ]
    }
  ],
  "diagnostics": []
}

Output

Run the tool to generate output

Frequently Asked Questions

What does the index include?

Each token and phrase key includes all occurrences with timestamps (when available) and context snippets. The output is deterministic and offline-friendly.

Do I need subtitles?

No. If you only provide a transcript, all occurrences will carry null timestamps and a warning is emitted.

Does this perform semantic search?

No. The search is exact-match on normalized keys. Stemming and fuzzy matching are intentionally out of scope.