VRChat OSC Voice Changer: Mic Routing & Avatar Parameters

Route your voice changer through VRChat OSC to trigger avatar expressions, emotes, and parameter animations in sync with your mic. Full setup guide.

VRChat OSC Voice Changer: Mic Routing & Avatar Parameters

VRChat OSC voice changer setups are where avatar presence goes from “sounds different” to “responds like a real character.” Most guides stop at audio routing — pick a voice changer, select the virtual mic in VRChat, done. That covers the sound. But VRChat’s Open Sound Control layer opens a second channel where your mic activity directly animates avatar expressions, triggers emote sequences, and drives parameter blendshapes that no face tracker reaches. This guide covers the full picture: the audio chain, the OSC data path, avatar parameter mapping for the Stream Avatar System, voice-triggered emote automation, and the practical script setup that ties it together.


TL;DR

  • VRChat uses two separate channels for voice: WASAPI audio input (your mic sound) and UDP OSC messages (parameter data for avatar animation)
  • A voice changer handles the audio channel; an OSC bridge script handles the data channel — they run in parallel and do not conflict
  • The Stream Avatar System spec uses VoiceVolume, VoiceActivity, and VoicePitch float parameters to drive mouth/expression blendshapes without face tracking
  • You can trigger emotes with Bool parameters sent over OSC on voice events or hotkey presses inside the voice changer’s macro system
  • VRChat’s default OSC port is 9000 UDP; no special configuration is needed unless port 9000 is already taken
  • VoxBooster works as the audio layer in this chain with no additional configuration on its end

How VRChat Handles Two Separate Channels for Voice

To understand why the OSC integration works the way it does, you need to see the two channels VRChat uses for voice separately.

Channel 1 — WASAPI audio. VRChat captures your voice through the Windows Audio Session API. It reads from the microphone device you have selected in VRChat’s Settings → Microphone. This is the channel that delivers the actual sound other players hear. A voice changer like VoxBooster inserts itself here at the OS audio layer, so the processed voice reaches VRChat without any in-game configuration. VRChat simply sees a microphone, not a voice changer.

Channel 2 — OSC UDP messages. VRChat listens on UDP port 9000 for Open Sound Control packets. These carry structured data: avatar parameter names paired with Float, Int, Bool, or String values. VRChat takes those values and writes them into the active avatar’s Animator layer in real time. This channel has nothing to do with audio — it’s purely about driving visual animation parameters.

The reason this is powerful: audio alone only drives VRChat’s built-in viseme system (the basic mouth-open/close animation from volume thresholding). OSC lets you drive arbitrary custom parameters — meaning any blendshape, any state transition, any behavior your avatar’s animator has wired up.

An OSC bridge script sits between these two channels and does one job: it listens to the audio activity (or hotkey events) from your voice changer and translates that into OSC parameter packets sent to VRChat. The voice changer and VRChat never need to know about each other beyond their individual connection points.


The Audio Chain: Voice Changer to VRChat Mic Input

Before touching OSC, getting the audio chain right is the prerequisite.

Setting Up VoxBooster as the Capture Source

VoxBooster registers a virtual microphone at the Windows audio layer via WASAPI. VRChat reads from this virtual mic the same way it reads any physical mic. The setup is:

  1. Install VoxBooster and launch it. Confirm the virtual microphone device appears in Windows Settings → Sound → Input.
  2. Select your physical microphone as VoxBooster’s input source inside the VoxBooster UI.
  3. Choose a voice preset or configure effects (pitch, formants, AI model — depending on the character you’re building).
  4. In VRChat, go to Settings → Microphone and confirm the correct device is selected.

VRChat’s microphone selection behavior changed in 2023: it now by default shows physical input devices and may hide virtual ones depending on driver presentation. If VoxBooster’s virtual mic doesn’t appear in the VRChat list, check that the device is listed as “Ready” in Windows Sound Settings (not “Disabled” or “Not plugged in”).

VRChat Voice Settings That Matter for Processed Audio

VRChat applies post-processing to whatever mic input it receives. For processed voice (which is already equalized and pitch-shifted), a few of these settings need attention:

VRChat SettingDefaultRecommendation for Voice Changer
Microphone loudness gateOnLower threshold or disable — processed audio may clip the gate
Voice falloff range25mKeep default; this is about proximity, not processing
Spatialized voiceOnKeep on; adds VR presence independent of voice effect
Allow avatar audio overrideUser settingOnly relevant if wearing avatars that override mic settings

The loudness gate is the most common point of failure. VRChat uses a volume threshold below which it cuts your microphone — this prevents ambient noise but can also cut a voice changer output that has been over-compressed. If your voice keeps cutting in and out in VRChat, lower the gate threshold in VRChat’s Microphone settings or reduce compression in VoxBooster.


What Is VRChat OSC and What Can It Actually Do?

VRChat Open Sound Control (OSC) is a real-time messaging protocol VRChat introduced as a first-party feature in 2022. It operates over UDP on the local machine (no internet connection required, no VRChat server involved) and allows external applications to read and write VRChat avatar parameters in real time.

OSC in VRChat can do the following:

  • Write Float, Int, Bool, or String values to any avatar parameter that has “Allow OSC write” enabled in the avatar’s descriptor
  • Read avatar parameter values back from VRChat (VRChat sends on port 9001)
  • Send chatbox messages programmatically
  • Trigger VRChat Actions (turning on/off avatar features that are wired to Action parameters)
  • Simulate input controls (movement axes, button presses) from external hardware or software

For voice-changer integration, the relevant capabilities are writing Float and Bool parameters to avatar parameters in real time. This is the mechanism that enables mic-level-driven mouth animation, voice-activity expressions, and hotkey-triggered emotes.


Stream Avatar System: The Spec That Makes OSC Voice Useful

The Stream Avatar System is a community standard for VRChat avatars that defines a consistent set of OSC-writable parameters for streamers and VTubers who want reactive avatar animation without face tracking hardware. If your avatar was built to the Stream Avatar System spec, it ships with an Animator layer ready to receive these parameters:

Parameter NameTypeDescription
VoiceVolumeFloatCurrent mic amplitude, 0.0–1.0 normalized
VoiceActivityBoolTrue while voice is above the noise threshold
VoicePitchFloatApproximate fundamental frequency, normalized to a 0.0–1.0 range
VoiceEmotionIntMapped to expression states (0=neutral, 1=happy, 2=sad, 3=angry, 4=surprised)
IsStreamingBoolOptional flag for activating streaming-mode overlays on the avatar

When an OSC bridge script sends these values in real time, the avatar’s mouth opens in proportion to voice volume (replacing VRChat’s coarse viseme system), expressions shift based on pitch contour, and the avatar goes idle-neutral when you stop speaking. On a Stream Avatar System rig, this produces the mouth and expression quality most people associate with expensive face trackers — it’s not full face tracking, but for voice presence it’s close enough that casual observers often don’t notice the difference.

You can find avatars built to this spec on VRChat community hubs. When shopping for an avatar, look for “OSC ready” or “Stream Avatar System” in the description. If you own an existing avatar and have Unity + the VRChat SDK, adding the parameter layer is a matter of extending the Animator Controller — the VRChat OSC documentation covers the parameter wiring in detail.


Voice-Triggered Emotes: Wiring OSC Bool Parameters

One of the more entertaining applications is triggering avatar emotes automatically from voice activity — so your avatar waves, claps, or reacts physically to specific moments in your speech.

How Bool-Triggered Emotes Work in VRChat

VRChat avatars can have Bool parameters in their Animator layers that, when set to True, enter a specific state (playing an emote clip) and return to False when the clip finishes (via a transition with “Exit Time” or an OSC reset). To trigger an emote via OSC, you send a message to VRChat/avatar/parameters/YourParameterName with a Bool True value. VRChat writes it to the Animator, the transition fires, the emote plays.

The OSC message format is: /avatar/parameters/EmoteWave True (using VRChat’s OSC address format).

Two Ways to Trigger from a Voice Changer

Method 1 — Volume threshold triggers. A bridge script monitors the audio output from VoxBooster’s virtual mic, detects when amplitude exceeds a threshold for more than N milliseconds, and fires the OSC Bool. Useful for “start talking” and “stop talking” transitions — sends VoiceActivity True on voice start and VoiceActivity False on voice end.

Method 2 — Hotkey-based triggers. VoxBooster supports programmable hotkeys for switching presets, firing soundboard clips, and triggering macros. A bridge script listens for a global hotkey and fires an OSC emote parameter when that key is pressed. This gives intentional control: press F5 while talking to wave, press F6 to do a laugh animation. Cleaner for emotes than trying to detect them from audio automatically.

The simplest script implementation for both methods uses Python with the python-osc library:

from pythonosc import udp_client
import sounddevice as sd
import numpy as np

VRC_IP = "127.0.0.1"
VRC_PORT = 9000
THRESHOLD = 0.02  # adjust to your mic's noise floor

client = udp_client.SimpleUDPClient(VRC_IP, VRC_PORT)
last_state = False

def audio_callback(indata, frames, time, status):
    global last_state
    volume = float(np.abs(indata).mean())
    active = volume > THRESHOLD
    if active != last_state:
        client.send_message("/avatar/parameters/VoiceActivity", active)
        client.send_message("/avatar/parameters/VoiceVolume", min(volume * 10, 1.0))
        last_state = active

with sd.InputStream(device="VoxBooster Virtual Mic",  # match Windows device name
                    channels=1, callback=audio_callback, samplerate=48000):
    print("OSC bridge running. Press Ctrl+C to stop.")
    while True:
        sd.sleep(10)

Replace "VoxBooster Virtual Mic" with the exact Windows device name that appears for VoxBooster’s output. Run python -c "import sounddevice as sd; print(sd.query_devices())" to list available devices.

The python-osc and sounddevice packages install via pip: pip install python-osc sounddevice numpy.


OSC-Aware Proxy: Running Voice Changer and OSC in Parallel

The cleanest production setup runs VoxBooster and the OSC bridge as two independent processes that share only the virtual mic device as an intermediary. Neither process needs to know about the other’s internals.

Physical Mic


VoxBooster (audio processing: pitch, formants, AI model)

    ├── [WASAPI out] → VRChat mic input → VRChat audio engine

    └── [Virtual mic monitor] → OSC bridge script → UDP port 9000 → VRChat OSC engine


                                                                  Avatar parameters
                                                                  (VoiceVolume, VoiceActivity, etc.)

The virtual mic monitor (the sounddevice InputStream in the script) reads the already-processed audio. This means the OSC data reflects the voice changer output, not the raw mic — so VoiceVolume is based on the transformed voice level, which matches exactly what other players are hearing. This is the correct behavior: the avatar’s mouth movement should follow the audible voice, not the original mic.

Running the Bridge at Startup

To launch the bridge automatically when Windows starts (so you don’t need to manually run it each VRChat session):

  1. Save your bridge script somewhere persistent, e.g. C:\Users\YourName\vrc-osc-bridge\bridge.py
  2. Create a .bat file: pythonw C:\Users\YourName\vrc-osc-bridge\bridge.py
  3. Press Win+R, type shell:startup, and place a shortcut to the .bat in that folder

pythonw (without the console window) keeps the bridge running silently in the background. It uses negligible CPU — the audio callback only runs 100 times per second and does a single amplitude computation.


Mic Chain Latency: What OSC Adds and What It Doesn’t

A common concern is whether adding OSC messaging introduces perceptible lag to avatar animation. The numbers are reassuring.

Audio path latency is set by VoxBooster’s processing mode. DSP effects (pitch, formants, EQ) run under 10ms. AI voice model inference in Low-Latency mode runs approximately 80ms on a mid-range GPU. This is the delay between speaking and other players hearing you — it’s unrelated to OSC.

OSC parameter latency is the delay between voice activity and avatar animation responding. The bridge script’s audio callback fires every ~10ms (100 callback cycles per second at 48kHz with standard buffer sizes). Adding UDP transmission on localhost (sub-millisecond) and VRChat’s Animator update cycle (~30ms at 30fps in the animator update step), the end-to-end OSC latency is 30–50ms.

The net result: the avatar’s mouth visually responds within one animation frame of the audio — which is indistinguishable from simultaneous to observers. The audio itself may be 80ms delayed (AI mode), but that’s the same delay observers perceive in both the sound and the animation, so they stay in sync.


Comparison: Voice Changer Approaches for VRChat OSC

ApproachAudio QualityOSC IntegrationLatencySetup Complexity
VoxBooster + OSC bridge scriptHigh (AI model available)Yes, via bridge80ms AI / <10ms DSPMedium — needs Python script
Voicemod + OSC bridge scriptMedium (DSP only)Yes, via bridge<10msMedium — same bridge approach
MorphVOX + OSC bridgeLow-mediumYes, via bridge<15msMedium
VRChat built-in viseme onlyN/A (unmodified voice)Native, no bridge<5msZero
Face tracker (e.g. VRCFaceTracking)N/A (audio separate)Native, no bridge15–30msHigh — hardware required

The OSC bridge approach works with any voice changer that exposes a virtual mic output. The difference between tools is audio quality and whether AI voice model inference is available — which is where VoxBooster’s local model pipeline differs from DSP-only tools like Voicemod and MorphVOX.


Common Issues and Fixes

VRChat Not Receiving OSC Messages

Check these in order:

  1. Confirm OSC is enabled in VRChat’s Action Menu → Options → OSC → Enabled
  2. Confirm the listening port is 9000 (Action Menu → Options → OSC → Port)
  3. Confirm no firewall rule is blocking UDP localhost traffic — Windows Firewall sometimes blocks Python applications on first run
  4. Confirm the bridge script’s target port matches VRChat’s listening port
  5. Restart VRChat after enabling OSC — some VRChat builds require a restart for OSC to initialize

Avatar Parameters Not Responding

OSC writes to parameters only work if:

  • The avatar has those parameters defined in its VRChat Avatar Descriptor
  • The parameters are set to “Allow OSC” in the descriptor’s parameter list
  • The Animator layer has transitions wired to those parameters

If you downloaded a community avatar and parameters aren’t responding, the avatar may predate VRChat’s OSC support or may not have the Stream Avatar System layer. Check the avatar’s documentation or import it into Unity with the VRChat SDK to verify parameter definitions.

Voice Changer Audio Cutting Out in VRChat

As noted in the audio chain section, VRChat’s noise gate can cut a heavily compressed or normalized voice changer output. Solutions:

  • Reduce VRChat’s microphone gate threshold
  • In VoxBooster, reduce the output compression ratio (lighter compression = more dynamic range = clearer gate signal)
  • Ensure VoxBooster’s output level is calibrated so normal speech peaks around -12 to -6 dBFS

Bridge Script Selecting the Wrong Audio Device

If sounddevice is reading from your physical microphone instead of VoxBooster’s virtual output, the device name in the script doesn’t match Windows. Use sd.query_devices() to list all devices and copy the exact string for VoxBooster’s virtual mic.


VRChat OSC Voice in the Context of Other Social VR Platforms

VRChat was the first major social VR platform to implement OSC as a first-party feature, but the concept is spreading. If you build experience with VRChat OSC voice setup, the same principles apply elsewhere:

  • Resonite uses a node-graph-based scripting system where audio input can drive avatar parameters with similar expressiveness — see our Resonite node graph voice guide for how the workflow translates
  • ChilloutVR supports OSC parameter input for compatible avatars and uses a routing architecture similar to VRChat’s — our ChilloutVR voice routing guide covers that platform’s specifics
  • General streaming setups benefit from the same virtual mic chain — see voice changer for live streaming if you’re also running OBS or a stream alongside VRChat

The OSC bridge script you write for VRChat will work on any platform that supports OSC parameter input with minimal changes (usually just the port number and parameter name mapping).


Advanced: Sending VoicePitch via OSC for Expression Control

If your avatar’s Stream Avatar System layer includes a VoicePitch Float parameter (not all do), you can extend the bridge to send approximate pitch data. Accurate real-time pitch detection requires a fundamental frequency estimator — a basic approach using autocorrelation:

def estimate_pitch(audio_chunk, samplerate=48000):
    """Returns normalized pitch 0.0-1.0, where 0.5 is roughly 200 Hz."""
    if np.max(np.abs(audio_chunk)) < 0.01:
        return 0.0
    # Autocorrelation-based F0 estimation
    corr = np.correlate(audio_chunk, audio_chunk, mode='full')
    corr = corr[len(corr)//2:]
    # Look for first peak after minimum period (100 Hz = 480 samples at 48kHz)
    min_lag = int(samplerate / 800)   # 800 Hz max
    max_lag = int(samplerate / 80)    # 80 Hz min
    if len(corr) < max_lag:
        return 0.0
    peak_lag = np.argmax(corr[min_lag:max_lag]) + min_lag
    if peak_lag == 0:
        return 0.0
    f0 = samplerate / peak_lag
    # Normalize: 80 Hz = 0.0, 800 Hz = 1.0, log scale
    import math
    normalized = (math.log2(f0) - math.log2(80)) / (math.log2(800) - math.log2(80))
    return max(0.0, min(1.0, normalized))

This is accurate enough for expression control (distinguishing “high excited speech” from “low calm speech”) but not accurate enough for musical applications. For the purposes of driving facial expression blendshapes, the coarse approximation is exactly right — you want a smooth, latency-tolerant signal, not a precise pitch tracker.

For VTubers interested in how AI voice processing interacts with content creation workflows more broadly, our AI voice cloning for voiceover guide covers model training and inference in more depth, and our voice changer for roleplay guide goes into character consistency techniques that translate directly to long VRChat sessions.


Frequently Asked Questions

What is VRChat OSC and how does it work with a voice changer?

VRChat OSC (Open Sound Control) is a built-in protocol that lets external applications send real-time data to VRChat — including avatar parameters, chatbox text, and input actions. A voice changer integrated with OSC can read your mic audio level or key events and push parameter values into VRChat so avatar animations react to your voice in sync.

Can I use VRChat OSC to trigger avatar emotes with my voice?

Yes. With an OSC bridge script you can fire Bool or Float avatar parameters whenever your voice changer detects a phoneme, volume threshold, or a pressed hotkey. VRChat interprets those parameters in your avatar’s Animator layer and plays the mapped emote or expression transition.

Does a voice changer need special drivers to work with VRChat OSC?

No. The voice changer handles audio at the Windows WASAPI layer. OSC messaging runs over UDP on localhost port 9000. They are completely separate channels — the voice changer sends processed audio to VRChat’s mic input, while an OSC sender script sends parameter data to VRChat over UDP. No special drivers are required for either.

What is the Stream Avatar System in VRChat and how does it connect to mic routing?

Stream Avatar System is a VRChat community standard that maps OSC float parameters like VoiceVolume, VoicePitch, and VoiceActivity to viseme and expression blendshapes in avatar rigs built to that spec. When your OSC bridge feeds those parameters in real time, your avatar’s mouth, brows, and body animations respond continuously to your live mic, giving a face-tracked quality without a face tracker.

Will using OSC with a voice changer get me banned in VRChat?

No. VRChat explicitly supports OSC as a first-party feature since the OSC update in 2022. Sending OSC messages to control your own avatar parameters is an intended use case. Neither the voice changer processing nor the OSC messaging touches game memory or violates VRChat’s Terms of Service.

What port does VRChat OSC listen on by default?

VRChat receives OSC on UDP port 9000 by default, sending from port 9001. If another application on your machine already uses port 9000, you can change the listening port in VRChat’s Action Menu under OSC Settings. Your OSC sender script must match whichever port you set.

Which voice changers support VRChat OSC integration natively?

As of mid-2026, no major commercial voice changer ships a built-in VRChat OSC bridge — Voicemod, MorphVOX, and Voice.ai all lack this feature. Integration is done via lightweight Python or Node.js bridge scripts that read mic data from the voice changer’s virtual output and forward OSC messages to VRChat. VoxBooster’s virtual microphone output is compatible with any such bridge.


Conclusion

The combination of a vrchat osc voice changer setup with the Stream Avatar System is the practical ceiling of what social VR voice integration looks like right now — short of full face tracking hardware. The audio channel delivers the character voice; the OSC channel makes the avatar animate in response to it. Together they produce avatar presence that passive audio routing alone cannot achieve.

The setup is more involved than a basic voice changer install, but the components are small: a voice changer handling audio (VoxBooster), a 40-line Python bridge script handling OSC, and an OSC-ready avatar. The bridge script runs silently in the background and uses negligible system resources once it’s running.

If you want to extend this into a full VTuber or streaming setup, VoxBooster covers the audio processing side — AI voice models, DSP presets, soundboard macros, and noise suppression — on a standard Windows virtual mic with a 3-day free trial. Once audio is handled, the OSC bridge wires up in minutes and the avatar starts reacting.

Download VoxBooster — free 3-day trial, no credit card required.

Try VoxBooster — 3-day free trial.

Real-time voice cloning, soundboard, and effects — wherever you already talk.

  • No credit card
  • ~30ms latency
  • Discord · Teams · OBS
Try free for 3 days