Spaces:
Sleeping
title: Sanket Setu
emoji: π
colorFrom: blue
colorTo: purple
sdk: docker
sdk_version: 4.36.1
python_version: 3.1
app_file: app.py
pinned: false
license: mit
short_description: Gujarati Sign Language Translator using AI
π About
SanketSetu (Sanskrit: Sanket = gesture/sign, Setu = bridge) is a production-grade, real-time Gujarati Sign Language (GSL) recognition system. It bridges the communication gap between the hearing-impaired community and the broader public by translating hand gestures corresponding to 34 Gujarati consonants (ΰͺβΰͺΰ«ΰͺ) into text β all in real time, directly in the browser.
The system uses your device camera, processes hand landmarks locally via MediaPipe, and sends them over a WebSocket connection to a machine-learning backend that classifies the gesture using a 3-pipeline ensemble of models.
β¨ Features
- Real-time gesture detection β sub-100 ms end-to-end latency
- 3-pipeline ensemble inference β XGBoost β Autoencoder+LightGBM β CNN+SVM, invoked in order of confidence
- 34 Gujarati sign classes β complete consonant alphabet (ΰͺ, ΰͺ, ΰͺ β¦ ΰͺΰ«ΰͺ·, ΰͺΰ«ΰͺ)
- WebSocket streaming β live bidirectional communication between browser and backend
- MediaPipe hand tracking β 21 landmark coordinates extracted client-side (no raw video sent to server)
- Onboarding wizard β animated step-by-step guide for first-time users
- Calibration screen β transparent overlay keeps camera feed fully visible while detecting hand readiness
- Landmark canvas overlay β live 21-point skeleton drawn over the webcam feed
- Prediction HUD β displays recognised sign, confidence bar, latency, and prediction history
- Low-bandwidth mode β auto-throttles to 5 fps when latency is high
- Docker-ready backend β deployable on Hugging Face Spaces in one push
ποΈ System Architecture
Browser (React + TypeScript)
β
ββ MediaPipe Hands (WASM) β extracts 21 hand landmarks (63 floats) locally
ββ WebcamFeed + LandmarkCanvas
ββ Calibration / Onboarding UI
β
ββ WebSocket (wss://)
β
βΌ
FastAPI Backend (Python)
β
ββ Pipeline A β XGBoost (63 landmarks β 34 classes) β primary, fastest
β ββ if confidence < 0.70 β
ββ Pipeline B β Autoencoder (63β16) + LightGBM β secondary
β ββ if confidence < 0.60 β
ββ Pipeline C β ResNet50 CNN (128Γ128 image) + SVM β tertiary
ββ Ensemble weighted average β final prediction
π Project Structure
SanketSetu/
βββ backend/
β βββ app/
β β βββ main.py # FastAPI entry-point, WebSocket + REST
β β βββ config.py # Settings (thresholds, model paths, env vars)
β β βββ schemas.py # Pydantic request/response models
β β βββ inference/
β β β βββ pipeline_a.py # XGBoost inference (63 MediaPipe landmarks)
β β β βββ pipeline_b.py # Autoencoder encoder + LightGBM
β β β βββ pipeline_c.py # ResNet CNN + SVM (image-based)
β β β βββ ensemble.py # Confidence-weighted ensemble logic
β β βββ models/
β β βββ loader.py # Singleton model loader
β β βββ label_map.py # Index 0β33 β Gujarati character
β βββ tests/ # Pytest test suite
β βββ requirements.txt
β βββ requirements-dev.txt
β
βββ frontend/
β βββ src/
β β βββ App.tsx # App shell, stage machine (onboarding β calibration β running)
β β βββ components/
β β β βββ WebcamFeed.tsx # Webcam stream + canvas overlay
β β β βββ LandmarkCanvas.tsx # Draws 21-point hand skeleton
β β β βββ PredictionHUD.tsx # Live sign, confidence bar, latency, history
β β β βββ OnboardingGuide.tsx # Animated intro wizard
β β β βββ Calibration.tsx # Transparent hand-detection calibration card
β β βββ hooks/
β β β βββ useWebSocket.ts # WS connection, send/receive
β β β βββ useMediaPipe.ts # MediaPipe Hands JS integration
β β β βββ useWebcam.ts # Camera permissions + stream
β β βββ lib/
β β βββ landmarkUtils.ts # Landmark normalisation helpers
β βββ .env.production # VITE_WS_URL for Vercel build
β βββ vite.config.ts
β βββ package.json
β
βββ CNN_Autoencoder_LightGBM/ # Autoencoder + LightGBM model weights
βββ CNN_PreTrained/ # ResNet CNN + SVM model weights
βββ Mediapipe_XGBoost/ # XGBoost model weights
βββ Dockerfile # Multi-stage Docker build for HF Spaces
βββ start.ps1 # One-command local dev launcher (Windows)
π οΈ Tech Stack
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Vite, TailwindCSS, Framer Motion |
| Hand Tracking | MediaPipe Hands (browser WASM) |
| Real-time Comm. | WebSocket (native browser API) |
| Backend | FastAPI, Python 3.10+ |
| ML β Pipeline A | XGBoost (scikit-learn API) |
| ML β Pipeline B | Keras/TensorFlow Autoencoder + LightGBM |
| ML β Pipeline C | PyTorch ResNet50 CNN + scikit-learn SVM |
| Deployment | Hugging Face Spaces (Docker SDK) + Vercel |
π Getting Started
Prerequisites
- Python 3.10+
- Node.js 18+
- npm or yarn
1. Clone the repository
git clone https://github.com/devrajsinh2012/Sanket-Setu.git
cd Sanket-Setu
2. Backend Setup
cd backend
pip install -r requirements.txt
# Starts FastAPI server on http://localhost:8000
python -m app.main
3. Frontend Setup
cd frontend
npm install
# Starts Vite dev server on http://localhost:5173
npm run dev
4. One-Command Start (Windows)
# From the repo root β starts both backend and frontend
.\start.ps1
π§ͺ Testing
cd backend
pytest tests/ -v
π³ Docker (Local)
# Build the image
docker build -t sanketsetu .
# Run on port 7860 (matches HF Spaces)
docker run -p 7860:7860 sanketsetu
βοΈ Deployment
Backend β Hugging Face Spaces
The backend runs as a Hugging Face Space using the Docker SDK.
Push to the Space:
# From repo root
git push space main
HF Spaces automatically builds the Docker image and serves the container on port 7860.
Space Secrets (HF Space β Settings β Repository secrets):
| Secret | Example value |
|---|---|
CORS_ORIGINS |
https://sanket-setu.vercel.app,http://localhost:5173 |
PIPELINE_MODE |
ensemble |
CONFIDENCE_THRESHOLD |
0.70 |
Live URLs:
| Endpoint | URL |
|---|---|
| Health check | https://devrajsinh2012-sanket-setu.hf.space/health |
| WebSocket | wss://devrajsinh2012-sanket-setu.hf.space/ws/landmarks |
Frontend β Vercel
Connect the GitHub repository in the Vercel dashboard and add the Environment Variable:
| Variable | Value |
|---|---|
VITE_WS_URL |
wss://devrajsinh2012-sanket-setu.hf.space |
Vercel auto-deploys on every push to main.
π§ Environment Variables
| Variable | Scope | Default | Description |
|---|---|---|---|
VITE_WS_URL |
Frontend (build-time) | β | WebSocket URL of the backend |
CORS_ORIGINS |
Backend (runtime) | * |
Comma-separated allowed origins |
PIPELINE_MODE |
Backend (runtime) | ensemble |
ensemble / A / B / C |
CONFIDENCE_THRESHOLD |
Backend (runtime) | 0.70 |
Primary confidence cutoff |
SECONDARY_THRESHOLD |
Backend (runtime) | 0.60 |
Secondary confidence cutoff |
WEIGHTS_DIR |
Backend (runtime) | repo root | Override path to model weight files |
π€ Contributing
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. Please make sure to update tests as appropriate.
π₯ Team & Acknowledgements
This project was developed by:
| Name | Contribution |
|---|---|
| Devrajsinh Gohil | Full-stack development, ML integration, deployment |
| Jay Nasit | Machine learning models, dataset preparation, testing |
Guided by: Dr. Om Prakash Suthar
We express our sincere gratitude to Dr. Om Prakash Suthar for his invaluable guidance, encouragement, and technical insights throughout the development of SanketSetu. His mentorship was instrumental in shaping both the research direction and the system architecture of this project.
π License
Β© 2026 Devrajsinh Gohil & Jay Nasit. All Rights Reserved.