I’ve been extremely critical of “AI”, really machine learning (ML), especially when it comes to image generation. I have yet to find any capable of producing a true top down image, let alone one that doesn’t belong in a horror movie.

However, the voice generation/cloning stuff is honestly pretty good, and has been for years. It’s far from perfect, but the main issue is not technological, it’s that parody videos that probably should fall under fair use keep getting taken down due to copyright infringement, as copyright law is yet another aspect of Weimerica that is deliberately broken on behalf of the big, entrenched interests.
I do agree that, barring some special circumstances, it should be illegal to use someone’s voice without paying them, no matter how much David Attenborough’s voice and Warhammer 40k go together like peanut butter and chocolate. Yet, ML companies train their models on explicitly pirated material, something that Anthropic, Meta, and AI Labs have all admitted to in court, and despite the obvious illegality, judges consistently rule that they are somehow allowed to do this. Frankly, there’s a strong argument that they shouldn’t be allowed to train their models on even non-pirated content, but ZOG needs to be competitive with China, so get used to that monstrously one-sided double standard, peasant.
I’ve used ElevenLabs to produce all my voice clone parodies, and have been fairly happy with it. Sure, it’s a bit rough around the edges. The intonation is often very wrong, some words get bizarrely mispronounced, and every now and then it borks, and the output is pure nonsensical gibberish that sounds like demons talking in tongues. Still, tweaking of the input, and hitting generate a half dozen times usually produces a total output that can be amalgamated into something decent. When the point is to make something satirical it works well enough.
It’s also a good fit for voice lines that are deliberately degraded in some way, such as enemies chatting over the radio. Or, alternatively, an announcer who’s supposed to be deliberately campy.
Producing the announcer lines was fairly easy, albeit time consuming. The much harder problem is figuring out how and when to play them in game. We certainly don’t want the situation below. It is kind of hilarious how repetitive it is, but that joke gets old fast.
My initial vision for the announcer was that he would serve as both play by play and colour commentary all in one. He should be speaking roughly half the time, but it’s not supposed to be Foley sound, made to fill the background of the soundscape. This is supposed to highlight the interesting things happening, while providing flavour.
But before delving into anything more complicated, I simply added a bunch of variations of one particular line, in this case melee’ing an enemy, along with some basic programming that randomly selects among them, biasing against recently played lines. I coupled that with some code that prevents us from starting a new line in rapid succession if the player hits a number of enemies with the same swing.
The above is a tremendous improvement, although there are still many issues. First of all, most of the time it doesn’t feel right for the announcer to cut himself off. For example, when he’s saying “he’s gonna feel THAT one,” cutting that short so that he can say “nice,” in response to some other swing feels incredibly artificial. On the other hand, we can’t just refuse to play a new line provided he’s currently speaking, as there are many situations, such as the player dying, that should always receive an immediate comment. This was solved by assigning different types of lines are numerical priority over each other. Important lines will interrupt less important ones.
However, the second issue is a bit more abstract, and reminds me of the somewhat limited humour of the “Shaniqua Twerk Attack.” I was having a great time coming up with all sorts of complicated, humourous lines for the announcer to say. Then fighting the machine learning software to properly repeat them with generally the correct intonation, then spending ungodly amounts of time editing each line out in Audacity, getting them in the program, and bundling them together with similar lines to be played appropriately. And after doing all that I realized that the most important lines were not of the “and she’s hosin’ em down like Arnold in Predator” kind, but the much more brief and mundane “oh, woah, wow, oops, ahhh, ouch, tasty,” generic reaction grunts that I hadn’t particularly cared about.
There is a lot going on during gameplay, and we want the announcer to be a purely positive addition, not a distraction. When an enemy gets smacked by the player, we really don’t need the announcer to say “oooh, bitch slapped,” or “she’s really bringin’ the smackdown,” at least not every single time. A simple “ohh,” suffices, which is true for the vast majority of events worth commenting on. While the more complicated and unique lines are great, we actually don’t need unique lines for the announcer to respond to sniping versus melee’ing an enemy, when “ouch,” or “nice,” works just fine. The more complicated, unique lines were shuttled off to another system that keeps track of rare lines and plays them periodically, with a lesser chance of being interrupted.
However, I needed more generic responses, or at least thought that I did. I needed more complicated lines as well, but figured I’d have to manually come up those, as any ML bot wouldn’t be capable and they’d self censor anyway. So I hit up ChatGPT to generate a list of random react words/sounds. One thing lead to another, and I ended up with this.

Yes, one thousand entries. Sure, it was easy enough to drag the output into ElevenLabs voice generation tools, and get a reasonably good output. The issue is that I still needed to manually edit the resultant audio file into a myriad of clips with all dead space removed, which is a painfully tedious process. I briefly wondered if there was some machine learning editing software that could help me, but the problem too specific.
Luckily, not paying for ChatGPT saved me from myself.

Eventually I realized, to my great disappointment, that my original plan of playing more complicated lines instead of simple “woah!” type reacts, was simply better. It’s true that not every line from the announcer needs to be incredibly long and entertaining, but if they become too short and generic much of the flavour is lost, and it feels very videogame-y, and not in a good way. The underlying issue was not a lack of variety with regards to a specific type reaction, such as to an enemy being meleed, but rather the absence of entire types of comments.
To be more precise, I only had created and (partially) implemented lines for player deaths, starting/restarting, killing enemies, meleeing enemies, using stasis, and a few other small one-offs. If the only kind of line that the player hears during a game is after smacking or killing enemies, not only does that get tiresome, but there’s going to be a lot of dead air where nothing is said. My original plan was to fill that with random bantz, which on paper worked, but it feels better when the announcer is responding to what the player is doing.
To fix this I created and added lines responding to the player’s movement, the types of enemies present, the player’s current score, weapon usage, etcetera. Lines such as “the NPCs are gathering,” “she’s cautiously running around,” “she hasn’t thrown a grenade in a hot minute,” etcetera. Basically, more play by play than colour commentary, but not just generic, random reacts. It’s similar to a sports announcer saying things like “Randy Moss goes in motion,” or “Tkachuk to Eichel,” only it feels good, because the commenter is responding to you.
Implementing this required an enormous increase in programming logic. It had been relatively trivial making enough quips that described the same phenomenon, but I now need to make sure an appropriate variety of lines are played, even though many types of quips will be appropriate at any one moment in time. For example, if the player keeps running around, we may want the announcer to say “she’s repositioning,” but then follow it up with “I haven’t seen this many trannies since that Reddit mod meetup,” and “still hasn’t reloaded that sniper,” instead of “she’s movin’ to a better angle,” and “those long legs of hers are getting a workout,” even though those lines will still be valid.
It also required me to keep track of an inordinate amount of data, with a huge amount of one-offs. For example, the announcer will comment on any kind of enemy that is in the arena, but that doesn’t make sense for the Redditors, who are a trash mob type enemy. Those guys aren’t worth a comment if there’s only one of them, and the comments are in the vein of “the Predditors are surrounding her,” which implies multiple of them. Similarly, the weapon/teleport usage needed to be tracked, and each weapon is given two custom usage use rates which govern the eligibility of comments for low and high usage respectively.
Put all that together, and here’s the result.
This was, by far, the most heinous part of EEI’s development. For a good long time the announcer just didn’t work, which was incredibly painful, partly for all the same reasons a joke not working is frustrating, but mostly because it was such a time sink. In the future the announcer will be improved upon bit by bit, but I’m shelving those updates now that I have something I’m happy with. It’s in a decent state right now, and it’ll stay that way for a long while.
This experience has made me realize that I need to write far more frequently, but with far shorter articles in the future. If I’d just gotten the first part of this article up, that might have let me put the announcer on the backburner for a while and I could have pivoted to something else without feeling so frustrated.













