{
  "version": "2",
  "generatedAt": "2026-11-03T22:49:39.280Z",
  "listing": {
    "slug": "huanshere--videolingo",
    "name": "VideoLingo",
    "tagline": "Subtitle translation and dubbing pipeline driven by config.yaml, a prompts file, and a batch spreadsheet.",
    "shortTagline": "Subtitle translation and dubbing",
    "description": "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.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "video-streaming",
    "alternativeTo": [
      "Rask AI"
    ],
    "shape": "agent-workflow",
    "formFactor": "web-app",
    "executionModel": "hybrid",
    "provenance": "unknown",
    "codeStack": {
      "languages": [
        "Python"
      ],
      "frameworks": [
        "Streamlit",
        "WhisperX",
        "spaCy",
        "ffmpeg"
      ],
      "packageManager": "uv",
      "database": [],
      "hostingTarget": [
        "local",
        "Docker (CUDA)",
        "Colab"
      ]
    },
    "modelStack": {
      "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"
      ],
      "requiredKeys": [
        "api.key (config.yaml)"
      ],
      "promptLocations": [
        "core/prompts.py"
      ],
      "tools": []
    },
    "repos": [
      {
        "url": "https://github.com/Huanshere/VideoLingo",
        "owner": "Huanshere",
        "name": "VideoLingo",
        "license": "Apache-2.0",
        "stars": 18342,
        "lastCommit": "2026-08-23"
      }
    ],
    "interface": {
      "kind": "config",
      "url": "https://github.com/Huanshere/VideoLingo/tree/main/batch",
      "official": true,
      "hosted": "local"
    },
    "operability": "config",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Download a YouTube video",
        "reachable": true,
        "evidence": "config.yaml youtube and ytb_resolution keys; batch/tasks_setting.xlsx takes a URL or file"
      },
      {
        "job": "Word-level transcription with WhisperX",
        "reachable": true,
        "evidence": "config.yaml whisper block; core/_2_asr.py runs in batch"
      },
      {
        "job": "Split and translate subtitles",
        "reachable": true,
        "evidence": "config.yaml target_language, max_split_length, reflect_translate; core/prompts.py"
      },
      {
        "job": "Custom terminology",
        "reachable": true,
        "evidence": "custom_terms.xlsx at repo root; pause_before_translate key"
      },
      {
        "job": "Burn single-line subtitles into the video",
        "reachable": true,
        "evidence": "config.yaml burn_subtitles"
      },
      {
        "job": "Dub with a chosen TTS",
        "reachable": true,
        "evidence": "config.yaml tts_method and per-TTS blocks; core/_10_gen_audio.py through _12_dub_to_vid.py"
      },
      {
        "job": "Batch many videos",
        "reachable": true,
        "evidence": "batch/tasks_setting.xlsx and OneKeyBatch scripts"
      },
      {
        "job": "Pause, resume, or stop a running task",
        "reachable": false,
        "evidence": "README: task control is a Streamlit UI feature"
      },
      {
        "job": "Search the provider's model list",
        "reachable": false,
        "evidence": "README: model searchbox in the Streamlit UI"
      },
      {
        "job": "Dub multiple speakers separately",
        "reachable": false,
        "evidence": "README Current Limitations: not supported"
      }
    ],
    "editions": [
      {
        "name": "Free",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/Huanshere/VideoLingo"
          },
          {
            "kind": "installable",
            "url": "https://github.com/Huanshere/VideoLingo#installation",
            "command": "python setup_env.py"
          },
          {
            "kind": "container",
            "url": "https://github.com/Huanshere/VideoLingo/blob/main/docs/pages/docs/docker.en-US.md"
          }
        ]
      },
      {
        "name": "VideoLingo hosted",
        "price": null,
        "open": false,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://videolingo.io"
          }
        ]
      }
    ],
    "skills": {
      "kind": "none",
      "paths": [],
      "install": null,
      "note": "No SKILL.md, Claude Code plugin, or skills install target in the repo."
    },
    "customization": {
      "summary": "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.",
      "envVars": [],
      "configFiles": [
        "config.yaml",
        "custom_terms.xlsx",
        "batch/tasks_setting.xlsx",
        "core/tts_backend/custom_tts.py"
      ],
      "promptFiles": [
        "core/prompts.py"
      ],
      "effort": "config-only",
      "editCount": 5
    },
    "useWhen": [
      "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"
    ],
    "accounts": [
      "OpenRouter, 302.ai, or another OpenAI-compatible LLM API",
      "Azure, OpenAI, Fish, or SiliconFlow (dubbing, optional)"
    ],
    "active": true,
    "lastActivity": "2026-08-23",
    "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"
    ],
    "fit": {
      "adaptable": 3,
      "operable": 1
    },
    "evidence": {
      "formFactor": "README: streamlit run st.py on :8501",
      "executionModel": "README: fixed pipeline; LLM does translation, WhisperX does ASR, TTS does dubbing",
      "operability": "No API; batch/ directory with tasks_setting.xlsx plus config.yaml is the only non-GUI path",
      "effort": "config.yaml at repo root with commented keys; core/prompts.py present; custom_tts.py named in README",
      "editions": "README license: Apache 2.0; README links 'Try VL Now' at videolingo.io with no price shown",
      "active": "GitHub pushedAt 2026-08-23"
    },
    "confidence": {
      "formFactor": 0.95,
      "executionModel": 0.9,
      "operability": 0.9,
      "effort": 0.9,
      "reach": 0.85,
      "editions": 0.7
    },
    "openQuestions": [
      "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": [
      {
        "url": "https://docs.videolingo.io",
        "foundBy": "sourcing:video-streaming:curated"
      },
      {
        "url": "https://github.com/Huanshere/VideoLingo",
        "foundBy": "sourcing:video-streaming:curated"
      }
    ],
    "research": {
      "stage": "verified",
      "verdict": "approve",
      "reason": "Verified the repo tree: config.yaml (api, target_language, whisper, tts_method, burn_subtitles, subtitle limits), core/prompts.py, custom_terms.xlsx, batch/tasks_setting.xlsx and core/tts_backend/custom_tts.py all exist at the named paths and directly change output language, translation prompts, terminology and voice. This is business adaptation by editing named files.",
      "disputed": []
    },
    "url": "apps/huanshere--videolingo.html",
    "coverage": "partial",
    "paid": false,
    "source": "research/verified/huanshere--videolingo.json"
  }
}
