A FastAPI-based application that integrates with Recall.ai to create meeting bots that provide real-time transcription via webhooks, with intelligent wake-phrase detection for AI-powered research assistance.
- Instant Bot Creation: Create meeting bots for any Google Meet, Zoom, or Teams URL
- Real-time Transcription: Receive live transcripts as people speak in meetings
- Wake-Phrase Detection: Automatically detect "Hey Samantha, can you research..." commands
- AI Research Integration: OpenAI-powered research responses to detected wake phrases
- Webhook Integration: Automatic webhook configuration for transcript delivery
- Real-time Monitoring: Web dashboard to monitor transcripts and research activity
- SQLite Storage: Persistent storage of transcripts and research results
- Multi-platform Support: Works with Google Meet, Zoom, Microsoft Teams, and more
- Auto-deployment: Integrated ngrok tunneling for easy webhook setup
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ Meeting URL โโโโโถโ FastAPI App โโโโโถโ Recall.ai โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ โ
โผ โผ
โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ ngrok โโโโโโ Meeting Bot โ
โ Webhook โ โ (Transcribing) โ
โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโ
โ Wake-Phrase Engine โ
โ "Hey Samantha..." โ
โโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ OpenAI Research โโโโโถโ SQLite Storage โ
โ Assistant โ โ Transcripts & โ
โโโโโโโโโโโโโโโโโโโโโโโ โ Research Resultsโ
โโโโโโโโโโโโโโโโโโโ
- Python 3.11+
- pyenv (recommended)
- ngrok account
- Recall.ai API key (us-west-2 region)
- OpenAI API key (for research functionality)
# Install Python 3.11.7 with pyenv
pyenv install 3.11.7
pyenv virtualenv 3.11.7 recall-poc
pyenv local recall-pocpip install -r requirements.txtCreate a .env file with your API keys:
# Recall.ai API Configuration (us-west-2 region)
RECALL_API_KEY=your_recall_api_key_here
# OpenAI API Key (for research functionality)
OPENAI_API_KEY=your_openai_api_key_here
# Database URL
DATABASE_URL=sqlite:///./recall_poc.db
# API Configuration
API_HOST=0.0.0.0
API_PORT=8000
DEBUG=false# Install ngrok
brew install ngrok/ngrok/ngrok
# Configure your authtoken (get from ngrok.com)
ngrok authtoken YOUR_NGROK_TOKEN# Start everything automatically (server + ngrok + interactive CLI)
python start_recall_bot.pyThis will:
- Start the FastAPI server on port 8001
- Launch ngrok tunnel automatically
- Provide an interactive CLI for bot management
- Display webhook URLs and monitoring links
# Start FastAPI server
python -m src.recall_poc.main# In a separate terminal
ngrok http 8000When using python start_recall_bot.py, you get an interactive CLI:
> create https://meet.google.com/your-meeting-url
๐ค Creating bot for meeting: https://meet.google.com/your-meeting-url
โ
Bot created successfully!
๐ Bot ID: abc-123-def
๐ Monitor URL: https://your-ngrok.ngrok-free.app/bots/abc-123-def
> status
๐ System Status:
Server: http://localhost:8001
Ngrok: https://your-ngrok.ngrok-free.app
Webhook: https://your-ngrok.ngrok-free.app/webhooks/recall/transcript
> test
๐งช Running wake-phrase test...
โ
Test completed successfully!
๐ Transcript: Hey Samantha, can you research AI safety best practices?
๐ Research Command: ai safety best practices
> quit
# Replace with your actual meeting URL
curl -X POST "http://localhost:8001/bots/quick-create?meeting_url=https://meet.google.com/abc-defg-hij"| Method | Endpoint | Description |
|---|---|---|
POST |
/bots/create |
Create a new bot with full configuration |
POST |
/bots/quick-create |
Quick bot creation with defaults |
GET |
/bots/ |
List all bots |
GET |
/bots/{bot_id} |
Get specific bot details |
DELETE |
/bots/{bot_id} |
Delete a bot |
| Method | Endpoint | Description |
|---|---|---|
POST |
/webhooks/recall/transcript |
Receive real-time transcripts |
GET |
/webhooks/recall/test |
Test webhook accessibility |
POST |
/webhooks/recall/test-payload |
Test with sample data |
POST |
/webhooks/recall/test-research |
Test wake-phrase detection |
GET |
/monitor/ |
Real-time monitoring dashboard |
GET |
/monitor/data |
Get monitoring data as JSON |
| Method | Endpoint | Description |
|---|---|---|
GET |
/ |
API information and endpoints |
GET |
/health |
Health check |
- Real-time Monitoring: The system continuously monitors meeting transcripts
- Wake-Phrase Detection: Detects phrases like "Hey Samantha, can you research..."
- AI Research: Automatically triggers OpenAI research on the detected topic
- Storage: Stores both transcripts and research results in SQLite database
"Hey Samantha, can you research [topic]?"
"Samantha, research [topic]"
"Hey Samantha, look up [topic]"
In your meeting, say:
"Hey Samantha, can you research AI safety best practices?"
The system will:
- โ Detect the wake phrase
- ๐ Extract "AI safety best practices" as the research topic
- ๐ค Query OpenAI for comprehensive research
- ๐พ Store the result in the database
- ๐ Display in the monitoring dashboard
Visit http://localhost:8001/monitor/ to see:
- Real-time transcripts from your meetings
- Wake-phrase detection highlights
- Research results from AI queries
- System statistics and activity
# Using the interactive CLI
> create https://meet.google.com/abc-defg-hij
# Or via API
curl -X POST "http://localhost:8001/bots/quick-create?meeting_url=https://meet.google.com/abc-defg-hij"curl -X POST -H "Content-Type: application/json" \
-d '{
"meeting_url": "https://meet.google.com/abc-defg-hij",
"bot_name": "My Custom Bot",
"transcription_provider": "meeting_captions",
"enable_partial_transcripts": true,
"auto_configure_webhook": true
}' \
http://localhost:8001/bots/createWhen transcripts are generated, your webhook receives:
{
"event": "transcript.data",
"data": {
"data": {
"words": [
{
"text": "Hello",
"start_timestamp": {"relative": 0.0},
"end_timestamp": {"relative": 0.5}
}
],
"participant": {
"id": 1,
"name": "John Doe",
"is_host": true,
"platform": "google_meet"
}
},
"bot": {"id": "bot-123"},
"recording": {"id": "recording-456"},
"transcript": {"id": "transcript-789"}
}
}# Required
RECALL_API_KEY=your_recall_api_key_here
# Optional
RECALL_API_BASE_URL=https://us-west-2.recall.ai/api/v1
DATABASE_URL=sqlite:///./recall_poc.db
API_HOST=0.0.0.0
API_PORT=8000
DEBUG=falseThe API key determines the region. Common regions:
us-west-2.recall.ai(default)us-east-1.recall.aieu-central-1.recall.aiap-northeast-1.recall.ai
src/recall_poc/
โโโ __init__.py
โโโ main.py # FastAPI application
โโโ settings.py # Configuration management
โโโ api/
โ โโโ __init__.py
โ โโโ bots.py # Bot management endpoints
โ โโโ models.py # Pydantic data models
โ โโโ recall_client.py # Recall.ai API client
โ โโโ webhooks.py # Webhook endpoints
โโโ skills/ # Future AI processing modules
โโโ db/ # Database modules
curl https://your-ngrok-url.ngrok-free.app/bots/{bot_id}- ngrok Dashboard:
http://127.0.0.1:4040 - Server Logs: Watch terminal output for transcript processing
- Webhook Test:
GET /webhooks/recall/test
joining_call- Bot is connecting to meetingin_waiting_room- Bot is waiting for admissionin_call_recording- Bot is actively recordingcall_ended- Meeting has endeddone- Bot completed successfully
- Create Meeting: Start a Google Meet at
https://meet.google.com/abc-defg-hij - Create Bot:
POST /bots/createwith the meeting URL - Bot Joins: Bot appears as "Recall POC Bot" in your meeting
- Start Speaking: Real-time transcripts flow to your webhook
- Process Data: Your app receives and processes transcript events
Error: "Invalid API token"
- โ
Solution: Ensure your Recall.ai API key is for the
us-west-2region - Check your
.envfile has the correctRECALL_API_KEY
Error: "Cannot specify realtime endpoint events for artifacts that are not configured"
- โ Solution: This is fixed in the current version - uses proper transcript configuration
- The system now correctly configures the transcript artifact before setting up webhooks
Error: "AssemblyAI credentials not configured"
- โ
Solution: The system now uses
meeting_captionsby default (no external credentials needed) - For advanced features, configure transcription providers in your Recall.ai dashboard
Monitor shows 0 transcripts
- โ
Solution: Refresh the page at
http://localhost:8001/monitor/ - The JavaScript endpoint was fixed to use the correct API path
- Check that your bot is actually in the meeting and people are speaking
- Verify ngrok tunnel is running (
python start_recall_bot.pyhandles this automatically) - Check webhook URL in bot configuration
- Test webhook endpoint:
curl http://localhost:8001/webhooks/recall/test
- Ensure you're saying the exact phrase: "Hey Samantha, can you research [topic]?"
- Check the monitoring dashboard for transcript accuracy
- Verify OpenAI API key is configured in
.env
- Check if meeting exists and is active
- Verify meeting platform is supported (Google Meet, Zoom, Teams)
- Use a real meeting URL, not a test URL
# Reset database if needed
rm recall_poc.db
python -c "from src.recall_poc.db import create_tables; import asyncio; asyncio.run(create_tables())"- Real-time transcription via Recall.ai webhooks
- Wake-phrase detection for "Hey Samantha" commands
- AI-powered research using OpenAI integration
- Real-time monitoring dashboard with live transcripts
- SQLite storage for transcripts and research results
- Automated deployment with ngrok integration
- Interactive CLI for easy bot management
- Meeting summaries and action items
- Multi-language support
- Integration with Slack/Teams/Discord
- Calendar integration for automatic bot scheduling
- Speaker identification and analytics
- Custom wake-phrase configuration
- Advanced transcription providers (AssemblyAI, AWS Transcribe)
- Conversation context awareness
MIT License - see LICENSE file for details.
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests
- Submit a pull request
Built with โค๏ธ using FastAPI, Recall.ai, and ngrok