wow-voiceover gives every World of Warcraft NPC its own synthesised voice
ml world of warcraft voiceover addon
At a glance
- What is it?
- wow-voiceover is a two part project, a Python command line tool that renders quest and gossip dialogue to audio files using text to speech, and a World of Warcraft addon that plays them back in game. The text comes from a local MySQL database, the voices are clones you create yourself, and a second version moves voice creation to a community site.
- Who is it for?
- wow-voiceover earns its place for a World of Warcraft player who wants the world to talk back, and for a developer who wants a worked example of a data extraction and text to speech pipeline feeding a game addon, since the schema, the lookup tables and the install steps are all documented.
- Can I use it commercially?
- Yes. Unlicense is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 85 days ago.
- What is it written in?
- Mainly Lua, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Two halves, a generator and an addon
The project is described in three lines, and they are the whole architecture. There is a command line tool to create audio files for quest and gossip text, and there is an in game addon for playing the generated voiceovers. The CLI uses data fetched from a local MySQL database and a text to speech service for the speech itself. That split is the interesting design decision, because it separates the slow, expensive part, which is rendering thousands of lines of dialogue, from the part that has to be fast, which is the in game playback of a file chosen from a lookup table. The repository reflects it, with the addon in a directory named for the voice over feature, a vanilla variant of the data directory, a main script, a package for the text to speech command line, a compose file for the database, example queries, and a requirements file. The readme also points out the split between users, telling non-developers to go to the releases page for the addon and that the rest is for developers only.
Getting a working environment takes five steps
The requirements are Python 3.10 or newer and Docker for the database, and the installation sequence is a standard data pipeline setup. You create and activate a virtual environment, install the requirements, copy the example environment file and fill in the text to speech key and the database credentials, bring the database up with compose, and then seed it.
python -m venv .venvpip install -r requirements.txtcp .env.example .envdocker compose up -dpython cli-main.py init-dbThe example environment file shows the full set of variables, with a key for the speech service and the host, port, user, password and database name for MySQL, and the default database name is the name of a classic server emulator, which is a hint about where the text data comes from. The compose file is equally small, a single MySQL 8 service with a root password, a named volume for the data and the port published to the host. The requirements file gives a sense of the tool's shape, with a data stack of pandas and numpy, an audio stack of mutagen and Pillow, a terminal interface built on prompt-toolkit, a MySQL client, and a small templating library for filling in the text templates.
The voices are clones you make, named by race and gender
The voice setup section is where the project becomes personal. The generation scripts assume you have voices created in the speech service named in the format race and gender, for example an orc male, and gender is always either male or female. The exact set of races the script looks for is listed in a constants file in the text to speech package, so the list of voices you need is discoverable rather than guesswork. You need to create your own voice clones, and the readme suggests a place to find sample audio, a well known database of NPC sounds with a page per creature, which is where you would record or collect a few seconds of a voice to clone. The mapping is deliberate, because a voice assigned per race and gender is what lets the addon pick the right clip for an orc when the same line is spoken by a human. The second version of the project takes that model to a community scale, where contributors submit voices to a site, the top rated voice for each character is used, and each character can have a unique model.
Installing the addon is a copy or a symlink
The generated audio lands in a sounds folder with separate subfolders for quests and gossip, and the run also produces lookup tables and sound length tables for the addon to use. Installing means copying the generated folder into the vanilla data folder and then both folders into the game's addons directory, under the classic era interface path, and the readme notes that you can symlink instead of copying for faster development.
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"The symlink route is the one a developer will use, because regenerating the audio and the tables is a normal part of the loop, and re-copying a directory of generated files after every regeneration is not. The two folders, one for the addon itself and one for the generated data, are separate on purpose, since the data is machine generated and the addon is source.
Other client languages are lookup tables, not translations
There are no voice translations for languages other than English, and the readme is honest that the text completion quality for other languages can vary significantly. What the project offers instead is a way to build the lookup tables for a non-English client, using a command that takes a language code.
python cli-main.py gen_lookup_tables --lang=LANGUAGE_CODEThe default is English when no code is given, and the supported codes are listed in a table covering two English regional variants, Korean, French, German, Simplified and Traditional Chinese, two regional Spanish variants and Russian. The distinction matters for anyone who has run a non-English client, because the addon identifies a line of dialogue by an identifier, and the identifier differs between client languages, so the table maps the same interaction to the right entry in that client. Generating a table per language is a mechanical translation of identifiers rather than of text, which is why it can be automated and why the text quality is not part of it.
The dataframe schema is the contract between the parts
The CLI documentation describes the dataframe schema that goes into the preprocessing function, and reading it tells you how the whole thing fits together. The source column says what kind of interaction it is, accepting, progressing, completing or gossip. The quest column holds the quest identifier, or an empty string for gossip. The text column holds the text template content, which is a template because the same line can be spoken with different names substituted. Then there are the identifiers of the character: the display race identifier, the display sex identifier, the name, the type, which is creature, gameobject or item, and the identifier itself. The preprocessing function adds the derived fields, mapping the race and sex identifiers to a race and a gender through lookup dictionaries, combining them into a voice name, combining that with the text into a lookup key, hashing the key, and producing the cleaned text after the template is rendered. One special case is documented, that a race identifier of minus one means the interaction is with an inanimate object, and it maps to a voice called the narrator.
A mature first version and a community second version
The release history shows two eras. The first version is the one described above, with v1.4.5 in July 2026 fixing addon loading for a particular client patch, v1.4.3 in December 2023 and v1.4.2 in August 2023 fixing a launch problem on a hardcore server. Then there is the second version, which is a link to a separate site where the community contributes voices, with the top rated voice for each character used, and a Discord for that effort, plus a link to the website code for it. The project is licensed under the Unlicense, which places the work in the public domain, an unusual and generous choice for a project that has grown a community around it. The tree also contains a retail plan document and an assets directory, and the project page points at a listing on a well known mod distribution site, which is how most players will find it.
Editorial conclusion
wow-voiceover earns its place for a World of Warcraft player who wants the world to talk back, and for a developer who wants a worked example of a data extraction and text to speech pipeline feeding a game addon, since the schema, the lookup tables and the install steps are all documented. It is the wrong tool if you are not running a private or classic era server with the data available, and it is the wrong tool if you want professional voice acting, since every voice is a clone you produce yourself. Verify three things before you build it: that you have the right text source, because the CLI works from a local MySQL database seeded by an initialisation command, that the voice model you need exists or can be created, since the generation scripts look for voices named by race and gender in your own account, and which client language you are targeting, because the addon ships English text and other languages rely on lookup tables you generate yourself. The project is released under the Unlicense, the last push was on 2026-07-29, and the newest release is v1.4.5.
Frequently asked questions
What does the wow-voiceover project consist of?
Two parts, a Python command line tool that creates audio files for quest and gossip text, and an in game World of Warcraft addon that plays the generated voiceovers. The CLI works from data fetched from a local MySQL database and uses a text to speech service for the speech.
How do I set up the wow-voiceover development environment?
You need Python 3.10 or newer and Docker. Create and activate a virtual environment, install the requirements, copy the example environment file to .env and fill in the speech service key and the database credentials, start the database with docker compose up, and seed it with the init-db command on the main script.
Where do the voices come from?
You create them yourself. The generation scripts look for voices in your own text to speech account named by race and gender, for example an orc male, with the exact races listed in a constants file, and you need to supply sample audio to clone. The second version of the project moves this to a community site where the top rated voice for each character is used.
Can I use wow-voiceover with a non-English client?
There are no voice translations for other languages, but you can generate the lookup tables for a client language with the gen_lookup_tables command and a language code, covering English, Korean, French, German, Chinese, Spanish and Russian variants. The readme warns that text completion quality in other languages can vary significantly.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/mrthinger-wow-voiceover)Was this useful?