Real-time AI-powered communication coach that analyses spoken responses and delivers structured, actionable feedback.
Voice Analysis β’ AI Feedback β’ Interview Coaching β’ Production-Ready
β If you like this project, consider giving it a star!
Real-time voice recording β’ AI-powered feedback β’ Structured scoring β’ Sample answers β’ Communication coaching
Most people struggle with spoken communication β interviews, presentations, and everyday conversations β yet receive little to no structured feedback on how they actually sound. Traditional coaching is expensive, inaccessible, and not available in real time.
Orato AI is a production-grade, full-stack AI coaching platform. Users record their spoken responses, and the system instantly transcribes, analyzes, and returns structured coaching feedback β scoring clarity, confidence, fluency, and structure β powered by Google Gemini or OpenAI.
Key value: Real-time, structured, actionable coaching available to anyone with a browser.
| Feature | Description |
|---|---|
| π Real-time voice recording | Capture spoken responses using the MediaRecorder API with live waveform visualization |
| π§ AI-powered feedback | Coaching analysis via Google Gemini API or OpenAI (configurable) |
| π Structured scoring | Scores across Clarity, Confidence, Fluency, and Structure (0β100) |
| π£ Speech-to-text | Browser-native Web Speech API transcription with no third-party cost |
| π Text-to-speech playback | AI feedback narrated back via SpeechSynthesis API |
| π Session analytics | Track improvement over time with per-session history and trend charts |
| π Multilingual support | Full English and Hindi interface via built-in translation layer |
| β‘ Adaptive question generation | AI-generated questions tailored to role, difficulty, and session history |
| π‘ Secure backend proxy | API keys never exposed to the browser β all AI calls routed through the Express server |
| πΎ In-memory caching | Response caching and transcript deduplication to reduce API cost and latency |
| Intelligent fallback feedback when AI is unavailable β no broken states | |
| π Dark mode | Full dark/light theme support |
+------------------------------------------------------------+
| FRONTEND (React + Vite) |
| |
| [Home] -> [Setup] -> [VoicePractice] -> [AIFeedback] |
| MediaRecorder API Web Speech API (STT) |
| SpeechSynthesis API (TTS) Recharts (analytics) |
+-----------------------------+------------------------------+
|
POST /api/ai (transcript + prompt)
|
v
+------------------------------------------------------------+
| BACKEND (Node.js + Express) |
| |
| Rate Limiter -> Request Validator -> Cache Lookup |
| | |
| +-----------+-----------+ |
| v v |
| Google Gemini API OpenAI API |
| +-----------+-----------+ |
| v |
| Response Validator -> Cache Store -> JSON Response |
+-----------------------------+------------------------------+
|
Structured feedback JSON
|
v
+----------------+
| React UI |
| Score cards |
| Coaching |
| insights |
+----------------+
User speaks -> MediaRecorder captures audio
-> Web Speech API transcribes to text
-> Frontend sends transcript + prompt to backend
-> Backend checks cache (dedup + prompt cache)
-> Backend calls Gemini / OpenAI with schema prompt
-> Response validated, clamped, cached
-> Structured JSON returned to frontend
-> UI renders scores, strengths, improvements, sample answer
-> SpeechSynthesis reads feedback aloud (optional)
Frontend
| Technology | Version | Purpose |
|---|---|---|
| React | 18 | UI framework |
| Vite | 6 | Build tool & dev server |
| Tailwind CSS | 3 | Utility-first styling |
| Framer Motion | 11 | Animations |
| Recharts | 2 | Session analytics charts |
| React Router | 6 | Client-side routing |
| React Query | 5 | Server state management |
Backend
| Technology | Version | Purpose |
|---|---|---|
| Node.js | 18+ | Runtime |
| Express | 4 | HTTP server |
| express-rate-limit | 7 | API rate limiting |
| dotenv | 16 | Environment config |
| cors | 2 | Cross-origin policy |
AI & Browser APIs
| API | Purpose |
|---|---|
| Google Gemini API | Primary AI provider for feedback & question generation |
| OpenAI API | Optional secondary AI provider |
| Web Speech API (SpeechRecognition) | Browser-native speech-to-text |
| MediaRecorder API | Audio capture with waveform |
| SpeechSynthesis API | Text-to-speech feedback playback |
1. User selects a practice mode (Interview / Presentation / Casual)
|
2. AI generates an adaptive question based on role and difficulty
|
3. User records their spoken response via the microphone
|
4. Web Speech API transcribes the audio to text in real time
|
5. Transcript and coaching prompt are sent to the backend proxy
|
6. Backend checks the in-memory cache; on a miss, calls Gemini or OpenAI
|
7. AI returns structured JSON: scores, strengths, improvements, tip, sample answer
|
8. Frontend renders animated score cards, coaching insights, and a model answer
|
9. SpeechSynthesis reads the feedback aloud if enabled
|
10. Session is saved; analytics charts update with the new data point
Orato-AI/
βββ index.html
βββ vite.config.js
βββ tailwind.config.js
βββ package.json
β
βββ src/
β βββ main.jsx # App entry point
β βββ App.jsx # Route definitions
β βββ Layout.jsx # Shell layout
β β
β βββ pages/
β β βββ Home.jsx # Mode selection dashboard
β β βββ Intro.jsx # Onboarding / landing
β β βββ InterviewSetup.jsx # Configure interview parameters
β β βββ QuestionSetup.jsx # Custom question setup
β β βββ VoicePractice.jsx # Recording + STT interface
β β βββ AIFeedback.jsx # Feedback results & analytics
β β
β βββ components/
β β βββ VoiceWaveform.jsx # Live audio visualizer
β β βββ ScoreIndicator.jsx # Animated score ring
β β βββ SessionSummary.jsx # Per-session summary card
β β βββ ProgressSnapshot.jsx
β β βββ SettingsModal.jsx
β β βββ SettingsProvider.jsx
β β βββ ErrorBoundary.jsx
β β βββ translations.jsx # EN / HI strings
β β βββ ui/ # Radix UI + shadcn components
β β
β βββ api/
β β βββ apiClient.js # Fetch wrapper (frontend -> backend)
β β βββ aiService.js # AI endpoint helpers
β β βββ sessionAnalytics.js
β β
β βββ lib/
β β βββ AuthContext.jsx
β β βββ logger.js
β β βββ healthCheck.js
β β βββ utils.js
β β
β βββ utils/
β βββ index.js
β
βββ server/
βββ index.js # Express server -- AI proxy, cache, rate limit
βββ config.js # Centralised server config
βββ package.json
βββ .env.example # Environment variable template
- Node.js 18+
- A Google Gemini API key or an OpenAI API key
git clone https://github.com/amansethhh/Orato-AI.git
cd Orato-AInpm installcd server
npm install
cd ..cp server/.env.example server/.envOpen server/.env and add your API key:
# Choose your AI provider: auto | gemini | openai
AI_PROVIDER=auto
GEMINI_API_KEY=your_gemini_key_here
OPENAI_API_KEY=your_openai_key_here # optional
PORT=3001
FRONTEND_URL=http://localhost:5173
NODE_ENV=developmentNote: If neither key is provided, the server runs in mock mode and returns locally-generated coaching feedback β useful for UI development without an API key.
cd server
node index.jsExpected output:
======================================================
Orato AI - Backend Server
======================================================
[INFO] Server running on http://localhost:3001
[INFO] AI Provider: GEMINI
Open a new terminal from the project root:
npm run devThe app opens automatically at http://localhost:5173.
| Variable | Required | Default | Description |
|---|---|---|---|
GEMINI_API_KEY |
Yes* | β | Google Gemini API key |
OPENAI_API_KEY |
Yes* | β | OpenAI API key |
AI_PROVIDER |
No | auto |
Force a provider: auto, gemini, openai |
PORT |
No | 3001 |
Backend server port |
FRONTEND_URL |
No | http://localhost:5173 |
Allowed CORS origin |
NODE_ENV |
No | development |
development or production |
*At least one AI key is required for real feedback. Without either, the server runs in mock mode.
| Variable | Description |
|---|---|
VITE_API_URL |
Backend base URL (defaults to /api via Vite proxy) |
| Optimization | Implementation |
|---|---|
| Code splitting | Vite manualChunks separates React, UI libs, and charts into parallel-loaded bundles |
| Lazy loading | Route-level code splitting via React Router lazy imports |
| In-memory caching | Backend caches AI responses by prompt hash (TTL: configurable) |
| Transcript deduplication | Identical transcripts return cached results within a dedup window |
| Rate limiting | express-rate-limit prevents abuse and protects API quota |
| Request validation | Prompt and transcript length limits enforced server-side before any AI call |
| Exponential backoff | Automatic retry with backoff on AI rate-limit (429) responses |
| Graceful fallback | Context-aware locally-generated feedback ensures zero broken states |
| Timeout handling | Per-request AbortController timeout on all AI calls |
Returns server status, active AI provider, uptime, and cache size.
{
"status": "ok",
"provider": "gemini",
"uptime": 142,
"cacheSize": 3,
"timestamp": "2025-01-01T00:00:00.000Z"
}Analyze a spoken response and return structured coaching feedback.
Request body:
{
"prompt": "The user answered the interview question: 'Tell me about yourself'",
"transcript": "Hi, I'm a software engineer with 3 years of experience..."
}Response:
{
"feedback": "Your opening established context well. Consider adding a specific achievement to strengthen impact.",
"clarity": 78,
"confidence": 65,
"structure": 72,
"fluency": 80,
"strengths": ["Clear introduction", "Good pacing"],
"improvements": ["Add a quantifiable result", "Reduce filler words"],
"tip": "Use the STAR framework: Situation, Task, Action, Result.",
"sampleAnswer": "I'm a software engineer with 3 years of experience...",
"filler_word_count": 4,
"_provider": "gemini"
}Generate an adaptive practice question.
Request body:
{
"prompt": "Generate a behavioral interview question for a senior frontend engineer role, medium difficulty."
}Response:
{
"question": "Describe a situation where you had to refactor a large codebase under time pressure. How did you prioritize?"
}- Real-time streaming AI β Stream AI tokens to the UI for lower perceived latency
- User authentication β Persistent accounts with cross-device session history
- Cloud deployment β Docker + Railway / Render backend, Vercel frontend
- Whisper STT β Server-side transcription via OpenAI Whisper for higher accuracy
- Video analysis β Webcam-based posture and eye-contact scoring
- Interview simulation β Multi-turn conversational interview mode
- PDF export β Download session feedback reports (html2canvas + jsPDF already included)
- Team / recruiter dashboard β Share sessions and track candidate progress
Contributions are welcome. Please follow these steps:
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature-name - Make your changes and commit:
git commit -m "feat: add your feature" - Push to your fork:
git push origin feature/your-feature-name - Open a pull request against
main
Please keep pull requests focused and include a clear description of the change and its motivation.
This project is licensed under the MIT License.



