Mass Effect 2 & 3: Redirecting, Replacing and Adding Audio to Conversations - ME3Tweaks/LegendaryExplorer GitHub Wiki

February 2025: Full rewrite of this guide to account for currently available tools and best practice.


This guide will outline some methods to add audio to Mass Effect 2 and 3 (Legendary Edition).

Fresh banks cannot be made for Mass Effect 3 (original release), but other methods should work. We cannot add new audio to Mass Effect 2 (original release) at all and only FOVOs for existing conversations will work. Mass Effect 1 (both Legendary Edition and original release) uses different audio middleware and is not covered by this guide.

If you want to add new audio to conversations in Mass Effect, you will need to:

  1. Add new audio to the game by

    1a. Creating a new audio bank in Wwise or,

    1b. Cloning and fully renaming an existing audio bank.

  2. Make the new audio play in a conversation by

    2a. Setting up the new lines to play directly or,

    2b. Using a method known as a “FOVO” (FaceOnlyVoiceOver) to “borrow” lines from other conversations in the same file.

The advantages and disadvantages of these approaches will be outlined in more detail below.

1. ADD NEW AUDIO TO THE GAME

To provide context, here is an overview of audio in Mass Effect. The raw audio for conversations is stored in an audio file cache (*.afc). A package file (*.pcc) then contains:

  • WwiseStreams – these point to the raw audio in the *.afc file. These are your dialogue lines.
  • WwiseEvents – directs a WwiseStream to play (more broadly, other events, such as stopping audio, are also controlled by WwiseEvents, but within the context of dialogue, these make the lines play).
  • WwiseBank – this is the audio bank. It’s the nervous system for the conversation's audio content. It connects the WwiseEvents to the WwiseStreams, it sets volume, it can add filters (like helmet filters), it can hold playlists, randomise groups, etc. Our ability to visualise and edit existing vanilla WwiseBanks is very limited and largely done via hex editing. However we can create brand new WwiseBanks.

OPTION 1A: CREATING A BRAND NEW AUDIO BANK

Here is a tutorial on creating new WwiseBanks for Mass Effect 2 & 3 (Legendary Edition only – this is not possible for the original releases). This tutorial goes over replacing a soundtrack for the main menu, and as such is simpler than a conversation bank. However it covers the basics of adding audio, adding WwiseEvents, the necessary settings and how to generate and then import a bank.

By copying the vanilla naming conventions for both WwiseStreams and WwiseEvents (including the presence of the TLK string in the name - keeping the exact same format), you should be able to use this guide to create an audio bank for a conversation. We cannot currently create localized banks, and so if you plan to support multiple languages you would need to create each bank separately.

OPTION 1B: RENAMING AN EXISTING CONVERSATION (INCLUDING AUDIO BANK)

Here is a tutorial on fully renaming an existing conversation so that it can be safely reused. After fully renaming the conversation, all its lines may be replaced with new lines, with no risk of overwriting anything original.

WHICH OPTION TO USE

Advantages of a fresh bank:

  • Guaranteed to be wholly unique (renaming a bank involves more opportunities for human error or duplication).
  • More efficient as it will contain only the audio required for the mod – no extra bloat.
  • Smaller footprint as it will not include the rest of the conversation (dialogue nodes, speakers, facefx, etc). If you aren't making a conversation from scratch, these are not needed.
  • Complete control over WwiseBank structures (random containers, playlists, etc. – less important for conversations but a consideration for broader audio work).
  • With the current tools, it is less work than renaming a bank under most circumstances.

Advantages of a renamed bank:

  • Perfectly matched ambient audio buses.
  • Can reuse specialised filters such as helmet or holocomm filters.
  • Comes with a reusable conversation (speakers, facefx, dialogue nodes, etc.) If you’re making a conversation wholly from scratch, this is useful.
  • There may be additional lines in the bank you are not using. While this bloats the file, it is also convenient if you need to expand your bank in future or if you are not sure how many lines you will need yet.

ONCE YOU'VE MADE YOUR DECISION...

You should now have imported your audio into the package file. You will either have imported your brand new bank created by Wwise, or you will have cloned in your fully renamed conversation.

Throughout the rest of this tutorial we will use the terms "resource" and "target" conversations. A “resource conversation” or “resource bank” refers to the conversation or bank you have added to the package in order to hold your new lines. A “target conversation” refers to the conversation you are trying to add lines into. If you're creating a conversation from scratch, these two may be one and the same, but to keep things simple, we're going to focus on a situation where you're adding a few new lines to a vanilla conversation.

ADDING NEW AUDIO TO THE RESOURCE CONVERSATION

If you have a fresh WwiseBank you should have added the your modded TLK strings to the names of the WwiseEvents and WwiseStreams when you made the bank, and your audio will already be in place. However, if you are using a renamed bank, you will need to update each dialogue node's TLK string and replace its audio. We will now look at that process.

First, select the dialogue node that you plan to replace. Then open the experiments menu (this must be enabled in LEX settings) and select “Change Audio Node StringRef”.

Figure 1

You will be prompted to enter the new StringRef – this is the TLK number of your line in your mod’s TLK file. You may see “No Data” once this is complete. If so, open the Tools menu, then select Manage TLKs.

Figure 2

Here you should choose “Auto find TLKs” for the relevant game, then choose Reload TLKs. Close the TLK Manager. Then go back to the Tools menu and select “Force Refresh”. Your line text should now appear.


The experiment is the fastest way of changing the TLK reference for a dialogue node. But for completeness, to manually do this you would need to find the WwiseStream and WwiseEvents in the package editor and change the old TLK number in the names of those exports to the new one. Be aware that Shepard lines will have two WwiseStreams (one male and one female). All lines have two WwiseEvents (one male and one female). You also need to change the FaceFX data to match the new TLK. To do this open the FaceFX editor by selecting the dialogue node, going to the Assets tab and selecting the icon with the drama masks.

Figure 3

Once you’ve entered the FaceFX editor, the correct line should be automatically selected. Towards the bottom of the window, you will see three places with the current TLK string listed – “Name”, “Path,” and “ID”.

Figure 4

Double click on the lines themselves and a dialogue box will open which will allow you to edit the names and replace the old TLK string with your new string.

It is important to stick to the vanilla naming conventions. If a TLK string has leading zeroes, keep them. If it does not, do not.


Now that you have updated the TLK string, you must add the audio. This time, open the line using Sound Explorer. Note there is an entry under the Male WwiseStream, but the Female WwiseStream is empty. Lines for characters other than Shepard are always kept in the Male stream. Lines for Shepard will appear in both (because every Shepard line has a male and female variant), and you must replace both.

Figure 5

Sound Explorer should open with the correct line selected. Select “replace” and choose your audio line.

Figure 6

Set the sample rate to the highest possible, and change the destination AFC to your mod’s AFC name. It will append the line into the AFC if it already exists. If it does not, it will be created. Select Replace Audio.

2. HOW TO GET YOUR LINE FROM THE RESOURCE BANK TO THE TARGET CONVERSATION

You should now have a new line in a resource bank/conversation, and a target conversation you want the line to play in. You will need to decide how to get one into the other.

Broadly you have two choices. You can either move the line from the resource bank to the new conversation so it will function like any other vanilla line, or you can use a FOVO (FaceOnlyVoiceOver) to pipe a line directly from your resource conversation into your target conversation.

Advantages of moving the line:

  • Follows the intended process.
  • Easier to move within the conversation, and to work with, once it’s set up.
  • Only option when using a fresh WwiseBank.
  • Works with ambient lines (FOVOs aren’t always fully reliable with ambient dialogue).
  • Can interpolate FaceFx between nodes.

Advantages of FOVOs:

  • Can be used so that a second person speaks during a dialogue node.
  • Avoids a rare, but so far unsolved bug where the player must press space to advance the line (primarily seen in LE3).
  • Easier to clone wholesale to a new file if creating compatibility patches.

2A. MOVING THE LINE DIRECTLY

First we will discuss moving the line to the new conversation correctly. Open the package file in package editor and identify your resource bank, and the WwiseStream and WwiseEvents for the line you want to move. You must then move them, by changing their parent links, to the corresponding location in the target conversation.

Figure 7

In this example we want to move Export 3616 (a WwiseEvent outlined in blue) from the resource conversation (dlc_mod_assassin) to the target conversation (norhen_tali_mr_cirmir). The blue arrows show the parent export in both the tree view on the left-hand side, and the link in the metadata tab on the right hand side. It is currently 3544. We need to move this WwiseEvent from the resource conversation’s Audio package to the target conversation’s audio package (which is outlined in green).

To do this click into the Link in the Metadata tab and update the number to 2414 – the export number for the target conversation’s Audio package. The WwiseEvent will move to the correct location.

As noted previously, WwiseEvents in dialogue come in pairs – one male, one female. The image above shows moving the female WwiseEvent. The male WwiseEvent is directly below, Export 3617.

Next the same process needs to be repeated for the WwiseStream. In Mass Effect 3, this is found inside the Int package (because this is the International localisation). In the image above this is Export 3545, directly beneath the Audio package. You will need to move the relevant WwiseStreams to the Int package for the target conversation using the same method outlined above.

Mass Effect 2’s audio structures are slightly different, but the same principle applies. Find the WwiseEvents and WwiseStreams you need to move, then change the Metadata Link so that they are now in the relevant place in the target conversation instead.

Next you must add ReferencedSoundCues to the correct speaker.

Figure 8

As shown above, find the FaceFXAnimset for the person who will be speaking the line. Use the + icon at the top of the right-hand pane to add an entry to the ReferencedSoundCues array, and enter the export number for your new line’s WwiseEvent. Note that every speaker will have a Male and Female set of FaceFX, and you will need to add the corresponding WwiseEvent to the corresponding array.


A note on Male/Female Events and Streams. This always refers to Shepard’s gender. Characters other than Shepard have only one WwiseStream, but they still have M/F WwiseEvents (which will both trigger the Male WwiseStream) and FaceFx.


Now, move over to the FaceFX tab.

Figure 9

Clone a line (it doesn’t matter which). Do this by right-clicking and selecting Clone. It will appear at the bottom of the list. Once you have cloned the line, you will need to change the TLK references highlighted in green to the TLK for your new line. You also must ensure that the index number (outlined in blue) matches the array position of your line in the Speaker ReferencedSoundCues array. This should automatically increment, but it is worth checking.

You can also import the actual lipsync for the line at this point – a process which is beyond the scope of this tutorial, but is detailed in this useful resource here. If you are using placeholder FaceFx because you have not yet generated lipsync, make sure that at least one of the lipsync tracks lasts the length of your line, or it may get cut off prematurely. You can add a default keyframe to ensure the FaceFx track is long enough.

You should now be able to use your line in the target conversation by simply changing the dialogue node's current TLK to your new TLK. This will swap the line for your new line and new FaceFX.

2B. USING A FOVO

A FOVO – or FaceOnlyVoiceOver – will make a character say a line during a dialogue node, but it does not have to be the node's designated speaker. It also allows more than one line to be spoken during a node (by the designated speaker or another character). FOVOs – as used in the vanilla game – are generally there to allow additional lines to be spoken within the same dialogue node.

However, a FOVO can “borrow” a line from any conversation held within the package file. Including a resource conversation you cloned in. It must be a full conversation, with a _dlg export, speakers, FaceFXAnimSets, etc. So you cannot use this method if you created a fresh bank in Wwise.

Here is a method to “bootleg” a new line via a FOVO. Essentially you silence the vanilla line, and then add a second line as a FOVO.

To start, open your target conversation in the dialogue editor.

Figure 10

Here we are going to change node E1 (outlined in red) to say something different, replacing it with a line from our resource conversation.

Take note of the area in the blue box. This is a list of all conversations in the package file. We are looking at our target conversation – citprs_miranda_talk2_m_dlg (export 93). We will be using a line from our resource conversation – dlc_mod_assassin_13_dlg (export 1178).

Highlight the dialogue node you want to edit, then, on the matinee tab, open the InterpEditor (outlined in green).

Figure 11

In the InterpEditor, right click the group to which you want to add your FOVO and choose Add New InterpTrack. In this specific case, group is relatively unimportant and is largely a matter of organisation. The Conversation group is a good default choice.

A dialogue box will open with a search bar. Search for SFXInterpTrackPlayFaceOnlyVO and add this to your conversation group. It should look like this, with default settings:

Figure 12

Open Add Property (outlined in blue). On the left pane of the dialogue box you will see a number of classes. Select SFXGameActorInterpTrack and then add the m_nmFindActor property from the right pane. Next, select the InterpTrack property from the left pane, and then add TrackTitle from the right pane.

Next, select m_aFOVOKeys (as shown in Figure 12), then press the + symbol next to “Array” (outlined in green). Do the same thing for m_aTrackKeys.

Your FOVO is now ready to fill in with data.

Fill TrackTitle with a plain text description of the track. This is for your reference in future.

Enter the name of the speaker into the m_nmFindActor property box. Note that Shepard will always be Player. The owner of the conversation will be named Owner. Other named speakers in the conversation can also be called this way. They will have specific tags, which you can check by looking at the speaker drop-down menu in the dialogue editor’s main interface.

Expand m_aTrackKeys to see the array entry you just created. Enter the time at which you want the line to play. Often this will be 0 (which is the default setting).

Expand m_aFOVOKeys so that you can enter information into the array entry you just created. Enter the export number of the conversation which holds the line you want to play in the pConversation field. In this case, it will be 1178 – dlc_mod_assassin_13_dlg.

nlineStringRef must be filled with the TLK string of the line you want to play.

You must also ensure that bAllowInConversation is set to true. bSubtitleHasPriority should also be set to true.

It should look something like this:

Figure 13

Close the InterpEditor. In the main dialogue editor, on the matinee tab, check “Non vocal line”. This is to silence the vanilla line and ensure it does not play. Under the GUI Control tab, check "Hide subtitle". You can also change the TLK string in the main node to your new line’s TLK just for organisational purposes so you can track what line you’re really playing here.


In LE2 the above does not work, and instead you must go into the InterpEditor, and edit BioEvtSysTrackVOElements (in the Conversation group) and move the line to a time later than the length of the node – for instance if a node plays for 3 seconds total, set the vanilla line to play at some point after 3 seconds has passed).


Reopen the InterpEditor, and, in the main interp’s properties panel, add m_aBioPreloadData.

Figure 14

Add an entry to the array, then enter the export number for the FOVO InterpTrack you just added into the pObject field. Set fTime as the time at which the FOVO will play.

Figure 15

The FOVO is now complete. The new line will play instead of the old one.

CLONING DIALOGUE NODES

If you are adding brand new lines to a conversation, rather than replacing existing lines, you will likely need to add fully unique dialogue nodes.

It is therefore worth drawing attention to the fact that when you right-click and clone a dialogue node you are not creating a fresh new line within the conversation. You are simply creating a new access point for a specific Interp. An Interp in this context is all the data that determines what plays during that dialogue node – camera angles, animations, audio lines, overall length, depth of field, sound effects, prop placement, etc.

See the illustration below. R20 has been cloned (by right-clicking and selecting “Clone Reply”) to create R40 as a new dialogue node. Both R20 and R40 are accessible via different dialogue wheel positions, and R40 then feeds back to the same node as R20. The dialogue editor overview goes over this in more detail.

Figure 16

As things stand, nothing else has been changed. The same line will play, etc. Crucially, R20 and R40 are currently still pointing at the same underlying InterpData. Look at the R40’s matinee tab.

Note the ExportID (outlined in blue) is 917510. Selecting R20 would show that same ExportID.

R40 and R20 can have different plot control information and can be accessed in different ways, at different points in the conversation. Sometimes it is genuinely useful to be able to clone a node and point it at the same vanilla data. Investigate options for instance may need to be accessible in multiple places within the dialogue tree.

But at the moment, if you open up R20 in the InterpEditor and make changes, it will be reflected in R40 and vice versa. If you are adding a brand new line as an alternative response, you clearly do not want this.

To fix this we need to make a new, unique Interp and point R40 at this new Interp. Begin by opening the sequence editor (the shortcut button is outlined in green).

Figure 17

Every dialogue node will, at minimum, consist of the four sequence objects shown above. A ConvNode (red), an Interp (yellow), an EndCurrentConvNode (green) and an InterpData object (blue). In the image above, the ConvNode has been selected. You can see outlined in purple, the m_nNodeID property. Note this matches the ExportID for the dialogue node.

You need to right-click the sequence objects, choose “Clone Object”, then drag/drop the input and output links to set up an identical sequence. When you right-click the InterpData object you must select “Clone Interpdata Tree” or you will not clone all the relevant cinematic data.

Then change the m_nNodeID to something unique – I would recommend adding leading or trailing digits in order to safely move the ID outside the vanilla range.

Close the sequence editor. Then in the Dialogue Editor, select your cloned node, and on the matinee tab, double click the current ExportID and change it to the new number.

The node is now fully unique and can be independently edited.


Within Exkywor’s Buttons for Lazy People in the Experiments menu, there is a useful option – “Clone node and sequence”. If you select a dialogue node, then select this experiment, it will prompt you for a new ExportID. It will then clone the node and the sequence objects automatically. While this is extremely useful and a huge time saver, you need to be aware that it will only clone the four core objects shown above, and any variable links on the Interp (the links along the bottom). It will not clone additional output links. If any objects exist between the ConvNode and the interp, the experiment will not work. So you do need to check the original sequence to see if there is anything you will need to manually correct after running the experiment.