TranscribePress
by Edris Husein · github.com/husein-edris/transcribepress · website
★ 0stars
0forks
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/husein-edris/transcribepress/archive/refs/heads/main.zip
Private, on-device audio & video transcription for WordPress. Whisper AI runs in your browser (WebGPU/WASM via transformers.js) — media files never leave your machine; only the text is saved.
This plugin is the WordPress successor of a local Python/Flask + Whisper app, rebuilt so it needs no Python, no ffmpeg, and no server resources.
Why client-side?
| Old server-side approach | TranscribePress | |
|---|---|---|
| Upload | Full media file (25 MB limit) | Nothing — file stays local |
| Server load | Whisper on CPU, minutes per file | Zero |
| Speed | Bound by server CPU | WebGPU-accelerated in the browser |
| Privacy | File stored on server during processing | File never leaves the machine |
| Hosting requirements | Python, ffmpeg, 4 GB+ RAM | Any WordPress host |
Features
- Drag & drop multiple audio files (MP3, WAV, M4A, OGG, OPUS, FLAC)
- Video to transcript: the audio track of MP4 / WebM / MOV files is decoded in the browser via the Web Audio API
- Four Whisper models — Tiny / Base / Small / Large v3 Turbo (best accuracy, GPU recommended)
- Language auto-detect or manual selection (18 languages in the UI)
- Live progress: model download %, decoding, transcription
- Exports generated client-side: TXT · JSON · SRT · VTT
- Per-user history in a custom table; admins can view and manage all users' items
- Settings: default model, default language, history on/off
Architecture
transcribepress.php Plugin bootstrap
includes/
class-tp-install.php Activation, dbDelta schema, upgrades
class-tp-models.php Model & language catalog (shared PHP/JS validation)
class-tp-rest.php REST API (history CRUD, settings)
class-tp-admin.php Admin menu, asset loading, JS config
admin/views/admin-page.php Markup (all rendering is escaped / textContent)
assets/
js/app.js UI: queue, results, history, settings
js/transcriber.js Web Audio decoding + worker bridge
js/worker.js Whisper pipeline in a module web worker
js/exports.js TXT/JSON/SRT/VTT builders
vendor/transformers.min.js Pinned transformers.js v4.2.0 (self-hosted, self-contained build)
- Audio is decoded to 16 kHz mono
Float32Arrayin the page, transferred (zero-copy) to a module worker that runs the Whisper pipeline with 30 s chunking and timestamps. - Device selection: WebGPU with
q4/fp16weights when available, otherwise WASM withq8— with automatic fallback. - Models are fetched from the Hugging Face Hub on first use and cached by the browser. The ONNX runtime WASM is loaded from jsDelivr, pinned to the bundled library version. No other external requests; media and transcripts are never sent anywhere.
Security
- Every REST route requires the
edit_postscapability (filterable viatranscribepress_capability) plus a validwp_restnonce. - Ownership enforced server-side: users only read/delete their own items;
manage_optionsmay passscope=all. - All inputs validated and sanitized (model/language whitelists, segment shape validation, 2 MB content cap); all queries use
$wpdb->prepare. - All output escaped (PHP) or rendered with
textContent(JS) — stored transcripts cannot inject markup. - Uninstall removes the table and all options.
Installation
- Copy this folder to
wp-content/plugins/transcribepress/(or upload a zip of it). - Activate TranscribePress in wp-admin → Plugins.
- Open the TranscribePress menu item and drop a file.
Requires WordPress 6.5+ (script modules) and PHP 7.4+.
License
GPL-2.0-or-later. Bundles transformers.js (Apache-2.0).