This guide explains how to use a website called Cyberpunk 2077 SFX Explorer. It is an open source tool made by @zhincore on Discord.
In the sound effects section of the website you can search for sounds by events, tags or sound hash or using the filtering options. Once you find what you're searching for, open the detail window by clicking on the list item, there you can find where the files is located.
For .opuspak
sounds you need to use a tool like SoundFX Search and Replace to extract/replace it. Use the sound's hash to find it.
For sounds in a "Separate .wem file", you can usually find the file in WolvenKit Asset Browser, again, by the sound's hash.
If the sound is marked a virtual or nonexistent, you're out of luck for now and must find other way. Perhaps your wanted sound is a voice-over and you can find it using the section described bellow.
The voice-over and subtitles section allows you to search for the game's voice-overs using their subtitles, by quest ID or other filtering options. Again, once you find what you need, click on it to open the detail window.
Usually you want the path to the voice-over audio, if no audio was found, it probably doesn't exist in the game (otherwise ping @zhincore that it's missing). If it was found, it might've been found in various forms, for male vs. female V and in normal, holocall or helmet variant. Choose the one you want and click on it's path to copy it. This will give you the exact path that you can paste into WolvenKit to find that file. If you want different localization than en-us, change it in the path (e.g. to fr-fr
).
If you want the subtitles itself, if it was found, click on the "Subtitles found in" path to copy it, you can find the file in WolveKit using the path and using the String ID you can find the specific line.
WIP: This page contains a selection of guides on how to create sound-related mods but is still incomplete.
Feel free to sign up and add your knowledge to the wiki. It doesn't matter if the guide is shitty or if your English is bad, the next person can always improve on your stuff – as long as there is any stuff!
Cyberpunk uses Wwise audio system, which uses mostly proprietary ("secret", non-opensource) formats. But thanks to the community we have the tools to dig into them. But first, you have to find the file. Checkout my sound explorer tool that will help you find sounds and their location in the game. Cyberpunk stores sounds primarily in two ways, let's go over them.
The game stores voice-overs and most music as a .wem
file, which you can find and extract using WolvenKit, which can also export it to other format (like mp3) using the Export Tool. Alternatively I'd like to recommend VGMStream, which you can use in various ways, but I use it in CLI, it can also decode other formats very well.
All of SFX, grunts, and some music are packed together in files ending with .opuspak
. Those paks are mapped by a single .opusinfo
file, both types are very machine-readble and not made for humans. You have to use tools like SoundFX Search and Replace to modify them.
Few sounds, mostly car noises, are so-called *preloaded* in .bnk
files, they're mostly duplicated and can be found elsewhere, but some sounds are only preloaded. VGMStream is able to extract some of them, but not all, because they differ in audio format.
Some sounds do not exist are handled differently. For example generated (noise, sine wave, etc.), or generated by CDPR's custom Wwise plugins which I haven't figured out yet. This might require more research, but you most probably don't need those sounds anyway.
The aforementioned .bnk files are primarily for other purpose that storing audio. They describe how the audio should be played.
The process of playing a sound when something happens goes something like this: The game sends an event to Wwise, those are described in eventmetadata.json
file in the game's archives. Those events are connected to a tree of nodes describe in .bnk
files, this may include random selection of next node, layering, volume modification, switching between the next nodes according to a condition, etc. at the end is a node that points to an audio file (or a plugin) and that sound is played. Or multiple sounds are played at once, according to the previous nodes.
This happens every time V has to grunt, when a weapon shoots, car starts, crashes, or when you enter a building and ominous music starts to play, that went through bnks, too! This does not seem to happen for most voice-overs (apart for exceptions, for example I think the Konpeki Plaza alarm uses CDPR's Voice Broadcast plugin).
Every subtitle in the game has a String ID (which is a really long number) that is universal between languages. What .wem
audio file belongs to which String ID is mapped inside files starting with voiceover
and ending in .json
. Some of them are for holocall voice-overs, some for when the character has a helmet on. Then there is more .json
files in the subtitles
folders that contain the subtitles for each String ID... and by more I mean few thousands. So, again, it is easier to search those using my sound explorer tool.
There are a couple of pages about sounds on Roms1383s wiki for his Addicted Mod:
https://cyb3rpsych0s1s.github.io/4ddicted/cheatsheet/sounds.html https://cyb3rpsych0s1s.github.io/4ddicted/travelog/2023-03-31.html
Bioskop's comprehensive guide to vocoding - Google Docs
A basic guide for audio modding
This tool makes the process way easier, but to get the most out of it you need to understand how to use it:
First, we have to know about eventsmetadata.json, which is located at "base\sound\event" in your cyberpunk game folder. Extract this with wolvenkit or get it from the optional downloads in the page above and add it to your project. This archive is the one that tells the game where each sound is, and what to use it for. Each sound has a WWise ID assigned to it and an event name, depending on what you want to do, you might not need the tool, but we're going to cover as much as we can.
Redmod can be used to replace all the sounds in an event with a .wav file. Redmod is the only audio modding method that doesn't cause compatibility issues but it's not the best one because it's a very limited solution, only letting you use one .wav file to replace all the sounds in an event with few customization options.
If this is what you're looking for, you can read more about audio modding with redmod here:
Any mods that edit eventsmetadata.json will be incompatible with each other but will also allow you to make changes to the game that can't be made any other way.
This is by far the easiest edit as long as you know what you want to change, and all you need is wolvenkit and notepad. Right click eventsmetadata.json in wolvenkit and click on 'convert to json', this will make the file readable. Now, open up eventsmetadata.json.json in notepad and look for the events that have the sound that you need, for example, you can press CTRL+F and search for w_melee_blunt_impact_bat.
You'll see isLooping
, maxAttenuation
, maxDuration
, minDuration
(see below for information on these) and the event name, as well as the WWise ID right at the end. Copy this ID.
Now, say that you want another melee weapon to sound like a baseball bat, all you have to do is to look for the event that has the sound you want to change for that weapon as outlined above and replace the ID with the one you copied earlier for all the events with that name. Save your changes and right click on eventsmetadata.json.json in wolvenkit and click on convert from json, pack your mod, install it and your melee weapon should now sound like a baseball bat!!
Add eventsmetadata.json to your wolvenkit project, right click on it inside your project and click on 'convert to json', then open the resulting eventsmetadata.json.json in notepad and look for the event that has the sounds you want to mute with CTRL+F. After you've found it, look for its WWise ID and set it to 0, save the file, right click on it in your project again, click on convert from json and pack your mod. Any sounds associated to the event you edited should now be muted.
The information that follows is the result of what was observed during testing and has not been fully confirmed as of February 16, 2024.
isLooping
: whether or not the sound will loop, can be set to 0 or 1.
maxAttenuation
: controls the loss of energy a sound will experience the further it travels. It is not known whether this property has an impact on how loud a sound is or how different environments make it behave, but it is speculated that the higher the maxAttenuation the further the sound can travel before it can't be heard anymore. Can be set to any value from 0 to 1000.
maxDuration
: the amount of time a sound plays for before it stops.
minDuration
: the minimum amount of time a sound has to be played for before the game can stop it.
You can find more information on the wiki under
A Basic guide on the different ways to play a sound effect in-game
This is a very basic tutorial so you don't need much knowledge to do it successfully.
Wolven kit
Any text editor capable of opening a big JSON file without crashing
That's about it.
This tutorial presumes that you already have a mod project in WolvenKit and will not walk you through how to create one.
If you don't have redscripts in your project, you will need to add the following structure to your resources folder inside your mod folder:
There are 3 documented ways to play sounds using scripting. Two are linked to the event system and the third one is linked to a helper function:
If you try to run the script now it will most likely fail because you don't have the player object used to queue or play the event.
So how to get the player?
It's actually quite easy, once a save has been loaded, you can simply use:
You are not even obligated to get the player. You can use any GameObject
capable of handling events in the event way and you can use any GameObject
at all using the helper function. If it isn't valid, the GameObject
method will use the game engine to play the sound. (It will not be spatialized this way)
If you did everything correctly, your sound should be played in the part of the script where you used it.
And now, you will probably want to play other sounds. Sounds played by the game are referenced using a redIdentifier.
To find many of these identifiers for sounds, you will need to use WolvenKit and navigate to:
You can then import it into your project, turn it into JSON and explore the JSON file to find all the tags, for example:
Use any of these IDs and experiment!
There is a lot of them so use string search to find them more quickly. You can also search for them in the events
array for an easier search with tags.