stable-ts

by jianfch

stable-ts: Whisper with stabilised timestamps — more accurate word-level timing. Skip the install: WhipScribe transcribes it in your browser. Packs: $4 for 500 minutes, $12 for 2,000, $24 for 5,000; Workspace $19 a month. Up to 10 hours or 5 GB per file. Measured turnaround: about 2 minutes per audio hour. 99 languages. Checked 25 Oct 2026.

Don’t want to install stable-ts? Drop the file here.

Every recording starts with a free preview of its opening minutes. Credits never expire.

Word-perfect timestamps for SRT/VTT subtitles on top of any Whisper backend — vanilla Whisper, faster-whisper, HF Transformers, or MLX.

Linux, macOS, Windows, GPU  ·  free

stable-ts and stable_whisper: one project, two names

The PyPI package is stable-ts, version 2.19.1 (16 Aug 2025, Python 3.8 or newer, MIT). The Python module it installs is stable_whisper. It needs FFmpeg on PATH and PyTorch; a stable-ts-whisperless package installs it without openai-whisper.

GitHub's releases page still shows 2.0.0 from March 2023 as the latest release; new versions are published on PyPI (2.19.1).

  1. Install.

    pip install -U stable-ts
  2. Transcribe to SRT from Python.

    import stable_whisper
    
    model = stable_whisper.load_model("base")
    result = model.transcribe("audio.mp3")
    result.to_srt_vtt("audio.srt")
  3. Or from the command line.

    stable-ts audio.mp3 -o audio.srt
  4. Use faster-whisper, Hugging Face Transformers or MLX underneath.

    pip install -U stable-ts[fw]
    stable-ts audio.mp3 -o audio.srt -fw
    
    pip install -U stable-ts[hf]
    stable-ts audio.mp3 -o audio.srt -hw
    
    pip install -U stable-ts[mlx]
    stable-ts audio.mp3 -o audio.srt -mlx
  5. Align a transcript you already have to the audio.

    stable-ts audio.mp3 --align text.txt --language en

Sources:

  1. PyPI · stable-ts (2.19.1, 16 Aug 2025), fetched 26 Oct 2026
  2. jianfch/stable-ts · README (GitHub), fetched 26 Oct 2026
TL;DR

MIT-licensed Python library + CLI that wraps OpenAI Whisper, faster-whisper, Hugging Face Transformers, and MLX Whisper to produce stabilised word-level timestamps. Re-runs the decode with a tuned segmentation strategy, then applies silence suppression (Silero VAD or custom denoiser), refinement (token-probability re-scoring), and regrouping rules to land cleaner SRT/VTT/ASS timing than the raw Whisper output. Latest stable: 2.19.1 on PyPI, Python ≥3.8.

Best for subtitle creators, video editors, and accessibility teams who need karaoke-quality word timing, force-alignment of existing transcripts to fresh audio, or both. Pair with faster-whisper for the throughput sweet spot or with MLX on Apple Silicon. License: MIT.

Category
Open source
License
MIT
Stars
★ 2.3k
Last push
2026-05-30
Pricing
free
Platforms
Linux, macOS, Windows, GPU

What it is

stable-ts tackles Whisper's weakest point — word-level timestamp drift — by re-running inference with a tuned segmentation strategy. The result: noticeably cleaner SRT/VTT output for subtitles and shorts. Pairs well with whisper.cpp or faster-whisper as the underlying engine.

Best for: Subtitle generation where drift and poor word boundaries matter.
Watch out for: Slower than faster-whisper; no diarization; less community momentum than whisperX.

Install / use

pip install stable-ts

Where stable-ts shines · use-case cards

stable-ts solves a small set of problems very well. Each card below maps a concrete subtitle / alignment workflow to the right flag or API entry point. Links point to the canonical section of the project README.

SRT / VTT for video
Output formats · subtitle-grade timing

The default reason to reach for stable-ts. One command produces a polished SRT/VTT/ASS file with stabilised segment + word timing — typically materially less drift than vanilla Whisper at the same WER.


CLI: stable-ts audio.mp3 -o audio.srt · also -o .vtt / .ass / .tsv / .json
Karaoke / word-highlighted captions
Word-level timestamps for highlight rendering

Per-word start/end timestamps are on by default. Export to ASS for karaoke-style word highlights in the same pass, or pull the JSON output and drive your own caption renderer.


Methods: result.to_ass(...) · result.to_srt_vtt(word_level=True) · result.to_dict()
Align an existing transcript
Force-align text → audio

Have a clean human transcript but no timing? align() pins the words to the audio without re-running full transcription — much faster than transcribing and ideal for iterating on segmentation rules. Realign a previous result the same way.


Python: model.align(audio, text, language='en') · also align_words(...) for fast in-segment word timing
Backend of choice
Whisper · faster-whisper · HF · MLX

Same stabilisation pipeline on top of any backend. Default is vanilla Whisper; switch with a single CLI flag or by loading a different model class in Python. Pick by hardware: faster-whisper on NVIDIA, MLX on Apple Silicon, HF Transformers for non-standard checkpoints.


CLI flags: -fw faster-whisper · -hw Hugging Face · -mlx MLX Whisper
Silence suppression / VAD
Silero VAD + denoiser preprocessing

Whisper's biggest timestamp failure mode is hallucinated text over silence and word boundaries that snap to silence edges. Enable VAD to drop silent regions before decode, and suppress_silence to snap timestamps to true voiced regions afterward.


Flags: --vad (Silero) · --suppress_silence · --denoiser · --q_levels · --k_size
Refinement + word locating
Token re-scoring · quick word search

Refinement iteratively mutes spans of audio to find the true word boundaries via token-probability shifts — slower than a single decode but the closest thing to ground-truth timing without forced alignment. locate() searches an audio file for when specific words are spoken without full transcription.


Python: model.refine(audio, result) · model.locate(audio, text=['word'])
Selecting at runtime: the CLI takes the backend flag (-fw / -hw / -mlx); the Python API exposes stable_whisper.load_model, load_faster_whisper_model, load_hf_whisper, and load_mlx_whisper — pick whichever matches your hardware and call the same .transcribe() / .align() / .refine() methods on the result. For raw throughput see faster-whisper; for diarization on top of word timing see WhisperX.

Setup recipes · pick one and copy

Three runnable configurations covering the most common stable-ts deployments. Each block is copy-and-run against stable-ts 2.19.x.

1Install + first subtitle

pip install -U stable-ts · CLI · one-line SRT export. The default pick.

# stable-ts 2.19.x · Python >=3.8
pip install -U stable-ts

# Transcribe a video / audio file and write SRT in one command.
stable-ts input.mp4 -o out.srt

# Other output formats:
#   stable-ts input.mp4 -o out.vtt
#   stable-ts input.mp4 -o out.ass   # karaoke-friendly word highlights
#   stable-ts input.mp4 -o out.json  # raw timings for custom renderers

# Pick a Whisper model size with --model (default: base)
stable-ts input.mp4 --model large-v3 -o out.srt
2Backend = faster-whisper (4× speedup)

Add the [fw] extra, pass -fw, point at large-v3 on a GPU. Production sweet spot when you also want stable-ts post-processing.

# stable-ts + faster-whisper backend
pip install -U "stable-ts[fw]"

# CLI: -fw routes the decode through faster-whisper (CTranslate2).
stable-ts input.mp3 \
  -fw \
  --model large-v3 \
  --vad true \
  --suppress_silence true \
  -o out.srt

# Python equivalent
import stable_whisper
model = stable_whisper.load_faster_whisper("large-v3")
result = model.transcribe(
    "input.mp3",
    vad=True,
    suppress_silence=True,
    word_timestamps=True,
)
result.to_srt_vtt("out.srt", word_level=False)
3Force-align an existing transcript

Use model.align() when you already have clean text and just need timestamps. Significantly faster than re-transcribing.

# Force-align plain text to audio at word level.
import stable_whisper

model = stable_whisper.load_model("base")

text = (
    "Machines thinking, breeding. "
    "You were to bear us a new, promised land."
)

result = model.align("audio.mp3", text, language="en")

# Inspect or export
for seg in result.segments:
    for w in seg.words:
        print(f"{w.start:6.2f}-{w.end:6.2f}  {w.word!r}")

result.to_srt_vtt("out.srt", word_level=True)   # word-highlight subtitles
Source: Alignment ↗. For faster in-segment timing only, see align_words() ↗

What people actually do with stable-ts-style transcription

The tool is the means. These are the jobs — each one priced at published rates, each one wired up on its own page.

Wire it into Amazon S3n8nMake.comGoogle DriveZapierSlack

Features

Speaker diarizationNo
Word-level timestampsYes
Streaming / real-timeNo
Languages supported99
HIPAA eligibleNo

Links

stable-ts vs Whipscribe

Featurestable-tsWhipscribe
CategoryOpen sourceTranscription APIs
Pricingfree$4–$24 one-time packs (credits never expire) · free preview of the opening minutes
Speaker identificationNoNamed in the summary, key quotes and chapters
Word timestampsYesYes
StreamingNoNo
Languages9999
PlatformsLinux, macOS, Windows, GPUWeb, API, MCP

Alternatives to stable-ts

Frequently asked about stable-ts

What is stable-whisper?

The import name of stable-ts. Install the package with pip install -U stable-ts, then import stable_whisper in Python.

How do I make an SRT file with stable-ts?

Run stable-ts audio.mp3 -o audio.srt, or in Python call result.to_srt_vtt("audio.srt") on the result of model.transcribe().

Is stable-ts free?

Yes. stable-ts is free and open source.

Does stable-ts work on Mac, Windows and Linux?

stable-ts runs on Linux, macOS, Windows and GPU.

How do I install stable-ts?

With pip: `pip install stable-ts`. You need Python and, for most audio tools, ffmpeg on your PATH first.

How many languages does stable-ts support?

stable-ts lists 99 languages. That is the Whisper-family multilingual set, so quality varies by language — English and the large European languages are strongest.

Does stable-ts identify different speakers?

No. stable-ts does not label speakers; a conversation comes back as one continuous text. If you need speaker labels, that is a separate tool or a different service.

Does stable-ts give word-level timestamps?

Yes — stable-ts produces timing per word, which is what subtitle cues and clip boundaries need.

Can stable-ts transcribe live audio?

No — stable-ts works on finished files, not a live stream.

Is stable-ts HIPAA compliant?

stable-ts does not claim HIPAA compliance. For PHI, run it on infrastructure you control or choose a service that will sign a BAA.

What are the limitations of stable-ts?

Slower than faster-whisper; no diarization; less community momentum than whisperX.

Who is stable-ts best for?

Subtitle generation where drift and poor word boundaries matter.

What should I know before choosing stable-ts?

Best for subtitle creators, video editors, and accessibility teams who need karaoke-quality word timing, force-alignment of existing transcripts to fresh audio, or both. Pair with faster-whisper for the throughput sweet spot or with MLX on Apple Silicon. License: MIT.

Does stable-ts run offline?

stable-ts runs on your own machine — it is open source, so nothing leaves the computer unless you configure it to.

Can I use stable-ts in the browser?

No — stable-ts is a Linux, macOS, Windows and GPU application, not a web app. You install it rather than sign in to it.

Whipscribe is a hosted transcription service. If you want transcripts without running infrastructure, paste a URL or drop a file in the form below — you'll have a transcript in seconds.

What we measured, last 30 days

2,547 recordings, 1,244 audio hours, 66 languages detected. An hour of audio came back in 3.5 minutes for half of the recordings and within 18.0 minutes for nine in ten, measured from the moment the file landed to the finished transcript. Refreshed 2026-10-07; method on how we test.

Transcribe your recordings

Explore

Related

Need the subtitle file itself?

Upload the recording or paste a link and download SRT or VTT: see the SRT file generator, YouTube to SRT and subtitles for any video.

Looking at paid options?

Before you choose a transcription tool or service: see how our transcription services work.