4 min read

Open-LLM-VTuber: Voice Chat With a Live2D AI Avatar (GitHub, Scanned)

Talk hands free with an AI through an animated Live2D character, fully offline if you want.

Open-LLM-VTuber logo
✅
Scan: safe. Nothing malicious. The thing to know is that its locked Python dependencies are old, including a PyTorch version with a known code-execution advisory, so keep it on your own machine. Scanned Oct 26, 2026; the full report is below.

Open-LLM-VTuber puts a talking, animated character in front of a language model. You speak, it transcribes you, the model answers, and a Live2D avatar says the reply aloud with matching expressions. You can interrupt it mid-sentence without headphones, let it see your camera or screen, and run it in a browser or as a desktop pet that floats above other windows.

Every stage is swappable: Ollama, LM Studio, vLLM or any OpenAI-compatible API for the model, plus Claude, Gemini, DeepSeek and others; sherpa-onnx, Faster-Whisper, FunASR and more for speech recognition; and a long list of text-to-speech engines from Edge TTS to CosyVoice. With local choices for all three it runs with no internet connection. A character is a prompt plus a Live2D model, and both can be replaced.

It is MIT-licensed, with about 14,400 stars, at v1.2.1. Expect some setup: it is a Python project installed with uv. The README says the team's attention has moved to a v2.0 rewrite that is still being planned, and the last commit when scanned was in May 2026.

Who it is for

Hobbyists who want a voice assistant with a face, VTubers experimenting with an AI co-host, and anyone who wants a private, offline voice chat with a local model.

Getting started

1. Clone it with its submodules (the --recursive flag is required)

git clone https://github.com/Open-LLM-VTuber/Open-LLM-VTuber --recursive

2. Install dependencies with uv and copy the default config

cd Open-LLM-VTuber && uv sync && cp config_templates/conf.default.yaml conf.yaml

3. Start the server, then open the address it prints in your browser

uv run run_server.py

Set your model in conf.yaml first; the docs use Ollama as the example. The microphone only works over https when you open the page from another device, such as your phone.

Safety scan

We cloned Open-LLM-VTuber/Open-LLM-VTuber at commit 992309c on Oct 26, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.

  • No secrets, no suspicious code patterns, no committed binaries, no install scripts and no bare-IP URLs across about 51,000 lines, most of them Python and JSON.
  • uv.lock carries 137 advisories, 6 critical, and these ship with the app: torch 2.2.2 (a torch.load code-execution bug), aiohttp 3.9.5, brotli, PyJWT and certifi among them. Most matter when the server faces untrusted traffic or loads untrusted model files, one more reason not to put it on the open internet.
  • requirements.txt and requirements-bilibili.txt (for the optional Bilibili live-stream client) repeat largely the same pins, which is why the three lockfiles report overlapping totals.
  • The outside hosts in the code are the model and voice APIs you can choose (OpenAI, Anthropic, Gemini, DeepSeek, Groq, ElevenLabs, Fish Audio and others) plus Hugging Face for model downloads. None is contacted unless you configure it.
  • 6 workflows, none using pull_request_target; none of the 8 third-party actions is pinned to a commit. CodeQL and a contributing guide are present; no security policy.

What the scanner counted

CheckResult
SecretsNone found.
Suspicious codeNone found.
Install-time codeNone: nothing runs at install beyond the package manager itself.
Committed binariesNone.
CI workflows6 workflows. None use pull_request_target. 8 of 8 third-party actions pinned to a tag rather than a commit.
Network hosts21 distinct hosts referenced from source; most often github.com, repo.anaconda.com, huggingface.co, open-llm-vtuber.github.io. No URLs to bare IP addresses.
Known vulnerabilities191 advisories across 330 pinned packages: 6 critical, 62 high, 75 moderate, 48 low. requirements-bilibili.txt: 36 packages, 77 advisories; requirements.txt: 308 packages, 135 advisories; uv.lock: 310 packages, 137 advisories.
Project hygieneHas CodeQL, licence file, contributing guide. Missing security policy, automated dependency updates.
OpenSSF ScorecardNot scored: the project is not in Scorecard's weekly index.

The raw findings

Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.

Worst known vulnerabilities (24 of 191)
AdvisorySeverityPackageSummary
GHSA-9v8h-qqgm-4m35criticalbrotli@1.1.0Brotli: Out-of-bounds write in the Brotli decoder ("Node2Shell") also affects the PyPI Brotli package
GHSA-53q9-r3pm-6pq6criticaltorch@2.2.2PyTorch: `torch.load` with `weights_only=True` leads to remote code execution
CVE-2024-48063criticaltorch@2.2.2
GHSA-82r6-8w77-94w6criticalanyio@4.12.1AnyIO: TLSStream IDNA 2003 host name encoding enables potential TLS certificate spoofing
GHSA-6q48-6c7w-9gw2criticalcertifi@2026.1.4certifi bundles emSign root CAs with compromised intermediate CA keys
GHSA-ffc3-869f-jxw9criticalpyjwt@2.10.1PyJWT: Asymmetric-PEM detection bypass: whitespace/line-ending-mutated public keys skip the HS/asymmetric confusion guar…
GHSA-2g87-pp6c-29x5highaiohttp@3.9.5aiohttp: Multiple instances of excessive or unbounded memory/CPU use
GHSA-5wr8-gcqf-gqf3highaiohttp@3.9.5aiohttp server lacks an initial request/header timeout
GHSA-6mq8-rvhq-8wgghighaiohttp@3.9.5AIOHTTP's HTTP Parser auto_decompress feature is vulnerable to zip bomb
GHSA-9xw5-w5jj-pvcghighaiohttp@3.9.5AIOHTTP: File descriptor exhaustion in multipart requests
GHSA-cq5v-8q36-5273highaiohttp@3.9.5AIOHTTP: Out-of-bounds heap read in C HTTP response parser error path (malformed chunked response)
GHSA-2qfp-q593-8484highbrotli@1.1.0Scrapy is vulnerable to a denial of service (DoS) attack due to flaws in brotli decompression implementation
GHSA-9h52-p55h-vw2fhighmcp@1.15.0Model Context Protocol (MCP) Python SDK does not enable DNS rebinding protection by default
GHSA-jpw9-pfvf-9f58highmcp@1.15.0MCP Python SDK: HTTP transports serve session requests without verifying the authenticated principal
GHSA-vj7q-gjh5-988whighmcp@1.15.0MCP Python SDK: WebSocket server transport does not support Host/Origin validation
CVE-2025-55551hightorch@2.2.2
CVE-2025-55552hightorch@2.2.2
CVE-2025-55553hightorch@2.2.2
CVE-2025-55557hightorch@2.2.2
CVE-2025-55558hightorch@2.2.2
CVE-2025-55560hightorch@2.2.2
CVE-2026-4538hightorch@2.2.2
GHSA-63cw-57p8-fm3phightorch@2.2.2
CVE-2025-55551hightorch@2.8.0

By the numbers

Stars14.4K
Forks1,732
Contributors29
Commits913
Open issues111
Open pull requests49
Releases19
Latest releasev1.2.1
Licencecustom
Main languagePython
Project age2 years
Last pushMay 15, 2026
Tracked files253
Lines of code51.5K
Checkout size24 MB

Lines by language: JSON 29.1K, Python 17.6K, Markdown 2,088, YAML 2,069, JavaScript 530, HTML 143.

Questions

Is Open-LLM-VTuber free?

Yes. The code is MIT-licensed. The Live2D sample models bundled with it are under Live2D Inc.'s own free material licence, which adds conditions for commercial use by larger companies, so swap in your own model if you plan to use it commercially.

Can it run completely offline?

Yes, if you pick local options for all three parts: a model through Ollama, LM Studio or similar, local speech recognition such as sherpa-onnx or Faster-Whisper, and a local voice. Cloud APIs are optional for any part your hardware struggles with.

Does it need a GPU?

No, but it helps. It runs on CPU, supports NVIDIA and other GPUs, and some components accelerate on macOS. Speech recognition and the language model are the heavy parts, so a slow machine can hand those to a cloud API instead.


This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.