Skip to main content
skill CX Codex

faster-whisper — Claude Code skill: what it does, how to install

Run local speech-to-text with CTranslate2 Whisper without API charges. It generates subtitles, diarizes speakers, and transcribes YouTube clips.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add ThePlasmak/faster-whisper --skill faster-whisper -a claude-code
Open on GitHub

What faster-whisper does

This skill provides local speech-to-text using a CTranslate2 reimplementation of Whisper. It runs 4-6x faster than OpenAI Whisper with identical accuracy. On systems with GPU acceleration, transcription reaches ~20x realtime speeds, converting a 10-minute recording in roughly 30 seconds. Output formats include SRT, VTT, ASS, LRC, TTML, and CSV.

Beyond basic transcription, it parses YouTube URLs, reads podcast RSS feeds, and detects chapter breaks from silence gaps. Speaker diarization labels who spoke each segment.

Running this skill requires python3 on Linux, macOS, or WSL2. Optional dependencies include ffmpeg for media handling and yt-dlp for web links. Diarization will fail without a Hugging Face token cached at ~/.cache/huggingface/token or provided via flag.

What it helps with

  • transcribe audio and video recordings without cloud API costs
  • generate subtitle files in SRT, VTT, ASS, or TTML standards
  • label distinct speakers using diarization flags
  • fetch and transcribe podcast episodes directly from RSS feeds

Example prompts for the agent

  • transcribe interview.mp3 and identify speakers with --diarize
  • generate srt subtitles for video.mp4 and clean filler words
  • transcribe this youtube url and export timestamps to csv

How to install faster-whisper

1Skills CLI (Vercel)

npx skills add ThePlasmak/faster-whisper --skill faster-whisper -a claude-code

2Manually: put the files in place

~/.claude/skills/faster-whisper/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/faster-whisper/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about faster-whisper

How to install faster-whisper in Claude Code?

Run npx skills add ThePlasmak/faster-whisper --skill faster-whisper -a claude-code in your terminal.

What does faster-whisper do?

It transcribes speech locally using CTranslate2 Whisper, exports subtitle files, detects audio chapters, and separates speaker turns.

What system dependencies are required?

It needs python3 on Linux, macOS, or WSL2. You will also need yt-dlp for URLs, ffmpeg for media decoding, and a Hugging Face token for diarization.

Source text

SKILL.md · MIT
---
name: faster-whisper
description: "Local speech-to-text using faster-whisper. 4-6x faster than OpenAI Whisper with identical accuracy; GPU acceleration enables ~20x realtime transcription. SRT/VTT/TTML/CSV subtitles, speaker diarization, URL/YouTube input, batch processing with ETA, transcript search, chapter detection, per-file language map."
version: 1.5.1
author: ThePlasmak
homepage: https://github.com/ThePlasmak/faster-whisper
tags:
  [
    "audio",
    "transcription",
    "whisper",
    "speech-to-text",
    "ml",
    "cuda",
    "gpu",
    "subtitles",
    "diarization",
    "podcast",
    "chapters",
    "search",
    "csv",
    "ttml",
    "batch",
  ]
platforms: ["linux", "macos", "wsl2"]
metadata:
  {
    "openclaw":
      {
        "emoji": "🗣️",
        "requires":
          {
            "bins": ["python3"],
            "optionalBins": ["ffmpeg", "yt-dlp"],
            "optionalPaths": ["~/.cache/huggingface/token"],
          },
      },
  }
---

# Faster Whisper

Local speech-to-text using faster-whisper — a CTranslate2 reimplementation of OpenAI's Whisper that runs **4-6x faster** with identical accuracy. With GPU acceleration, expect **~20x realtime** transcription (a 10-minute audio file in ~30 seconds).

## When to Use

Use this skill when you need to:

- **Transcribe audio/video files** — meetings, interviews, podcasts, lectures, YouTube videos
- **Generate subtitles** — SRT, VTT, ASS, LRC, or TTML broadcast-standard subtitles
- **Identify speakers** — diarization labels who said what (`--diarize`)
- **Transcribe from URLs** — YouTube links and direct audio URLs (auto-downloads via yt-dlp)
- **Transcribe podcast feeds** — `--rss <feed-url>` fetches and transcribes episodes
- **Batch process files** — glob patterns, directories, skip-existing support; ETA shown automatically
- **Convert speech to text locally** — no API costs, works offline (after model download)
- **Translate to English** — translate any language to English with `--translate`
- **Do multilingual transcription** — supports 99+ languages with auto-detection
- **Transcribe a batch of files in different languages** — `--language-map` assigns a different language per file
- **Transcribe multilingual audio** — `--multilingual` for mixed-language audio
- **Transcribe audio with specific terms** — use `--initial-prompt` for jargon-heavy content or any other terms to look out for
- **Preprocess noisy audio (before transcription)** — `--normalize` and `--denoise` before transcription
- **Stream output** — `--stream` shows segments as they're transcribed
- **Clip time ranges** — `--clip-timestamps` to transcribe specific sections
- **Search the transcript** — `--search "term"` finds all timestamps where a word/phrase appears
- **Detect chapters** — `--detect-chapters` finds section breaks from silence gaps
- **Export speaker audio** — `--export-speakers DIR` saves each speaker's turns as separate WAV files
- **Spreadsheet output** — `--format csv` produces a properly-quoted CSV with timestamps

**Trigger phrases:**
"transcribe this audio", "convert speech to text", "what did they say", "make a transcript",
"audio to text", "subtitle this video", "who's speaking", "translate this audio", "translate to English",
"find where X is mentioned", "search transcript for", "when did they say", "at what timestamp",
"add chapters", "detect chapters", "find breaks in the audio", "table of contents for this recording",
"TTML subtitles", "DFXP subtitles", "broadcast format subtitles", "Netflix format",
"ASS subtitles", "aegisub format", "advanced substation alpha", "mpv subtitles",
"LRC subtitles", "timed lyrics", "karaoke subtitles", "music player lyrics",
"HTML transcript", "confidence-colored transcript", "color-coded transcript",
"separate audio per speaker", "export speaker audio", "split by speaker",
"transcript as CSV", "spreadsheet output", "transcribe podcast", "podcast RSS feed",
"different languages in batch", "per-file language",
"transcribe in multiple formats", "srt and txt at the same time", "output both srt and text",
"remove filler words", "clean up ums and uhs", "strip hesitation sounds", "remove you know and I mean",
"transcribe left channel", "transcribe right channel", "stereo channel", "left track only",
"wrap subtitle lines", "character limit per line", "max chars per subtitle",
"detect paragraphs", "paragraph breaks", "group into paragraphs", "add paragraph spacing"

**⚠️ Agent guidance — keep invocations minimal:**

_CORE RULE: default command (`./scripts/transcribe audio.mp3`) is the fastest path — add flags only when the user explicitly asks for that capability._

**Transcription:**

- Only add `--diarize` if the user asks "who said what" / "identify speakers" / "label speakers"
- Only add `--format srt/vtt/ass/lrc/ttml` if the user asks for subtitles/captions in that format
- Only add `--format csv` if the user asks for CSV or spreadsheet output
- Only add `--word-timestamps` if the user needs word-level timing
- Only add `--initial-prompt` if there's domain-specific jargon to prime
- Only add `--translate` if the user wants non-English audio translated to English
- Only add `--normalize`/`--denoise` if the user mentions bad audio quality or noise
- Only add `--stream` if the user wants live/progressive output for long files
- Only add `--clip-timestamps` if the user wants a specific time range
- Only add `--temperature 0.0` if the model is hallucinating on music/silence
- Only add `--vad-threshold` if VAD is aggressively cutting speech or including noise
- Only add `--min-speakers`/`--max-speakers` when you know the speaker count
- Only add `--hf-token` if the token is not cached at `~/.cache/huggingface/token`
- Only add `--max-words-per-line` for subtitle readability on long segments
- Only add `--filter-hallucinations` if the transcript contains obvious artifacts (music markers, duplicates)
- Only add `--merge-sentences` if the user asks for sentence-level subtitle cues
- Only add `--clean-filler` if the user asks to remove filler words (um, uh, you know, I mean, hesitation sounds)
- Only add `--channel left|right` if the user mentions stereo tracks, dual-channel recordings, or asks for a specific channel
- Only add `--max-chars-per-line N` when the user specifies a character limit per subtitle line (e.g., "Netflix format", "42 chars per line"); takes priority over `--max-words-per-line`
- Only add `--detect-paragraphs` if the user asks for paragraph breaks or structured text output; `--paragraph-gap` (default 3.0s) only if they want a custom gap
- Only add `--speaker-names "Alice,Bob"` when the user provides real names to replace SPEAKER_1/2 — always requires `--diarize`
- Only add `--hotwords WORDS` when the user names specific rare terms not well served by `--initial-prompt`; prefer `--initial-prompt` for general domain jargon
- Only add `--prefix TEXT` when the user knows the exact words the audio starts with
- Only add `--detect-language-only` when the user only wants to identify the language, not transcribe
- Only add `--stats-file PATH` if the user asks for performance stats, RTF, or benchmark info
- Only add `--parallel N` for large CPU batch jobs; GPU handles one file efficiently on its own — don't add for single files or small batches
- Only add `--retries N` for unreliable inputs (URLs, network files) where transient failures are expected
- Only add `--burn-in OUTPUT` only when user explicitly asks to embed/burn subtitles into the video; requires ffmpeg and a video file input
- Only add `--keep-temp` when the user may re-process the same URL to avoid re-downloading
- Only add `--output-template` when user specifies a custom naming pattern in batch mode
- **Multi-format output** (`--format srt,text`): only when user explicitly wants multiple formats in one pass; always pair with `-o <dir>`
- Any word-level feature auto-runs wav2vec2 alignment (~5-10s overhead)
- `--diarize` adds ~20-30s on top of that

**Search:**

- Only add `--search "term"` when the user asks to find/locate/search for a specific word or phrase in audio
- `--search` **replaces** the normal transcript output — it prints only matching segments with timestamps
- Add `--search-fuzzy` only when the user mentions approximate/partial matching or typos
- To save search results to a file, use `-o results.txt`

**Chapter detection:**

- Only add `--detect-chapters` when the user asks for chapters, sections, a table of contents, or "where does the topic change"
- Default `--chapter-gap 8` (8-second silence = new chapter) works for most podcasts/lectures; tune down for dense content
- `--chapter-format youtube` (default) outputs YouTube-ready timestamps; use `json` for programmatic use
- **Always use `--chapters-file PATH`** when combining chapters with a transcript output — avoids mixing chapter markers into the transcript text
- If the user only wants chapters (not the transcript), pipe stdout to a file with `-o /dev/null` and use `--chapters-file`
- **Batch mode limitation:** `--chapters-file` takes a single path — in batch mode, each file's chapters overwrite the previous. For batch chapter detection, omit `--chapters-file` (chapters print to stdout under `=== CHAPTERS (N) ===`) or use a separate run per file

**Speaker audio export:**

- Only add `--export-speakers DIR` when the user explicitly asks to save each speaker's audio separately
- Always pair with `--diarize` — it silently skips if no speaker labels are present
- Requires ffmpeg; outputs `SPEAKER_1.wav`, `SPEAKER_2.wav`, etc. (or real names if `--speaker-names` is set)

**Language map:**

- Only add `--language-map` in batch mode when the user has confirmed different languages across files
- Inline format: `"interview*.mp3=en,lecture*.mp3=fr"` — fnmatch globs on filename
- JSON file format: `@/path/to/map.json` where the file is `{"pattern": "lang_code"}`

**RSS / Podcast:**

- Only add `--rss URL` when the user provides a podcast RSS feed URL
- Default fetches 5 newest episodes; `--rss-latest 0` for all; `--skip-existing` to resume safely
- **Always use `-o <dir>`** with `--rss` — without it, all episode transcripts print to stdout concatenated, which is hard to use; each episode gets its own file when `-o <dir>` is set

**Output format for agent relay:**

- **Search results** (`--search`) → print directly to user; output is human-readable
- **Chapter output** → if no `--chapters-file`, chapters appear in stdout under `=== CHAPTERS (N) ===` header after the transcript; with `--format json`, chapters are also embedded in the JSON under `"chapters"` key
- **Subtitle formats** (SRT, VTT, ASS, LRC, TTML) → always write to `-o` file; tell the user the output path, never paste raw subtitle content
- **Data formats** (CSV, HTML, TTML, JSON) → always write to `-o` file; tell the user the output path, don't paste raw XML/CSV/HTML
- **ASS format** → for Aegisub, VLC, mpv; write to file and tell user they can open it in Aegisub or play it in VLC/mpv
- **LRC format** → timed lyrics for music players (Foobar2000, AIMP, VLC); write to file
- **Multi-format** (`--format srt,text`) → requires `-o <dir>`; each format goes to a separate file; tell user all paths written
- **JSON format** → useful for programmatic post-processing; not ideal to paste in full to user
- **Text/transcript** → safe to show directly to user for short files; summarise for long ones
- **Stats output** (`--stats-file`) → summarise key fields (duration, processing time, RTF) for the user rather than pasting raw JSON
- **Language detection** (`--detect-language-only`) → print the result directly; it's a single line
- **ETA** is printed automatically to stderr for batch jobs; no action needed

**When NOT to use:**

- Cloud-only environments without local compute
- Files <10 seconds where API call latency doesn't matter

**faster-whisper vs whisperx:**
This skill covers everything whisperx does — diarization (`--diarize`), word-level timestamps (`--word-timestamps`), SRT/VTT subtitles — so whisperx is not needed. Use whisperx only if you specifically need its pyannote pipeline or batch-GPU features not covered here.

## Quick Reference

| Task                           | Command                                                                                | Notes                                               |
| ------------------------------ | -------------------------------------------------------------------------------------- | --------------------------------------------------- |
| **Basic transcription**        | `./scripts/transcribe audio.mp3`                                                       | Batched inference, VAD on, distil-large-v3.5        |
| **SRT subtitles**              | `./scripts/transcribe audio.mp3 --format srt -o subs.srt`                              | Word timestamps auto-enabled                        |
| **VTT subtitles**              | `./scripts/transcribe audio.mp3 --format vtt -o subs.vtt`                              | WebVTT format                                       |
| **Word timestamps**            | `./scripts/transcribe audio.mp3 --word-timestamps --format srt`                        | wav2vec2 aligned (~10ms)                            |
| **Speaker diarization**        | `./scripts/transcribe audio.mp3 --diarize`                                             | Requires pyannote.audio                             |
| **Translate → English**        | `./scripts/transcribe audio.mp3 --translate`                                           | Any language → English                              |
| **Stream output**              | `./scripts/transcribe audio.mp3 --stream`                                              | Live segments as transcribed                        |
| **Clip time range**            | `./scripts/transcribe audio.mp3 --clip-timestamps "30,60"`                             | Only 30s–60s                                        |
| **Denoise + normalize**        | `./scripts/transcribe audio.mp3 --denoise --normalize`                                 | Clean up noisy audio first                          |
| **Reduce hallucination**       | `./scripts/transcribe audio.mp3 --hallucination-silence-threshold 1.0`                 | Skip hallucinated silence                           |
| **YouTube/URL**                | `./scripts/transcribe https://youtube.com/watch?v=...`                                 | Auto-downloads via yt-dlp                           |
| **Batch process**              | `./scripts/transcribe *.mp3 -o ./transcripts/`                                         | Output to directory                                 |
| **Batch with skip**            | `./scripts/transcribe *.mp3 --skip-existing -o ./out/`                                 | Resume interrupted batches                          |
| **Domain terms**               | `./scripts/transcribe audio.mp3 --initial-prompt 'Kubernetes gRPC'`                    | Boost rare terminology                              |
| **Hotwords boost**             | `./scripts/transcribe audio.mp3 --hotwords 'JIRA Kubernetes'`                          | Bias decoder toward specific words                  |
| **Prefix conditioning**        | `./scripts/transcribe audio.mp3 --prefix 'Good morning,'`                              | Seed the first segment with known opening words     |
| **Pin model version**          | `./scripts/transcribe audio.mp3 --revision v1.2.0`                                     | Reproducible transcription with a pinned revision   |
| **Debug library logs**         | `./scripts/transcribe audio.mp3 --log-level debug`                                     | Show faster_whisper internal logs                   |
| **Turbo model**                | `./scripts/transcribe audio.mp3 -m turbo`                                              | Alias for large-v3-turbo                            |
| **Faster English**             | `./scripts/transcribe audio.mp3 --model distil-medium.en -l en`                        | English-only, 6.8x faster                           |
| **Maximum accuracy**           | `./scripts/transcribe audio.mp3 --model large-v3 --beam-size 10`                       | Full model                                          |
| **JSON output**                | `./scripts/transcribe audio.mp3 --format json -o out.json`                             | Programmatic access with stats                      |
| **Filter noise**               | `./scripts/transcribe audio.mp3 --min-confidence 0.6`                                  | Drop low-confidence segments                        |
| **Hybrid quantization**        | `./scripts/transcribe audio.mp3 --compute-type int8_float16`                           | Save VRAM, minimal quality loss                     |
| **Reduce batch size**          | `./scripts/transcribe audio.mp3 --batch-size 4`                                        | If OOM on GPU                                       |
| **TSV output**                 | `./scripts/transcribe audio.mp3 --format tsv -o out.tsv`                               | OpenAI Whisper–compatible TSV                       |
| **Fix hallucinations**         | `./scripts/transcribe audio.mp3 --temperature 0.0 --no-speech-threshold 0.8`           | Lock temperature + skip silence                     |
| **Tune VAD sensitivity**       | `./scripts/transcribe audio.mp3 --vad-threshold 0.6 --min-silence-duration 500`        | Tighter speech detection                            |
| **Known speaker count**        | `./scripts/transcribe meeting.wav --diarize --min-speakers 2 --max-speakers 3`         | Constrain diarization                               |
| **Subtitle word wrapping**     | `./scripts/transcribe audio.mp3 --format srt --word-timestamps --max-words-per-line 8` | Split long cues                                     |
| **Private/gated model**        | `./scripts/transcribe audio.mp3 --hf-token hf_xxx`                                     | Pass token directly                                 |
| **Show version**               | `./scripts/transcribe --version`                                                       | Print faster-whisper version                        |
| **Upgrade in-place**           | `./setup.sh --update`                                                                  | Upgrade without full reinstall                      |
| **System check**               | `./setup.sh --check`                                                                   | Verify GPU, Python, ffmpeg, venv, yt-dlp, pyannote  |
| **Detect language only**       | `./scripts/transcribe audio.mp3 --detect-language-only`                                | Fast language ID, no transcription                  |
| **Detect language JSON**       | `./scripts/transcribe audio.mp3 --detect-language-only --format json`                  | Machine-readable language detection                 |
| **LRC subtitles**              | `./scripts/transcribe audio.mp3 --format lrc -o lyrics.lrc`                            | Timed lyrics format for music players               |
| **ASS subtitles**              | `./scripts/transcribe audio.mp3 --format ass -o subtitles.ass`                         | Advanced SubStation Alpha (Aegisub, mpv, VLC)       |
| **Merge sentences**            | `./scripts/transcribe audio.mp3 --format srt --merge-sentences`                        | Join fragments into sentence chunks                 |
| **Stats sidecar**              | `./scripts/transcribe audio.mp3 --stats-file stats.json`                               | Write perf stats JSON after transcription           |
| **Batch stats**                | `./scripts/transcribe *.mp3 --stats-file ./stats/`                                     | One stats file per input in dir                     |
| **Template naming**            | `./scripts/transcribe audio.mp3 -o ./out/ --output-template "{stem}_{lang}.{ext}"`     | Custom batch output filenames                       |
| **Stdin input**                | `ffmpeg -i input.mp4 -f wav - \| ./scripts/transcribe -`                               | Pipe audio directly from stdin                      |
| **Custom model dir**           | `./scripts/transcribe audio.mp3 --model-dir ~/my-models`                               | Custom HuggingFace cache dir                        |
| **Local model**                | `./scripts/transcribe audio.mp3 -m ./my-model-ct2`                                     | CTranslate2 model dir                               |
| **HTML transcript**            | `./scripts/transcribe audio.mp3 --format html -o out.html`                             | Confidence-colored                                  |
| **Burn subtitles**             | `./scripts/transcribe video.mp4 --burn-in output.mp4`                                  | Requires ffmpeg + video input                       |
| **Name speakers**              | `./scripts/transcribe audio.mp3 --diarize --speaker-names "Alice,Bob"`                 | Replaces SPEAKER_1/2                                |
| **Filter hallucinations**      | `./scripts/transcribe audio.mp3 --filter-hallucinations`                               | Removes artifacts                                   |
| **Keep temp files**            | `./scripts/transcribe https://... --keep-temp`                                         | For URL re-processing                               |
| **Parallel batch**             | `./scripts/transcribe *.mp3 --parallel 4 -o ./out/`                                    | CPU multi-file                                      |
| **RTX 3070 recommended**       | `./scripts/transcribe audio.mp3 --compute-type int8_float16`                           | Saves ~1GB VRAM, minimal quality loss               |
| **CPU thread count**           | `./scripts/transcribe audio.mp3 --threads 8`                                           | Force CPU thread count (default: auto)              |
| **Podcast RSS (latest 5)**     | `./scripts/transcribe --rss https://feeds.example.com/podcast.xml`                     | Downloads & transcribes newest 5 episodes           |
| **Podcast RSS (all episodes)** | `./scripts/transcribe --rss https://... --rss-latest 0 -o ./episodes/`                 | All episodes, one file each                         |
| **Podcast + SRT subtitles**    | `./scripts/transcribe --rss https://... --format srt -o ./subs/`                       | Subtitle all episodes                               |
| **Retry on failure**           | `./scripts/transcribe *.mp3 --retries 3 -o ./out/`                                     | Retry up to 3× with backoff on error                |
| **CSV output**                 | `./scripts/transcribe audio.mp3 --format csv -o out.csv`                               | Spreadsheet-ready with header row; properly quoted  |
| **CSV with speakers**          | `./scripts/transcribe audio.mp3 --diarize --format csv -o out.csv`                     | Adds speaker column                                 |
| **Language map (inline)**      | `./scripts/transcribe *.mp3 --language-map "interview*.mp3=en,lecture.wav=fr"`         | Per-file language in batch                          |
| **Language map (JSON)**        | `./scripts/transcribe *.mp3 --language-map @langs.json`                                | JSON file: {"pattern": "lang"}                      |
| **Batch with ETA**             | `./scripts/transcribe *.mp3 -o ./out/`                                                 | Automatic ETA shown for each file in batch          |
| **TTML subtitles**             | `./scripts/transcribe audio.mp3 --format ttml -o subtitles.ttml`                       | Broadcast-standard DFXP/TTML (Netflix, BBC, Amazon) |
| **TTML with speaker labels**   | `./scripts/transcribe audio.mp3 --diarize --format ttml -o subtitles.ttml`             | Speaker-labeled TTML                                |
| **Search transcript**          | `./scripts/transcribe audio.mp3 --search "keyword"`                                    | Find timestamps where keyword appears               |
| **Search to file**             | `./scripts/transcribe audio.mp3 --search "keyword" -o results.txt`                     | Save search results                                 |
| **Fuzzy search**               | `./scripts/transcribe audio.mp3 --search "aproximate" --search-fuzzy`                  | Approximate/partial matching                        |
| **Detect chapters**            | `./scripts/transcribe audio.mp3 --detect-chapters`                                     | Auto-detect chapters from silence gaps              |
| **Chapter gap tuning**         | `./scripts/transcribe audio.mp3 --detect-chapters --chapter-gap 5`                     | Chapters on gaps ≥5s (default: 8s)                  |
| **Chapters to file**           | `./scripts/transcribe audio.mp3 --detect-chapters --chapters-file ch.txt`              | Save YouTube-format chapter list                    |
| **Chapters JSON**              | `./scripts/transcribe audio.mp3 --detect-chapters --chapter-format json`               | Machine-readable chapter list                       |
| **Export speaker audio**       | `./scripts/transcribe audio.mp3 --diarize --export-speakers ./speakers/`               | Save each speaker's audio to separate WAV files     |
| **Multi-format output**        | `./scripts/transcribe audio.mp3 --format srt,text -o ./out/`                           | Write SRT + TXT in one pass                         |
| **Remove filler words**        | `./scripts/transcribe audio.mp3 --clean-filler`                                        | Strip um/uh/er/ah/hmm and discourse markers         |
| **Left channel only**          | `./scripts/transcribe audio.mp3 --channel left`                                        | Extract left stereo channel before transcribing     |
| **Right channel only**         | `./scripts/transcribe audio.mp3 --channel right`                                       | Extract right stereo channel                        |
| **Max chars per line**         | `./scripts/transcribe audio.mp3 --format srt --max-chars-per-line 42`                  | Character-based subtitle wrapping                   |
| **Detect paragraphs**          | `./scripts/transcribe audio.mp3 --detect-paragraphs`                                   | Insert paragraph breaks in text output              |
| **Paragraph gap tuning**       | `./scripts/transcribe audio.mp3 --detect-paragraphs --paragraph-gap 5.0`               | Tune gap threshold (default 3.0s)                   |

## Model Selection

Choose the right model for your needs:

```dot
digraph model_selection {
    rankdir=LR;
    node [shape=box, style=rounded];

    start [label="Start", shape=doublecircle];
    need_accuracy [label="Need maximum\naccuracy?", shape=diamond];
    multilingual [label="Multilingual\ncontent?", shape=diamond];
    resource_constrained [label="Resource\nconstraints?", shape=diamond];

    large_v3 [label="large-v3\nor\nlarge-v3-turbo", style="rounded,filled", fillcolor=lightblue];
    large_turbo [label="large-v3-turbo", style="rounded,filled", fillcolor=lightblue];
    distil_large [label="distil-large-v3.5\n(default)", style="rounded,filled", fillcolor=lightgreen];
    distil_medium [label="distil-medium.en", style="rounded,filled", fillcolor=lightyellow];
    distil_small [label="distil-small.en", style="rounded,filled", fillcolor=lightyellow];

    start -> need_accuracy;
    need_accuracy -> large_v3 [label="yes"];
    need_accuracy -> multilingual [label="no"];
    multilingual -> large_turbo [label="yes"];
    multilingual -> resource_constrained [label="no (English)"];
    resource_constrained -> distil_small [label="mobile/edge"];
    resource_constrained -> distil_medium [label="some limits"];
    resource_constrained -> distil_large [label="no"];
}
```

### Model Table

#### Standard Models (Full Whisper)

| Model                  | Size  | Speed     | Accuracy  | Use Case                           |
| ---------------------- | ----- | --------- | --------- | ---------------------------------- |
| `tiny` / `tiny.en`     | 39M   | Fastest   | Basic     | Quick drafts                       |
| `base` / `base.en`     | 74M   | Very fast | Good      | General use                        |
| `small` / `small.en`   | 244M  | Fast      | Better    | Most tasks                         |
| `medium` / `medium.en` | 769M  | Moderate  | High      | Quality transcription              |
| `large-v1/v2/v3`       | 1.5GB | Slower    | Best      | Maximum accuracy                   |
| `large-v3-turbo`       | 809M  | Fast      | Excellent | High accuracy (slower than distil) |

#### Distilled Models (~6x Faster, ~1% WER difference)

| Model                   | Size | Speed vs Standard | Accuracy  | Use Case                           |
| ----------------------- | ---- | ----------------- | --------- | ---------------------------------- |
| **`distil-large-v3.5`** | 756M | ~6.3x faster      | 7.08% WER | **Default, best balance**          |
| `distil-large-v3`       | 756M | ~6.3x faster      | 7.53% WER | Previous default                   |
| `distil-large-v2`       | 756M | ~5.8x faster      | 10.1% WER | Fallback                           |
| `distil-medium.en`      | 394M | ~6.8x faster      | 11.1% WER | English-only, resource-constrained |
| `distil-small.en`       | 166M | ~5.6x faster      | 12.1% WER | Mobile/edge devices                |

`.en` models are English-only and slightly faster/better for English content.

> **Note for distil models:** HuggingFace recommends disabling `condition_on_previous_text` for all distil models to prevent repetition loops. The script **auto-applies** `--no-condition-on-previous-text` whenever a `distil-*` model is detected. Pass `--condition-on-previous-text` to override if needed.

## Custom & Fine-tuned Models

WhisperModel accepts local CTranslate2 model directories and HuggingFace repo names — no code changes nee...

© ThePlasmak · MIT · ThePlasmak/faster-whisper

Similar skills

Everything for AI and ML →

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor