Uncensoring Songs in Rocksmith

Rocksmith 2014 is a great game, but some of the DLC songs are mangled; radio-friendly, soulless, censored caricatures of rock music:

missing words

Let's fix that, so we can enjoy playing along to the (well-tabbed song) as it was meant to be heard.

Makeup of a RS track

Each song/DLC is a PSARC, a kind of encrypted zip file. The psarc has inside:
- The audio track
- Metadata
- The tab/arragement for each guitar part (lead, rhythm, bass, etc..)
- The lyrics
- Artwork
- Other bits we don't care about

In order to uncensor a song, we'll need to unpack it, replace the audio file and lyrics, then repack it. We'll want to touch the track as little as possible; we just want to fix the lyrics and replace the audio track. We don't want to touch any metadata or guitar parts, so that all progress in the song is saved and it still works on the leaderboards and such.

Prerequisites / Tools Used

Rocksmith Custom Song Toolkit

The Rocksmith Custom Song Toolkit is the primary tool used. In theory, you could use it for everything. Just unpack, swap, repack.

However, it does a lot more when it unpacks - it also converts some of the propriety audio and tab formats; this conversion is not loseless.
Since the toolkit is mostly intended to be used for the creation of new tracks, that's understandable. We'll just use some of it's command line tools. Grab the latest build from the builds page, and just extract to /Applications

Python3 Rocksmith tools

There's a fantastic python library for working with PSARCs. We'll be using this for loseless unpacking/repacking.

Various Command Line Tools

  • Homebrew
    • Install by doing:
    • /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • Tools used by the RSCT:
    • brew cask install mono-mdk
    • brew install wine winetricks ffmpeg
  • Python3 Rocksmith Tools
    • brew install pip
    • pip3 install git+https://github.com/0x0L/rocksmith.git

WWise

Annoyingly enough, you have first download a bloated launcher, then you can download the version needed.

We'll need the 2016.2.4.6098 edition.

wav2wem.rb

wav2wem.rb is a little Ruby script I wrote. It has no dependencies so should be easy to run.

Install like this:

# Download to somewhere in $PATH
wget https://gist.githubusercontent.com/JustinAiken/aed8f3d08c0e90e6d148f315df462482/raw/b4d9c18628caf0cc995232b994ae87ce2d10a565/wav2wem.rb \
  --output-document=/usr/local/sbin/wav2wem.rb

# Make it executable:
chmod +x /usr/local/sbin/wav2wem.rb

Working on a song

First, setup a work area:

# Make a work area in /tmp (wine gets confused about ~/, so we'll use a global path):
mkdir -p /tmp/rs_uncensor

# Your DLC is probably stored here:
cd ~/Library/Application\ Support/Steam/SteamApps/common/Rocksmith2014/dlc

Now we'll unpack the song and move it to the work area

# "Unzips" ragekilling_m.psarc into ragekilling_m/
pyrocksmith --unpack ragekilling_m.psarc --no-crypto

# Move it to the to work area:
mv ragekilling_m /tmp/rs_uncensor

The file structure looks like this:

ragekilling_m
├── appid.appid
├── audio
│   └── mac
│       ├── 1010334697.wem               # The main audio track - we need to replace this.
│       ├── 776360560.wem                # The short preview audio track
│       ├── song_ragekilling.bnk            
│       └── song_ragekilling_preview.bnk    
├── flatmodels
│   └── rs
│       ├── rsenumerable_root.flat
│       └── rsenumerable_song.flat
├── gamexblocks
│   └── nsongs
│       └── ragekilling.xblock
├── gfxassets
│   └── album_art
│       ├── album_ragekilling_128.dds
│       ├── album_ragekilling_256.dds
│       └── album_ragekilling_64.dds
├── manifests
│   └── songs_dlc_ragekilling
│       ├── ragekilling_bass.json
│       ├── ragekilling_lead.json
│       ├── ragekilling_rhythm.json
│       ├── ragekilling_vocals.json    # We won't edit this, but it's used to unpack/repack lyrics
│       └── songs_dlc_ragekilling.hsan
├── ragekilling_aggregategraph.nt
└── songs
    ├── arr
    │   └── ragekilling_showlights.xml
    └── bin
        └── macos
            ├── ragekilling_bass.sng
            ├── ragekilling_lead.sng
            ├── ragekilling_rhythm.sng
            └── ragekilling_vocals.sng  # The lyrics - we'll fix these.

14 directories, 22 files

Fix the Lyrics

The lyrics will be found in the unpacked directory under songs/bin/macos/ragekilling_vocals.sng.

Since the sng is an encrypted, proprietary format, we need to convert it to something editable, like XML. To do this we'll use the Rocksmith Custom Song Toolkit's sng2014.exe tool. It'll need the manifest - easy enough to find in the manifests dir.

wine /Applications/RocksmithCustomSongToolkit.app/Contents/Resources/sng2014.exe \
  --sng2xml \
  --manifest=/tmp/rs_uncensor/ragekilling_m/manifests/songs_dlc_ragekilling/ragekilling_vocals.json \
  --input=/tmp/rs_uncensor/ragekilling_m/songs/bin/macos/ragekilling_vocals.sng \
  --arrangement=Vocal \
  --platform=Mac

This creates /tmp/rs_uncensor/ragekilling_m/songs/bin/macos/ragekilling_vocals.xml.
Open that file up, and put in all the missing fucks:

-   <vocal time="264.751" note="84" length="0.115" lyric="You" />
+   <vocal time="264.751" note="84" length="0.115" lyric="Fuck You" />
...
-   <vocal time="267.588" note="84" length="0.127" lyric="You" />
+   <vocal time="267.588" note="84" length="0.127" lyric="Fuck You" />
...
-   <vocal time="270.539" note="84" length="0.248" lyric="You" />
+   <vocal time="270.539" note="84" length="0.248" lyric="Fuck You" />
...
-   <vocal time="273.4" note="84" length="0.176" lyric="You" />
+   <vocal time="273.4" note="84" length="0.176" lyric="Fuck You" />
...
-   <vocal time="276.188" note="84" length="0.17" lyric="You" />
+   <vocal time="276.188" note="84" length="0.17" lyric="Fuck You" />
...
-   <vocal time="278.937" note="84" length="0.175" lyric="You" />
+   <vocal time="278.937" note="84" length="0.175" lyric="Fuck You" />
...
-   <vocal time="281.808" note="84" length="0.188" lyric="You" />
+   <vocal time="281.808" note="84" length="0.188" lyric="Fuck You" />
...
-   <vocal time="284.615" note="84" length="0.088" lyric="You" />
+   <vocal time="284.615" note="84" length="0.088" lyric="Fuck You" />
...
-   <vocal time="287.408" note="84" length="0.081" lyric="You" />
+   <vocal time="287.408" note="84" length="0.081" lyric="Fuck You" />
...
-   <vocal time="290.017" note="84" length="0.083" lyric="You" />
+   <vocal time="290.017" note="84" length="0.083" lyric="Fuck You" />
...
-   <vocal time="292.663" note="84" length="0.083" lyric="You" />
+   <vocal time="292.663" note="84" length="0.083" lyric="Fuck You" />
...
-   <vocal time="295.314" note="84" length="0.082" lyric="You" />
+   <vocal time="295.314" note="84" length="0.082" lyric="Fuck You" />
...
-   <vocal time="297.942" note="84" length="0.083" lyric="You" />
+   <vocal time="297.942" note="84" length="0.083" lyric="Fuck You" />
...
-   <vocal time="300.59" note="84" length="0.083" lyric="You" />
+   <vocal time="300.59" note="84" length="0.083" lyric="Fuck You" />
...
-   <vocal time="303.223" note="84" length="0.082" lyric="You" />
+   <vocal time="303.223" note="84" length="0.082" lyric="Fuck You" />
...
-   <vocal time="305.837" note="84" length="0.082" lyric="You" />
+   <vocal time="305.837" note="84" length="0.082" lyric="Fuck You" />
...
-   <vocal time="310.221" note="84" length="0.219" lyric="er+" />
+   <vocal time="310.221" note="84" length="0.219" lyric="er Fucker+" />

Convert back to SNG:

wine /Applications/RocksmithCustomSongToolkit.app/Contents/Resources/sng2014.exe \
  --xml2sng \
  --manifest=/tmp/rs_uncensor/ragekilling_m/manifests/songs_dlc_ragekilling/ragekilling_vocals.json \
  --input=/tmp/rs_uncensor/ragekilling_m/songs/bin/macos/ragekilling_vocals.xml \
  --arrangement=Vocal \
  --platform=Mac

# And clean up our XML:
rm /tmp/rs_uncensor/ragekilling_m/songs/bin/macos/ragekilling_vocals.xml

Fix the audio track

Convert the .wem file inside to .ogg, so you can use it as a guide track. Always use the bigger of the 2 .wem files.

# First do the actual conversion:
wine /Applications/RocksmithCustomSongToolkit.app/Contents/Resources/ww2ogg.exe \
  /tmp/rs_uncensor/ragekilling_m/audio/mac/1010334697.wem \
  --pcb /Applications/RocksmithCustomSongToolkit.app/Contents/Resources/packed_codebooks_aoTuV_603.bin

# It'll be a little messed up, use revorb to fix it:
wine /Applications/RocksmithCustomSongToolkit.app/Contents/Resources/revorb.exe \
  /tmp/rs_uncensor/ragekilling_m/audio/mac/1010334697.ogg

Load up that file in an audio editor, as well as the original album version (try to use a lossless format, like flac or wav). Line them up as close as you possibly can!

to the sample

Delete the guide track, save the shifted original audio as fixed.wav.

Now we have to convert that back to a .wem file:

# And back!
wav2wem.rb ~/Desktop/fixed.wav
mv audio.wem /tmp/rs_uncensor/ragekilling_m/audio/mac/1010334697.wem
mv preview.wem /tmp/rs_uncensor/ragekilling_m/audio/mac/776360560.wem

Replace

Now we can repack our fixes files back into a single .psarc, and move it back to the DLC dir.

First, delete any .DS_Store, leftover .xml, etc dirs you may have created whilst working on it.

# Repack the folder into the archive:
pyrocksmith --pack /tmp/rs_uncensor/ragekilling_m --no-crypto

# Rename the original:
mv ~/Library/Application\ Support/Steam/SteamApps/common/Rocksmith2014/dlc/ragekilling_m.psarc \
  ~/Library/Application\ Support/Steam/SteamApps/common/Rocksmith2014/dlc/ragekilling_m.censored.bak

# Move our repack to the DLC dir:
mv ragekilling_m.psarc ~/Library/Application\ Support/Steam/SteamApps/common/Rocksmith2014/dlc/

Ready to rock

Success! Now we have uncensored lyrics and original audio:

no missing words

Since we haven't touched the guitar arrangement or the manifest, everything else is intact: - Any previous progress on the track should be intact - Should still work with the leaderboards (if you care about that sort of thing)

Other Uses

Besides uncensoring, this method of audio swapping could also:
- Replace audio with pitch-shifted version - no more tightening your strings until they almost pop to play old Kinks songs.
- Replace audio with a guitar-less version crafted from multitracks
- There won't be many of these available, but for those that are, will be a much nicer audio experience.

JustinAiken

I'm a Ruby/Rails developer currently working for UserTesting, living in Southern Utah.
More about the author →