All work

Whisper Studio

Local Whisper transcription you can check and edit

Year
2026
Kind
Apps
Status
Finished

A local web app that transcribes audio and video with faster-whisper, int8 on the CPU or float16 on an NVIDIA GPU, and streams the transcript into an editable, synced view.

Drop in a recording or speak into the microphone, and Whisper Studio transcribes it on your own machine. It uses CTranslate2's int8 kernels on the CPU and switches to CUDA float16 when a GPU is present. Segments stream to the page as they are decoded, play back in sync with the media, and export as text or subtitles.

The problem

Whisper Studio transcribes recordings without uploading them anywhere, in a form you can check against the audio. It is a local web app around faster-whisper, a CTranslate2 reimplementation of OpenAI's Whisper. You drop in audio or video, or record from the microphone, and the transcript streams in segment by segment beside a player synced to it.

How it works

  1. 01

    Upload or record

    The page posts the file, or a webm/opus recording made with MediaRecorder, to a FastAPI endpoint. The server saves it under a random name and replies first with a media URL, so the player can load the file while transcription starts. A file is deleted only after 15 minutes without use: playing it or transcribing it resets the clock, and files left over from an earlier run are cleared when the server starts.

  2. 02

    Pick the device, then the number format

    In auto mode the server asks CTranslate2 whether it can see a CUDA device. On a GPU the model loads in float16; on a CPU it loads in int8, and if a GPU load fails at runtime it retries on the CPU. Loaded models are cached by size, device, precision and thread count, so switching back does not reload.

  3. 03

    Skip the silence

    Silero VAD (voice activity detection) is on by default, with a 500 ms minimum silence. Stretches without speech are dropped before Whisper sees the audio, so pauses are never decoded.

  4. 04

    Stream each segment as it is decoded

    faster-whisper returns a lazy generator, which decodes each segment only when it is asked for the next one. The server asks for it on a worker thread, so it keeps answering, the player's media requests included, while a segment decodes. The endpoint turns each segment into a server-sent event carrying its text, timestamps and progress through the file, so the transcript grows on the page while the rest is still decoding.

  5. 05

    Check, fix and export

    Segments render as editable lines with timestamps. Clicking a timestamp seeks the player there, and the line being spoken highlights during playback. The edited lines export as plain or timestamped text, SRT, WebVTT, Markdown, CSV or JSON, and each session is kept in the browser's local storage.

Decisions

  • No CUDA toolkit to install

    GPU support comes from pip wheels that bundle cuBLAS and cuDNN for CUDA 12. run.sh finds their library folders and sets LD_LIBRARY_PATH, so the machine only needs a recent NVIDIA driver. Without those wheels the app runs on the CPU, unchanged.

  • One request for upload and progress

    The file upload and the progress stream are a single POST. EventSource can only make GET requests, so the page reads the streamed response body itself and parses each data: line.

  • Small as the default model

    The model picker offers tiny to large-v3. The default is small, about 1 GB of RAM, picked as the best balance of accuracy and speed on a CPU.