PuriPuly
Real-Time Two-Way Voice Translator for VRChat
Demo

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.
What is PuriPuly?
PuriPuly is a two-way voice translator for Windows that translates your voice and the other person’s voice in real time.
We aim for natural translation through LLMs.
Beyond stiff literal translation, so real person-to-person conversation can happen.
It works in many environments, including VRChat and Discord.
- 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.
- No setup required — No need to configure the complicated settings yourself; the built-in agent provides the best experience.
- The most powerful local full stack — From Granite Speech 5.0 to Gemma 4 E4B, built with the most efficient models available today.
Q&A
-
How good is the translation quality?
→ You can comfortably have even the deepest conversations people can share. It also outperforms traditional commercial translation services by a wide margin. See the ‘Translation Comparison’ section below for details.
-
How long does it take from speaking to getting a translation?
→ Under optimal conditions, latency is around 1 second, measured from when the speaker finishes talking.
-
Does it cost money to use?
→ You can start right away for free. Free options alone already perform well enough. Paid models are also very inexpensive — thousands of uses for $1.
-
Voice recognition is slow.
→ When using local ASR, processing times can be slow if compute resources are limited. In this case, we recommend switching to a cloud STT service.
-
How is personal data handled?
→ Voice and conversation contents are never sent to Puripuly servers. In addition, all source code is publicly available in this repository, so you can verify its network behavior directly.
Translation Comparison


- Blue bars show PuriPuly configurations at the time of the benchmark.
- 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 |
Local ASR |
Cloud Free Tier ASR |
Soniox |
Qwen Audio |
| Index-Translate 35B A3B |
Unlimited |
Unlimited |
5,000 |
7,260 |
| Gemma 4 26B A4B + 31B |
13,940 |
13,940 |
3,680 |
4,770 |
| DeepSeek V4.1 Flash |
16,800 |
16,800 |
3,860 |
5,070 |
| GPT-6 Luna |
8,680 |
8,680 |
3,170 |
3,950 |
Other Models
| LLM \ ASR |
Local ASR |
Cloud Free Tier ASR |
Soniox |
Qwen Audio |
| Gemma 4 E4B & 26B (Local) |
Unlimited |
Unlimited |
5,000 |
7,260 |
| DeepSeek V4 Flash (OpenRouter) |
17,020 |
17,020 |
3,860 |
5,090 |
| Gemini 3.8 Flash |
1,160 |
1,160 |
940 |
1,000 |
| Qwen 3.8 Flash |
7,460 |
7,460 |
2,990 |
3,680 |
Cost per Utterance
Recommended Models
| LLM \ ASR |
Local ASR |
Cloud Free Tier ASR |
Soniox |
Qwen Audio |
| Index-Translate 35B A3B |
$0 |
$0 |
~$0.0002 |
~$0.00014 |
| Gemma 4 26B A4B + 31B |
~$0.00007 |
~$0.00007 |
~$0.0003 |
~$0.00021 |
| DeepSeek V4.1 Flash |
~$0.00006 |
~$0.00006 |
~$0.0003 |
~$0.00020 |
| GPT-6 Luna |
~$0.00012 |
~$0.00012 |
~$0.0003 |
~$0.00025 |
Other Models
| LLM \ ASR |
Local ASR |
Cloud Free Tier ASR |
Soniox |
Qwen Audio |
| Gemma 4 E4B & 26B (Local) |
$0 |
$0 |
~$0.0002 |
~$0.00014 |
| DeepSeek V4 Flash (OpenRouter) |
~$0.00006 |
~$0.00006 |
~$0.0003 |
~$0.00020 |
| Gemini 3.8 Flash |
~$0.0009 |
~$0.0009 |
~$0.0011 |
~$0.0010 |
| Qwen 3.8 Flash |
~$0.0001 |
~$0.0001 |
~$0.0003 |
~$0.00027 |
- 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 V4.1 Flash assumes a 70% cache hit rate; V4 Flash (OpenRouter) assumes 60%.
- GPT-6 Luna uses OpenAI API pricing with no cache discount assumed; when connected through ChatGPT, it uses your Codex limits instead of API charges.
- Qwen API costs are based on the Beijing region.
- Pricing as of October 17, 2026.
Free Credits
| Service |
Free Credit |
Duration |
Note |
| Deepgram |
$200 |
None |
No card required |
| ElevenLabs |
10,000 credits |
Monthly reset |
No card required |
| Gemini 3.5 Transcribe |
Free tier |
None |
Practically unlimited on the free tier |
| Alibaba Cloud |
1M tokens per model |
90 days |
Singapore region |
| Alibaba Cloud |
¥300 |
1 year |
Students in China |
Local Models
PuriPuly comes with the following local models built in. You can also connect OpenAI-compatible APIs.
GPU inference runs on Vulkan. It works regardless of the vendor — Radeon or Arc alike.
ASR
| Model |
Runtime |
Quantization |
| Granite Speech 5.0 Multilingual |
CPU |
Q8_0 |
| GigaAM-v3 e2e-CTC |
CPU |
Q8_0 |
| Fun-ASR-Nano-2512 |
CPU |
Q8_0 |
| Fun-ASR-MLT-Nano-2512 |
CPU |
Q8_0 |
| Parakeet TDT-CTC 0.6B (ja) |
CPU |
INT8 |
| Qwen3-ASR 1.7B |
GPU |
Q6_K |
| OpenAI-compatible API |
— |
— |
LLM
| Model |
Runtime |
Quantization |
| Gemma 4 E4B IT QAT |
CPU / GPU |
UD Q4_K_XL |
| Gemma 4 26B A4B IT QAT |
GPU only (Vulkan) |
UD Q4_K_XL |
| OpenAI-compatible API |
— |
— |
Ask the built-in agent Puri anything you’re curious about!
Usage
-
Download the latest version from the Download page.
-
Install PuriPuly.
-
Click the TALK button.
-
Click TRANS. New installations use Index without an API key; complete authentication or setup if prompted.
-
Click the CAPTIONS button to turn on VR subtitles.
-
(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.
-
Enable OSC in VRChat: Action menu → Settings → OSC → Enable.
For bidirectional control setup and the stable parameter ABI, see VRChat OSC controls.
SELF translations can appear in the chatbox while a speech turn is still in progress and update as more speech arrives. The app marks previews separately from completed turns. See progressive Self chatbox translations for correction, ordering, and pagination behavior.
On the merged SELF speech route, captions advance with closed-source units or sentence-complete cumulative source whose matching translation is ready. During ongoing speech, source and translation appear together; stable recognition updates, grace restarts, and speculative completions alone are not display boundaries. Existing translated coverage is retained while newer coverage is pending; closed source still has a source-only fallback when translation is disabled, unavailable, or fails. An untranslated successor is staged only when ordinary shared-window selection would evict translated SELF. Eligible late results update retained captions without refocusing newer speech; expired or displaced captions are not revived. Chatbox progression and PEER policy remain independent. Punctuation-free continuous speech can wait for closure, and finite shared slots do not guarantee a minimum reading interval.
Cloud PEER captions do not publish late preview translations after recognition fully retracts the provisional text. Qwen’s empty partial updates deliberately retain the last nonempty hypothesis instead. Retraction does not prevent a later valid replacement or authoritative final from being translated.
If audio capture does not work
If audio capture does not work, open Settings > General and follow these steps.
- Change Audio Host API to Auto or MME.
- Select the correct microphone.
- Restart the app.
Note for Users in China
If Soniox/Gemini/Deepgram are blocked in your region, please use the following combination:
-
STT: Qwen Audio
-
LLM: DeepSeek V4.1 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 selecting Gemma 4 26B A4B + 31B with the OpenRouter connection.
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
-
Set the options inside the red circle as shown in the screenshot.

-
In the app, click the button inside the red circle.

-
Login at OpenRouter.

-
Click the button inside the red circle to exit the payment screen.

-
Click the Authorize button.

-
Prepay as much as you plan to use.

If clicking Authorize didn't authenticate you
You can bypass browser authorization by creating an API key as below and pasting it into the OpenRouter API Key field. Click outside the field to save and verify it; you do not need to press the authentication button again.
Network, proxy, TLS certificate, and service errors do not mean your key is invalid. The app distinguishes these failures and automatically records safe diagnostic metadata without the key or authorization code. SOCKS5 proxies are supported; native Windows startup preserves explicitly configured CA certificate settings. Certificate verification stays enabled, and an unavailable proxy is not silently bypassed.
-
Click your account in the top right, go to the API Keys tab on the left, then click the Create button in the center.

-
Click the Create button.

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

DeepSeek
-
Set the options inside the red circle as shown in the screenshot.

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

-
Login on the homepage.

-
Go to the API Keys tab and click Create new API Keys.

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

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

Deepgram
-
Login to the Deepgram Console.

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

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

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

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

-
Copy the generated key and paste it into PuriPuly settings.

Gemini
-
Go to Google AI Studio and click the Get API key button.

-
Create a new project.

-
Choose any name for the project.

-
Select the project you created and click Create key.

-
Click the circled area.

-
Click the circled area to copy the key.

For Gemini paid subscribers
-
Go to Google Developer Program and join the program.

-
Select your paid-tier project.

Qwen
-
Access Alibaba Cloud Model Studio via the appropriate path for your region:
-
Login at the URL above. Make sure to select the correct Region for your API key (e.g., Beijing).

-
Click the gear icon in the top right.

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

-
Click Create API Key.

-
Assign an account and workspace, then click OK.

-
Click the circled area to copy the key.

Soniox
-
Login to Soniox Console.

-
Enter an organization name of your choice.

-
Click Add Funds to link a payment method.

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

-
Create a new API Key.

-
Copy the generated key and paste it into PuriPuly settings.

Architecture
See docs/architecture.md.
Development
Requires Windows x64, standard GIL-enabled CPython 3.14.10, and uv 0.13.6, matching the CI pins. Install the selected Python explicitly before synchronizing the environment. Run these commands from the repository root.
Setup
uv sync --locked --extra dev --python 3.14.10
GUI
uv run python -m puripuly_heart.main run-gui
CLI
The CLI can run the application without a GUI or control an already-running application. See the CLI guide for commands.
uv run python -m puripuly_heart.main cli --help
Verification
uv run --locked black --check .
uv run --locked ruff check .
uv run --locked python scripts/ci/check_test_selection.py
Contributors
Special Thanks
SUI_32C, Nagikokoro, motoka96, _Ykol魚, kascr_, Just Monika V, FLUVIA, Han โชเล่ย์, EA_PE, Ephedrine, ~ eri ~, fzcfweasdferttgg-png, Welcius, nunu299, 梅雨Shiro
Policies
License
AGPL-3.0-or-later
Third-party licenses and notices: src/puripuly_heart/data/THIRD_PARTY_NOTICES.txt
评论