Debrief AI is a local-first AI assistant that transforms meeting recordings into structured, actionable intelligence. Provide a YouTube URL or upload an audio file and the system will transcribe, summarize, extract action items and decisions, and make the entire transcript available for conversational Q&A through a Retrieval-Augmented Generation (RAG) pipeline.
Landing Page — Input & Language Selection

Summary View — AI-generated meeting title and bullet-point summary

Transcript View — Full scrollable transcript with export options

Chat Assistant — RAG-powered Q&A grounded on the transcript

- Features
- Architecture
- Tech Stack
- Project Structure
- Prerequisites
- Installation
- Configuration
- Running the App
- Usage Guide
- Language Support
- Known Limitations
- License
Audio Ingestion
- Download and extract audio from any YouTube URL via
yt-dlp - Upload local audio files directly (MP3, WAV, M4A, MP4, OGG, FLAC, WebM)
- Automatic conversion to 16kHz mono WAV for model compatibility
- Chunked processing to handle recordings of any length
Transcription
- Local transcription using OpenAI Whisper — no data leaves your machine
- Hindi audio routed to a dedicated fine-tuned model (
Oriserve/Whisper-Hindi2Hinglish-Swift) for significantly better accuracy - Automatic 30-second sub-chunking for the Hindi model, which enforces a hard input limit
- Optional translation to English for non-Hindi languages using Whisper's native translation mode
AI Analysis (via Mistral API with LCEL pipelines)
- Automatic meeting title generation
- Multi-chunk summarization using a map-reduce strategy: each chunk is summarized independently, then combined into a final professional summary
- Action item extraction with task description, owner, and deadline
- Decision extraction
- Open question extraction
RAG Chat Assistant
- Full transcript indexed into ChromaDB with
all-MiniLM-L6-v2sentence embeddings (runs locally on CPU) - Conversational Q&A grounded strictly on the transcript — the model will not hallucinate information not present in the meeting
- Chat history maintained within the session
Export
- Download the raw transcript as a
.txtfile - Download a full structured report (title, summary, action items, decisions, questions, transcript) as a single
.txtfile
Resilience
- Automatic retry with exponential backoff on transient Mistral API errors (5xx, 429)
- All ML models lazily loaded and cached in memory — loaded once per session, not on every request
Input (YouTube URL / Audio File)
│
▼
┌─────────────────────┐
│ audio_processor │ yt-dlp download → FFmpeg convert → pydub chunk
└─────────────────────┘
│
▼
┌─────────────────────┐
│ transcriber │ Language routing:
│ │ ├── Hindi → Oriserve fine-tuned HF pipeline (≤30s chunks)
│ │ └── Other → OpenAI Whisper (local)
└─────────────────────┘
│
├──────────────────────────────────────────────┐
▼ ▼
┌─────────────────────┐ ┌───────────────────────┐
│ summarise / │ Mistral API │ vector_store │
│ extractor │ (LCEL chains) │ ChromaDB + MiniLM │
│ - Title │ │ embeddings (local) │
│ - Summary │ └───────────────────────┘
│ - Action Items │ │
│ - Decisions │ ▼
│ - Questions │ ┌───────────────────────┐
└─────────────────────┘ │ rag_engine │
│ Retriever + Mistral │
│ RAG chain (LCEL) │
└───────────────────────┘
│ │
└──────────────────┬──────────────────────────┘
▼
┌─────────────────┐
│ app.py │
│ Streamlit UI │
└─────────────────┘
| Layer | Technology |
|---|---|
| UI | Streamlit |
| Audio download | yt-dlp |
| Audio processing | pydub, FFmpeg |
| Transcription (general) | OpenAI Whisper (local) |
| Transcription (Hindi) | Oriserve/Whisper-Hindi2Hinglish-Swift (Hugging Face Transformers) |
| LLM | Mistral AI (mistral-small-latest) via API |
| LLM orchestration | LangChain LCEL (langchain-core, langchain-mistralai) |
| Vector database | ChromaDB |
| Embeddings | all-MiniLM-L6-v2 via sentence-transformers (local, CPU) |
| Deep learning runtime | PyTorch |
| Environment config | python-dotenv |
meetmind/
├── app.py # Streamlit UI — entry point
├── main.py # CLI entry point (alternative to app.py)
├── requirements.txt
├── .env # API keys (not committed)
│
├── .streamlit/
│ └── config.toml # Streamlit theme and server configuration
│
├── core/
│ ├── llm_factory.py # Shared LLM factory with retry/backoff logic
│ ├── transcriber.py # Language-aware transcription + Hindi sub-chunker
│ ├── summarise.py # Map-reduce summarization chain
│ ├── extractor.py # Action items, decisions, questions extraction
│ ├── vector_store.py # ChromaDB build / load / retriever
│ └── rag_engine.py # RAG chain assembly and question answering
│
├── utils/
│ └── audio_processor.py # Download, convert, chunk, save uploaded files
│
├── downloads/ # Downloaded and converted audio files (auto-created)
└── vector_db/ # ChromaDB persistence directory (auto-created)
- Python 3.10 or higher
- FFmpeg installed and available on your system PATH (required by
yt-dlpandpydubfor audio conversion) - A Mistral AI API key (free tier available)
- A GPU is optional but will significantly accelerate Whisper transcription and the Hindi fine-tuned model
winget install ffmpegAlternatively, download the binaries from gyan.dev and extract ffmpeg.exe / ffprobe.exe into a ffmpeg_bin/ folder in the project root — the audio processor will detect them automatically.
- Clone the repository
git clone https://github.com/your-username/meetmind.git
cd meetmind- Create a virtual environment and install dependencies
Using uv (recommended):
uv venv
uv pip install -r requirements.txtUsing standard pip:
python -m venv .venv
.venv\Scripts\activate # Windows
pip install -r requirements.txtNote:
torchandopenai-whisperare large packages. Installation may take several minutes on a slow connection.
Create a .env file in the project root:
MISTRAL_API_KEY=your_mistral_api_key_here
WHISPER_MODEL=smallWHISPER_MODEL controls which OpenAI Whisper checkpoint is used for non-Hindi audio. Available options in increasing size and accuracy: tiny, base, small, medium, large. The small model is a reasonable default for most use cases. The model is downloaded automatically on first run.
streamlit run app.pyThe app will open at http://localhost:8501.
python main.pyThe CLI will prompt for a source URL and language, run the full pipeline, then enter an interactive Q&A loop.
-
Provide a source — paste a YouTube URL into the URL tab, or switch to the Upload tab and select an audio file from your machine.
-
Select language — choose the language spoken in the recording. Select
hindito use the fine-tuned Hindi model. -
Translation — optionally enable "Translate to English" to have Whisper produce an English transcript from non-English audio. This option has no effect when Hindi is selected (the Hindi model outputs Hinglish by design).
-
Analyze — click the "Analyze Meeting" button. A live progress bar shows each pipeline step.
-
Review results across four tabs:
- Summary — bullet-point meeting summary and a questions-raised section
- Transcript — full scrollable transcript with download options
- Actions & Decisions — extracted action items and key decisions side by side
- Chat — type questions about the meeting; the RAG assistant answers from the transcript
-
Export — download the raw transcript or the full structured report as
.txtfrom the Transcript tab.
| Language | Model Used | Notes |
|---|---|---|
| English | OpenAI Whisper | Local inference |
| Hindi | Oriserve/Whisper-Hindi2Hinglish-Swift | Local inference; outputs Hinglish (Hindi in Latin script) |
| French, Spanish, German, Portuguese, Japanese, Chinese | OpenAI Whisper | Local inference; use "Translate to English" for English output |
-
Mistral free tier rate limits — the free API tier has request and token-per-minute limits. Very long transcripts (over ~30 minutes) may hit these limits. The app retries automatically with exponential backoff, but extremely long recordings may still require a paid API tier.
-
Hindi model — 30-second limit —
Oriserve/Whisper-Hindi2Hinglish-Swiftcannot process audio segments longer than 30 seconds. The transcriber handles this transparently by splitting chunks further, but this increases processing time proportionally. -
ChromaDB session scope — the vector store is rebuilt on every new pipeline run and replaces the previous one. Loading a previous session's vector store from disk is supported in
rag_engine.pyviaload_rag_chain()but is not exposed in the current UI. -
FFmpeg dependency — audio download and conversion from YouTube will not work without FFmpeg installed on the host system.
-
No speaker diarization — the transcript does not identify individual speakers. All speech is treated as a single stream of text.
This project is licensed under the MIT License. See the LICENSE file for details.