🎯 Real-time AI coaching for Microsoft Teams meetings
A powerful real-time meeting feedback system that captures Teams audio, transcribes speech, and provides live coaching on speaking pace, tone, and communication effectiveness.
This project is organized as a monorepo with two main components:
teams-meeting-coach/
├── backend/ # Python console application & analysis engine
│ ├── main.py # Console application entry point
│ ├── analyzer.py # AI-powered communication analysis
│ ├── transcriber.py # Real-time speech-to-text
│ ├── tests/ # Comprehensive test suite
│ └── README.md # Backend documentation
├── frontend/ # React Native UI (in development)
│ ├── src/
│ │ └── components/
│ └── README.md # Frontend documentation
├── docs/ # Shared documentation
├── Makefile # Monorepo orchestration
└── README.md # This file
- 🎤 Live Audio Capture: Captures Teams audio via BlackHole virtual audio device
- 📝 Real-time Transcription: Uses Faster-Whisper for streaming speech-to-text
- ⏱️ Speaking Pace Analysis: Monitors words per minute with smart alerts
- 🎭 Tone Detection: AI-powered analysis of communication style and sentiment
- 🔄 Filler Word Tracking: Counts and reports usage of "um", "uh", "like", etc.
- 📊 Live Feedback Display: Clean console interface (UI app in development)
- 🤖 Local AI Processing: Uses Ollama for private, offline tone analysis
- macOS (required for React Native macOS app)
- Homebrew (for installing dependencies)
- Node.js 20+ (for frontend)
- Python 3.12+ (for backend)
- Overmind (process manager for development)
brew install overmind# Clone the repository
git clone <your-repo>
cd teams-meeting-coach
# Optional: Set up version managers to prevent polluting system versions (recommended)
brew install pyenv pyenv-virtualenv nvm
# Python with pyenv (reads version from .python-version)
PYVER=$(cat .python-version) && pyenv install $PYVER && pyenv virtualenv $PYVER teams-meeting-coach && pyenv local teams-meeting-coach
# Node.js with nvm (reads version from .nvmrc)
nvm install && nvm use
# Install both backend and frontend
make installCreate a .env file in the project root (copy from .env.example):
cp .env.example .env.env file (all values required):
# Backend WebSocket Server
WEBSOCKET_HOST=localhost
WEBSOCKET_PORT=3002
# Frontend Metro Bundler
METRO_PORT=8082Start everything:
make runThis starts the backend server, Metro bundler, and macOS app.
Control processes:
overmind connect macos # View app logs
overmind restart macos # Restart the app
Ctrl+C # Stop all processesRun make help for more commands. See overmind help for process management options.
The Python backend runs a WebSocket server on port 3002 (configurable), broadcasting real-time meeting analysis to connected clients:
make run backendKey features:
- WebSocket API on
ws://localhost:3002(or configured port) - Real-time audio capture and transcription
- AI-powered tone analysis via Ollama
- Emotional timeline tracking
See backend/README.md for architecture details, configuration, and API documentation.
React Native macOS app that connects to the backend WebSocket server:
make run metro # Start Metro bundler
make run macos # Launch macOS appCurrent status: UI mockup with WebSocket integration in progress.
See frontend/README.md for setup, component structure, and development workflow.
Critical: You must configure audio routing for the coach to hear Teams audio:
- Open Audio MIDI Setup (Applications → Utilities)
- Create Multi-Output Device: Click
+→ "Create Multi-Output Device" - Configure the Multi-Output:
- ✅ Check "BlackHole 2ch"
- ✅ Check your speakers/headphones
- Set drift correction if needed
- Configure Teams:
- Teams Settings → Devices
- Set Speaker to your Multi-Output Device
- Keep Microphone as your preferred mic
This setup allows the coach to "listen" to Teams audio while you still hear everything normally.
The coach provides real-time feedback on:
- 🐢 Too Slow (< 100 WPM): "Consider picking up the pace"
- ✅ Ideal (120-160 WPM): "Great pace!"
- 🐇 Too Fast (> 180 WPM): "Try to slow down"
- 🤝 Supportive: Collaborative and encouraging language
- 🙄 Dismissive: Language that might shut down discussion
- 😤 Aggressive: Forceful or confrontational tone
- 😐 Neutral: Professional, matter-of-fact communication
Real-time tracking of: "um", "uh", "like", "you know", "basically", "actually", "literally"
make help # See all available commandsCommon tasks:
make run- Start full environmentmake test- Run all testsmake lint- Lint all codemake check-ports- Debug WebSocket connection issues
Component-specific:
make backend-test- Backend tests onlymake frontend-test- Frontend tests onlymake backend-install- Reinstall backend dependenciesmake frontend-install- Reinstall frontend dependencies
For detailed development workflows, see:
- Backend: backend/README.md
- Frontend: frontend/README.md
This project uses a comprehensive testing strategy with full regression testing - all tests run on every commit.
# Run all tests (backend + frontend)
make test
# Backend tests only
make backend-test # All backend tests
make test-unit # Unit tests only
make test-integration # Integration tests only
make test-fast # Fast tests (no slow/external deps)
# Frontend tests only
make frontend-test # All frontend tests
# Tests with coverage report
make test-coverage # Backend coverageWe run ALL tests on every commit (full regression testing), not just tests for changed files.
Why?
- Complete confidence in every change
- Catches unexpected side effects
- Ensures all components work together
- Simpler CI without change detection logic
For detailed information about our testing strategy, test organization, and best practices, see TESTING_STRATEGY.md.
Backend (Python):
- Unit Tests: Test individual modules (analyzer, transcriber, timeline)
- Integration Tests: Test component interactions (pipeline, WebSocket communication)
- System Tests: End-to-end workflows (mocked external dependencies)
Frontend (React Native):
- Unit Tests: Test individual utilities and services
- Component Tests: Test React components in isolation
- Integration Tests: Test WebSocket service and state management integration
# Run all tests (backend + frontend)
make test
# Backend tests only
make backend-test # All backend tests
make test-unit # Unit tests only
make test-integration # Integration tests only
make test-fast # Fast tests (no slow/external deps)
# Frontend tests only
make frontend-test # All frontend tests
# Tests with coverage report
make test-coverage # Backend coverageThe project uses a consolidated CI workflow that provides a unified view of all tests:
- CI Workflow (
ci.yml): Consolidated workflow that runs all backend and frontend tests in a single view- Backend: Linting, unit tests, integration tests, and coverage
- Frontend: Linting, unit tests, component tests, integration tests, and coverage
- Coverage reporting updates PR descriptions (not comments)
- Clear job grouping with visual separators (Backend →, Frontend →, Coverage →)
- Code Quality (
code-quality.yml): Security scans and code quality metrics - PR Validation (
pr-validation.yml): PR title validation
The CI workflow is designed to provide easy navigation with all frontend and backend jobs visible in one workflow view, making it simple to see the status of all tests at a glance.
backend/tests/
├── unit/ # Unit tests
│ ├── test_analyzer.py
│ ├── test_transcriber.py
│ └── test_dashboard.py
├── integration/ # Integration tests
│ ├── test_pipeline.py
│ └── test_full_pipeline.py
└── conftest.py # Shared fixtures
frontend/src/
├── components/
│ └── *.test.js # Component unit tests
├── services/
│ └── *.test.js # Service integration tests
└── context/
└── *.test.js # State management tests
Application configuration is managed through code constants in each component:
Backend: backend/src/config.py
Key settings:
WHISPER_MODEL- Transcription model size (tiny/base/small/medium/large)OLLAMA_MODEL- LLM for tone analysis (default: gemma2:2b)PACE_THRESHOLDS- WPM thresholds for pace alertsMIN_WORDS_FOR_ANALYSIS- Minimum words before analysisWEBSOCKET_HOST/WEBSOCKET_PORT- Server configuration (from .env)
Frontend: frontend/src/utils/constants.js
Key settings:
WEBSOCKET.URL- Backend WebSocket URL (built from .env)WEBSOCKET.AUTO_RECONNECT- Auto-reconnect on disconnectWEBSOCKET.MAX_RECONNECT_ATTEMPTS- Maximum reconnection attempts
See backend/README.md for complete configuration options.
Microsoft Teams Audio
↓
BlackHole Driver
↓
Audio Capture (PyAudio)
↓
Faster-Whisper Transcription
↓
┌─────────────┬─────────────┐
│ │ │
Pace Analysis Filler Words Tone Analysis
│ │ (Ollama LLM)
└─────────────┼─────────────┘
↓
Feedback Display
(Console / React Native UI)
- Local Processing: All analysis runs locally on your machine
- No Cloud Services: Audio never leaves your computer
- No Data Storage: Transcriptions are processed in real-time and discarded
- Open Source: Full code transparency
- Meeting Facilitation: Get real-time feedback on speaking pace and tone
- Presentation Practice: Monitor your delivery during practice sessions
- Communication Training: Build awareness of speaking habits
- Accessibility: Real-time transcription for hearing assistance
- Neurodivergent Support: Helpful for ADHD and autism spectrum individuals
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Run
make lintandmake test - Submit a pull request
This project follows Conventional Commits for commit messages (e.g., feat:, fix:, docs:, chore:).
Apache 2.0 with Commons Clause - see LICENSE file for details.
Summary: Free for personal, educational, and internal use. Commercial use (selling the software or offering it as a paid service) requires a separate commercial license.
- Faster-Whisper: High-performance speech recognition
- Ollama: Local LLM inference
- BlackHole: Virtual audio driver
- PyAudio: Audio I/O library
- React Native: Cross-platform mobile framework
For detailed project status, architecture decisions, and next steps, see PROJECT_SUMMARY.md