meizhong986/WhisperJAV

ASR/STT subtitle generator. Uses Qwen3-ASR, local LLM, Whisper, TEN-VAD. Noise-robust for JAV

2,220

stars

1,087

commits

Python

primary language

Sep 5, 2026

updated

github.com/meizhong986/WhisperJAV/releases/latest
aitranslate
hallucination
japanese
llm
modelscope
qwen3
qwen3-asr
speechenhancement
speech-to-text
subtitling
ten-vad
whisper
zipformer
Browse cluster: Whisper-based speech recognition

README

WhisperJAV

Open In Colab Open In Kaggle Buy Me a Coffee

A subtitle generator for Japanese Adult Videos. Free, runs on your own machine, no cloud upload of your media.

Documentation: English | 简体中文


The idea

Speech recognition models like Whisper are trained on clean, curated speech. JAV audio is the opposite of that, and the mismatch breaks them in specific, well-understood ways:

  1. The acoustic profile. JAV audio has a low signal-to-noise ratio and a high density of non-verbal vocalisations — breathing, gasps, moans — whose spectra often mimic real Japanese syllables (e.g. fu), tricking the model into hearing words where none exist. Add extreme volume swings (whispers to screams) and theatrical role language (yakuwarigo) absent from training corpora, and the model's assumptions stop holding.

  2. Long-form drift and hallucination. These are feature-length recordings, not 30-second clips. Over long stretches of ambiguous audio — silence, rhythmic breathing — the model's attention collapses and it fills the void with repeated or invented text. This is a documented failure mode of Whisper-family models [3, 4, 5].

  3. The pre-processing paradox. Intuition says "denoise first". In practice, blanket denoising and vocal isolation can strip the high-frequency detail the model needs to tell consonants apart, making things worse. Fine-tuning on JAV data has its own trap: good datasets are scarce, so fine-tuned models tend to overfit and become hit-or-miss.

WhisperJAV is built around these three failure points rather than around any single model:

  • Scene-based segmentation — split the audio at natural acoustic boundaries so the model always processes a coherent environment, never a mixed stream [1, 2].
  • VAD clamping — detect where speech actually is, and feed the model only that, with measured padding. This is the main defence against hallucination on non-speech.
  • Defensive decoding and post-processing — tuned confidence thresholds discard low-quality output, and Japanese-aware filters clean what remains.

None of this is magic; it is careful plumbing around known model weaknesses, and the defaults are tuned against ground-truth benchmarks. Results still vary with source audio quality.


Quick start

GUI (recommended): launch WhisperJAV from the desktop shortcut (Windows installer) or run:

whisperjav-gui

Add files, pick a mode, click Start. Subtitles land next to your video as .srt.

Command line:

whisperjav video.mp4                                        # defaults
whisperjav video.mp4 --mode balanced --sensitivity aggressive
whisperjav /path/to/folder --output-dir ./subtitles         # whole folder

Any input FFmpeg can read works: MP4, MKV, AVI, WMV, MP3, WAV, FLAC, and so on. Output is SRT (default), WebVTT, or both (--output-format both).


How a video becomes subtitles

Every pipeline follows the same overall shape; modes differ in which components they use and how aggressively they are tuned.

flowchart LR
    A[Audio<br/>extraction] --> B[Scene<br/>detection]
    B --> C[Speech<br/>enhancement<br/><i>optional</i>]
    C --> D[Speech<br/>segmentation<br/>VAD]
    D --> E[ASR<br/>model]
    E --> F[Post-<br/>processing]
    F --> G[.srt]
  • Scene detection uses the media characteristics to cut by predicted scenes. This allows the downstream VAD and ASR to receive chunks which have similar DNA.
  • Speech enhancement (off by default) can clean audio per-scene — used surgically, per the pre-processing paradox above.
  • Speech segmentation (VAD) finds where speech actually is inside each scene. This choice matters more than most settings: it decides what the model hears and, in the modern pipelines, where your subtitle timestamps come from.
  • The ASR model turns speech into text.
  • Post-processing is the Japanese-specific cleanup pass:
    • Sentence regrouping aware of ending particles (ね, よ, わ, の), aizuchi (うん, はい), and dialect patterns (Kansai-ben and others)
    • Hallucination and repetition removal
    • Sound-only line removal — subtitle lines that are purely moans/breathing kana are dropped (real dialogue is protected by an evidence check)
    • Timing repair — a subtitle whose duration is absurdly long for its text gets its start pulled in (the end stays put); the console reports how many lines were retimed
    • Scene-boundary overlap resolution

Each stage has several interchangeable providers — the full menu, with strengths and weaknesses, is in Mix-and-match strategies below.


Processing modes

ModeEngineCharacter
balancedFaster-WhisperDefault. Full pipeline; good speed/accuracy balance
fidelityOpenAI WhisperSlowest, most thorough of the classic pipelines
fastOpenAI Whisper + scene detectionGeneral use, mixed-quality audio
fasterFaster-Whisper, minimal preprocessingSpeed first, clean audio
qwen (ChronosJAV)Qwen3-ASRModern text-first recognizer
anime-whisper (ChronosJAV)anime-whisperAnime/JAV-tuned dialogue
transformersHuggingFaceKotoba and other HF Whisper models
crispasrExternalBring-your-own CrispASR build (experimental)

Sensitivity applies to every mode: conservative (fewer false positives, good for noisy content) · balanced · aggressive (catches more quiet dialogue; good for whisper/ASMR content — and the tuning target of most of our benchmark work).

ChronosJAV

Some of the best recognizers for this domain (anime-whisper, Qwen3-ASR and its Japanese finetunes) don't produce reliable timestamps on their own. ChronosJAV runs text generation and timing as separate stages: the VAD provides the time skeleton, the model provides the words. Since v1.9, timestamps come from the VAD frames by default (no aligner model loaded, ~1 GB less VRAM); a Qwen forced-aligner mode remains available in the settings for word-level alignment.

The same decoupled design is why new models can be added without rebuilding the pipeline — anything that turns audio into text can be slotted in.


Two-pass ensemble

Different pipelines miss different lines. Ensemble mode runs your file through two pipelines and merges the results.

The v1.9 default pairing: pass 1 = anime-whisper with WhisperSeg VAD, pass 2 = Qwen3-ASR with TEN VAD — two different recognizers and two different VADs, so their blind spots don't overlap.

whisperjav video.mp4 --ensemble \
    --pass1-pipeline qwen --pass2-pipeline balanced \
    --merge-strategy pass1_primary
  • Merge strategies: pass1_primary / pass2_primary (one pass leads, the other fills gaps), smart_merge, full_merge, pass1_overlap / pass2_overlap, longest
  • Presets: save and reload named ensemble configurations from the GUI
  • Serial mode (--ensemble-serial): finish each file completely before starting the next, so results appear as they're done
  • Bring your own pass 2: PurfView's Faster-Whisper XXL (--pass2-pipeline xxl --xxl-exe ...) or an external CrispASR build

Mix-and-match strategies

The Ensemble tab is a mixing desk. Each pass is a free combination of five choices — pipeline × scene detection × audio pre-processing × speech segmentation × ASR model — and the two-pass design is the sixth dimension. The defaults are benchmark-tuned, so you never have to touch any of this; but audio varies a lot, and one deliberate substitution is often worth the experiment. The golden rule: change one thing at a time, so you know what caused the difference.

Pipeline

The recipe that ties the other choices together.

PipelineStrengthWatch out
balancedThe workhorse: full pipeline, good speed/accuracy, every component swappableJack of all trades — specialists beat it on their home turf
fidelityMost thorough classic pipeline; strong on quiet/ASMR contentSlowest option
fastDecent middle ground on mixed-quality audioFewer defences than balanced
fasterSpeed; fine for clean, dialogue-forward audioMinimal preprocessing = less hallucination protection
qwen (ChronosJAV)Modern text-first recognizer; robust on messy audioTimestamps come from the VAD, so the segmenter choice matters doubly
anime-whisper (ChronosJAV)Best-in-class on anime-style/JAV dialogue; heavily benchmark-tuned hereCan miss very faint, isolated utterances
transformersRuns any HF Whisper model; best GPU path on Apple SiliconUses HF's own chunking — scene/segmenter choices don't apply
crispasr / xxlBring your own external engine as a passSelf-contained: WhisperJAV's knobs don't reach inside

Naming note (CLI users). ChronosJAV is one pipeline with interchangeable recognizers, so qwen and anime-whisper are two backends of it rather than two separate pipelines. The GUI lists them side by side in the pipeline dropdown; on the command line both live under qwen, and the backend is chosen inside the params:

# Qwen3-ASR (the default backend)
--pass1-pipeline qwen

# anime-whisper, same pipeline, different recognizer
--pass1-pipeline qwen --pass1-qwen-params '{"generator_backend": "anime-whisper"}'

The usable values for generator_backend are qwen3 and anime-whisper (a third, cohere, exists in the code but is not currently enabled). Note also that litagin/anime-whisper can be loaded through the transformers pipeline via --hf-model-id — but that route uses HF's own chunking and does not produce usable per-line timing, so prefer the ChronosJAV route above.

Scene detection

Where the long file gets cut into workable pieces.

MethodStrengthWatch out
SemanticGroups acoustically similar audio; best for full-length features; ChronosJAV defaultOccasionally cuts inside speech on very uniform audio
AuditokEnergy-based: fast, simple, dependableConstant background music can mask the pauses it needs
SileroNeural; holds up on noisy audioSlower than auditok
NoneNo cutting at allOnly sensible for short clips

Audio pre-processing (speech enhancement)

Off by default — remember the pre-processing paradox. The "Enhance for VAD only" checkbox is the safest way to use these: the cleaned audio guides speech detection while the model still hears the original.

BackendStrengthWatch out
noneNo artefacts, no surprises — the right defaultWon't rescue genuinely bad audio
ffmpeg-dspTransparent classic filters (loudnorm, denoise, compress…); loudnorm genuinely helps very quiet recordingsAggressive settings dull consonants
zipenhancerLightweight neural denoise; good against hiss16 kHz processing; can soften detail
clearvoiceStronger neural denoise, up to 48 kHzHeavier; artefact risk on music-heavy audio
bs-roformerVocal isolation — separates voice from loud BGMThe biggest intervention of all; reserve for music-dominated content

Speech segmentation (VAD)

Decides what the model hears — and in ChronosJAV pipelines, where your timestamps come from. Probably the highest-leverage swap on this list.

BackendStrengthWatch out
WhisperSegTrained on Japanese ASMR-style audio; tuned against our ground truth; the JA defaultJapanese-specialised — switch it for other languages
TEN VADLight and quick; good general performer; pass-2 default for diversityLess JA-specialised than WhisperSeg
Silero v3.1 / v4.0Solid general-purpose; the recommendation for non-Japanese audioTends to miss very quiet Japanese speech
Silero v6.2Adds max-duration splitting and finer controlSame quiet-speech caveat
Faster-Whisper nativeFastest — one recognizer call per sceneCoarser timing than a dedicated VAD
FireRedVAD (new, experimental)Tiny multilingual model, cheap on CPU; early access for feedbackPresets not yet JAV-tuned; needs pip install fireredvad
NoneThe model hears everythingMaximum hallucination exposure on non-speech

ASR engine and model

ModelPipelineStrengthWatch out
Whisper large-v2classicThe most predictable performer on this domain — that's why it's the defaultNot the newest
Whisper large-v3classicNewer trainingMore hallucination-prone on JAV audio
Whisper turboclassicFastest WhisperSome accuracy cost
whisper-ja-1.5B (CT2) (new)balancedJA finetune, word timestamps intact; strongest results in our scene-length benchmarksCommunity model; occasional repetitions (our filters catch most)
anime-whisperChronosJAVExcellent anime/JAV dialogue qualityNo native timestamps — VAD-timed
Qwen3-ASR 1.7B / 0.6BChronosJAVRobust on messy audio; 0.6B fits 4 GB VRAMNo native timestamps — VAD-timed
JA Anime-Galgame 1.7B (new)ChronosJAVQwen finetune with published gains on anime speech (CER −27% rel.); recovers lines the base dropsSlightly more junk insertions (post-processing handles most)
JA-tuned 1.7B (neosophie) (new)ChronosJAVQwen finetune aimed at proper nouns and kanji-heavy phrasingNo published benchmarks
Kotoba familytransformersJapanese-optimized, light; bilingual variant; good on Apple SiliconSmaller models — ceiling below the 1.5B+ class

The two-pass dimension

Everything above multiplies: two passes means two full recipes, then a merge. What makes a good pair is diversity — different recognizers and different VADs, so the passes fail in different places and the merge covers both.

A few known-good recipes:

GoalPass 1Pass 2Merge
The v1.9 defaultanime-whisper · semantic · WhisperSeg · aggressiveQwen3-ASR · semantic · TENpass1_primary
Classic + modernbalanced · large-v2qwen (or the Anime-Galgame finetune)pass1_primary
Quiet/ASMR recallfidelity · aggressiveanime-whisper · aggressivelongest
Second opinion on the model onlyyour usual recipesame recipe, different ASR modelpass1_primary

Merge strategies. Seven are available (--merge-strategy):

StrategyWhat it does
pass1_primaryKeeps pass 1 as primary and fills missing parts from pass 2
pass2_primaryThe mirror image — pass 2 primary, filled from pass 1
smart_mergeAutomatically picks the better line from each pass
full_mergeIncludes every line from both passes — most recall, most duplicates to clean up
longestFor each overlapping pair, picks the subtitle with more text content
pass1_overlap / pass2_overlapSame as the _primary pair, but tolerates up to 30% overlap when filling — use when the two passes disagree slightly on boundaries

Save anything that works as a preset so it's one click next time.


AI translation

Generate and translate in one go, or translate subtitles you already have:

whisperjav video.mp4 --translate                      # transcribe + translate
whisperjav-translate -i subtitles.srt --provider ollama
ProviderCostNotes
Ollamafree, localRecommended local option; auto-starts the server and picks a model for your VRAM
DeepSeekcheapGood quality/price for this content
Geminifree tier
Claude / GPT / OpenRouter / GLM / Groqpaid API
Local LLM (llama-cpp)free, localLegacy option; auto-installs on first use

Interrupted translations resume where they left off — just run the same command again.


The GUI

Four tabs:

  1. Transcribe — files, mode, sensitivity, language
  2. Advanced options — output format, scene detection, model override, debug
  3. Ensemble — the two-pass grid: per-pass pipeline, sensitivity, scene detector, enhancer, VAD, and model, plus a Customize dialog exposing each backend's tunable parameters, and preset save/load
  4. AI SRT Translate — translate existing subtitle files

Sensible defaults everywhere: if you never open a Customize dialog, you get the benchmark-tuned configuration.


Which mode for which content

ContentSuggestionSensitivity
Dialogue-heavy dramabalancedaggressive
Anime-style / clear JAV dialogueanime-whisperaggressive
ASMR / whispering / VRfidelity or anime-whisperaggressive
Heavy background musicbalancedconservative
Amateur / variable audiofastconservative
Group scenesfasterconservative
Best possible resultensemble (anime-whisper + qwen)per-pass defaults

These are starting points, not rules — see Mix-and-match strategies for how to adapt them.


Installation

Already installed? Upgrade with whisperjav-upgrade (all platforms). Rollback is available: whisperjav-upgrade --rollback.

No Python knowledge needed.

  1. Download the .exe from Releases
  2. Run it — no admin rights required (installs to %LOCALAPPDATA%\WhisperJAV)
  3. Wait 10–20 minutes while it sets up Python, PyTorch, FFmpeg and dependencies. It detects your NVIDIA driver and installs the matching CUDA build automatically (or CPU-only if no GPU)
  4. Launch from the desktop shortcut. First transcription downloads models (~3 GB)

Google Colab / Kaggle

No local install at all — use the badges at the top of this page. Maintained notebooks for both platforms.

Windows — install from source

Prerequisites: Python 3.10–3.12, Git, FFmpeg in PATH.

git clone https://github.com/meizhong986/whisperjav.git
cd whisperjav
installer\install_windows.bat            :: auto-detects GPU
installer\install_windows.bat --cpu-only :: or force CPU

Full guide: docs/en/guides/installation_windows_python.md

macOS (Apple Silicon)
xcode-select --install
brew install python@3.12 ffmpeg portaudio git

git clone https://github.com/meizhong986/whisperjav.git
cd whisperjav
python3 -m venv ~/venvs/whisperjav && source ~/venvs/whisperjav/bin/activate
chmod +x installer/install_mac.sh && ./installer/install_mac.sh

M-series chips get MPS acceleration for Whisper pipelines (--mode transformers performs best). The CTranslate2-based modes and the Qwen pipeline currently run on CPU on Mac. Intel Macs are CPU-only.

Full guide: docs/en/guides/installation_mac_apple_silicon.md

Linux

Install system packages first (Ubuntu example; see the guide for Fedora/Arch):

sudo apt-get install -y python3 python3-pip python3-venv python3-dev \
    build-essential ffmpeg git libsndfile1 libsndfile1-dev

Then:

git clone https://github.com/meizhong986/whisperjav.git
cd whisperjav
chmod +x installer/install_linux.sh && ./installer/install_linux.sh

You need the NVIDIA driver (450+), but not the CUDA Toolkit — PyTorch bundles its own runtime. GUI needs WebKit2GTK. On distros with externally-managed Python (Ubuntu 24.04+), use a venv; the script detects this and tells you what to do.

Full guide: docs/en/guides/installation_linux.md

Expert: pip with modular extras

Install PyTorch first (pick your platform):

pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu128  # NVIDIA
pip install torch torchaudio                                                     # Apple Silicon
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu    # CPU

Then WhisperJAV with the extras you want:

pip install "whisperjav[all] @ git+https://github.com/meizhong986/whisperjav.git"

Extras: cli, gui, translate, llm, enhance, huggingface, analysis, colab, all.

System requirements

MinimumRecommended
OSWindows 10 / macOS 11 / Ubuntu 20.04Windows 11 / macOS 14 / Ubuntu 22.04
Python (source installs)3.103.11
RAM8 GB16 GB
Disk8 GB15 GB with models
GPUnone (CPU works, slowly)NVIDIA RTX 2060+ or Apple Silicon

Rough speed per hour of video: RTX GPU 5–10 min · Apple Silicon 8–15 min · CPU 30–60 min.


Troubleshooting

  • "FFmpeg not found" — install FFmpeg and add it to PATH.
  • Very slow, GPU warning in log — your PyTorch is CPU-only. Reinstall it with the CUDA index URL shown above.
  • model.bin error in faster mode — enable Windows Developer Mode (or run once as admin), then delete the cached model folder under %USERPROFILE%\.cache\huggingface\hub.
  • Anything else: open a GitHub issue with your system info and the console log. Logs and reproduction details make fixes much faster.

Contributing

Contributions are welcome — see CONTRIBUTING.md. Development setup:

git clone https://github.com/meizhong986/whisperjav.git
cd whisperjav
pip install -e ".[dev]"
python -m pytest tests/

License

MIT. See LICENSE.

References

  1. Chen, Y., et al. (2025). "ChronusOmni: Improving Time Awareness of Omni Large Language Models." arXiv:2512.09841. (Inspiration for the ChronosJAV pipeline)
  2. Bain, M., et al. (2023). "WhisperX: Time-Accurate Speech Transcription of Long-Form Audio." arXiv:2303.00747.
  3. Wang, Y., et al. (2025). "Calm-Whisper: Reduce Whisper Hallucination On Non-Speech By Calming Crazy Heads Down." Interspeech 2025. arXiv:2505.12969.
  4. Barański, M., et al. (2025). "Investigation of Whisper ASR Hallucinations Induced by Non-Speech Audio." arXiv:2501.11378.
  5. Koenecke, A., et al. (2024). "Careless Whisper: Speech-to-Text Hallucination Harms." ACM FAccT 2024.
  6. Roll, N., et al. (2025). "In-Context Learning Boosts Speech Recognition via Human-like Adaptation to Speakers and Language Varieties." arXiv:2505.14887.
  7. Yang, X., et al. (2024). "PromptASR for Contextualized ASR with Controllable Style." ICASSP 2024. arXiv:2309.07414.

Acknowledgments

Built on the shoulders of: OpenAI Whisper · faster-whisper · stable-ts · Qwen3-ASR · anime-whisper · Kotoba-Whisper · HuggingFace Transformers · PySubtrans — and the testing community, whose feedback and bug reports shape every release.

Disclaimer

This tool generates accessibility subtitles. Users are responsible for compliance with applicable laws regarding the content they process.

Contributors

meizhong986

1,073 commits

hyiip

8 commits

Copilot

6 commits

meizhong986/WhisperJAV

ASR/STT subtitle generator. Uses Qwen3-ASR, local LLM, Whisper, TEN-VAD. Noise-robust for JAV

2,220

stars

1,087

commits

Python

primary language

Sep 5, 2026

updated

github.com/meizhong986/WhisperJAV/releases/latest
aitranslate
hallucination
japanese
llm
modelscope
qwen3
qwen3-asr
speechenhancement
speech-to-text
subtitling
ten-vad
whisper
zipformer
Browse cluster: Whisper-based speech recognition

README

WhisperJAV

Open In Colab Open In Kaggle Buy Me a Coffee

A subtitle generator for Japanese Adult Videos. Free, runs on your own machine, no cloud upload of your media.

Documentation: English | 简体中文


The idea

Speech recognition models like Whisper are trained on clean, curated speech. JAV audio is the opposite of that, and the mismatch breaks them in specific, well-understood ways:

  1. The acoustic profile. JAV audio has a low signal-to-noise ratio and a high density of non-verbal vocalisations — breathing, gasps, moans — whose spectra often mimic real Japanese syllables (e.g. fu), tricking the model into hearing words where none exist. Add extreme volume swings (whispers to screams) and theatrical role language (yakuwarigo) absent from training corpora, and the model's assumptions stop holding.

  2. Long-form drift and hallucination. These are feature-length recordings, not 30-second clips. Over long stretches of ambiguous audio — silence, rhythmic breathing — the model's attention collapses and it fills the void with repeated or invented text. This is a documented failure mode of Whisper-family models [3, 4, 5].

  3. The pre-processing paradox. Intuition says "denoise first". In practice, blanket denoising and vocal isolation can strip the high-frequency detail the model needs to tell consonants apart, making things worse. Fine-tuning on JAV data has its own trap: good datasets are scarce, so fine-tuned models tend to overfit and become hit-or-miss.

WhisperJAV is built around these three failure points rather than around any single model:

  • Scene-based segmentation — split the audio at natural acoustic boundaries so the model always processes a coherent environment, never a mixed stream [1, 2].
  • VAD clamping — detect where speech actually is, and feed the model only that, with measured padding. This is the main defence against hallucination on non-speech.
  • Defensive decoding and post-processing — tuned confidence thresholds discard low-quality output, and Japanese-aware filters clean what remains.

None of this is magic; it is careful plumbing around known model weaknesses, and the defaults are tuned against ground-truth benchmarks. Results still vary with source audio quality.


Quick start

GUI (recommended): launch WhisperJAV from the desktop shortcut (Windows installer) or run:

whisperjav-gui

Add files, pick a mode, click Start. Subtitles land next to your video as .srt.

Command line:

whisperjav video.mp4                                        # defaults
whisperjav video.mp4 --mode balanced --sensitivity aggressive
whisperjav /path/to/folder --output-dir ./subtitles         # whole folder

Any input FFmpeg can read works: MP4, MKV, AVI, WMV, MP3, WAV, FLAC, and so on. Output is SRT (default), WebVTT, or both (--output-format both).


How a video becomes subtitles

Every pipeline follows the same overall shape; modes differ in which components they use and how aggressively they are tuned.

flowchart LR
    A[Audio<br/>extraction] --> B[Scene<br/>detection]
    B --> C[Speech<br/>enhancement<br/><i>optional</i>]
    C --> D[Speech<br/>segmentation<br/>VAD]
    D --> E[ASR<br/>model]
    E --> F[Post-<br/>processing]
    F --> G[.srt]
  • Scene detection uses the media characteristics to cut by predicted scenes. This allows the downstream VAD and ASR to receive chunks which have similar DNA.
  • Speech enhancement (off by default) can clean audio per-scene — used surgically, per the pre-processing paradox above.
  • Speech segmentation (VAD) finds where speech actually is inside each scene. This choice matters more than most settings: it decides what the model hears and, in the modern pipelines, where your subtitle timestamps come from.
  • The ASR model turns speech into text.
  • Post-processing is the Japanese-specific cleanup pass:
    • Sentence regrouping aware of ending particles (ね, よ, わ, の), aizuchi (うん, はい), and dialect patterns (Kansai-ben and others)
    • Hallucination and repetition removal
    • Sound-only line removal — subtitle lines that are purely moans/breathing kana are dropped (real dialogue is protected by an evidence check)
    • Timing repair — a subtitle whose duration is absurdly long for its text gets its start pulled in (the end stays put); the console reports how many lines were retimed
    • Scene-boundary overlap resolution

Each stage has several interchangeable providers — the full menu, with strengths and weaknesses, is in Mix-and-match strategies below.


Processing modes

ModeEngineCharacter
balancedFaster-WhisperDefault. Full pipeline; good speed/accuracy balance
fidelityOpenAI WhisperSlowest, most thorough of the classic pipelines
fastOpenAI Whisper + scene detectionGeneral use, mixed-quality audio
fasterFaster-Whisper, minimal preprocessingSpeed first, clean audio
qwen (ChronosJAV)Qwen3-ASRModern text-first recognizer
anime-whisper (ChronosJAV)anime-whisperAnime/JAV-tuned dialogue
transformersHuggingFaceKotoba and other HF Whisper models
crispasrExternalBring-your-own CrispASR build (experimental)

Sensitivity applies to every mode: conservative (fewer false positives, good for noisy content) · balanced · aggressive (catches more quiet dialogue; good for whisper/ASMR content — and the tuning target of most of our benchmark work).

ChronosJAV

Some of the best recognizers for this domain (anime-whisper, Qwen3-ASR and its Japanese finetunes) don't produce reliable timestamps on their own. ChronosJAV runs text generation and timing as separate stages: the VAD provides the time skeleton, the model provides the words. Since v1.9, timestamps come from the VAD frames by default (no aligner model loaded, ~1 GB less VRAM); a Qwen forced-aligner mode remains available in the settings for word-level alignment.

The same decoupled design is why new models can be added without rebuilding the pipeline — anything that turns audio into text can be slotted in.


Two-pass ensemble

Different pipelines miss different lines. Ensemble mode runs your file through two pipelines and merges the results.

The v1.9 default pairing: pass 1 = anime-whisper with WhisperSeg VAD, pass 2 = Qwen3-ASR with TEN VAD — two different recognizers and two different VADs, so their blind spots don't overlap.

whisperjav video.mp4 --ensemble \
    --pass1-pipeline qwen --pass2-pipeline balanced \
    --merge-strategy pass1_primary
  • Merge strategies: pass1_primary / pass2_primary (one pass leads, the other fills gaps), smart_merge, full_merge, pass1_overlap / pass2_overlap, longest
  • Presets: save and reload named ensemble configurations from the GUI
  • Serial mode (--ensemble-serial): finish each file completely before starting the next, so results appear as they're done
  • Bring your own pass 2: PurfView's Faster-Whisper XXL (--pass2-pipeline xxl --xxl-exe ...) or an external CrispASR build

Mix-and-match strategies

The Ensemble tab is a mixing desk. Each pass is a free combination of five choices — pipeline × scene detection × audio pre-processing × speech segmentation × ASR model — and the two-pass design is the sixth dimension. The defaults are benchmark-tuned, so you never have to touch any of this; but audio varies a lot, and one deliberate substitution is often worth the experiment. The golden rule: change one thing at a time, so you know what caused the difference.

Pipeline

The recipe that ties the other choices together.

PipelineStrengthWatch out
balancedThe workhorse: full pipeline, good speed/accuracy, every component swappableJack of all trades — specialists beat it on their home turf
fidelityMost thorough classic pipeline; strong on quiet/ASMR contentSlowest option
fastDecent middle ground on mixed-quality audioFewer defences than balanced
fasterSpeed; fine for clean, dialogue-forward audioMinimal preprocessing = less hallucination protection
qwen (ChronosJAV)Modern text-first recognizer; robust on messy audioTimestamps come from the VAD, so the segmenter choice matters doubly
anime-whisper (ChronosJAV)Best-in-class on anime-style/JAV dialogue; heavily benchmark-tuned hereCan miss very faint, isolated utterances
transformersRuns any HF Whisper model; best GPU path on Apple SiliconUses HF's own chunking — scene/segmenter choices don't apply
crispasr / xxlBring your own external engine as a passSelf-contained: WhisperJAV's knobs don't reach inside

Naming note (CLI users). ChronosJAV is one pipeline with interchangeable recognizers, so qwen and anime-whisper are two backends of it rather than two separate pipelines. The GUI lists them side by side in the pipeline dropdown; on the command line both live under qwen, and the backend is chosen inside the params:

# Qwen3-ASR (the default backend)
--pass1-pipeline qwen

# anime-whisper, same pipeline, different recognizer
--pass1-pipeline qwen --pass1-qwen-params '{"generator_backend": "anime-whisper"}'

The usable values for generator_backend are qwen3 and anime-whisper (a third, cohere, exists in the code but is not currently enabled). Note also that litagin/anime-whisper can be loaded through the transformers pipeline via --hf-model-id — but that route uses HF's own chunking and does not produce usable per-line timing, so prefer the ChronosJAV route above.

Scene detection

Where the long file gets cut into workable pieces.

MethodStrengthWatch out
SemanticGroups acoustically similar audio; best for full-length features; ChronosJAV defaultOccasionally cuts inside speech on very uniform audio
AuditokEnergy-based: fast, simple, dependableConstant background music can mask the pauses it needs
SileroNeural; holds up on noisy audioSlower than auditok
NoneNo cutting at allOnly sensible for short clips

Audio pre-processing (speech enhancement)

Off by default — remember the pre-processing paradox. The "Enhance for VAD only" checkbox is the safest way to use these: the cleaned audio guides speech detection while the model still hears the original.

BackendStrengthWatch out
noneNo artefacts, no surprises — the right defaultWon't rescue genuinely bad audio
ffmpeg-dspTransparent classic filters (loudnorm, denoise, compress…); loudnorm genuinely helps very quiet recordingsAggressive settings dull consonants
zipenhancerLightweight neural denoise; good against hiss16 kHz processing; can soften detail
clearvoiceStronger neural denoise, up to 48 kHzHeavier; artefact risk on music-heavy audio
bs-roformerVocal isolation — separates voice from loud BGMThe biggest intervention of all; reserve for music-dominated content

Speech segmentation (VAD)

Decides what the model hears — and in ChronosJAV pipelines, where your timestamps come from. Probably the highest-leverage swap on this list.

BackendStrengthWatch out
WhisperSegTrained on Japanese ASMR-style audio; tuned against our ground truth; the JA defaultJapanese-specialised — switch it for other languages
TEN VADLight and quick; good general performer; pass-2 default for diversityLess JA-specialised than WhisperSeg
Silero v3.1 / v4.0Solid general-purpose; the recommendation for non-Japanese audioTends to miss very quiet Japanese speech
Silero v6.2Adds max-duration splitting and finer controlSame quiet-speech caveat
Faster-Whisper nativeFastest — one recognizer call per sceneCoarser timing than a dedicated VAD
FireRedVAD (new, experimental)Tiny multilingual model, cheap on CPU; early access for feedbackPresets not yet JAV-tuned; needs pip install fireredvad
NoneThe model hears everythingMaximum hallucination exposure on non-speech

ASR engine and model

ModelPipelineStrengthWatch out
Whisper large-v2classicThe most predictable performer on this domain — that's why it's the defaultNot the newest
Whisper large-v3classicNewer trainingMore hallucination-prone on JAV audio
Whisper turboclassicFastest WhisperSome accuracy cost
whisper-ja-1.5B (CT2) (new)balancedJA finetune, word timestamps intact; strongest results in our scene-length benchmarksCommunity model; occasional repetitions (our filters catch most)
anime-whisperChronosJAVExcellent anime/JAV dialogue qualityNo native timestamps — VAD-timed
Qwen3-ASR 1.7B / 0.6BChronosJAVRobust on messy audio; 0.6B fits 4 GB VRAMNo native timestamps — VAD-timed
JA Anime-Galgame 1.7B (new)ChronosJAVQwen finetune with published gains on anime speech (CER −27% rel.); recovers lines the base dropsSlightly more junk insertions (post-processing handles most)
JA-tuned 1.7B (neosophie) (new)ChronosJAVQwen finetune aimed at proper nouns and kanji-heavy phrasingNo published benchmarks
Kotoba familytransformersJapanese-optimized, light; bilingual variant; good on Apple SiliconSmaller models — ceiling below the 1.5B+ class

The two-pass dimension

Everything above multiplies: two passes means two full recipes, then a merge. What makes a good pair is diversity — different recognizers and different VADs, so the passes fail in different places and the merge covers both.

A few known-good recipes:

GoalPass 1Pass 2Merge
The v1.9 defaultanime-whisper · semantic · WhisperSeg · aggressiveQwen3-ASR · semantic · TENpass1_primary
Classic + modernbalanced · large-v2qwen (or the Anime-Galgame finetune)pass1_primary
Quiet/ASMR recallfidelity · aggressiveanime-whisper · aggressivelongest
Second opinion on the model onlyyour usual recipesame recipe, different ASR modelpass1_primary

Merge strategies. Seven are available (--merge-strategy):

StrategyWhat it does
pass1_primaryKeeps pass 1 as primary and fills missing parts from pass 2
pass2_primaryThe mirror image — pass 2 primary, filled from pass 1
smart_mergeAutomatically picks the better line from each pass
full_mergeIncludes every line from both passes — most recall, most duplicates to clean up
longestFor each overlapping pair, picks the subtitle with more text content
pass1_overlap / pass2_overlapSame as the _primary pair, but tolerates up to 30% overlap when filling — use when the two passes disagree slightly on boundaries

Save anything that works as a preset so it's one click next time.


AI translation

Generate and translate in one go, or translate subtitles you already have:

whisperjav video.mp4 --translate                      # transcribe + translate
whisperjav-translate -i subtitles.srt --provider ollama
ProviderCostNotes
Ollamafree, localRecommended local option; auto-starts the server and picks a model for your VRAM
DeepSeekcheapGood quality/price for this content
Geminifree tier
Claude / GPT / OpenRouter / GLM / Groqpaid API
Local LLM (llama-cpp)free, localLegacy option; auto-installs on first use

Interrupted translations resume where they left off — just run the same command again.


The GUI

Four tabs:

  1. Transcribe — files, mode, sensitivity, language
  2. Advanced options — output format, scene detection, model override, debug
  3. Ensemble — the two-pass grid: per-pass pipeline, sensitivity, scene detector, enhancer, VAD, and model, plus a Customize dialog exposing each backend's tunable parameters, and preset save/load
  4. AI SRT Translate — translate existing subtitle files

Sensible defaults everywhere: if you never open a Customize dialog, you get the benchmark-tuned configuration.


Which mode for which content

ContentSuggestionSensitivity
Dialogue-heavy dramabalancedaggressive
Anime-style / clear JAV dialogueanime-whisperaggressive
ASMR / whispering / VRfidelity or anime-whisperaggressive
Heavy background musicbalancedconservative
Amateur / variable audiofastconservative
Group scenesfasterconservative
Best possible resultensemble (anime-whisper + qwen)per-pass defaults

These are starting points, not rules — see Mix-and-match strategies for how to adapt them.


Installation

Already installed? Upgrade with whisperjav-upgrade (all platforms). Rollback is available: whisperjav-upgrade --rollback.

No Python knowledge needed.

  1. Download the .exe from Releases
  2. Run it — no admin rights required (installs to %LOCALAPPDATA%\WhisperJAV)
  3. Wait 10–20 minutes while it sets up Python, PyTorch, FFmpeg and dependencies. It detects your NVIDIA driver and installs the matching CUDA build automatically (or CPU-only if no GPU)
  4. Launch from the desktop shortcut. First transcription downloads models (~3 GB)

Google Colab / Kaggle

No local install at all — use the badges at the top of this page. Maintained notebooks for both platforms.

Windows — install from source

Prerequisites: Python 3.10–3.12, Git, FFmpeg in PATH.

git clone https://github.com/meizhong986/whisperjav.git
cd whisperjav
installer\install_windows.bat            :: auto-detects GPU
installer\install_windows.bat --cpu-only :: or force CPU

Full guide: docs/en/guides/installation_windows_python.md

macOS (Apple Silicon)
xcode-select --install
brew install python@3.12 ffmpeg portaudio git

git clone https://github.com/meizhong986/whisperjav.git
cd whisperjav
python3 -m venv ~/venvs/whisperjav && source ~/venvs/whisperjav/bin/activate
chmod +x installer/install_mac.sh && ./installer/install_mac.sh

M-series chips get MPS acceleration for Whisper pipelines (--mode transformers performs best). The CTranslate2-based modes and the Qwen pipeline currently run on CPU on Mac. Intel Macs are CPU-only.

Full guide: docs/en/guides/installation_mac_apple_silicon.md

Linux

Install system packages first (Ubuntu example; see the guide for Fedora/Arch):

sudo apt-get install -y python3 python3-pip python3-venv python3-dev \
    build-essential ffmpeg git libsndfile1 libsndfile1-dev

Then:

git clone https://github.com/meizhong986/whisperjav.git
cd whisperjav
chmod +x installer/install_linux.sh && ./installer/install_linux.sh

You need the NVIDIA driver (450+), but not the CUDA Toolkit — PyTorch bundles its own runtime. GUI needs WebKit2GTK. On distros with externally-managed Python (Ubuntu 24.04+), use a venv; the script detects this and tells you what to do.

Full guide: docs/en/guides/installation_linux.md

Expert: pip with modular extras

Install PyTorch first (pick your platform):

pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu128  # NVIDIA
pip install torch torchaudio                                                     # Apple Silicon
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu    # CPU

Then WhisperJAV with the extras you want:

pip install "whisperjav[all] @ git+https://github.com/meizhong986/whisperjav.git"

Extras: cli, gui, translate, llm, enhance, huggingface, analysis, colab, all.

System requirements

MinimumRecommended
OSWindows 10 / macOS 11 / Ubuntu 20.04Windows 11 / macOS 14 / Ubuntu 22.04
Python (source installs)3.103.11
RAM8 GB16 GB
Disk8 GB15 GB with models
GPUnone (CPU works, slowly)NVIDIA RTX 2060+ or Apple Silicon

Rough speed per hour of video: RTX GPU 5–10 min · Apple Silicon 8–15 min · CPU 30–60 min.


Troubleshooting

  • "FFmpeg not found" — install FFmpeg and add it to PATH.
  • Very slow, GPU warning in log — your PyTorch is CPU-only. Reinstall it with the CUDA index URL shown above.
  • model.bin error in faster mode — enable Windows Developer Mode (or run once as admin), then delete the cached model folder under %USERPROFILE%\.cache\huggingface\hub.
  • Anything else: open a GitHub issue with your system info and the console log. Logs and reproduction details make fixes much faster.

Contributing

Contributions are welcome — see CONTRIBUTING.md. Development setup:

git clone https://github.com/meizhong986/whisperjav.git
cd whisperjav
pip install -e ".[dev]"
python -m pytest tests/

License

MIT. See LICENSE.

References

  1. Chen, Y., et al. (2025). "ChronusOmni: Improving Time Awareness of Omni Large Language Models." arXiv:2512.09841. (Inspiration for the ChronosJAV pipeline)
  2. Bain, M., et al. (2023). "WhisperX: Time-Accurate Speech Transcription of Long-Form Audio." arXiv:2303.00747.
  3. Wang, Y., et al. (2025). "Calm-Whisper: Reduce Whisper Hallucination On Non-Speech By Calming Crazy Heads Down." Interspeech 2025. arXiv:2505.12969.
  4. Barański, M., et al. (2025). "Investigation of Whisper ASR Hallucinations Induced by Non-Speech Audio." arXiv:2501.11378.
  5. Koenecke, A., et al. (2024). "Careless Whisper: Speech-to-Text Hallucination Harms." ACM FAccT 2024.
  6. Roll, N., et al. (2025). "In-Context Learning Boosts Speech Recognition via Human-like Adaptation to Speakers and Language Varieties." arXiv:2505.14887.
  7. Yang, X., et al. (2024). "PromptASR for Contextualized ASR with Controllable Style." ICASSP 2024. arXiv:2309.07414.

Acknowledgments

Built on the shoulders of: OpenAI Whisper · faster-whisper · stable-ts · Qwen3-ASR · anime-whisper · Kotoba-Whisper · HuggingFace Transformers · PySubtrans — and the testing community, whose feedback and bug reports shape every release.

Disclaimer

This tool generates accessibility subtitles. Users are responsible for compliance with applicable laws regarding the content they process.

Contributors

meizhong986

1,073 commits

hyiip

8 commits

Copilot

6 commits

Languages

Python

79.5%

Jupyter Notebook

7.0%

JavaScript

4.9%

Batchfile

2.7%

HTML

2.2%

CSS

1.9%

Shell

1.9%