{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Deep-Dive Video Note Taker — Experimentation Notebook\n", "\n", "This notebook is used to experiment with individual pipeline stages:\n", "- Audio extraction\n", "- Whisper transcription\n", "- Text chunking\n", "- LLM summarization\n", "- RAG pipeline\n", "- Action item extraction" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.insert(0, '..')\n", "\n", "# Load environment\n", "from dotenv import load_dotenv\n", "load_dotenv('../.env')\n", "print('Environment loaded ✅')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Audio Extraction" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from backend.services.audio_extractor import AudioExtractor\n", "\n", "extractor = AudioExtractor()\n", "\n", "# Replace with your video path\n", "VIDEO_PATH = '../data/videos/sample.mp4'\n", "JOB_ID = 'experiment_001'\n", "\n", "audio_path = extractor.extract(VIDEO_PATH, JOB_ID)\n", "duration = extractor.get_video_duration(VIDEO_PATH)\n", "\n", "print(f'Audio extracted: {audio_path}')\n", "print(f'Duration: {duration:.1f}s')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Whisper Transcription" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from backend.services.whisper_transcriber import WhisperTranscriber\n", "\n", "transcriber = WhisperTranscriber()\n", "transcript = transcriber.transcribe(audio_path, JOB_ID)\n", "\n", "print(f\"Language: {transcript['language']}\")\n", "print(f\"Segments: {len(transcript['segments'])}\")\n", "print(f\"Preview: {transcript['text'][:300]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Text Chunking" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from backend.services.text_chunker import TextChunker\n", "\n", "chunker = TextChunker(max_chunk_size=800, overlap=100)\n", "chunks = chunker.chunk_transcript(transcript)\n", "\n", "print(f'Total chunks: {len(chunks)}')\n", "for c in chunks[:3]:\n", " print(f\" Chunk {c['chunk_id']}: [{c['start_ts']} → {c['end_ts']}] — {len(c['text'].split())} words\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. LLM Summarization" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from backend.services.summarizer import Summarizer\n", "\n", "summarizer = Summarizer()\n", "\n", "# Summarize just the first 3 chunks for experiment\n", "test_chunks = chunks[:3]\n", "summarized = summarizer.summarize_chunks(test_chunks)\n", "\n", "for s in summarized:\n", " print(f\"\\n=== Chunk {s['chunk_id']} [{s['start_ts']}] ===\")\n", " print(s['summary'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. RAG Pipeline" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from backend.services.rag_pipeline import RAGPipeline\n", "\n", "rag = RAGPipeline()\n", "rag.index_chunks(chunks)\n", "\n", "# Test a query\n", "query = 'What are the main topics discussed?'\n", "results = rag.query(query, top_k=3)\n", "\n", "print(f'Query: {query}')\n", "for r in results:\n", " print(f\" Score: {r['score']:.3f} | [{r['start_ts']}] {r['text'][:100]}...\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6. Action Item Extraction" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from backend.services.action_item_extractor import ActionItemExtractor\n", "\n", "extractor2 = ActionItemExtractor()\n", "action_items = extractor2.extract(chunks[:5])\n", "\n", "print(f'Found {len(action_items)} action items:')\n", "for item in action_items:\n", " print(f\" [{item['type'].upper()}] [{item['priority']}] {item['description']} (@ {item['timestamp']})\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7. Full Pipeline Run" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from backend.services.timestamp_mapper import TimestampMapper\n", "from backend.services.note_generator import NoteGenerator\n", "\n", "# Summarize all chunks\n", "all_summarized = summarizer.summarize_chunks(chunks)\n", "final_notes = summarizer.generate_final_notes(all_summarized)\n", "\n", "# Map timestamps\n", "mapper = TimestampMapper()\n", "highlights = mapper.map_timestamps(all_summarized)\n", "chapters = mapper.generate_chapter_markers(highlights)\n", "\n", "# Extract all action items\n", "all_actions = extractor2.extract(chunks)\n", "\n", "# Generate final notes\n", "generator = NoteGenerator()\n", "result = generator.generate(\n", " job_id=JOB_ID,\n", " filename='sample.mp4',\n", " transcript=transcript,\n", " summarized_chunks=all_summarized,\n", " final_notes=final_notes,\n", " highlights=highlights,\n", " action_items=all_actions,\n", " chapters=chapters,\n", " duration=duration,\n", ")\n", "\n", "print('Notes saved to:', result['markdown_path'])\n", "print('\\n--- Preview (first 500 chars) ---')\n", "print(result['markdown'][:500])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "name": "python", "version": "3.10.0" } }, "nbformat": 4, "nbformat_minor": 5 }