←  All projects Open Source · v0.1.0 alpha

Dabuj

A transcription, translation and dubbing studio that runs on your own computer. Not a cloud service, and not a wrapper around one, pick local providers and nothing about your media leaves the machine. Alpha, and specific about which parts exist.

Type Local-first application
Status v0.1.0 alpha
Licence MIT · code only
Stack Python · FastAPI · faster-whisper · FFmpeg
Read ~7 min

The ideaDub a video without uploading it

Dabuj transcribes speech, translates it, and, eventually, re-voices it with synthetic speakers, producing a dubbed audio or video file. It runs as a small local web application: you start it from a terminal, your browser opens, and the processing happens on your own CPU or GPU.

It is not a cloud service and it is not a wrapper around one. When every selected provider is a local one, nothing about your media leaves the machine, no uploads, no API calls, no telemetry.

MotivationThe upload is the problem

Commercial AI dubbing services require you to upload your media to someone else's computer. That is a poor fit for unreleased footage, confidential interviews, medical or legal recordings, client work under NDA, or simply anything you would rather keep private.

The part that matters

Dabuj exists to make that upload unnecessary. Every other design decision in the project, local model runtimes, CPU-only support, a cloud master switch that defaults to off, follows from that one constraint.

HonestyWhat works today

This is alpha software at v0.1.0. The transcription vertical slice works end to end; everything after it is scaffolded but not yet built. Rather than bury that, here is the whole capability list:

CapabilityStatus
Media probing, any FFmpeg-supported containerImplemented
Audio extraction and conversionImplemented
Local speech recognition (faster-whisper)Implemented
Automatic language detection with confidenceImplemented
Word-level timestampsImplemented
Timestamped, speaker-aware transcript modelImplemented
Project format with schema versioningImplemented
Export to JSON, SRT, WebVTT and TXTImplemented
Model manager, download, verify, removeImplemented
Hardware detection and profile recommendationImplemented
CLI, transcribe, models, doctor, system-infoImplemented
Incremental cache and checkpoint/resumeImplemented
Local web UI, REST and WebSocket APIExperimental
Speaker diarizationPlanned, v0.3
Local translation and glossaryPlanned, v0.4
Text to speech and voice mappingPlanned, v0.5
Multi-speaker dubbing and duration matchingPlanned, v0.6
Audio mixing and video muxingPlanned, v0.7
Background and music preservation via source separationPlanned, v0.8
The rule the README sets for itself

Nothing in the documentation describes functionality that does not exist. Anything marked as planned is a plan, not a promise. For a project whose whole pitch is trust, a README that oversells would undermine the product it is describing.

Language coverage follows the same logic. Dabuj is tested against English, German and Czech, but the list is not hard-coded, it is read from the capabilities of whichever model you have selected, so installing a model with wider coverage widens the list in the UI. Dabuj will not offer a language the active model does not actually support.

PipelineOne core, two front ends

The CLI and the web UI call the same application services. There is no business logic in the frontend and no duplicated pipeline hiding behind the CLI, which is what makes it credible that both will keep working as the later stages land.

SHIPPED, WORKS END TO END IN v0.1.0 Media probe any container Audio extract ffmpeg Speech recognition faster-whisper Transcript word-level stamps Export srt vtt json txt PLANNED, CONTINUES FROM THE TRANSCRIPT, NOT BUILT YET Diarization v0.3 Translation v0.4 · local Text to speech v0.5 Dub · mix · mux v0.6 – v0.7 RUNS ON Local AI models + FFmpeg, your own CPU or GPU no uploads · no api calls · no telemetry Cloud providers exist as an opt-in behind a master switch that is off by default. There is no silent fallback: if a local model fails, Dabuj says so rather than quietly sending your audio somewhere.
The shipped half is a complete vertical slice rather than a demo: probe, extract, recognise, store, export. Everything planned hangs off the transcript, which is why getting the transcript model right, timestamped and speaker-aware from the start, mattered before any of the later stages could be built.

In practice that is four commands:

# What is in this file?
dabuj probe interview.mkv

# Transcribe it. The model is downloaded on first use, after asking.
dabuj transcribe interview.mkv --language auto

# Pick a specific model and force CPU
dabuj transcribe interview.mkv --model whisper-small-int8 --device cpu

# Export
dabuj export <project-id> --format srt --output subtitles.srt

Or dabuj start, which brings up the local server on 127.0.0.1:7860 and opens your browser. If the port is taken, it picks the next free one.

ReachGenuinely usable without a GPU

A tool that only runs on a workstation with 12 GB of VRAM would miss most of the people who need the privacy guarantee. So hardware detection produces a recommended profile, and the profile picks quantisation and model size to match:

ProfileTarget machineApproach
LowOffice laptop, no discrete GPUQuantised int8 models on CPU
BalancedModern CPU, 16 GB RAM, 4–8 GB VRAMGood quality at reasonable speed
High8–12 GB VRAM, 32 GB RAMLarger models, better accuracy
UltraWorkstationBest available, quality over speed

Profiles are recommendations, not constraints. Every individual setting, model, runtime, device, precision, quantisation, beam size, can be overridden. Dabuj never assumes CUDA.

GuaranteesPrivacy as behaviour, not a promise

"Local-first" is easy to claim and easy to quietly break. The concrete commitments:

LicensingMIT covers the code, not the models

Dabuj ships no model weights. Models are downloaded on request into your application data directory and can be removed at any time, and the first run tells you exactly how large a download is before starting it. Nothing pulls a multi-gigabyte model without asking.

Worth reading before you invoice a client

The MIT licence on the repository covers the source code only. Downloaded AI models carry their own licences, some of which restrict commercial use. Every model Dabuj can install is listed with its licence, size and verified source, so the answer to "can I use this at work" is a lookup rather than a guess.

BuildBoundaries drawn before the features

Most of the pipeline does not exist yet, which makes the module layout the load-bearing decision. Each later stage has a place to land that does not require rewriting the ones already shipped:

backend/src/dabuj/
├── domain/        Pure data model: transcripts, speakers, media, languages
├── media/         The FFmpeg boundary, all media I/O goes through here
├── hardware/      Machine detection and the profile recommendation engine
├── models/        Model catalog, registry and secure downloader
├── providers/     Pluggable ASR / diarization / translation / TTS backends
├── pipeline/      Stages, cache keys, checkpoints, progress, cancellation
├── projects/      On-disk project format and schema migrations
├── export/        SRT, WebVTT, JSON, TXT writers
├── jobs/          Local job queue and worker
├── application/   Services shared by the CLI and the API
├── api/           FastAPI routes and WebSocket endpoints
└── cli/           Command-line interface

Three of those are doing quiet but real work. media/ is a single FFmpeg boundary, so every container quirk is handled in one place rather than scattered through the pipeline. providers/ is what makes "local or cloud, your choice" a configuration rather than a fork, translation and TTS plug in beside speech recognition instead of being bolted on. And pipeline/ owns cache keys, checkpoints and cancellation, which is why a long transcription can resume instead of starting over.

There is a versioned on-disk project format with schema migrations from v0.1.0, before there was anything to migrate. That is the sort of thing that is nearly free to add early and genuinely painful to retrofit once other people have projects on disk.

DirectionTranscription first, dubbing last

The order is deliberate: every stage depends on the transcript being right, so the transcript shipped first and complete rather than as a stub to be revisited.

VersionFocus
v0.1Transcription vertical slice, CLI, project format, exports, shipped
v0.2Web UI, job progress over WebSocket, model manager UI
v0.3Speaker diarization and the speaker editor
v0.4Local translation, glossary, translation editor
v0.5Local TTS, voice mapping, previews
v0.6Multi-speaker dubbing, duration matching
v0.7Audio mixing, video muxing, multiple audio tracks
v0.8Source separation to preserve music and effects
v0.9Installer, benchmarking, performance work
v1.0Stable transcription → translation → dubbing workflow

BoundariesWhat it deliberately isn't

That last one is a design position rather than a missing feature. The same technology that dubs a training video into Czech will happily forge someone's voice, and the difference between the two is consent, so the project treats it as a gate rather than an afterthought.

Dabuj also processes media that may be copyrighted, confidential, or contain identifiable human voices. Having the rights to the content you put through it is the operator's responsibility, and the documentation says so out loud rather than leaving it implied.

In one sentence

Transcribe, translate and dub on your own machine, with nothing uploaded anywhere, today that means transcription end to end, and the rest is marked as the plan it is.

MIT for the source. The models you download are not MIT, so check their licences before shipping commercial work through it.

Let’s connect

Build reliable AI.
Start with a conversation.

Production AI, platform architecture and technical leadership.