Bulk Audio Manager - Replace audio across multiple games

The plugin can be found here.

Roblox audio update has recently forced a lot of audio to be privatized. As a result, developers are forced to either re-upload audio or replace them.

This plugin is to allow the bulk replacement of sounds affected by the changes, especially for games with hundreds of unique audio. It is designed to be used along with Roblox’s official Audio Discovery Plugin. Essentially, you are still manually replacing audio, but the plugin allows you to quickly replace duplicate IDs and IDs across multiple games.

I made this plugin specifically for my group and games as it faces this specific issue of requiring 300+ manual audio edits to transition back to a working state. However, I have decided to make it public in order to help out some folks under the same circumstances. I will put a little bit of time to fix some of the bugs if any arises. However, this is only a short term thing as I’m also in the process of updating audio.

This plugin is built off of the concept of this post. While the original idea allows bulk replacement, it doesn’t support collaboration, error handling/verification, user friendliness.

The features of the plugin excels in specific scenarios, namely:

  • the bulk replacement of sounds in multi-place games
  • the bulk replacement of sounds where repeat occurs (duplicate sounds)
  • automatic bulk replacement of both scripts and sounds

Drawbacks:

  • Unfortunately, the plugin doesn’t come with the bells and whistles of a full blown plugin, such as GUIs and fancy boxes. This is just something whipped up by me to quickly update all of my games, and to never use again… Unless it’s also to bulk replace more audio…
  • Since this covers such a niched portion of the community, I cannot guarantee that all bugs and overheads are caught. I can guarantee that the plugin works if you follow the appropriate steps, as it has been used on my own games. I would recommend to start on a small place with a backup just in case. Any issues that you might find, please post below!

Documentation:

About the PluginData Module (Generated from Plugin)

The module contains necessary data in order for the plugin to have functionality.

Meta Info: Contains information generated by the “Generate” and “Update” plugin buttons. This includes plugin version, the user who created/last updated it, the place it last came from, and the day of last update.

Context Dictionary: Contains information on what sound IDs are used for what objects in the game. This is used by the plugin to determine if any ID changes are made so that it could log it.

ID Dictionary: The main part of the plugin. This portion tells the “Export” button which IDs to replace. The plugin also includes additional information such as name of a sample Instance (for readability/easy searching) and LoadFail, which is whether the ID is loaded or not into the game. In addition, the dictionary may also include R_[SOUND_PROPERTY_NAME] if it’s outside of the default and is applicable. This is to ensure that the characteristics of your sound are also transferred.

You are free to edit the module. The plugin will handle user errors accordingly:

  • Self-Replacement (1234 → 1234): delete the Replacement entry on that ID.
  • Circular Reference (1234 → 5555, 5555 → 9001, 9001 → 1234): “Export” will not update sounds and warn the user.
  • Missing Reference (Context Dict. Found, no ID Dict.): Append new entry.
  • Missing Reference (ID Dict. Found, no Context Dict.): Do nothing
The "Generate" Button

Overview: This button generates an “audio database”, stored as a module. All other subsequent actions performed will require the user to select the module before clicking on an action.

  1. Select an instance as the parent, if no selection is made, “Workspace” will be selected.
    image

  2. Click “Generate”. A ModuleScript should appear. The ModuleScript contains metadata in addition to the full list of audios picked up and processed by the plugin.
    image
    image

The "Update" Button
  1. Manually change some audio IDs. If there are duplicates of the same sounds and ID, only change the ID of one of them.
    image
    image
  2. Select the data module and hit update again.
  3. A new entry should appear that is to be interpreted as 1234 → 9001. This means that all sounds/scripts with ID 1234 will be replaced with 9001 when “Export” is called.
    image
  4. Additional changes to the ID can be made. You can either go into the modulescript itself and change the IDs, or change the Sound’s SoundId and hit update again. Note that if there are reference chains in the module, the objects-to-be-replaced will take on the ID of the end of the chain.
    image
    All sounds/scripts with an ID of 1234 will be replaced with 9002 in this case.

NOTE: Hit update as often as possible. This will ensure that no forks could potentially develop from user error (script finds an ID change of both 1234 → 5555 and 1234 → 9002; bad news).

NOTE 2: Do check the output log for audios that might’ve been changed but you didn’t intend to change. This could be caused by edge cases, such as replacing an Audio ID but copying it over to be used for another thing: essentially preserving the same ID, which means that both IDs can co-exist without needing to replace each other (if you do not intend to delete the old audio, simply delete the Replacement key in the entry).

The "Export" Button
  1. Once you are happy with your sound updates. Select the module and hit “Export”. This will replace your IDs in audio and scripts.
    image
  2. You may find warnings such as “rbxassetid://” DETECTED IN ServerScriptService.AudioManagerPlugin WITHOUT DIRECT ID LINKED, CONSIDER SCANNING SCRIPT AND MANUALLY CHANGING IDs" This means that the plugin requires you to manually go in and update the ID of the script, as it is unsure of whether to replace it or not.
function ag()
	print("rbxassetid://9001") -- will be auto replaced
end

print("rbxassetid://5555") -- will be auto replaced

local testTable = {
	["rbxassetid://5555"] = true, -- will be auto replaced	
}


print("rbxassetid://"..1234) -- concatination, will NOT be replaced

local soundIDs = {
	1234, -- ambiguous number, will NOT be replaced
}
Examples
Bulk Update a Single Game
  1. Generate a new module.
  2. Open up the Roblox Audio Discovery Plugin.
  3. Find a sound that no longer works.
  4. Make changes to a single instance of that sound.
  5. Select the module, hit Update.
  6. Select the module, hit Export.
  7. Changes will reflect on all sounds of the same ID.
  8. Repeat until all sounds are updated.
  9. Once done, store the module or bring it to another place to bulk replace.
Importing Sounds from Place A to B (with Module)
  1. Make sure module in A has Replacement entries after regular updating.
  2. Copy module from A and paste it anywhere in B.
  3. Select module and hit “Export”.
Importing Sounds from Place A to B (without Module)
  1. Go to place B.
  2. Hit “Generate”.
  3. Copy the module and paste it over to place A.
  4. Hit “Update”.
  5. Bring the module back to place B.
  6. Hit “Export”.
  7. Sounds in place B will now be replaced with changes from place A.
Extra Notes
  • Update cannot pick up changes in scripts, only in sounds. Creating a sound object, pasting in the old ID, hitting update, replace the sound with the new ID, then hitting update again will add a new replacement entry into the table.
  • Avoid moving the sound files around (changing parents) while you’re still replacing audio. If you do move audio/script, hit update after you move, then change the ID and hit update again.
  • Avoid creating “forks”, this means that you have 2 copies of the same audio ID, but you set each one to different IDs. The plugin will pick the first one it encounters and labels it as the original. The other will be replaced.
FAQs

Can you delete the PluginData module once you’re done?
Yes, if the module is no longer useful, you can delete it and save space. The module is simply for the plugin to log changes to sounds. Deleting it will not affect your game.

Can you make changes to the PluginData by hand?
Yes, the table is relatively simple to figure out, and the module generation will try to correct errors. Simply hit “Update” and scan the output log when you’re done.

What is the plugin to going to exactly in terms of privacy/permissions?

  • the plugin will be making changes to sounds properties & script sources
  • the plugin will not store data of any kind other than the DataModule for updating/exporting sounds, which you have access to
  • the plugin will create a lot of output in the output window, this is to provide details to the user

The Roblox Audio Discovery Plugin is picking up sound IDs from the module and it’s making it difficult to tell missing audio from real ones!

  1. Locate the PluginData module, CTRL + X to cut it.
  2. With the module no longer in the game, hit refresh on the Audio Discovery.
  3. Past the module back into wherever you were storing it at.
  4. Repeat if you want to refresh the missing audio list again.

This is my first time documenting a plugin. I will make sure to answer any questions/fix errors on this post/plugin if there are any. Thanks and have fun :wink:.


Plugin art by @swopped

The plugin can be found here.

9 Likes

eyy that’s mine, I never thought people would build stuff off mine, well that’s epic.

by the way, I rate your plugin 10/10 since it has better system than mine.

1 Like

hey i currently have a problem with this plugin where it says providedstring length is greater or equal to max length, i guess my game has too many audios, how can i fix this?

Hi,

  1. Could you post the full error report here or dm it to me?
  2. How large is your game? How many audios do you have?

It’s pretty obvious, roblox strings (stored inside textboxes, text labels, stringvalues, etc, not sure if this applies to scripts too) have a limit of 200k digits, the game im reuploading the audios has a LOT of audios, and the string that your plugin generates is too big to fit in the string digit limit, so the best fix would be to separate the string in parts.

Also: the roblox audio discovery plugin stopped working LONG AGO so even if it’s possible to separate the strings I still can’t go through the next step

The reason why I ask for the full error report is so that I can isolate the failure point, namely which section of the script is hitting that string limit. We can figure out what to do after. Please send me the error report.

There should be other ways to detecting audio failures. The easiest one looping through all sounds and checking .IsLoaded or .TimeLength.