The issue: Commands registered as global commands weren't being synced
when calling tree.sync(guild=...) because they weren't associated with
the specific guild context.
The fix: Call tree.copy_global_to(guild=...) before sync() to copy global
commands to each guild's context. This makes commands appear immediately
instead of requiring global sync (which can take up to 1 hour).
Reference: discord.py FAQ recommends copy_global_to for development
when you want immediate command availability in specific guilds.
- Added _log_registered_commands() to list all commands in tree
- Added logging in __init__ to track command registration
- Enhanced on_ready() sync logging with detailed information
- Shows registered commands before and during sync
- Shows specific guild sync status with command counts
- Added error handling for Forbidden errors (missing permissions)
- Clear warnings when no guilds are synced
- Added new audio_effects.py module with pitch shift and speed change
- Pitch range: -12 to +12 semitones (higher = chipmunk, lower = deeper)
- Speed range: 0.5 to 2.0x (higher = faster, lower = slower)
- Maximum 2 active effects per user (performance optimization)
- Added /effects command group:
- /effects list - Shows current effects with descriptions
- /effects set pitch|speed <value> - Apply effects
- /effects reset - Confirmation UI to clear all effects
- Effects persist across restarts in preferences.json
- Updated /voice preview to support optional pitch/speed parameters
- Effects applied in _generate_wav_bytes using librosa
- Added performance warnings when processing takes >1 second
- Updated README with effects documentation
- Added 8 random preview sample lines for voice testing
- New /voice preview <name> command to hear voices before selecting
- Previews play in queue like regular messages (no queue jumping)
- Preview does NOT change user's active voice preference
- Updated queue system to support voice override for previews
- Added documentation for new command in README
Major features added since 1.0.0:
- Test Mode support for safe development
- Auto-updates dependencies on startup
- Multi-voice support with per-user preferences
- Voice persistence across restarts
- Hot-reload voices without restart
- Replace Unicode emoji (✓, ⚠️) with [OK] and [WARN] in audio_preprocessor.py
to prevent UnicodeEncodeError on Windows console (cp1252 codec)
- Add auto-update dependencies function to bot.py for easier maintenance
- Remove setup_linux.sh (no longer needed)
- Update .gitignore to exclude VS Code launch.json
Renamed the systemd service from "pockettts" to "vox" for better branding and clarity.
Updated the script to reflect the new service name.
Addressed numba caching issues when running as a systemd service:
- Created to explicitly set to a project-local directory ().
- Modified to import early in the execution flow.
- Updated the systemd service file to grant write permissions to the directory.
- Added to to prevent caching files from being committed.
Improve documentation and add a setup script for easy deployment on Linux systems.
- Update README.md with instructions for the new multi-voice slash commands and the oices/ directory structure.
- Add a comprehensive 'Linux Server Deployment' section to the README, detailing both a quick setup via a new script and a manual systemd service setup.
- Create setup_linux.sh to automate dependency checking, virtual environment creation, and service installation on Linux.
- Revise comments in .env.example for clarity and to reflect the latest configuration options.
Refactor the TTS handling to support multiple, user-selectable voices. This replaces the previous single-voice system.
Key changes:
- Introduce VoiceManager to handle loading and managing voices from a dedicated oices/ directory.
- Add slash commands (/voice list, /set, /current, /refresh) for users to manage their personal TTS voice.
- Implement on-demand voice loading to improve startup time and memory usage.
- Remove the old ts_handler.py and single voice .wav files in favor of the new system.
- Update configuration to specify a voices directory instead of a single file path.