Professional video hard subtitle extraction tool. Extract hardcoded subtitles from any video and output SRT, VTT, ASS, JSON and more. Built with Tauri + Vue 3 + Rust.
Every subtitle maps to exact video frames. View source frames directly from the subtitle list.
| Engine | Technology | Accuracy | Speed | Languages |
|---|---|---|---|---|
| PaddleOCR | PP-OCRv5 Deep Learning | Excellent | Fast | 80+ |
| EasyOCR | PyTorch | Good | Medium | 80+ |
| Tesseract.js | LSTM + WASM | Good | Fastest | 100+ |
- Multi-pass OCR: recognize multiple times, take the best result
- Text normalization: full-width to half-width punctuation, Chinese typo correction
- Confidence calibration: mixed language / short text / repeated chars auto-degraded
- Subtitle merge: Levenshtein similarity auto-deduplication
| Format | Frame-Mapped | Best For |
|---|---|---|
| SRT | No | Universal subtitle players |
| WebVTT | No | Web video |
| ASS | No | Anime fansub, advanced styling |
| JSON | Yes | Frame-accurate editing |
| CSV | Yes | Spreadsheet analysis |
| TXT | No | Plain text |
| LRC | No | Lyrics |
| SBV | No | YouTube subtitles |
| SSA | No | Legacy subtitle format |
MP4 · MKV · AVI · MOV · WebM
# Clone the repo
git clone https://github.com/Agions/HardSubX.git
cd HardSubX
# Install frontend dependencies
pnpm install
# Run in development mode
pnpm tauri dev
# Build production package
pnpm tauri build# Basic extraction
hardsubx-cli extract video.mp4 --output ./subs
# Multi-format output
hardsubx-cli extract video.mp4 --format srt,vtt,json --output ./subs
# Specify ROI region + OCR engine
hardsubx-cli extract video.mp4 --roi bottom --ocr paddle --lang ch,en
# Custom confidence threshold
hardsubx-cli extract video.mp4 --confidence 80
# Preview a specific frame
hardsubx-cli preview video.mp4 --frame 1500
# Show video metadata
hardsubx-cli info video.mp4
# Display help
hardsubx-cli --help| Layer | Technology |
|---|---|
| Desktop Framework | Tauri 2.x |
| Frontend | Vue 3 + TypeScript |
| Backend | Rust |
| OCR Engines | Tesseract.js (WASM), PaddleOCR (Native), EasyOCR |
| State Management | Pinia |
| Build Tool | Vite |
HardSubX/
├── src/ # Vue frontend
│ ├── components/ # Vue components
│ │ ├── common/ # Button, Modal, Tooltip
│ │ ├── layout/ # ToolBar, SidePanel, VideoPreview
│ │ ├── video/ # ROISelector, Timeline
│ │ └── subtitle/ # SubtitleList, ExportDialog
│ ├── composables/ # Vue composables
│ │ ├── useOCREngine.ts # OCR engine + post-processing
│ │ ├── useVideoPlayer.ts
│ │ └── useBatchProcessor.ts
│ └── stores/ # Pinia stores
│
├── src-tauri/ # Rust backend
│ └── src/commands/ # Tauri IPC commands
│ ├── video.rs
│ ├── ocr.rs
│ └── export.rs
│
├── docs/ # Documentation
│ ├── index.md
│ ├── getting-started.md
│ ├── cli.md
│ └── architecture.md
│
└── cli/ # Node.js CLI tool