Japanese/Italian language learning app with AI conversation, speech recognition, and lesson-based practice.
- 🎙️ Speech-to-Text (OpenAI Whisper API)
- 🔊 Text-to-Speech (ElevenLabs)
- 📚 Lesson Mode — practice specific lessons with AI
- 🎯 Repeat After Me — pronunciation training with feedback
- 💬 AI Conversation — practice speaking naturally
Frontend (React + Vite) → Backend (Node/Express) → APIs (OpenAI, ElevenLabs)
↓ ↓
GitHub Pages Your Server
(Local + Tunnel / Cloud / VPS)
- Node.js 18+
- PostgreSQL database
- API keys: OpenAI, ElevenLabs
cd backend
cp .env.example .env.local
# Edit .env.local with your API keys
npm install
npm run devcd frontend
npm install
npm run devAutomatic via GitHub Actions on every push to main.
Expose your local backend through a secure public URL:
# Install cloudflared
# macOS: brew install cloudflare/cloudflare/cloudflared
# Linux: see https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/
# Login
cloudflared tunnel login
# Create and run tunnel
cloudflared tunnel create speech-practice
cloudflared tunnel route dns speech-practice api.yourdomain.com
cloudflared tunnel run speech-practice- Push repo to GitHub
- Connect platform to your repo
- Set environment variables
- Deploy
- Deploy to any VPS (DigitalOcean, AWS, etc.)
- Set up reverse proxy (nginx/Caddy) with SSL
- Configure environment variables
PORT=3001
DATABASE_URL=postgresql://user:pass@localhost:5432/speech_practice
ELEVENLABS_API_KEY=your_key
OPENAI_API_KEY=your_key
ACCESS_PASSWORD=secure_password_here
VITE_API_URL=https://your-backend-url.com
- Never commit
.env.localor.envfiles - Backend requires
X-Passwordheader for all API requests - API keys are server-side only
- Use strong password for
ACCESS_PASSWORD
cd backend
psql "$DATABASE_URL" -f src/db/schema.sqlPlace lesson JSON files in backend/src/data/lessons/
Format: see existing lesson files for structure.
MIT