# VideoLingo

Subtitle translation and dubbing pipeline driven by config.yaml, a prompts file, and a batch spreadsheet.

A Streamlit app and batch runner that downloads a video, transcribes with WhisperX, splits and translates subtitles in three LLM passes, burns single-line subtitles, and optionally dubs with GPT-SoVITS, Azure, Fish, Edge, or OpenAI TTS. Every behavior is a key in config.yaml or a prompt in core/prompts.py.

Alternative to: Rask AI

- Capabilities: adaptable, operable
- Vertical: video-streaming
- Shape: agent-workflow
- Form factor: web-app
- Execution model: hybrid
- Provenance: unknown (recorded, never ranked)
- Repo: https://github.com/Huanshere/VideoLingo (Apache-2.0), 18342 stars, last commit 2026-08-23
- Last activity: 2026-08-23
- Page: apps/huanshere--videolingo.html
- JSON: apps/huanshere--videolingo.json

## Use it when

- I publish tutorials in one language and want translated, single-line subtitles and a dub for another market
- I have a folder of lecture videos to localise overnight from a spreadsheet, on my own GPU

## Gotchas

- Weaker LLMs break the strict JSON steps; delete output/ before retrying
- Multilingual audio keeps only the main language; loud music needs the Demucs separation option
- GPU path needs CUDA 12.6 and cuDNN on Windows; Docker needs CUDA 12.4 and driver > 550
- No API or MCP; an agent drives it by writing config.yaml and the batch spreadsheet, then running the batch script

## Editions

- Free: Free, open source
  - source: https://github.com/Huanshere/VideoLingo
  - installable: python setup_env.py
  - container: https://github.com/Huanshere/VideoLingo/blob/main/docs/pages/docs/docker.en-US.md
- VideoLingo hosted: Free, closed source
  - hosted: https://videolingo.io

## Adaptable: make it yours

Effort: config-only (5 things to edit)

Edit config.yaml: api.key, api.base_url, api.model, target_language, whisper, tts_method, burn_subtitles, and the starred advanced keys. Rewrite the translation and summarisation prompts in core/prompts.py. Add terms to custom_terms.xlsx. Write your own TTS in core/tts_backend/custom_tts.py. Batch runs read batch/tasks_setting.xlsx.

- Env vars: none
- Config files: config.yaml, custom_terms.xlsx, batch/tasks_setting.xlsx, core/tts_backend/custom_tts.py
- Prompt files: core/prompts.py
- Accounts you'll need: OpenRouter, 302.ai, or another OpenAI-compatible LLM API; Azure, OpenAI, Fish, or SiliconFlow (dubbing, optional)

## Operable: what an agent can drive

Operability: config. Interface: config at https://github.com/Huanshere/VideoLingo/tree/main/batch (published by the builder, local).

### Reach (partial coverage)

- Download a YouTube video: reachable. config.yaml youtube and ytb_resolution keys; batch/tasks_setting.xlsx takes a URL or file
- Word-level transcription with WhisperX: reachable. config.yaml whisper block; core/_2_asr.py runs in batch
- Split and translate subtitles: reachable. config.yaml target_language, max_split_length, reflect_translate; core/prompts.py
- Custom terminology: reachable. custom_terms.xlsx at repo root; pause_before_translate key
- Burn single-line subtitles into the video: reachable. config.yaml burn_subtitles
- Dub with a chosen TTS: reachable. config.yaml tts_method and per-TTS blocks; core/_10_gen_audio.py through _12_dub_to_vid.py
- Batch many videos: reachable. batch/tasks_setting.xlsx and OneKeyBatch scripts
- Pause, resume, or stop a running task: not reachable. README: task control is a Streamlit UI feature
- Search the provider's model list: not reachable. README: model searchbox in the Streamlit UI
- Dub multiple speakers separately: not reachable. README Current Limitations: not supported

## Code stack

- Languages: Python
- Frameworks: Streamlit, WhisperX, spaCy, ffmpeg
- Package manager: uv
- Database: none
- Hosting target: local, Docker (CUDA), Colab

## Model stack

- Providers: OpenRouter (default), 302.ai, any OpenAI-compatible API, Ollama, Azure TTS, OpenAI TTS, Fish TTS, SiliconFlow, Edge TTS, GPT-SoVITS
- Models: deepseek/deepseek-v4-flash (default), WhisperX large-v3
- Keys you need (names only): api.key (config.yaml)
- Prompts live in: core/prompts.py
- Tools: none

## Evidence and confidence

- formFactor: README: streamlit run st.py on :8501 (confidence 0.95)
- executionModel: README: fixed pipeline; LLM does translation, WhisperX does ASR, TTS does dubbing (confidence 0.9)
- operability: No API; batch/ directory with tasks_setting.xlsx plus config.yaml is the only non-GUI path (confidence 0.9)
- effort: config.yaml at repo root with commented keys; core/prompts.py present; custom_tts.py named in README (confidence 0.9)
- editions: README license: Apache 2.0; README links 'Try VL Now' at videolingo.io with no price shown (confidence 0.7)
- active: GitHub pushedAt 2026-08-23
- reach:  (confidence 0.85)

## Open questions

- videolingo.io hosted edition pricing; docs.videolingo.io returned 404 to the fetcher
- Whether batch mode honours every config.yaml key or only a subset listed in batch/README.md

## Sources

- https://docs.videolingo.io (sourcing:video-streaming:curated)
- https://github.com/Huanshere/VideoLingo (sourcing:video-streaming:curated)
