DeepMeet Guard is a dual-purpose AI security research platform targeting one of the most critical emerging threats in remote hiring:
AI-powered audio fraud during live online interviews.
It simultaneously demonstrates how AI-driven audio spoofing attacks operate in real-time,
and deploys a multi-layer detection system to identify and report fraudulent audio to the interviewer.
๐ Setup Guide ยท ๐ Quick Start ยท ๐๏ธ Architecture ยท ๐ก API Reference ยท ๐ค Contributors
DeepMeet Guard is a graduation research platform engineered with two deeply integrated AI subsystems:
| Subsystem | Side | Description |
|---|---|---|
| ๐ญ Simulation Engine | Attacker | Demonstrates how an AI assistant autonomously responds to interview questions using a candidate-supplied knowledge base, generating synthetic voice output indistinguishable from a real human |
| ๐ก๏ธ Detection Engine | Defender | Analyzes incoming audio streams in real-time using a 4-layer ensemble model to determine whether the speaker's voice is AI-generated, flagging anomalies and reporting verdicts to the interviewer |
This dual-sided architecture makes DeepMeet Guard both a security research tool and a corporate fraud prevention platform.
The rapid commoditization of voice synthesis and large language models has made it trivially easy for bad actors to impersonate candidates in remote interviews. A technically sophisticated actor can now:
Existing interview platforms offer no protection against this attack vector.
DeepMeet Guard was built to:
REAL / AI-GENERATEDInterviewer speaks
โ
โผ
[STT Module โ Vosk]
Transcribes speech to text offline
โ
โผ
[LangChain + LangGraph Agent]
Retrieves relevant context from candidate's knowledge base
Generates a tailored answer via configured LLM provider
โ
โผ
[NeuTTS + eSpeak-NG Phonemizer]
Converts text to natural speech with phoneme-level control
โ
โผ
[Voice Cloning Module]
Applies candidate's reference voice to synthesized audio
โ
โผ
Fake audio streamed back to the interviewer
Audio stream captured from interviewee
โ
โผ
[Audio Capture โ sounddevice / soundcard]
Segments audio into configurable time periods
โ
โผ
[Parallel 4-Layer Detection]
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโ
โ Spectra0 โ ViT โ RawNet2 โ Behaviour/Live. โ
โ (w=0.42) โ (w=0.26) โ (w=0.172) โ (w=0.148) โ
โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโ
โ
โผ
[Weighted Ensemble Scorer]
Aggregates layer verdicts into final confidence score
โ
โผ
[Reporting Module]
Result + confidence delivered to interviewer dashboard per period
graph TD
subgraph CLIENT ["๐ Web Application (Next.js 16 / React 19)"]
UI[Candidate Interface\nSimulation Controls]
Dashboard[Interviewer Dashboard\nLive Detection Feed]
end
subgraph SERVER ["โ๏ธ FastAPI Backend (Python 3.11)"]
API[FastAPI Gateway\nUvicorn ASGI]
subgraph SIM ["๐ญ Simulation Engine"]
STT[Vosk STT\nOffline Speech-to-Text]
LLM[LangChain / LangGraph\nMulti-Provider LLM Agent]
KB[Knowledge Base\nDocument Store]
TTS[NeuTTS + eSpeak-NG\nNeural TTS Engine]
VC[Voice Cloning\nNeuCodec / Perth]
end
subgraph DET ["๐ก๏ธ Detection Engine (4-Layer Ensemble)"]
CAP[sounddevice / soundcard\nAudio Capture]
L1[Layer 1 โ Spectra0\nweight 0.42]
L2[Layer 2 โ ViT\nweight 0.26]
L3[Layer 3 โ RawNet2\nweight 0.172]
L4[Layer 4 โ Liveness\nweight 0.148]
SCORE[Weighted Ensemble\nVerdictScorer]
end
REPORT[Reporting Module\nPeriod-based JSON Reports]
end
UI -->|REST /deepmeet/simulator/*| API
Dashboard -->|REST /deepmeet/detector/*| API
API --> STT
STT --> LLM
LLM --> KB
LLM --> TTS
TTS --> VC
VC -->|Synthesized Audio Response| API
API --> CAP
CAP --> L1 & L2 & L3 & L4
L1 & L2 & L3 & L4 --> SCORE
SCORE --> REPORT
REPORT -->|Verdict + Confidence| Dashboard
DeepMeet-Gaurd/
โโโ LICENSE
โโโ README.md
โโโ src/
โโโ main.py # FastAPI application entry point
โโโ requirements.txt # Python dependencies
โโโ .env.example # Environment variable template
โ
โโโ assets/
โ โโโ simulator_assets/ # Candidate voice samples & knowledge base storage
โ โโโ detector_assets/ # Meeting session audio & detection reports
โ
โโโ client/ # Next.js 16 Frontend
โ โโโ app/ # App Router pages & layouts
โ โโโ components/ # Reusable React components (shadcn/ui + Radix UI)
โ โโโ hooks/ # Custom React hooks
โ โโโ lib/ # Utility functions & API client
โ โโโ styles/ # Global CSS styles
โ โโโ public/ # Static assets
โ โโโ package.json
โ โโโ tsconfig.json
โ โโโ next.config.mjs
โ
โโโ server/ # Python FastAPI Backend
โโโ app_defaults/ # Default reference audio & text for TTS
โโโ controllers/ # Request handling logic
โโโ helpers/ # Configuration loaders & shared utilities
โโโ infrastructure/ # Model files: STT (Vosk), liveness detection
โโโ models/
โ โโโ enums/ # Shared enumerations
โ โโโ interfaces/ # Abstract base classes
โ โโโ schemas/ # Pydantic request/response schemas
โโโ routers/ # FastAPI route definitions
โ โโโ health.py # GET /health
โ โโโ data.py # POST /deepmeet/simulator/data/*
โ โโโ setup.py # POST /deepmeet/simulator/setup/*
โ โโโ communication.py # POST /deepmeet/simulator/communication/*
โ โโโ detection.py # POST|GET /deepmeet/detector/*
โโโ services/
โ โโโ simulator.py # Simulator service singleton
โ โโโ detector.py # Detector service singleton
โโโ usecases/ # Business logic layer
โโโ utilities/ # Audio processing, session management helpers
โโโ views/ # Streamlit debug/monitoring views
The server is a Python 3.11 application built on FastAPI, orchestrating two specialized AI subsystems.
| Component | Technology | Role |
|---|---|---|
| STT | Vosk 0.3.45 + pyspellchecker | Offline speech-to-text transcription |
| LLM Orchestration | LangChain 1.0 + LangGraph 1.0 | Multi-agent pipeline with RAG over knowledge base |
| LLM Providers | OpenAI, Gemini, Claude, Cohere, Ollama | Configurable via LLM_PROVIDER env var |
| TTS | NeuCodec โฅ0.0.4 + eSpeak-NG + phonemizer 3.3 | Neural text-to-speech synthesis |
| Voice Cloning | resemble-perth 1.0.1 | Zero-shot voice profile application |
| Layer | Model | Weight | Technology |
|---|---|---|---|
| Layer 1 | Spectra0 | 0.42 | Custom spectrogram-based detector |
| Layer 2 | ViT | 0.26 | Vision Transformer on ConstantQ features |
| Layer 3 | RawNet2 | 0.172 | End-to-end raw waveform anti-spoofing |
| Layer 4 | Behaviour Liveness | 0.148 | XGBoost / sklearn behavioural liveness |
Additional libraries: Jabberjay 0.0.11, librosa 0.11, torchaudio โฅ2.11, ONNX Runtime 1.23, transformers, scikit-learn 1.8, xgboost
# main.py
app = FastAPI(title="DeepMeet Guard API", version="1.0.0")
# CORS origins
allow_origins = ["http://localhost:3000", "http://localhost:3001", "http://127.0.0.1:3000"]
The client is a Next.js 16 application written in TypeScript 5.7 with React 19, providing:
| Technology | Version | Purpose |
|---|---|---|
| Next.js | 16.2.0 | Full-stack React framework with App Router |
| React | 19.2.4 | UI component library |
| TypeScript | 5.7.3 | Type-safe frontend development |
| Tailwind CSS | 4.x | Utility-first styling |
| Radix UI | Various | Accessible headless component primitives |
| shadcn/ui | Latest | Pre-built accessible UI component system |
| React Three Fiber | ^9.5 | 3D rendering for visual effects |
| Three.js | ^0.183 | 3D graphics library |
| Recharts | 2.15 | Data visualization / detection charts |
| React Hook Form | ^7.54 | Form state management |
| Zod | ^3.24 | Schema validation |
| Lucide React | ^0.564 | Icon library |
| next-themes | ^0.4.6 | Dark/light mode support |
All endpoints are served by the FastAPI backend. Interactive Swagger docs are available at http://localhost:8000/docs when the server is running.
| Method | Endpoint | Description |
|---|---|---|
GET | /health | Server health check |
Prefix:
/deepmeet/simulator/data
| Method | Endpoint | Body | Description |
|---|---|---|---|
POST | /upload/info | JSON InterviewSetupRequest | Upload candidate user info and organization details. Returns user_id |
POST | /upload/references | Form: user_id, audio (file), reference_text (file) | Upload reference voice audio and knowledge base text file for voice cloning |
Prefix:
/deepmeet/simulator/setup
| Method | Endpoint | Params | Description |
|---|---|---|---|
POST | /impersonate | user_id (query) | Load user session and configure LLM agent with candidate's profile and knowledge base |
POST | /clone | user_id (query) | Load reference audio and text, apply voice cloning profile to TTS engine |
Prefix:
/deepmeet/simulator/communication
| Method | Endpoint | Params | Description |
|---|---|---|---|
POST | /start | user_id (query) | Start simulation loop in background thread: STT โ LLM โ TTS โ voice output |
POST | /end | user_id (query) | Gracefully stop the active simulation thread |
POST | /report | user_id (query) | Retrieve session transcript and interaction report |
Prefix:
/deepmeet/detector
| Method | Endpoint | Params | Description |
|---|---|---|---|
POST | /start | meeting_name (query) | Start continuous detection loop: captures audio in periods, runs 4-layer ensemble analysis |
POST | /end | โ | Stop the active detection thread gracefully |
GET | /report | meeting_name (query) | Retrieve the full period-by-period detection report for a completed meeting |
| Requirement | Version | Notes |
|---|---|---|
| Python | 3.11.x | Exact version required โ other versions may cause dependency conflicts |
| Node.js | 18+ | LTS recommended |
| npm | 9+ | Bundled with Node.js |
| Git | Latest | โ |
| eSpeak-NG | Latest | Required for TTS phonemization (Windows: via winget) |
| Google Account | โ | Required if using Ollama via Google Colab tunnel |
git clone https://github.com/3bdelmoemn/DeepMeet-Gaurd.git
cd DeepMeet-Gaurd/src
conda create -n dmg python=3.11
conda activate dmg
โ ๏ธ Windows only. Linux users:
sudo apt install espeak-ng
winget install -e --id eSpeak-NG.eSpeak-NG
Set required environment variables (run as Administrator):
setx PHONEMIZER_ESPEAK_LIBRARY "C:\Program Files\eSpeak NG\libespeak-ng.dll"
setx PHONEMIZER_ESPEAK_PATH "C:\Program Files\eSpeak NG"
Verify installation:
espeak-ng --version
Verify Python integration:
python -c "from phonemizer import phonemize; print(phonemize('hello world', language='en-us'))"
# Expected: h ษ l oส w ษห l d
๐ก Note: The repository already includes all required NeuTTS / NeuCodec-related files. Do not clone or download any additional TTS repositories.
Download the Vosk STT model from Google Drive:
๐ฅ Download STT Model โ vosk-model-en-us-0.22
After downloading:
src/server/infrastructure/stt/vosk-model-en-us-0.22/
The path must match
STT_MODEL_PATHin your.envfile.
cp .env.example .env
Open .env and fill in all required values. See Environment Variables for a complete reference.
If using LLM_MODE=local with Ollama tunneled via Colab:
src/server/notebooks/ollama_setup.ipynb to Google Colab.env as OLLAMA_BASE_URLpip install -r requirements.txt
โ All required packages are listed in
requirements.txt. Do not install additional packages manually.
Some models require a Hugging Face access token before they can be downloaded.
hf auth login
That's it โ the token will be stored locally and used automatically when downloading Hugging Face models.
cd src/client
npm install
cp .env.example .env.local
Set the backend API URL:
NEXT_PUBLIC_API_URL=http://localhost:8000
# From the src/ directory with venv activated
uvicorn main:app --reload --port 8000
| Endpoint | URL |
|---|---|
| API Base | http://localhost:8000 |
| Swagger UI | http://localhost:8000/docs |
| ReDoc | http://localhost:8000/redoc |
# From src/client/
npm run dev
| URL | Description |
|---|---|
http://localhost:3000 | Main web application |
cd src/client
npm run build
npm start
Copy src/.env.example to src/.env and fill in all values.
| Variable | Default / Example | Required | Description |
|---|---|---|---|
APP_NAME | "DeepMeet Guard" | โ๏ธ | Application display name |
APP_VERSION | "1.0.0" | โ๏ธ | Application version |
SIMULATOR_STORAGE_PATH | "assets/simulator_assets" | โ | Storage path for candidate voice & text files |
DETECTOR_STORAGE_PATH | "assets/detector_assets" | โ | Storage path for meeting audio & reports |
DETECTOR_MAX_DURATION | 15 | โ | Max seconds of audio captured per detection period |
DETECTOR_PERIOD_INTERVAL | 20 | โ | Seconds to wait between detection periods |
| Variable | Example | Required | Description |
|---|---|---|---|
LLM_MODE | "local" / "cloud" | โ | LLM execution mode |
LLM_PROVIDER | "gemini" | โ | Active LLM provider: openai, gemini, claude, cohere, ollama |
OPENAI_API_KEY | "sk-..." | โ๏ธ | OpenAI / OpenRouter API key |
CLAUDE_API_KEY | "..." | โ๏ธ | Anthropic Claude API key |
GEMINI_API_KEY | "..." | โ๏ธ | Google Gemini API key |
COHERE_API_KEY | "..." | โ๏ธ | Cohere API key |
OLLAMA_API_KEY | "dummy" | โ๏ธ | Ollama API key (can be any string for local) |
OLLAMA_BASE_URL | "https://your-ngrok-url/" | โ๏ธ | Ollama server URL (local or Colab tunnel) |
OPEN_AI_BASE_URL | "https://openrouter.ai/api/v1" | โ๏ธ | OpenAI-compatible base URL |
OPENAI_MODEL_ID | "openai/gpt-4.1" | โ๏ธ | OpenAI model identifier |
CLAUDE_MODEL_ID | "claude-3-5-haiku-20241022" | โ๏ธ | Claude model identifier |
GEMINI_MODEL_ID | "gemini-2.5-flash" | โ๏ธ | Gemini model identifier |
COHERE_MODEL_ID | "command-r-plus-08-2024" | โ๏ธ | Cohere model identifier |
OLLAMA_MODEL_ID | "interview-assistant:latest" | โ๏ธ | Ollama model identifier |
MAX_TOKENS | 1024 | โ๏ธ | LLM max output tokens |
TEMPERATURE | 0.1 | โ๏ธ | LLM sampling temperature |
CONTEXT_WINDOW | 8192 | โ๏ธ | LLM context window size |
MAX_INPUT_TOKENS | 6000 | โ๏ธ | Max tokens sent to LLM |
HISTORY_MESSAGES | 5 | โ๏ธ | Number of history messages to retain per session |
| Variable | Default | Required | Description |
|---|---|---|---|
TTS_BACKBONE | "NANO_Q8" | โ | NeuTTS backbone model variant |
TTS_CODEC | "DISTILL_NEU_CODEC" | โ | NeuCodec codec variant |
TTS_DEVICE | "cpu" | โ | TTS inference device (cpu / cuda) |
TTS_CODEC_DEVICE | "cpu" | โ | Codec inference device |
DEFAULT_REF_AUDIO_PATH | "server/app_defaults/..." | โ | Default reference audio for voice cloning |
DEFAULT_REF_TEXT_PATH | "server/app_defaults/..." | โ | Default reference text for TTS |
COOLDOWN_SECONDS | 1.2 | โ๏ธ | Cooldown between TTS synthesis cycles |
TTS_FRAMES_PER_BUFFER | 32768 | โ๏ธ | Audio buffer size |
| Variable | Default | Required | Description |
|---|---|---|---|
STT_MODEL_PATH | "server/infrastructure/stt/vosk-model-en-us-0.22" | โ | Path to downloaded Vosk STT model |
MIN_WORDS | 3 | โ๏ธ | Minimum word count to trigger LLM pipeline |
DEDUP_TTL | 30.0 | โ๏ธ | Seconds before a duplicate transcription is accepted |
| Variable | Default | Required | Description |
|---|---|---|---|
LAYER_ONE_WEIGHT | 0.42 | โ | Weight for Spectra0 layer in ensemble |
LAYER_TWO_WEIGHT | 0.26 | โ | Weight for ViT layer |
LAYER_THREE_WEIGHT | 0.172 | โ | Weight for RawNet2 layer |
LAYER_FOUR_WEIGHT | 0.148 | โ | Weight for Liveness layer |
LAYER_ONE_NAME | "Spectra0" | โ | Spectra0 model identifier |
LAYER_TWO_NAME | "VIT" | โ | ViT model identifier |
LAYER_THREE_NAME | "RawNet2" | โ | RawNet2 model identifier |
LAYER_FOUR_NAME | "liveness" | โ | Liveness model identifier |
VIT_DATASET_NAME | "VoxCelebSpoof" | โ | Dataset used to train the ViT model |
VIT_VISIUALIZATION | "ConstantQ" | โ | Feature type fed to ViT |
LAYER_FOUR__MODELPATH | "server/infrastructure/behaviour_liveness_detection_model" | โ | Path to liveness model files |
Refer to
.env.examplefor a fully annotated reference with inline documentation.
| Technology | Version | Purpose |
|---|---|---|
| Python | 3.11 | Core backend language |
| FastAPI | 0.118.3 | High-performance REST API framework |
| Uvicorn | 0.38.0 | ASGI server for FastAPI |
| Pydantic | 2.12.4 | Data validation and settings management |
| Vosk | 0.3.45 | Offline Speech-to-Text (STT) engine |
| pyspellchecker | 0.8.4 | Post-STT spelling correction |
| LangChain | 1.0.7 | LLM orchestration & RAG pipeline |
| LangGraph | 1.0.3 | Multi-agent AI workflow graph |
| langchain-openai | 1.0.3 | OpenAI / OpenRouter integration |
| langchain-google-genai | 3.1.0 | Google Gemini integration |
| langchain-anthropic | 1.1.0 | Anthropic Claude integration |
| langchain-cohere | 0.5.0 | Cohere integration |
| langchain-ollama | 1.0.1 | Ollama local LLM integration |
| NeuCodec | โฅ0.0.4 | Neural codec for TTS synthesis |
| eSpeak-NG | Latest | Text-to-phoneme conversion |
| phonemizer | 3.3.0 | Python wrapper for eSpeak-NG |
| resemble-perth | 1.0.1 | Zero-shot voice cloning |
| PyTorch | โฅ2.11 | Deep learning inference engine |
| torchaudio | โฅ2.11 | Audio processing with PyTorch |
| torchvision | โฅ0.22 | Vision model support |
| transformers | Latest | HuggingFace model hub integration |
| ONNX Runtime | 1.23.2 | Optimized model inference |
| Jabberjay | 0.0.11 | Fake audio detection utility |
| librosa | 0.11.0 | Audio feature extraction |
| scikit-learn | 1.8.0 | ML utilities for liveness detection |
| XGBoost | Latest | Gradient boosting for liveness model |
| sounddevice | 0.5.5 | Cross-platform audio I/O |
| soundcard | Latest | System audio capture |
| pydub | 0.25.1 | Audio format conversion |
| soundfile | 0.13.1 | Audio file I/O |
| pyaudio | 0.2.14 | PortAudio Python bindings |
| aiofiles | 25.1.0 | Async file I/O |
| httpx | 0.28.1 | Async HTTP client |
| aiohttp | 3.13.2 | Async HTTP networking |
| Streamlit | Latest | Debug/monitoring views |
| pytest | 9.0.2 | Testing framework |
| Technology | Version | Purpose |
|---|---|---|
| Next.js | 16.2.0 | Full-stack React framework (App Router) |
| React | 19.2.4 | UI component library |
| TypeScript | 5.7.3 | Type-safe frontend development |
| Tailwind CSS | 4.x | Utility-first CSS framework |
| Radix UI | Various | Accessible headless component primitives |
| shadcn/ui | Latest | Pre-built UI component system (built on Radix) |
| React Three Fiber | ^9.5 | Declarative 3D graphics for React |
| Three.js | ^0.183 | 3D WebGL rendering |
| Recharts | 2.15.0 | Chart library for detection data visualization |
| React Hook Form | ^7.54 | Performant form state management |
| Zod | ^3.24 | TypeScript-first schema validation |
| Lucide React | ^0.564 | Icon library |
| next-themes | ^0.4.6 | Dark/light mode theming |
| Embla Carousel | 8.6.0 | Touch-friendly carousel component |
| date-fns | 4.1.0 | Date utility library |
| Sonner | ^1.7 | Toast notification system |
| cmdk | 1.1.1 | Command palette component |
| Vaul | ^1.1.2 | Drawer component |
| Technology | Purpose |
|---|---|
| Google Colab | Cloud GPU hosting for Ollama LLM via ngrok tunnel |
| Vosk Model en-us-0.22 | Pre-trained offline English STT model |
| ViT on VoxCelebSpoof | Visual Transformer anti-spoofing on ConstantQ features |
| RawNet2 | End-to-end raw waveform audio anti-spoofing |
| Spectra0 | Spectrogram-based deepfake audio detector |
| Behaviour Liveness Detection | XGBoost/sklearn behavioural liveness model |
Ensure you have set the environment variables correctly after installing eSpeak-NG:
setx PHONEMIZER_ESPEAK_LIBRARY "C:\Program Files\eSpeak NG\libespeak-ng.dll"
setx PHONEMIZER_ESPEAK_PATH "C:\Program Files\eSpeak NG"
Restart your terminal after running setx so the new environment variables take effect.
Ensure the Vosk model is placed exactly at:
src/server/infrastructure/stt/vosk-model-en-us-0.22/
The folder must contain all extracted model files directly (not a nested sub-folder). Verify your .env:
STT_MODEL_PATH=server/infrastructure/stt/vosk-model-en-us-0.22
OLLAMA_BASE_URL in .env with the new ngrok URL8000NEXT_PUBLIC_API_URL in src/client/.env.local is set to http://localhost:8000localhost:3000, localhost:3001, and 127.0.0.1:3000 by defaultEnsure you are using Python 3.11 specifically. Other Python versions will cause dependency resolution failures.
python --version # Must output Python 3.11.x
If you have multiple Python versions installed, use:
py -3.11 -m venv venv
sounddevice and soundcard can enumerate your audio devices:
import sounddevice as sd
print(sd.query_devices())
Only one detection session can run at a time. If you see this error, call:
POST http://localhost:8000/deepmeet/detector/end
to stop the active session before starting a new one.
This project is licensed under the Apache License 2.0.
See the LICENSE file for full details.
30 commits
Jupyter Notebook
47.3%
TypeScript
31.9%
Python
20.0%
DeepMeet Guard is a dual-purpose AI security research platform targeting one of the most critical emerging threats in remote hiring:
AI-powered audio fraud during live online interviews.
It simultaneously demonstrates how AI-driven audio spoofing attacks operate in real-time,
and deploys a multi-layer detection system to identify and report fraudulent audio to the interviewer.
๐ Setup Guide ยท ๐ Quick Start ยท ๐๏ธ Architecture ยท ๐ก API Reference ยท ๐ค Contributors
DeepMeet Guard is a graduation research platform engineered with two deeply integrated AI subsystems:
| Subsystem | Side | Description |
|---|---|---|
| ๐ญ Simulation Engine | Attacker | Demonstrates how an AI assistant autonomously responds to interview questions using a candidate-supplied knowledge base, generating synthetic voice output indistinguishable from a real human |
| ๐ก๏ธ Detection Engine | Defender | Analyzes incoming audio streams in real-time using a 4-layer ensemble model to determine whether the speaker's voice is AI-generated, flagging anomalies and reporting verdicts to the interviewer |
This dual-sided architecture makes DeepMeet Guard both a security research tool and a corporate fraud prevention platform.
The rapid commoditization of voice synthesis and large language models has made it trivially easy for bad actors to impersonate candidates in remote interviews. A technically sophisticated actor can now:
Existing interview platforms offer no protection against this attack vector.
DeepMeet Guard was built to:
REAL / AI-GENERATEDInterviewer speaks
โ
โผ
[STT Module โ Vosk]
Transcribes speech to text offline
โ
โผ
[LangChain + LangGraph Agent]
Retrieves relevant context from candidate's knowledge base
Generates a tailored answer via configured LLM provider
โ
โผ
[NeuTTS + eSpeak-NG Phonemizer]
Converts text to natural speech with phoneme-level control
โ
โผ
[Voice Cloning Module]
Applies candidate's reference voice to synthesized audio
โ
โผ
Fake audio streamed back to the interviewer
Audio stream captured from interviewee
โ
โผ
[Audio Capture โ sounddevice / soundcard]
Segments audio into configurable time periods
โ
โผ
[Parallel 4-Layer Detection]
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโ
โ Spectra0 โ ViT โ RawNet2 โ Behaviour/Live. โ
โ (w=0.42) โ (w=0.26) โ (w=0.172) โ (w=0.148) โ
โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโ
โ
โผ
[Weighted Ensemble Scorer]
Aggregates layer verdicts into final confidence score
โ
โผ
[Reporting Module]
Result + confidence delivered to interviewer dashboard per period
graph TD
subgraph CLIENT ["๐ Web Application (Next.js 16 / React 19)"]
UI[Candidate Interface\nSimulation Controls]
Dashboard[Interviewer Dashboard\nLive Detection Feed]
end
subgraph SERVER ["โ๏ธ FastAPI Backend (Python 3.11)"]
API[FastAPI Gateway\nUvicorn ASGI]
subgraph SIM ["๐ญ Simulation Engine"]
STT[Vosk STT\nOffline Speech-to-Text]
LLM[LangChain / LangGraph\nMulti-Provider LLM Agent]
KB[Knowledge Base\nDocument Store]
TTS[NeuTTS + eSpeak-NG\nNeural TTS Engine]
VC[Voice Cloning\nNeuCodec / Perth]
end
subgraph DET ["๐ก๏ธ Detection Engine (4-Layer Ensemble)"]
CAP[sounddevice / soundcard\nAudio Capture]
L1[Layer 1 โ Spectra0\nweight 0.42]
L2[Layer 2 โ ViT\nweight 0.26]
L3[Layer 3 โ RawNet2\nweight 0.172]
L4[Layer 4 โ Liveness\nweight 0.148]
SCORE[Weighted Ensemble\nVerdictScorer]
end
REPORT[Reporting Module\nPeriod-based JSON Reports]
end
UI -->|REST /deepmeet/simulator/*| API
Dashboard -->|REST /deepmeet/detector/*| API
API --> STT
STT --> LLM
LLM --> KB
LLM --> TTS
TTS --> VC
VC -->|Synthesized Audio Response| API
API --> CAP
CAP --> L1 & L2 & L3 & L4
L1 & L2 & L3 & L4 --> SCORE
SCORE --> REPORT
REPORT -->|Verdict + Confidence| Dashboard
DeepMeet-Gaurd/
โโโ LICENSE
โโโ README.md
โโโ src/
โโโ main.py # FastAPI application entry point
โโโ requirements.txt # Python dependencies
โโโ .env.example # Environment variable template
โ
โโโ assets/
โ โโโ simulator_assets/ # Candidate voice samples & knowledge base storage
โ โโโ detector_assets/ # Meeting session audio & detection reports
โ
โโโ client/ # Next.js 16 Frontend
โ โโโ app/ # App Router pages & layouts
โ โโโ components/ # Reusable React components (shadcn/ui + Radix UI)
โ โโโ hooks/ # Custom React hooks
โ โโโ lib/ # Utility functions & API client
โ โโโ styles/ # Global CSS styles
โ โโโ public/ # Static assets
โ โโโ package.json
โ โโโ tsconfig.json
โ โโโ next.config.mjs
โ
โโโ server/ # Python FastAPI Backend
โโโ app_defaults/ # Default reference audio & text for TTS
โโโ controllers/ # Request handling logic
โโโ helpers/ # Configuration loaders & shared utilities
โโโ infrastructure/ # Model files: STT (Vosk), liveness detection
โโโ models/
โ โโโ enums/ # Shared enumerations
โ โโโ interfaces/ # Abstract base classes
โ โโโ schemas/ # Pydantic request/response schemas
โโโ routers/ # FastAPI route definitions
โ โโโ health.py # GET /health
โ โโโ data.py # POST /deepmeet/simulator/data/*
โ โโโ setup.py # POST /deepmeet/simulator/setup/*
โ โโโ communication.py # POST /deepmeet/simulator/communication/*
โ โโโ detection.py # POST|GET /deepmeet/detector/*
โโโ services/
โ โโโ simulator.py # Simulator service singleton
โ โโโ detector.py # Detector service singleton
โโโ usecases/ # Business logic layer
โโโ utilities/ # Audio processing, session management helpers
โโโ views/ # Streamlit debug/monitoring views
The server is a Python 3.11 application built on FastAPI, orchestrating two specialized AI subsystems.
| Component | Technology | Role |
|---|---|---|
| STT | Vosk 0.3.45 + pyspellchecker | Offline speech-to-text transcription |
| LLM Orchestration | LangChain 1.0 + LangGraph 1.0 | Multi-agent pipeline with RAG over knowledge base |
| LLM Providers | OpenAI, Gemini, Claude, Cohere, Ollama | Configurable via LLM_PROVIDER env var |
| TTS | NeuCodec โฅ0.0.4 + eSpeak-NG + phonemizer 3.3 | Neural text-to-speech synthesis |
| Voice Cloning | resemble-perth 1.0.1 | Zero-shot voice profile application |
| Layer | Model | Weight | Technology |
|---|---|---|---|
| Layer 1 | Spectra0 | 0.42 | Custom spectrogram-based detector |
| Layer 2 | ViT | 0.26 | Vision Transformer on ConstantQ features |
| Layer 3 | RawNet2 | 0.172 | End-to-end raw waveform anti-spoofing |
| Layer 4 | Behaviour Liveness | 0.148 | XGBoost / sklearn behavioural liveness |
Additional libraries: Jabberjay 0.0.11, librosa 0.11, torchaudio โฅ2.11, ONNX Runtime 1.23, transformers, scikit-learn 1.8, xgboost
# main.py
app = FastAPI(title="DeepMeet Guard API", version="1.0.0")
# CORS origins
allow_origins = ["http://localhost:3000", "http://localhost:3001", "http://127.0.0.1:3000"]
The client is a Next.js 16 application written in TypeScript 5.7 with React 19, providing:
| Technology | Version | Purpose |
|---|---|---|
| Next.js | 16.2.0 | Full-stack React framework with App Router |
| React | 19.2.4 | UI component library |
| TypeScript | 5.7.3 | Type-safe frontend development |
| Tailwind CSS | 4.x | Utility-first styling |
| Radix UI | Various | Accessible headless component primitives |
| shadcn/ui | Latest | Pre-built accessible UI component system |
| React Three Fiber | ^9.5 | 3D rendering for visual effects |
| Three.js | ^0.183 | 3D graphics library |
| Recharts | 2.15 | Data visualization / detection charts |
| React Hook Form | ^7.54 | Form state management |
| Zod | ^3.24 | Schema validation |
| Lucide React | ^0.564 | Icon library |
| next-themes | ^0.4.6 | Dark/light mode support |
All endpoints are served by the FastAPI backend. Interactive Swagger docs are available at http://localhost:8000/docs when the server is running.
| Method | Endpoint | Description |
|---|---|---|
GET | /health | Server health check |
Prefix:
/deepmeet/simulator/data
| Method | Endpoint | Body | Description |
|---|---|---|---|
POST | /upload/info | JSON InterviewSetupRequest | Upload candidate user info and organization details. Returns user_id |
POST | /upload/references | Form: user_id, audio (file), reference_text (file) | Upload reference voice audio and knowledge base text file for voice cloning |
Prefix:
/deepmeet/simulator/setup
| Method | Endpoint | Params | Description |
|---|---|---|---|
POST | /impersonate | user_id (query) | Load user session and configure LLM agent with candidate's profile and knowledge base |
POST | /clone | user_id (query) | Load reference audio and text, apply voice cloning profile to TTS engine |
Prefix:
/deepmeet/simulator/communication
| Method | Endpoint | Params | Description |
|---|---|---|---|
POST | /start | user_id (query) | Start simulation loop in background thread: STT โ LLM โ TTS โ voice output |
POST | /end | user_id (query) | Gracefully stop the active simulation thread |
POST | /report | user_id (query) | Retrieve session transcript and interaction report |
Prefix:
/deepmeet/detector
| Method | Endpoint | Params | Description |
|---|---|---|---|
POST | /start | meeting_name (query) | Start continuous detection loop: captures audio in periods, runs 4-layer ensemble analysis |
POST | /end | โ | Stop the active detection thread gracefully |
GET | /report | meeting_name (query) | Retrieve the full period-by-period detection report for a completed meeting |
| Requirement | Version | Notes |
|---|---|---|
| Python | 3.11.x | Exact version required โ other versions may cause dependency conflicts |
| Node.js | 18+ | LTS recommended |
| npm | 9+ | Bundled with Node.js |
| Git | Latest | โ |
| eSpeak-NG | Latest | Required for TTS phonemization (Windows: via winget) |
| Google Account | โ | Required if using Ollama via Google Colab tunnel |
git clone https://github.com/3bdelmoemn/DeepMeet-Gaurd.git
cd DeepMeet-Gaurd/src
conda create -n dmg python=3.11
conda activate dmg
โ ๏ธ Windows only. Linux users:
sudo apt install espeak-ng
winget install -e --id eSpeak-NG.eSpeak-NG
Set required environment variables (run as Administrator):
setx PHONEMIZER_ESPEAK_LIBRARY "C:\Program Files\eSpeak NG\libespeak-ng.dll"
setx PHONEMIZER_ESPEAK_PATH "C:\Program Files\eSpeak NG"
Verify installation:
espeak-ng --version
Verify Python integration:
python -c "from phonemizer import phonemize; print(phonemize('hello world', language='en-us'))"
# Expected: h ษ l oส w ษห l d
๐ก Note: The repository already includes all required NeuTTS / NeuCodec-related files. Do not clone or download any additional TTS repositories.
Download the Vosk STT model from Google Drive:
๐ฅ Download STT Model โ vosk-model-en-us-0.22
After downloading:
src/server/infrastructure/stt/vosk-model-en-us-0.22/
The path must match
STT_MODEL_PATHin your.envfile.
cp .env.example .env
Open .env and fill in all required values. See Environment Variables for a complete reference.
If using LLM_MODE=local with Ollama tunneled via Colab:
src/server/notebooks/ollama_setup.ipynb to Google Colab.env as OLLAMA_BASE_URLpip install -r requirements.txt
โ All required packages are listed in
requirements.txt. Do not install additional packages manually.
Some models require a Hugging Face access token before they can be downloaded.
hf auth login
That's it โ the token will be stored locally and used automatically when downloading Hugging Face models.
cd src/client
npm install
cp .env.example .env.local
Set the backend API URL:
NEXT_PUBLIC_API_URL=http://localhost:8000
# From the src/ directory with venv activated
uvicorn main:app --reload --port 8000
| Endpoint | URL |
|---|---|
| API Base | http://localhost:8000 |
| Swagger UI | http://localhost:8000/docs |
| ReDoc | http://localhost:8000/redoc |
# From src/client/
npm run dev
| URL | Description |
|---|---|
http://localhost:3000 | Main web application |
cd src/client
npm run build
npm start
Copy src/.env.example to src/.env and fill in all values.
| Variable | Default / Example | Required | Description |
|---|---|---|---|
APP_NAME | "DeepMeet Guard" | โ๏ธ | Application display name |
APP_VERSION | "1.0.0" | โ๏ธ | Application version |
SIMULATOR_STORAGE_PATH | "assets/simulator_assets" | โ | Storage path for candidate voice & text files |
DETECTOR_STORAGE_PATH | "assets/detector_assets" | โ | Storage path for meeting audio & reports |
DETECTOR_MAX_DURATION | 15 | โ | Max seconds of audio captured per detection period |
DETECTOR_PERIOD_INTERVAL | 20 | โ | Seconds to wait between detection periods |
| Variable | Example | Required | Description |
|---|---|---|---|
LLM_MODE | "local" / "cloud" | โ | LLM execution mode |
LLM_PROVIDER | "gemini" | โ | Active LLM provider: openai, gemini, claude, cohere, ollama |
OPENAI_API_KEY | "sk-..." | โ๏ธ | OpenAI / OpenRouter API key |
CLAUDE_API_KEY | "..." | โ๏ธ | Anthropic Claude API key |
GEMINI_API_KEY | "..." | โ๏ธ | Google Gemini API key |
COHERE_API_KEY | "..." | โ๏ธ | Cohere API key |
OLLAMA_API_KEY | "dummy" | โ๏ธ | Ollama API key (can be any string for local) |
OLLAMA_BASE_URL | "https://your-ngrok-url/" | โ๏ธ | Ollama server URL (local or Colab tunnel) |
OPEN_AI_BASE_URL | "https://openrouter.ai/api/v1" | โ๏ธ | OpenAI-compatible base URL |
OPENAI_MODEL_ID | "openai/gpt-4.1" | โ๏ธ | OpenAI model identifier |
CLAUDE_MODEL_ID | "claude-3-5-haiku-20241022" | โ๏ธ | Claude model identifier |
GEMINI_MODEL_ID | "gemini-2.5-flash" | โ๏ธ | Gemini model identifier |
COHERE_MODEL_ID | "command-r-plus-08-2024" | โ๏ธ | Cohere model identifier |
OLLAMA_MODEL_ID | "interview-assistant:latest" | โ๏ธ | Ollama model identifier |
MAX_TOKENS | 1024 | โ๏ธ | LLM max output tokens |
TEMPERATURE | 0.1 | โ๏ธ | LLM sampling temperature |
CONTEXT_WINDOW | 8192 | โ๏ธ | LLM context window size |
MAX_INPUT_TOKENS | 6000 | โ๏ธ | Max tokens sent to LLM |
HISTORY_MESSAGES | 5 | โ๏ธ | Number of history messages to retain per session |
| Variable | Default | Required | Description |
|---|---|---|---|
TTS_BACKBONE | "NANO_Q8" | โ | NeuTTS backbone model variant |
TTS_CODEC | "DISTILL_NEU_CODEC" | โ | NeuCodec codec variant |
TTS_DEVICE | "cpu" | โ | TTS inference device (cpu / cuda) |
TTS_CODEC_DEVICE | "cpu" | โ | Codec inference device |
DEFAULT_REF_AUDIO_PATH | "server/app_defaults/..." | โ | Default reference audio for voice cloning |
DEFAULT_REF_TEXT_PATH | "server/app_defaults/..." | โ | Default reference text for TTS |
COOLDOWN_SECONDS | 1.2 | โ๏ธ | Cooldown between TTS synthesis cycles |
TTS_FRAMES_PER_BUFFER | 32768 | โ๏ธ | Audio buffer size |
| Variable | Default | Required | Description |
|---|---|---|---|
STT_MODEL_PATH | "server/infrastructure/stt/vosk-model-en-us-0.22" | โ | Path to downloaded Vosk STT model |
MIN_WORDS | 3 | โ๏ธ | Minimum word count to trigger LLM pipeline |
DEDUP_TTL | 30.0 | โ๏ธ | Seconds before a duplicate transcription is accepted |
| Variable | Default | Required | Description |
|---|---|---|---|
LAYER_ONE_WEIGHT | 0.42 | โ | Weight for Spectra0 layer in ensemble |
LAYER_TWO_WEIGHT | 0.26 | โ | Weight for ViT layer |
LAYER_THREE_WEIGHT | 0.172 | โ | Weight for RawNet2 layer |
LAYER_FOUR_WEIGHT | 0.148 | โ | Weight for Liveness layer |
LAYER_ONE_NAME | "Spectra0" | โ | Spectra0 model identifier |
LAYER_TWO_NAME | "VIT" | โ | ViT model identifier |
LAYER_THREE_NAME | "RawNet2" | โ | RawNet2 model identifier |
LAYER_FOUR_NAME | "liveness" | โ | Liveness model identifier |
VIT_DATASET_NAME | "VoxCelebSpoof" | โ | Dataset used to train the ViT model |
VIT_VISIUALIZATION | "ConstantQ" | โ | Feature type fed to ViT |
LAYER_FOUR__MODELPATH | "server/infrastructure/behaviour_liveness_detection_model" | โ | Path to liveness model files |
Refer to
.env.examplefor a fully annotated reference with inline documentation.
| Technology | Version | Purpose |
|---|---|---|
| Python | 3.11 | Core backend language |
| FastAPI | 0.118.3 | High-performance REST API framework |
| Uvicorn | 0.38.0 | ASGI server for FastAPI |
| Pydantic | 2.12.4 | Data validation and settings management |
| Vosk | 0.3.45 | Offline Speech-to-Text (STT) engine |
| pyspellchecker | 0.8.4 | Post-STT spelling correction |
| LangChain | 1.0.7 | LLM orchestration & RAG pipeline |
| LangGraph | 1.0.3 | Multi-agent AI workflow graph |
| langchain-openai | 1.0.3 | OpenAI / OpenRouter integration |
| langchain-google-genai | 3.1.0 | Google Gemini integration |
| langchain-anthropic | 1.1.0 | Anthropic Claude integration |
| langchain-cohere | 0.5.0 | Cohere integration |
| langchain-ollama | 1.0.1 | Ollama local LLM integration |
| NeuCodec | โฅ0.0.4 | Neural codec for TTS synthesis |
| eSpeak-NG | Latest | Text-to-phoneme conversion |
| phonemizer | 3.3.0 | Python wrapper for eSpeak-NG |
| resemble-perth | 1.0.1 | Zero-shot voice cloning |
| PyTorch | โฅ2.11 | Deep learning inference engine |
| torchaudio | โฅ2.11 | Audio processing with PyTorch |
| torchvision | โฅ0.22 | Vision model support |
| transformers | Latest | HuggingFace model hub integration |
| ONNX Runtime | 1.23.2 | Optimized model inference |
| Jabberjay | 0.0.11 | Fake audio detection utility |
| librosa | 0.11.0 | Audio feature extraction |
| scikit-learn | 1.8.0 | ML utilities for liveness detection |
| XGBoost | Latest | Gradient boosting for liveness model |
| sounddevice | 0.5.5 | Cross-platform audio I/O |
| soundcard | Latest | System audio capture |
| pydub | 0.25.1 | Audio format conversion |
| soundfile | 0.13.1 | Audio file I/O |
| pyaudio | 0.2.14 | PortAudio Python bindings |
| aiofiles | 25.1.0 | Async file I/O |
| httpx | 0.28.1 | Async HTTP client |
| aiohttp | 3.13.2 | Async HTTP networking |
| Streamlit | Latest | Debug/monitoring views |
| pytest | 9.0.2 | Testing framework |
| Technology | Version | Purpose |
|---|---|---|
| Next.js | 16.2.0 | Full-stack React framework (App Router) |
| React | 19.2.4 | UI component library |
| TypeScript | 5.7.3 | Type-safe frontend development |
| Tailwind CSS | 4.x | Utility-first CSS framework |
| Radix UI | Various | Accessible headless component primitives |
| shadcn/ui | Latest | Pre-built UI component system (built on Radix) |
| React Three Fiber | ^9.5 | Declarative 3D graphics for React |
| Three.js | ^0.183 | 3D WebGL rendering |
| Recharts | 2.15.0 | Chart library for detection data visualization |
| React Hook Form | ^7.54 | Performant form state management |
| Zod | ^3.24 | TypeScript-first schema validation |
| Lucide React | ^0.564 | Icon library |
| next-themes | ^0.4.6 | Dark/light mode theming |
| Embla Carousel | 8.6.0 | Touch-friendly carousel component |
| date-fns | 4.1.0 | Date utility library |
| Sonner | ^1.7 | Toast notification system |
| cmdk | 1.1.1 | Command palette component |
| Vaul | ^1.1.2 | Drawer component |
| Technology | Purpose |
|---|---|
| Google Colab | Cloud GPU hosting for Ollama LLM via ngrok tunnel |
| Vosk Model en-us-0.22 | Pre-trained offline English STT model |
| ViT on VoxCelebSpoof | Visual Transformer anti-spoofing on ConstantQ features |
| RawNet2 | End-to-end raw waveform audio anti-spoofing |
| Spectra0 | Spectrogram-based deepfake audio detector |
| Behaviour Liveness Detection | XGBoost/sklearn behavioural liveness model |
Ensure you have set the environment variables correctly after installing eSpeak-NG:
setx PHONEMIZER_ESPEAK_LIBRARY "C:\Program Files\eSpeak NG\libespeak-ng.dll"
setx PHONEMIZER_ESPEAK_PATH "C:\Program Files\eSpeak NG"
Restart your terminal after running setx so the new environment variables take effect.
Ensure the Vosk model is placed exactly at:
src/server/infrastructure/stt/vosk-model-en-us-0.22/
The folder must contain all extracted model files directly (not a nested sub-folder). Verify your .env:
STT_MODEL_PATH=server/infrastructure/stt/vosk-model-en-us-0.22
OLLAMA_BASE_URL in .env with the new ngrok URL8000NEXT_PUBLIC_API_URL in src/client/.env.local is set to http://localhost:8000localhost:3000, localhost:3001, and 127.0.0.1:3000 by defaultEnsure you are using Python 3.11 specifically. Other Python versions will cause dependency resolution failures.
python --version # Must output Python 3.11.x
If you have multiple Python versions installed, use:
py -3.11 -m venv venv
sounddevice and soundcard can enumerate your audio devices:
import sounddevice as sd
print(sd.query_devices())
Only one detection session can run at a time. If you see this error, call:
POST http://localhost:8000/deepmeet/detector/end
to stop the active session before starting a new one.
This project is licensed under the Apache License 2.0.
See the LICENSE file for full details.
30 commits
Jupyter Notebook
47.3%
TypeScript
31.9%
Python
20.0%