Stop re-listening. Review the disagreement.
Transcript Lens compares the timestamped JSON from two speech-to-text engines and creates a focused review queue for the moments where they disagree. Everything runs in the browser: transcripts are never uploaded.
A 60-minute interview does not need another 60-minute listen. Independent ASR engines usually agree on most of it. Transcript Lens uses character-bigram similarity and timestamp overlap to surface only the uncertain segments, so a human can spend attention where it changes the result.
- Drag-and-drop comparison for timestamped JSON
- Supports
segments,utterances, nestedresults.segments, and generic transcript fields - Japanese-friendly character-bigram similarity (no tokenizer required)
- Adjustable agreement threshold and at-a-glance timeline
- Review queue with per-segment source text and completion state
- Markdown report export
- Local-first: no account, API key, server upload, or analytics
- Responsive and keyboard-accessible
Requires Node.js 24 LTS. Run nvm use to select the repository's pinned major version.
npm install
npm run devOpen http://localhost:3000. A synthetic demo is loaded automatically, so the complete workflow is visible without credentials or personal data.
The smallest supported format is:
{
"segments": [
{ "start": 0, "end": 4.2, "text": "Hello world", "speaker": "HOST" }
]
}Transcript Lens also recognizes utterances, results, results.segments, start_time, end_time, startTime, endTime, transcript, and millisecond timestamps.
- The first file is the timeline source.
- Comparison segments that overlap each primary time range are joined.
- Punctuation and whitespace are removed.
- A Sørensen–Dice score is calculated from character bigrams.
- Segments below the selected threshold enter the review queue.
Character bigrams work without language-specific tokenization, which makes the approach useful for Japanese and mixed-language interviews. The tool deliberately does not choose a winner; it identifies where human judgment is valuable.
npm test
npm run lint
npm run buildThe app uses React, TypeScript, vinext, and Cloudflare-compatible Vite output. Core matching logic lives in app/lib/consensus.ts and has no browser dependencies.
Files are parsed in browser memory and are not sent to a server. Exported reports are created with a local Blob. Avoid sharing an exported report if the source transcript contains sensitive information.
Bug reports, format adapters, and accessibility improvements are welcome. Please include a minimal synthetic JSON fixture rather than a real interview transcript.
Read CONTRIBUTING.md before opening a pull request. By participating, you agree to follow the Code of Conduct.