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.
- 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
- 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
Last activity Aug 23, 2026. Fit: adaptable 3, operable 1.
Editions
Free · Free open source
- Clone
git clone https://github.com/Huanshere/VideoLingo - Install
python setup_env.py - ImageContainer
VideoLingo hosted · Free closed source
- HostedOpen the hosted app
Adaptable: what is yours to change
Make it yours
Config only5 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.yamlcustom_terms.xlsxbatch/tasks_setting.xlsxcore/tts_backend/custom_tts.py- Prompt files
core/prompts.py- Accounts you need
- OpenRouter, 302.ai, or another OpenAI-compatible LLM APIAzure, OpenAI, Fish, or SiliconFlow (dubbing, optional)
Source
- github.com/Huanshere/VideoLingo
- Apache-2.0 license
- Last commit Aug 23, 2026
- 18,342 stars
Operable: what an agent can drive
Interface
ConfigConfig filespublished by the builderlocal
How an agent can drive an Operable Listing, in five levels: native (built for the agent as the primary interface), official (the Builder ships an agent interface), wrapped (a third party wraps the software's API), config (an agent can only drive it by editing files), gui (screen control only). An interface is official only when it is published by the same organization that ships the software. GUI-level Listings are allowed and sorted last.
Reach
Partial coverage. 7 of 10 jobs reachable through the stated interface.
| Job | Through the interface | Evidence |
|---|---|---|
| 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
- StreamlitWhisperXspaCyffmpeg
- Package manager
- uv
- Database
- none
- Hosting target
- localDocker (CUDA)Colab
- Built
- Unknown (recorded, never ranked)
Model stack
- Providers
- OpenRouter (default)302.aiany OpenAI-compatible APIOllamaAzure TTSOpenAI TTSFish TTSSiliconFlowEdge TTSGPT-SoVITS
- Models
- deepseek/deepseek-v4-flash (default)WhisperX large-v3
- Keys you need
api.key (config.yaml)- Prompts live in
core/prompts.py
Evidence and confidence
| Field | Where it was seen | Confidence |
|---|---|---|
| formFactor | README: streamlit run st.py on :8501 | 95% |
| executionModel | README: fixed pipeline; LLM does translation, WhisperX does ASR, TTS does dubbing | 90% |
| operability | No API; batch/ directory with tasks_setting.xlsx plus config.yaml is the only non-GUI path | 90% |
| effort | config.yaml at repo root with commented keys; core/prompts.py present; custom_tts.py named in README | 90% |
| editions | README license: Apache 2.0; README links 'Try VL Now' at videolingo.io with no price shown | 70% |
| active | GitHub pushedAt 2026-08-23 | – |
| reach | 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
- docs.videolingo.io sourcing:video-streaming:curated
- github.com/Huanshere/VideoLingo sourcing:video-streaming:curated