A modern, free Text-to-Speech (TTS) application with a sleek GUI. CriTTS uses Microsoft Edge's TTS engine (via edge-tts) to generate high-quality speech and can route audio to any output device, including virtual cables for Discord/VRChat integration.
- Free TTS Engine: Uses Microsoft Edge's online TTS service (no API key required)
- 100+ Voices: Access to all Microsoft Edge voices in multiple languages
- Voice Customization: Adjust speech rate (-100 to +100), volume (0-100), and pitch (-100 to +100)
- Auto Language Detection: Automatically detects text language and selects appropriate voice
- Custom Language Mappings: Set preferred voices for each language
- Audio Routing: Route TTS output to any audio device (including VB-Cable for Discord)
- Microphone Passthrough: Route your real microphone to VB-Cable alongside TTS for voice mixing
- Processing Profiles: Choose between Fast Preview, Balanced, or High Quality
- Audio Normalization: Peak, RMS, or LUFS normalization for consistent volume
- High-Quality Resampling: 48kHz with Kaiser-windowed anti-aliasing filters
- Stereo Enhancement: Converts mono TTS to natural-sounding stereo
- Persistent Audio Cache: Generated audio is cached to disk for instant replay
- LRU Cache Eviction: Configurable cache size with automatic cleanup
- Phrase Pre-generation: Frequently used phrases can be pre-generated
- Streaming Playback: Experimental low-latency mode starts playing before generation completes
- Modern Interface: Built with CustomTkinter for a sleek, modern look
- Dark/Light Mode: Switch between themes or follow system setting
- Voice Search & Filters: Search by name, filter by language/region/gender
- Voice Favorites: Save favorite voices for quick access
- Configurable Keybinds: All keyboard shortcuts are customizable
- Recording Overlay: Compact always-on-top overlay showing recording state with pulsing indicator (draggable, toggleable)
- Speech-to-Text: Record microphone audio and transcribe using Google Web Speech API
- Auto-Speak: Optionally speak transcribed text automatically
- Language Support: Configure recognition language in Settings β Behavior
- OSC Chatbox: Send TTS text to VRChat's in-game chatbox
- Viseme Animation: Automatic lip-sync for your avatar
- Voice Amplitude: Real-time mouth movement based on audio volume
- Typing Indicator: Show typing animation in VRChat while composing
- Python 3.8 or higher
- Windows, macOS, or Linux
# Clone the repository
git clone https://github.com/k1rk11/CriTTS.git
cd CriTTSUsing launcher scripts (recommended):
# Windows
run.bat
# Linux / macOS
./run.shThe launcher scripts automatically check for Python, install dependencies, and launch the app.
Manual installation:
# Install dependencies
pip install -r requirements.txt
# Run the application
python main.pycustomtkinter
edge-tts>=7.2.3
langid>=1.1.6
sounddevice
soundfile>=0.12.0
numpy>=1.21.0
scipy>=1.9.0
pyloudnorm>=0.1.0
python-osc>=1.8.0
SpeechRecognition
keyboard>=0.13.5
- Enter Text: Type or paste text in the main text area
- Speak: Click "Speak" or press
Enter - Stop: Click "Stop" or press
Escape - Clear: Click "Clear" or press
Ctrl+T
Click the π Voice button (or press Ctrl+Shift+V) to start recording. Click again (or press the keybind again) to stop and transcribe.
- Uses Google Web Speech API (free, requires internet)
- Configure language and microphone in Settings β Behavior
- Enable Auto-Speak to automatically speak transcribed text
Access settings by clicking the "Settings" button or pressing Ctrl+,
- Select voice from the list (100+ voices available)
- Adjust rate, volume, and pitch
- Preview voices before selecting
- Manage favorite voices
- Select output device
- Enable/disable normalization
- Choose normalization type (Peak, RMS, LUFS)
- Microphone Passthrough: Route your real microphone to VB-Cable alongside TTS
- Enable/disable passthrough
- Select microphone device
- Adjust passthrough volume (0-200%)
- Switch between Dark, Light, or System theme
- Button Visibility: Choose which buttons appear in the main window (Speak, Stop, Clear, Voice, Overlay). Settings button is always visible.
- Define text expansion shortcuts (e.g., "idk" β "I don't know")
- Customize all keyboard shortcuts
- Configure speak mode (current line or all text)
- Enable auto language detection
- Set language-to-voice mappings
- Enable OSC integration
- Configure chatbox settings
- Set up viseme/amplitude for lip-sync
- Manage audio cache settings
- Select processing profile
- Enable streaming playback (experimental)
To route TTS audio to Discord or other applications:
-
Install VB-Cable
- Download from VB-Audio Software
- Install the virtual audio cable
- CriTTS will automatically detect if VB-Cable is missing and prompt you to install it
-
Configure CriTTS
- Open Settings > Audio Output
- Select "CABLE Input (VB-Audio Virtual Cable)"
-
Configure Discord
- Open Discord Settings > Voice & Video
- Set Input Device to "CABLE Output"
- Disable "Automatically determine input sensitivity"
-
Use
- Type text in CriTTS and click Speak
- Audio will be routed to Discord
The Microphone Passthrough feature allows you to route your real microphone audio to VB-Cable alongside TTS output. This is useful for mixing your voice with TTS in VRChat or Discord.
-
Enable Passthrough
- Open Settings > Audio Output
- Scroll to "Microphone Passthrough" section
- Check "Enable microphone passthrough to VBCable"
-
Select Microphone
- Choose your microphone device from the dropdown
- Use "Default (System)" to use your system's default microphone
-
Adjust Volume
- Set passthrough volume (0-200%)
- 100% = normal volume
- 200% = doubled volume (for quiet microphones)
- 0% = muted
- VRChat: Speak normally while TTS plays, both audio sources go to VB-Cable
- Discord: Mix your voice with TTS for roleplay or accessibility
- Streaming: Combine voice and TTS into a single audio source
When enabled, CriTTS creates a real-time audio stream from your selected microphone to VB-Cable. This runs continuously in the background, allowing you to speak naturally while TTS plays. The volume control lets you boost quiet microphones or balance levels between your voice and TTS.
| Profile | Sample Rate | Anti-Aliasing | Stereo Width | Best For |
|---|---|---|---|---|
| Fast Preview | Original | None | None | Quick testing |
| Balanced | 48kHz | Kaiser Ξ²=5 | 0.3 | General use (default) |
| High Quality | 48kHz | Kaiser Ξ²=8 | 0.5 | Important content |
| Type | Description | Best For |
|---|---|---|
| Peak | Limits maximum amplitude to -1dB | General use, prevents clipping |
| RMS | Ensures consistent loudness | Multi-voice projects |
| LUFS | Professional loudness standards (-14 LUFS) | Streaming, broadcast |
| None | No processing | External audio workflows |
- Enable VRChat OSC in Settings > VRChat OSC
- Ensure OSC is enabled in VRChat (Settings > OSC > Enable OSC)
- Configure desired features:
- Send to Chatbox: Display TTS text in VRChat
- Viseme Animation: Animate avatar mouth
- Voice Amplitude: Real-time mouth movement
- Chatbox Integration: TTS text appears in VRChat's chatbox
- Lip-Sync: Avatar mouth moves in sync with speech
- Typing Indicator: Shows typing animation while composing
- Only incoming messages from other players can be monitored (VRChat limitation)
- Your own typed messages in VRChat are not logged by VRChat
CriTTS/
βββ main.py # Application entry point
βββ requirements.txt # Python dependencies
βββ README.md # This file
βββ src/
βββ config/
β βββ settings_manager.py # JSON settings persistence
βββ tts/
β βββ tts_engine.py # TTS orchestration
β βββ text_preprocessor.py # Text cleaning & abbreviation expansion
β βββ audio_cache.py # Persistent LRU audio cache
β βββ providers/
β βββ edge_tts_provider.py # edge-tts integration
βββ audio/
β βββ audio_router.py # Audio device routing & processing
βββ stt/
β βββ stt_engine.py # Speech-to-text engine
βββ utils/
β βββ language_detector.py # Language detection for auto voice selection
β βββ keybind_utils.py # Keybind utility functions
βββ gui/
β βββ main_window.py # Main application window
β βββ settings_window.py # Settings dialog
β βββ keybind_manager.py # Dynamic keybind registration
β βββ theme_constants.py # UI theme & layout constants
β βββ recording_overlay.py # Recording state overlay
β βββ settings_tabs/ # Settings tab components
β βββ voice_tab.py # Voice selection & customization
β βββ audio_output_tab.py # Audio device & normalization
β βββ appearance_tab.py # Theme & button visibility
β βββ abbreviations_tab.py # Text expansion shortcuts
β βββ keybinds_tab.py # Keyboard shortcuts
β βββ behavior_tab.py # Speak mode & language detection
β βββ vrchat_osc_tab.py # VRChat OSC integration
β βββ advanced_tab.py # Cache & processing profiles
βββ vrchat/
βββ osc_client.py # VRChat OSC client
βββ viseme_mapper.py # Phoneme-to-viseme mapping
| Default Shortcut | Action |
|---|---|
Escape |
Stop playback |
Ctrl+T |
Clear text |
Ctrl+, |
Open Settings |
Ctrl+Shift+V |
Voice input (toggle recording) |
All shortcuts are customizable in Settings > Keybinds.
Global Hotkeys: Enable the "Global Hotkeys" toggle in Settings > Keybinds to allow shortcuts to work even when the app is not focused. This requires the keyboard library (included in dependencies).
- Check output device in Settings > Audio Output
- Ensure device is not muted in system settings
- Try "System Default" device
- Verify VB-Cable is installed correctly
- Check Discord input device is "CABLE Output"
- Disable noise suppression in Discord
- Check internet connection (edge-tts requires internet)
- Verify firewall is not blocking Python
- Try refreshing voices in Settings
- Ensure OSC is enabled in VRChat settings
- Check IP/port configuration (default: 127.0.0.1:9000)
- Use "Test Connection" in Settings > VRChat OSC
- Enable Audio Cache: Reduces regeneration of repeated phrases
- Use Balanced Profile: Good quality without excessive processing
- Pre-generate Phrases: Common phrases load instantly
- Enable Streaming: Lower latency for long text (experimental)
- GUI Framework: CustomTkinter
- TTS Engine: edge-tts
- Audio I/O: sounddevice, soundfile
- Virtual Audio: VB-Audio Cable
This project is open source. Feel free to modify and distribute.
Enjoy CriTTS Recoded! ποΈ