{"id":32631291,"url":"https://github.com/devslem/ai-meeting-notes","last_synced_at":"2026-03-05T16:16:54.213Z","repository":{"id":318839889,"uuid":"1075304941","full_name":"DevSlem/ai-meeting-notes","owner":"DevSlem","description":"A Streamlit-based application for recording, managing, transcribing, and converting meeting audio into structured AI-powered meeting notes using OpenAI's Whisper and GPT-5 APIs.","archived":false,"fork":false,"pushed_at":"2025-10-15T07:44:00.000Z","size":855,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-15T21:02:23.117Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DevSlem.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-13T10:14:48.000Z","updated_at":"2025-10-15T07:55:40.000Z","dependencies_parsed_at":"2025-10-16T16:32:24.041Z","dependency_job_id":"d3fd75c5-2feb-41a4-8d19-118e85e352c0","html_url":"https://github.com/DevSlem/ai-meeting-notes","commit_stats":null,"previous_names":["devslem/ai-meeting-notes"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/DevSlem/ai-meeting-notes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevSlem%2Fai-meeting-notes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevSlem%2Fai-meeting-notes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevSlem%2Fai-meeting-notes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevSlem%2Fai-meeting-notes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DevSlem","download_url":"https://codeload.github.com/DevSlem/ai-meeting-notes/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevSlem%2Fai-meeting-notes/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281896620,"owners_count":26580138,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-30T02:00:06.501Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-10-30T22:57:38.858Z","updated_at":"2025-10-30T22:58:17.760Z","avatar_url":"https://github.com/DevSlem.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AI Meeting Notes\n\nA Streamlit-based application for recording, managing, transcribing, and converting meeting audio into structured AI-powered meeting notes using OpenAI's Whisper and GPT-5 APIs.\n\n![](img/main-page.png)\n\n## Features\n\n- 🎙️ **Audio Recording \u0026 Upload**: Record from microphone (multi-channel) or upload audio files (WAV, MP3, M4A, FLAC, OGG, WebM)\n- 📝 **AI Transcription**: Multiple OpenAI models (GPT-4o Mini, GPT-4o, Whisper-1) with automatic language detection\n- 🤖 **AI Meeting Notes**: Transform transcriptions into structured meeting notes with GPT-5 models\n- 📦 **Smart Compression**: Automatic compression for large files (\u003e25MB) or long audio (\u003e20min)\n- ⚡ **Long Audio Support**: Automatic chunking and parallel processing for files over 20 minutes\n- 🔒 **Secure Storage**: Store any content in your desktop\n\n## Prerequisites\n\n- **Python 3.12+**\n- **FFmpeg**: `brew install ffmpeg` (macOS) or `sudo apt-get install ffmpeg` (Ubuntu)\n- **OpenAI API Key**: Get from [OpenAI Platform](https://platform.openai.com/api-keys)\n- **uv Package Manager**: [Install uv](https://github.com/astral-sh/uv)\n\n## Installation\n\n```bash\n# Clone repository\ngit clone https://github.com/DevSlem/ai-meeting-notes.git\ncd ai-meeting-notes\n\n# Install dependencies and start the app\nuv run streamlit run main.py\n```\n\nThe app opens at `http://localhost:8501`.\n\n\u003e [!NOTE]\n\u003e Docker is not recommended for this application as it requires direct microphone access which is difficult to configure in containers.\n\n## Quick Start\n\n1. **Setup API Key**: Click ⚙️ API Key Settings → Enter OpenAI API key → Save\n2. **Record/Upload**: Navigate to \"Record \u0026 Upload\" tab\n3. **Manage**: Go to \"Recordings\" tab to view all files\n4. **Transcribe**: Click 🎙️ button next to any recording\n5. **Generate Notes**: Click 📝 button to create AI meeting notes\n6. **View Full Page**: Click 📖 View Full Page for distraction-free reading\n\n## Usage\n\n### Recording Audio\n1. Select microphone and sample rate (16kHz recommended)\n2. Click 🔴 Start Recording → Speak → ⏹️ Stop Recording\n3. File saved automatically to `recordings/` directory\n\n\u003e [!NOTE]\n\u003e We provide multi-channel recording support. If you want to record both your microphone and system audio (e.g., Zoom calls), use a virtual audio device like [BlackHole (macOS)](https://github.com/ExistentialAudio/BlackHole) or [VB-Audio Virtual Cable (Windows)](https://vb-audio.com/Cable/).\n\n### Transcribing Audio\n1. Click 🎙️ button in Recordings tab\n2. Select model (GPT-4o Mini recommended for most cases)\n3. Configure advanced options if needed:\n   - **Compression**: Auto-enabled for large/long files\n   - **Chunk Overlap**: 30s default (adjustable 15-120s)\n   - **Language**: Auto-detect or specify (en, ko, ja, etc.)\n4. Click Start Transcription\n5. View results in scrollable text area\n\n### Generating AI Meeting Notes\n1. Transcribe audio first (required)\n2. Click 📝 button next to the recording\n3. Select model:\n   - **GPT-5**: Best quality, complex meetings ($1.25/$10 per 1M tokens)\n   - **GPT-5 Mini**: Balanced (recommended) ($0.25/$2 per 1M tokens)\n   - **GPT-5 Nano**: Fast \u0026 affordable ($0.05/$0.40 per 1M tokens)\n4. Choose output language (auto-detect recommended)\n5. Configure advanced options:\n   - **Prompt Template**: Select or create custom prompts\n   - **Reasoning Effort**: minimal/low/medium/high\n   - **Max Output Tokens**: 1000-8000\n6. Review cost estimate\n7. Click 📝 Generate Meeting Notes\n\n### Viewing Meeting Notes\n- **In Details**: Toggle between 📝 AI Meeting Notes and 📄 Transcription\n- **Full Page**: Click 📖 View Full Page for better reading experience\n  - Shows metadata (model, generation time, tokens used)\n  - Distraction-free markdown rendering\n  - 🔄 Regenerate option\n  - ← Back to return to recordings\n\n### Managing Custom Prompts\n1. Click 📝 Prompt Settings in sidebar\n2. **Create New Prompt**:\n   - Click ➕ Create New Prompt\n   - Enter name (e.g., \"technical-meeting\")\n   - Write prompt content (use `{LANGUAGE_INSTRUCTION}` placeholder)\n   - Click 💾 Create Prompt\n3. **Edit Prompt**:\n   - Select prompt from dropdown\n   - Click ✏️ Edit This Prompt\n   - Modify content\n   - Click 💾 Save Changes\n4. **Delete Prompt**:\n   - Select prompt (except default)\n   - Click 🗑️ Delete This Prompt\n\n### Custom Naming\n1. Click ✏️ button next to recording\n2. Enter meaningful name (e.g., \"Weekly Team Meeting\")\n3. Original filename preserved, display name stored in `\u003cfilename\u003e.json`\n\n## Compression Methods\n\n| Method | Ratio | Speed | Use Case |\n|--------|-------|-------|----------|\n| **Recommended** | 75-85% | Medium | Meetings with silence removal |\n| **Fast (MP3)** | 60-70% | Fast | Quick compression |\n| **Balanced (Opus)** | 65-75% | Medium | Efficient for speech |\n| **Custom** | Varies | Varies | Specify your own FFmpeg options |\n\nCompression **auto-enabled** when file \u003e25MB or duration \u003e20min.\n\n\u003e [!WARNING]\n\u003e The ratio is arbitrary and depends on the audio content.\n\n## API Models \u0026 Pricing\n\n### Transcription Models\n\n| Model | Price/hour | Best For |\n|-------|------------|----------|\n| `gpt-4o-mini-transcribe` | $0.18 | Most meetings (recommended) |\n| `gpt-4o-transcribe` | $0.36 | Complex audio, heavy accents |\n| `whisper-1` | $0.36 | When timestamps needed |\n\n### AI Meeting Notes Models (GPT-5 Series)\n\n| Model | Price (Input/Output per 1M tokens) | Best For | Speed |\n|-------|------------|----------|-------|\n| `gpt-5` | $1.25 / $10 | Complex meetings, high quality | Slower |\n| `gpt-5-mini` | $0.25 / $2 | Most meetings (recommended) | Balanced |\n| `gpt-5-nano` | $0.05 / $0.40 | Simple summaries, quick notes | Fastest |\n\n**Reasoning Effort Levels:**\n- **minimal**: Fastest, least reasoning tokens\n- **low**: Quick processing (default)\n- **medium**: Balanced quality/speed\n- **high**: Best quality, more expensive\n\n## File Structure\n\n```\nai-meeting-notes/\n├── recordings/\n│   ├── recording_20251013_145550.wav      # Audio file\n│   ├── recording_20251013_145550.json     # Metadata (name, transcription, meeting notes)\n│   └── recording_20251013_145550.txt      # Legacy transcription (migrated to JSON)\n├── prompts/\n│   └── meeting-notes/\n│       ├── default.txt                    # Default prompt template\n│       ├── technical-meeting.txt          # Custom prompt example\n│       └── standup.txt                    # Custom prompt example\n├── .config/\n│   └── api_key.txt                        # OpenAI API key (auto-created)\n├── src/\n│   ├── audio.py                           # Audio recording\n│   ├── transcription.py                   # Whisper transcription\n│   ├── meeting_notes.py                   # GPT-5 meeting notes generation\n│   ├── file_manager.py                    # File \u0026 metadata management\n│   ├── audio_processor.py                 # Compression \u0026 chunking\n│   ├── config.py                          # API key management\n│   └── streamlit_ui.py                    # UI implementation\n└── main.py                                # Application entry point\n```\n\n## Metadata Structure\n\nEach audio file has a companion `.json` file storing:\n```json\n{\n  \"display_name\": \"Weekly Team Meeting\",\n  \"transcription\": \"Meeting transcription text...\",\n  \"transcribed_at\": \"2025-10-15T14:30:00\",\n  \"meeting_notes\": \"# Meeting Summary\\n...\",\n  \"meeting_notes_model\": \"gpt-5-mini\",\n  \"meeting_notes_generated_at\": \"2025-10-15T14:35:00\",\n  \"meeting_notes_usage\": {\n    \"prompt_tokens\": 1500,\n    \"completion_tokens\": 800,\n    \"total_tokens\": 2300,\n    \"reasoning_tokens\": 50\n  }\n}\n```\n\n## Troubleshooting\n\n**FFmpeg not found**: Install with `brew install ffmpeg` (macOS) or `sudo apt-get install ffmpeg` (Ubuntu)\n\n**API key issues**: Click ⚙️ API Key Settings and verify your key at [OpenAI Platform](https://platform.openai.com/api-keys)\n\n**Dialog not closing**: Use Close/Done buttons instead of X button\n\n**Long files**: App automatically chunks files \u003e23min with intelligent merging\n\n**Empty meeting notes**: Check transcription exists and try regenerating with different model\n\n**Streamlit media errors in logs**: Harmless internal caching issue, does not affect functionality\n\n## Tips\n\n### General\n- Let app auto-decide compression (enabled only when beneficial)\n- Rename recordings immediately for easy identification\n- Monitor API usage at [OpenAI Usage Dashboard](https://platform.openai.com/usage)\n\n### Transcription\n- Use GPT-4o Mini for most meetings\n- Specify language code for better accuracy if auto-detect fails\n- For long meetings, increase chunk overlap if transcription seems disjointed\n\n### AI Meeting Notes\n- **Start with GPT-5 Mini** (best balance of quality/cost)\n- Use **GPT-5 Nano** for quick summaries or budget constraints\n- Use **GPT-5** only for complex technical meetings\n- **Low reasoning effort** is sufficient for most meetings\n- Create **custom prompts** for recurring meeting types (standups, sales calls, etc.)\n- Use **auto-detect language** unless you need specific output language\n- **Full Page View** for comfortable reading and reviewing\n- **Regenerate** if first result isn't satisfactory (try different model or reasoning effort)\n\n### Custom Prompts\n- Include `{LANGUAGE_INSTRUCTION}` placeholder for language flexibility\n- Test prompts with different meeting types before committing\n- Name prompts descriptively (e.g., \"sales-call\", \"technical-review\")\n- Keep default prompt as fallback reference\n\n## Architecture\n\nThe application follows a modular architecture:\n\n1. **Frontend (Streamlit)**: Multi-page interface with dialogs\n2. **Audio Layer**: Recording and compression\n3. **Transcription Layer**: OpenAI Whisper integration\n4. **AI Notes Layer**: GPT-5 meeting notes generation\n5. **Storage Layer**: Local file system with JSON metadata\n\n---\n\n**Built with Streamlit, OpenAI Whisper API, OpenAI GPT-5 API, and FFmpeg**\n\n**License**: MIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevslem%2Fai-meeting-notes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevslem%2Fai-meeting-notes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevslem%2Fai-meeting-notes/lists"}