Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,549 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PuriPuly <3

PuriPuly <3

Version License: AGPL-3.0-or-later Python Platform

LLM-based two-way translator for VRChat


Demo

Comparison of translation results between PuriPuly (Deepgram + Gemini 3 Flash) and VRCT (Google Web Speech + Google Translate). PuriPuly STT: "아역시혼자기대하면안된다니깐", Translation: "(See, I knew I shouldn't have gotten my hopes up.)" | VRCT STT: "아 역시 혼자 기대하면 안 된다니까", Translation: "Oh, I guess you shouldn't expect it alone."


pph_clip_1_github.mp4

If you want to see more of actual communication with other foreign friends through PuriPuly:


Finally, talk like real friends.

You've been there.
Wanting to comfort a friend,
but only managing: "Are you okay?"

You already know a 'translator'
can't carry what's truly in your heart.

So I built one that can.

  • LLM-Powered Localization — Slang, colloquialisms, and casual/formal speech, all rendered naturally.
  • Context Memory — Keeps the conversation flowing naturally with awareness of prior context.
  • Two-way Voice Translation — Translates the other person's voice too, with VR subtitle overlay support.
  • Start via Discord — Get going right away without a complex setup process.

Q&A

  • How good is the translation quality? → When both you and the other person use this translator, you can have even the deepest kinds of conversations. Quantitatively, with Gemma 4 it scored 6× better than DeepL. See the 'Translation Comparison' section below for details.

  • How long does it take from speaking to getting a translation? → With Gemma 4 and a cloud STT service, latency is typically in the mid-to-late 1-second range.

  • Does it cost money to use? → Yes, but only later. New users get a free usage allowance, and even after that the pricing is very cheap; you can use it thousands of times for $1.

  • Do I need to get an API key? → Yes, but again, only later. At first, just install and authenticate via Discord to start using it.

  • How polished is the feature for translating the other person's voice? → It works best for one-on-one conversations in low-noise environments. Up to three people may be okay, but usability is not guaranteed. When using it in VRChat, use Earmuff to control the environment.

  • Voice recognition is poor / slow. → If you're using local Qwen ASR, we recommend switching to a cloud STT service. If you're on Intel, configure PuriPuly so it's pinned to P-cores only.

  • How are voice and conversation contents handled? → Voice and conversation contents are stored locally and are not sent to Puripuly servers. Other people's voices, transcripts, and translation results are never recorded. That said, the STT service and translation provider may process the data.


Translation Comparison

Translation quality benchmark chart. It shows the mean error penalty per sentence (lower is better) evaluated using the Gemba MQM framework (judge model: Gemini 3.1 Pro Preview) on 216 multi-turn Korean to EN, JA, and ZH-Hans samples. Scores: Gemini 3.1 Flash-lite 0.573, Gemini 3 Flash 0.596, Gemma 4 26B A4B 0.813, Qwen 3.5 Plus 0.958, DeepSeek V4 Flash 1.025, Gemma 4 26B A4B (no-context) 1.265, DeepSeek V4 Flash (no-context) 1.647, Qwen 3.5 Flash 2.198, DeepL 4.963, DeepL (no-context) 5.717, Google Translation Basic 5.998.

  • We ran the experiment using Microsoft's Gemba MQM framework.
  • It was set up as a multi-turn environment to better resemble real conversation.
  • For the full results, see here.

Cost

Uses per Dollar

Recommended Models

LLM \ ASR Qwen ASR (Local) Qwen ASR (Cloud) Soniox Deepgram
Gemma 4 26B A4B + 31B 14,380 2,920 3,710 1,180
DeepSeek V4 Flash 19,410 3,080 3,980 1,210

Other Models

LLM \ ASR Qwen ASR (Local) Qwen ASR (Cloud) Soniox Deepgram
Gemma 4 26B A4B 14,380 2,920 3,710 1,180
Gemma 4 31B (OpenRouter) 13,700 2,780 3,530 1,120
Gemma 4 31B (Cerebras) 920 730 770 540
Gemini 3 Flash 1,710 1,170 1,280 740
Gemini 3.1 Flash-Lite 3,430 1,770 2,030 940
Qwen 3.5 Plus 7,460 2,460
Local LLMs Unlimited 3,660 5,000 1,290

Cost per Utterance

Recommended Models

LLM \ ASR Qwen ASR (Local) Qwen ASR (Cloud) Soniox Deepgram
Gemma 4 26B A4B + 31B ~$0.00007 ~$0.0003 ~$0.0003 ~$0.0008
DeepSeek V4 Flash ~$0.00005 ~$0.0003 ~$0.0003 ~$0.0008

Other Models

LLM \ ASR Qwen ASR (Local) Qwen ASR (Cloud) Soniox Deepgram
Gemma 4 26B A4B ~$0.00007 ~$0.0003 ~$0.0003 ~$0.0008
Gemma 4 31B (OpenRouter) ~$0.00007 ~$0.0003 ~$0.0003 ~$0.0009
Gemma 4 31B (Cerebras) ~$0.0011 ~$0.0014 ~$0.0013 ~$0.0019
Gemini 3 Flash ~$0.0006 ~$0.0009 ~$0.0008 ~$0.0014
Gemini 3.1 Flash-Lite ~$0.0003 ~$0.0006 ~$0.0005 ~$0.0011
Qwen 3.5 Plus ~$0.0001 ~$0.0004
Local LLMs $0 ~$0.0003 ~$0.0002 ~$0.0008
  • Based on (Input 900 tokens + Output 12 tokens) × 1.2 avg LLM calls per utterance.
  • Uses per Dollar is derived from the un-rounded values in the Cost per Utterance table.
  • All costs and usage counts are approximate.
  • DeepSeek assumes a 70% cache hit rate.
  • Qwen API costs are based on the Beijing region.
  • Pricing as of May 25, 2026 / Fast Response mode active.

Free Credits

Service Free Credit Duration Note
Deepgram $200 None -
Google AI Studio $10 1 year Monthly for Gemini subscribers
Alibaba Cloud 1M tokens per model 90 days Singapore region
Alibaba Cloud ¥300 1 year Students in China
Cerebras 1M tokens daily None 5 calls per minute limit

If you run into problems or anything feels unclear, feel free to DM me on Twitter/X.

Usage

  1. Download the latest version from the Download page.

  2. Install PuriPuly.

  3. Click the TALK button.

  4. Click the TRANS button, then authenticate via Discord.

  5. Click the CAPTIONS button to turn on VR subtitles.

  6. (Optional) Click the LISTEN button to enable translation of the other person's voice.

    Peer voice translation needs a low-noise space to work properly. When using it in VRChat, use Earmuff to control the environment.

  7. Enable OSC in VRChat: Action menu → Settings → OSC → Enable.

For bidirectional control setup and the stable parameter ABI, see VRChat OSC controls.

If audio capture does not work

If audio capture does not work, open Settings > General and follow these steps.

  1. Change Audio Host API to Auto or MME.
  2. Select the correct microphone.
  3. Restart the app.

Note for Users in China

If Soniox/Gemini/Deepgram are blocked in your region, please use the following combination:

  • STT: Qwen ASR

  • LLM: DeepSeek V4 Flash

    You can authenticate through QQ instead of Discord.


Using Your Own API Keys

Follow the guide that matches the service you want to use.

For the translation LLM, we recommend using the Gemma 4 model through OpenRouter.

By the way, while you're setting things up, why not configure ASR too? PuriPuly delivers the best experience when paired with a cloud STT. For instance, even with the same Qwen ASR, local and cloud voice-recognition performance differ noticeably.

We recommend starting with Deepgram. Just signing up gets you $200 in free credits.

OpenRouter

  1. Set the options inside the red circle as shown in the screenshot. step0

  2. In the app, click the button inside the red circle. step1

  3. Login at OpenRouter. step2

  4. Click the button inside the red circle to exit the payment screen. step3

  5. Click the Authorize button. step4

  6. Prepay as much as you plan to use. step5

If clicking Authorize didn't authenticate you

If you clicked Authorize but you're still not authenticated, retry, or directly issue an API key as below and paste it in.

  1. Click your account in the top right, go to the API Keys tab on the left, then click the Create button in the center. step6

  2. Click the Create button. step7

  3. Click the button to copy the API key, then paste it into the API tab of the translator. step8

DeepSeek

  1. Set the options inside the red circle as shown in the screenshot. step0

  2. Go to the DeepSeek official homepage and click the Access API button. step1

  3. Login on the homepage. step2

  4. Go to the API Keys tab and click Create new API Keys. step3

  5. Click the button to copy the API key, then paste it into the API tab of the translator. step4

  6. Go to the Top Up tab and prepay as much as you plan to use. step5

Deepgram

  1. Login to the Deepgram Console. step1

  2. If you see a welcome message/survey, click Skip. step2

  3. Select STT (Speech-to-Text) on the service selection screen. step3

  4. In the API Keys menu, click Create a New API Key. step4

  5. Enter a key name (e.g., puripuly) and create. step5

  6. Copy the generated key and paste it into PuriPuly settings. step6

Gemini

  1. Go to Google AI Studio and click the Get API key button. step1

  2. Create a new project. step2

  3. Choose any name for the project. step3

  4. Select the project you created and click Create key. step4

  5. Click the circled area. step5

  6. Click the circled area to copy the key. step6

  7. (Recommended) Click the yellow Set Up Billing button to upgrade to the paid tier. The tier transition may take a moment. step7

For Gemini paid subscribers

  1. Go to Google Developer Program and join the program. step8

  2. Select the paid tier project you set up in step 7. step9

Qwen

  1. Access Alibaba Cloud Model Studio via the appropriate path for your region:

  2. Login at the URL above. Make sure to select the correct Region for your API key (e.g., Beijing). step2

  3. Click the gear icon in the top right. step3

  4. Create a workspace and go to the API-KEY page. step4

  5. Click Create API Key. step5

  6. Assign an account and workspace, then click OK. step6

  7. Click the circled area to copy the key. step7

Soniox

  1. Login to Soniox Console. step1

  2. Enter an organization name of your choice. step2

  3. Click Add Funds to link a payment method. step3

  4. Soniox requires prepaid credits. Once added, go to the API Keys menu. step4

  5. Create a new API Key. step5

  6. Copy the generated key and paste it into PuriPuly settings. step6

Cerebras

  1. Go to Cerebras and click Get started. step1

  2. Log in. step2

  3. Choose the plan you want. We recommend starting with the free tier. step3

  4. Copy the API key and paste it into PuriPuly. step4

To switch to the paid tier

  1. Go to the Billing tab. step5

  2. Enter your name. step6

  3. Add as much credit as you need. step7


Architecture

See ARCHITECTURE.md.

Roadmap

Upcoming work is tracked publicly on the PuriPuly project board.


Development

Environments

Surface Recommended environment Documentation
Python desktop application Windows This section
Broker service Linux broker/README.md
Native VR overlay Windows native/overlay/README.md

Python Environment

The Python application requires Python 3.12 or 3.13.

Create and activate the Windows environment:

python -m venv .venv
.venv\Scripts\Activate.ps1

Install the application and development dependencies:

python -m pip install --upgrade pip
pip install -e ".[dev]"

uv may be used instead:

uv sync --dev

Install the repository hooks:

pre-commit install

For Linux or WSL work, use .venv-wsl when it is available.

UV_PROJECT_ENVIRONMENT=.venv-wsl uv sync --dev

Repositories configured with direnv may run commands through:

direnv exec . <command>

Running the Application

Run the Flet desktop application:

python -m puripuly_heart.main run-gui

The equivalent uv command is:

uv run python -m puripuly_heart.main run-gui

Developer preview controls for hidden UI states are enabled with:

python -m puripuly_heart.main run-gui --debug-ui-preview

Python Verification

Format the Python sources and tests:

black src tests

Check formatting without modifying files:

black --check src tests

Run lint checks:

ruff check src tests

Run the complete Python test suite:

python -m pytest

Run a focused test file or directory during development:

python -m pytest tests/path/to/test_file.py

Other Surfaces

Broker documentation is maintained in broker/README.md.

Native VR overlay documentation is maintained in native/overlay/README.md.

Custom HTTP API extension documentation is maintained in docs/http-extensions.md. For the JSON Schema required for connection, see docs/http-extension.schema.json.

VRChat OSC controls are documented in docs/vrchat-osc.md.


Developer

salee


Contributors

RICHARDwuxiaofei fzcfweasdferttgg-png


Special Thanks

SUI_32C, Nagikokoro, motoka96, _Ykol魚, kascr_, Just Monika V, FLUVIA, Han โชเล่ย์, EA_PE, Ephedrine, ~ eri ~, fzcfweasdferttgg-png, Welcius, nunu299


License

AGPL-3.0-or-later

Third-party licenses and notices: src/puripuly_heart/data/THIRD_PARTY_NOTICES.txt

Releases

Sponsor this project

Used by

Contributors

Languages