Spaces:
Sleeping
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 | |
| <div align="center"> | |
| # π€ SanketSetu | ΰͺΈΰͺΰͺΰ«ΰͺ€-ΰͺΈΰ«ΰͺ€ΰ« | |
| **Real-time Gujarati Sign Language Recognition System** | |
| [](https://sanket-setu.vercel.app) | |
| [](https://huggingface.co/spaces/devrajsinh2012/Sanket-Setu) | |
| [](#license) | |
| </div> | |
| --- | |
| ## π 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 | |
| ```bash | |
| git clone https://github.com/devrajsinh2012/Sanket-Setu.git | |
| cd Sanket-Setu | |
| ``` | |
| ### 2. Backend Setup | |
| ```bash | |
| cd backend | |
| pip install -r requirements.txt | |
| # Starts FastAPI server on http://localhost:8000 | |
| python -m app.main | |
| ``` | |
| ### 3. Frontend Setup | |
| ```bash | |
| cd frontend | |
| npm install | |
| # Starts Vite dev server on http://localhost:5173 | |
| npm run dev | |
| ``` | |
| ### 4. One-Command Start (Windows) | |
| ```powershell | |
| # From the repo root β starts both backend and frontend | |
| .\start.ps1 | |
| ``` | |
| --- | |
| ## π§ͺ Testing | |
| ```bash | |
| cd backend | |
| pytest tests/ -v | |
| ``` | |
| --- | |
| ## π³ Docker (Local) | |
| ```bash | |
| # 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](https://huggingface.co/spaces/devrajsinh2012/Sanket-Setu) using the **Docker SDK**. | |
| **Push to the Space:** | |
| ```bash | |
| # 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](https://vercel.com) 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. |