Generative AI · 2026
Local video transcription and summarisation with Whisper and a quantised LLM
A web app that transcribes and summarises videos with Whisper and a quantised 14B LLM, all locally and with no external APIs.

- local processing, no external APIs
- 100%
- LLM parameters, quantised to 4 bits
- 14B
- LLMs you can switch between from the UI
- 2
- selectable Whisper sizes
- 3
Problem
Watching an hour-long lecture, talk or interview to find out whether it is worth it takes, precisely, an hour. Services that summarise videos send the audio to third-party APIs, with a per-use cost and the question of what happens to the content when it is private: an internal meeting, a recorded class or an interview with personal data.
The goal of this project is an app that runs the whole process locally, on your own GPU: take a video and return a short summary in Spanish together with the full transcript.
My contribution
Group project. My part was:
- Models configurable from the UI. I organised the backend so that the Whisper model, the LLM and their configuration arrive from the frontend with each request. I optimised GPU usage by controlling how models are loaded when the configuration changes from one request to the next.
- Controlling the LLM output. I added control over the output tokens, formatting the result into the expected shape.
- Settings panel in the frontend to choose the models and generation parameters, plus error handling with tracebacks in the backend.
Technical approach
- Video or audioDropped into the chat or recorded in the browser
- FFmpegExtracts the audio: mono MP3 at 16 kHz
- WhisperLocal transcriptionbase · small · medium
- 4-bit LLMSummarises in Spanish in five sentences at mostQwen 1.5‑14B · Phi‑3 mini
- ResponseFull transcript
A 14B model on a consumer GPU. Qwen 1.5-14B-Chat takes about 28 GB in half precision (FP16). Quantised to 4 bits with NF4 (bitsandbytes), the weights drop to about 7 GB while computation still runs in FP16:
# backend/main.py — loading the LLM (excerpt)
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # 4-bit NormalFloat
bnb_4bit_compute_dtype=torch.float16, # compute in FP16
)
model = AutoModelForCausalLM.from_pretrained(
model_name, quantization_config=bnb_config, device_map="auto"
)
# Stop when the assistant's turn ends (ChatML format)
terminators = [
tokenizer.eos_token_id,
tokenizer.convert_tokens_to_ids("<|im_end|>"),
tokenizer.convert_tokens_to_ids("<|endoftext|>"),
]
Instructions to the model. The prompt follows Qwen’s ChatML format and sets explicit rules: summarise only in Spanish, without mixing languages, in no more than five sentences.
Results
- A complete, working app: upload or record, transcription, summary and an expandable transcript in a chat-style interface with light and dark modes.
- All processing happens locally; no audio or text leaves the machine.
- Models and generation parameters can be swapped from the UI without restarting the server.
Evidence
- Repository with the backend (FastAPI) and frontend (React, TypeScript, Tailwind CSS), plus instructions to run it locally.
Professional application
- Summaries of meetings, classes or interviews when content cannot leave the organisation, for privacy or GDPR reasons.
- Deploying quantised open-source LLMs on your own hardware instead of relying on paid APIs.
- End-to-end AI prototypes (model, API and UI) to validate an idea with real users.
More projects
See all projects
Medical Imaging
Multi-label chest X-ray classification with DenseNet-121
Detecting 14 pathologies at once in 112,000 chest X-rays, with an asymmetric loss, per-pathology calibrated thresholds and Grad-CAM++ to audit the model.

Medical Imaging
Melanoma segmentation with U-Nets built from scratch in PyTorch
Two U-Nets coded from scratch to outline skin lesions: one trained from scratch and one with a frozen pretrained ResNet-50 encoder.