Learn Language Thru Movie is a hackathon MVP for turning uploaded videos into mixed-language lessons.
The app lets a learner upload a short video, transcribe it, mix a small number of target-language words into the transcript, generate new audio, play the lesson, quiz the learner, and save vocabulary progress.
The real video pipeline needs two external API keys:
ELEVENLABS_API_KEY: used byyarick/lltm-tapifor speech-to-text, voice cloning, and text-to-speech.FEATHERLESS_API_KEY: used byAndrii/LLMfor word translation and context-aware language mixing.
Do not commit real API keys. The repo already ignores .env files in
.gitignore, and yarick/lltm-tapi/.env.example is the safe template to commit.
Create this file:
yarick/lltm-tapi/.env
Add your real keys:
ELEVENLABS_API_KEY=your_elevenlabs_key_here
FEATHERLESS_API_KEY=your_featherless_key_here
# Optional on Melissa's Mac if Python packages are installed in Anaconda:
PYTHON_BIN=/opt/anaconda3/bin/python3
# Optional: reuse an existing ElevenLabs voice instead of cloning a new one.
# This helps avoid custom voice limits.
# ELEVENLABS_VOICE_ID=your_existing_voice_id_hereKeep yarick/lltm-tapi/.env.example without real values:
ELEVENLABS_API_KEY=
FEATHERLESS_API_KEY=Cloud Run does not read your local .env file. Add keys as Cloud Run
environment variables:
gcloud run services update lltm \
--region us-central1 \
--update-env-vars ELEVENLABS_API_KEY=your_elevenlabs_key_here,FEATHERLESS_API_KEY=your_featherless_key_hereThe app also needs these production environment variables:
gcloud run services update lltm \
--region us-central1 \
--update-env-vars GCS_BUCKET=lltm-493102-videos,USE_FIRESTORE=true,PYTHON_BIN=/opt/venv/bin/python3,REAL_PIPELINE_TIMEOUT_MS=1800000Use ELEVENLABS_VOICE_ID in production if you want to reuse one voice and avoid
creating temporary cloned voices:
gcloud run services update lltm \
--region us-central1 \
--update-env-vars ELEVENLABS_VOICE_ID=your_existing_voice_id_hereTo check what Cloud Run currently has configured:
gcloud run services describe lltm \
--region us-central1 \
--format="yaml(spec.template.spec.containers[0].env)"npm install
npm install --prefix yarick/lltm-tapi
python3 -m pip install -r Andrii/LLM/requirements.txt
python3 -m spacy download en_core_web_sm
npm run devThe React app runs on http://localhost:5173 and the API runs on http://localhost:5174.
For the real pipeline locally, upload a video through the website after adding
yarick/lltm-tapi/.env. You can also test the pipeline directly:
cd yarick/lltm-tapi
npm start -- videos/pawpatrol.mp4 es en 15The CLI arguments are:
npm start -- <video_path> <target_language_code> <source_language_code> <word_target>
Examples:
npm start -- videos/pawpatrol.mp4 uk en 15
npm start -- videos/pawpatrol.mp4 de en 15
npm start -- videos/spanish-video.mp4 en es 10npm run build
npm startThe Express server serves both the API and the built React app.
cd ~/LLTM
git pull origin main
gcloud run deploy lltm \
--source . \
--region us-central1 \
--allow-unauthenticatedRecommended Cloud Run resources for the real video pipeline:
gcloud run services update lltm \
--region us-central1 \
--memory=4Gi \
--cpu=2 \
--timeout=1800 \
--concurrency=1- Firestore stores the demo user's preferences, saved lessons, quiz results, and per-word progress.
- Google Cloud Storage stores uploaded source videos and generated lesson videos.
- Local development uses
server/data/db.jsonunless you explicitly setUSE_FIRESTORE=true.
Current production values:
Project: lltm-493102
Region: us-central1
Cloud Run service: lltm
GCS bucket: lltm-493102-videos
Public URL: https://lltm-914367008814.us-central1.run.app
The website currently exposes:
- English
- Spanish
- Ukrainian
- German
The real pipeline passes language codes to the transcription, translation, and speech steps:
english -> en
spanish -> es
ukrainian -> uk
german -> de
The selector is strongest for English source text because the current POS analysis uses the English spaCy model. Other source languages are wired through for the hackathon demo but may need language-specific selector tuning later.