Introduction

Alien: Isolation's audio runs through Wwise. Scripts don't reference audio files — they fire sound events by name, and Wwise decides what that means: which take to play, whether to pick at random, which bank the audio comes from.

Whenever you set a sound event on an entity parameter, OpenCAGE opens the sound event selector. That window has a player along its bottom edge, so you can hear what an event actually sounds like before committing to it — and export or replace the audio behind it.

The same window opens from View → Sound Editor once a level is loaded, with no parameter behind it: every sound event the level knows (shown below), to listen through, look up in the soundbanks, export or replace, without first finding an entity that plays one. The box along the top filters the list as you type. It stays open while you work in the editor and closes when the level does. Only one of these windows is open at a time, so editing a sound event parameter in the inspector closes the Sound Editor and opens the picker in its place.

The Sound Editor window: a searchable list of every sound event in the level, with the preview player along the bottom edge showing the loaded take, its variations and the Replace and Export buttons.

View → Sound Editor with an event selected. Opened from a parameter instead, the same window is titled Select for 'sound_event' and gains a Select button.

Events, Banks & Variations

Three ideas are worth having straight before you start changing things:

  • An event is the name a script fires. It is not a file.
  • A soundbank is the container the audio ships in. The same event can appear in several banks, because banks are loaded per level.
  • A variation is one of the actual takes behind an event. Most interesting events sit behind a random or switch container and pick between several takes at runtime — footsteps, impacts, and vocalisations especially.

The player exposes every variation it managed to resolve — below, the eight random takes behind play_facehugger_egg_opens — which is the only way to hear what an event will really sound like in the game rather than one arbitrary take of it.

The preview player with its variations dropdown open, listing the eight random takes behind the event.

Every take the event resolved to is listed; Shuffle picks one at random the way the game would.

The first time you open the selector, OpenCAGE starts indexing the game's soundbanks in the background so the first sound you click is ready rather than waiting on a cold index. While that runs the player's status line reads Indexing the game's soundbanks..., then Decoding... for each take.

Playing a Sound in a Script

Two entities do the work, and you generally need both:

  • Sound — plays a sound event. Set its sound_event parameter and trigger it; that parameter is what opens the selector described on this page.
  • SoundLoadBank — loads the soundbank the event lives in. The audio isn't resident until something loads its bank, so a Sound entity firing an event from an unloaded bank plays nothing.

Which bank to load is exactly what the Show Soundbanks button tells you — select the event, read off the soundbank it's listed in, and point a SoundLoadBank at that. See Soundbank Metadata.

Banks that are permanently resident don't need loading; those are configured separately under Permanent Soundbanks.

Dialogue

Character dialogue is fired the same way — through sound events — but by entities that also know which character is speaking, so the line comes from the right place and drives the right face:

  • Speech — one line on one character. Takes a character to speak it (plus an alt_character), and like Sound it inherits its sound_event from SoundPlaybackBaseClass. speech_priority decides what it interrupts or is interrupted by, and queue_time is how long it will wait for a slot before giving up. Fires on_speech_started.
  • SpeechScript — a whole exchange. Takes up to five characters (character_01…character_05, each with an alt) and up to ten lines. Each line has a line_NN_event for the sound event, a line_NN_character naming which of the five slots delivers it, and — from the second line onwards — a line_NN_delay for the pause before it. Fires on_script_ended when the last line finishes.

Use Speech for a barked line or a one-off; use SpeechScript for back-and-forth conversation, where hand-wiring a chain of Speech entities and delays would be far more work.

In the selector, a dialogue event shows its subtitle in the Content column, and the search box matches on that text as well as on the event name — so you can find a line by what's said. Lines whose audio depends on who is speaking can't be previewed; the player's status line says so when you select one.

Both still need their bank loaded, so the Show Soundbanks → SoundLoadBank step above applies to dialogue as much as to any other sound.

Previewing a Sound

Select an event in the list and the player fills in, as in the screenshots above. The top row is the transport; the row beneath is everything about the take that's loaded:

  • Play / Stop, with a seek bar you can scrub and the elapsed / total time. Play becomes Pause while the sound runs, and on a long sound a darker portion of the bar shows how far decoding has got.
  • A status line naming the soundbank the event is declared in, with a count of the others (Mission_DLC_ChallengeMap4 +4 in the screenshots), the container path it resolved through — Random, Switch > Random and so on — its sample rate and channel layout, and the media id and the bank or package it lives in. It's cut short with an ellipsis when the window is narrow, as it is above; hover over it for the whole line, or widen the window. If an event resolves to no audio at all, this line says why instead — an event that only changes sound settings, say, or dynamic dialogue that depends on who is speaking.
  • Auto-play — start playing as soon as you select an event, so you can arrow through a list and hear each one
  • A variations dropdown listing every take behind the event — Variation 1 of 8 (Random) and so on. It only appears when there's more than one.
  • Shuffle — jump to a different variation at random, which is roughly what the game does (also only shown when there's more than one)
  • Replace and Export — see below. Replace is hidden for an event that resolved to no audio.

Audio is decoded on demand rather than up front, so a long sound may take a moment before it starts.

Exporting Audio

Export writes the variation currently selected out as a .wav, named after the event by default. The file is decoded from whatever the game stores it as, so you get plain uncompressed audio you can open anywhere.

Exporting waits for the decode to finish first, which for a long sound is a few seconds — the button greys out while it works.

Note that this exports one variation, not the whole event. If an event has eight footstep takes and you want all of them, export each in turn.

Replacing Audio

Replace swaps the audio behind the selected variation for a .wav of your own. OpenCAGE encodes it into exactly the form the game's decoder expects and writes it into the soundbanks that hold it.

Everything is checked before anything is written. If the audio can't be imported, you're told why and nothing changes — you won't be left with a half-edited soundbank. If it can, you get a summary first:

  • Mono or stereo, duration, and sample rate
  • What it was encoded to, and at what quality
  • How big the new audio is against the audio it replaces
  • Any notes worth knowing before you commit — how many copies of the audio the game ships and which banks hold them, whether the files holding it will grow, or a copy that couldn't be reached

The Replace confirmation dialog summarising the incoming audio, its encoding, its size against the original and how many copies the game ships, before asking whether to replace the sound.

The summary shown before a replacement is written. Nothing changes until you answer Yes.

Answer Yes and the replacement is applied; the variation is then reloaded into the player, so you can play the new audio straight back.

Preparing a WAV

Replacement audio must be a .wav. A few things to keep in mind:

  • Match the original's channel count where you can. Replacing a mono sound with a stereo file changes how the engine positions it in 3D space. The summary describes the file you chose but doesn't compare it with the original — the player's status line is where you read off the original's sample rate and channel layout.
  • The encoding follows the original. On PC everything is Wwise Vorbis. The Switch build also stores some sounds as Wwise ADPCM and a few as plain PCM — OpenCAGE encodes to whichever codec the sound it's replacing used, so the game can still read it.
  • Size matters, but isn't fatal. The summary tells you how the new audio compares to the old; a much larger file grows the container it lives in.
  • A variation with no audio of its own can't be replaced. Some entries in a container are references rather than media — the player says so if you try.

Every Copy is Replaced

The same audio is often shipped in several banks at once, because banks are loaded per level and a sound used in three levels lives in three places.

A replacement therefore updates every copy the game ships, not just the one you were listening to — the summary says how many there are and names the banks, as in the dialog above. If it only changed one, the old sound would come back in whichever level loaded a different bank — which reads as a bug in the game rather than an unfinished edit.

If some copies write and others fail, OpenCAGE says so explicitly rather than reporting success, since a partial replacement leaves the sound changed in some places and not others.

Sound edits are global. Soundbanks aren't per-level data — replacing a sound changes it everywhere in the game, for every level, and there's no per-level override. Take a backup before doing this at scale.

Soundbank Metadata

With an event selected, the Show Soundbanks button at the bottom right of the window lists every soundbank the event appears in, as shown below. The player's status line already names one of them and counts the rest (Mission_DLC_ChallengeMap4 +4); this is the full list. It tells you which levels can actually fire the event — one that isn't in a bank your level loads won't play, however correctly the script is wired.

The Soundbanks dialog listing the five soundbanks that declare the selected event, shown over the Sound Editor.

Show Soundbanks: the banks this event is declared in — any one of these is a valid target for a SoundLoadBank entity.

This is where you get the bank name to give a SoundLoadBank entity, so the event you're about to fire is actually loaded — see Playing a Sound in a Script.

If the event isn't listed in any soundbank at all, it says so. That usually means the name is wrong or the event belongs to content that isn't shipped.

Which banks are permanently resident is configured separately — see Permanent Soundbanks.