wow-voiceover – Turtle WoW
Client Version: 1.12
This project contains a CLI (Command Line Interface) tool that generates Text-to-Speech (TTS) audio files for World of Warcraft quests and gossip texts. The tool uses data fetched from a local MySQL database and the ElevenLabs TTS API to generate the audio files. It also contains an addon for playing and queuing the text in game.
- Initialize quest and gossip text database
- Fetch quest and gossip texts from a local MySQL database.
- Generate TTS audio files using the ElevenLabs TTS API.
- Supports multiple races and genders.
- Generates lookup tables for use in addon.
- Parallel processing for faster generation.
- python 3.9+
- docker (for the database)
- Make a python virtual enviornment. (make sure to source it after creating)
python -m venv .venv
- Install the required packages.
pip install -r requirements.txt
- Copy the .env.example file to .env and fill in your ElevenLabs API Key and database credentials. The included database values are fine if you’re going to use the docker-compose file.
cp .env.example .env
- Start the MySQL DB
docker compose up -d
- Seed the MySQL DB
python cli-main.py init-db
The generation scripts assume you have voices created in Elevenlabs named in the format
race-gender. For the exact races the script checks your elevenlabs account for, refer to
tts_cliconsts.py. Gender will always either be
orc-male. You will need to create your own voice clones. A good place to get samples is @ https://www.wowhead.com/sounds/npc-greetings/name:orc
To use the interactive CLI tool, run the following command:
The generated TTS audio files will be saved in the sounds folder, with separate subfolders for quests and gossip. Lookup tables and sound length tables will also be generated for use in the addon.
Copy over the
generated folder to the VoiceOverData_Vanilla folder, then the VoiceOver and VoiceOverData_Vanilla folder to
World of Warcraft/_classic_era_/Interface/AddOns. Alternatively, you can syslink instead of copying for faster development. Example syslink:
export WOW_DIR=PATH_OF_YOUR_WOW_DIR ln -s ./VoiceOver "$WOW_DIR/_classic_era_/Interface/AddOns" ln -s ./VoiceOver_Vanilla "$WOW_DIR/_classic_era_/Interface/AddOns"
If you want to contribute to this project, please feel free to open an issue or submit a pull request.
The dataframe schema before calling the
preprocess_dataframe function consists of the following columns:
||Indicates the type of interaction, can be ‘accept’, ‘progress’, ‘complete’, or ‘gossip’|
||The quest ID or empty string if it’s a gossip interaction|
||The text template content of the interaction|
||The race ID of the NPC involved in the interaction|
||The gender ID of the NPC involved in the interaction|
||The name of the NPC involved in the interaction|
||The type of the NPC involved in the interaction (‘creature’, ‘gameobject’, or ‘item’)|
||The creature/gameobject/item ID of the NPC involved in the interaction|
DisplayRaceID = -1 is used for interactions with inanimate NPCs: gameobjects, items etc. It’s mapped to a voice called “narrator” in
New Fields Added by
preprocess_dataframe function adds the following new fields to the dataframe:
||The race of the NPC, mapped from
||The gender of the NPC, mapped from
||The voice name, which is a combination of the race and gender fields|
||A combination of the text, race, and gender fields|
||A hash of the