Users can make their own spotter sound packs for our sim.  Sound packs consist of a collection of audio samples along with a spmsg.txt file that stores the corresponding text.  Spotter packs can not create new spotter messages, but they can be used to modify the existing messages either to add color or to translate them into a different language.

Spotter packs are installed into a subfolder of C:\Program Files (x86)\iRacing\sound\spcc\. The name of the subfolder will act as the name of the spotter pack in the sim. Once installed you can switch packs by selecting them from the Voice Pack dropdown in the sound tab of the Options dialog. Note that you need to reload the sim to get the new pack to load.

You can adjust how the spotter works by looking in the [SPCC] section of the app.ini file found in [documents]\iRacing\

Samples need to be recorded as mono uncompressed wave files. We ship our own samples at 5512 Hz and 8 bits per sample, but you can use 16 bit samples and any bitrate you want as long as it is mono. Samples can be named any way you want, just use the spmsg.txt file to connect a spotter message-id to each sound file.

The spmsg.txt file allows you to attach a wav file and text string to a particular spotter message-id. You can attach up to 100 different wave/text pairs to each unique id. We will choose at random between the provided messages when making a spotter call. You can zero out a call by replacing the sound file and text in the spmsg.txt file with the words NULL. This is an easy way to quiet down a call you feel happens too often (you've got wheel damage, etc)

The spmsg.txt file for our base spotter can be found here. You are free to change the text or add/remove calls from the file as you want. If you remove all message id's for a given call from the file then we will fall back to the base spotter for that call, so if you want to remove a call from your pack use NULL's to zero it out rather than deleting it from the file.

You can use this text file to translate the spotter packs into different languages, but you will be limited in what characters we support. For now, we should support anything in the Windows-1252 code page (ISO 8859-1). This is the default code page on American English installs of Windows and maybe the same code page used on most western translations of windows as well.

Numbers are handled specially. Only numbers from 0-20 have samples attached to them, after that we only record the 10's, 100's, and 1000's place numbers. You can optionally fill in the numbers from 20-99, if they are not provided we will build them up based on the samples we have access to. You can optionally add in a call that only plays when we are playing an exact match for your number, so if your language calls 100 different then 101 then fill in both SPCC_N100_EQ and SPCC_N100. The EQ variant will be called for the number 100 (or 2100) and the non-EQ variant will be called for 101 as in SPCC_N100 + SPCC_N1.

Here are some notes to help with translating into other languages.

- All calls that have a number embedded in them use a unique message before and after the number. So for example SPCC_PACE_PASS <number> SPCC_PACE_PASS_PT2 says "Pass the" + NUM + "car.". You can freely move the word car from the second message to the first if your language requires a different order. If you don't want to use the first or second message at all simply insert NULL for the string and wave file name in the spmsg.txt file.

- You can define singular and plural forms of a phrase. For example, the call SPCC_JOKERDONE says "You completed all of the Joker laps.". In English we use the singular form when talking about just one Joker lap, so we also fill in the call SPCC_JOKERDONE_P1 with "You completed the Joker lap.". P1 is the one item plural form and will be called when talking about one joker lap. We also support 0 items, and 2 items if your language makes the distinction.

In some cases, like with the SPCC_JOKERSLEFT call, we need to actually insert the number into the sentence. In that case, we have a default SPCC_JOKERSLEFT <number> SPCC_JOKERSLEFT_PT2 (part 2) pair of messages, and optionally you can fill in SPCC_JOKERSLEFT_P1 (plural 1) if the form of the message needs to be changed. The same goes for the optional SPCC_JOKERSLEFT_P0 and SPCC_JOKERSLEFT_P2 calls.

- We have optional calls that differentiate between a race start and restart, as in SPCC_1TOGREEN vs SPCC_1TOGREEN_RESTART. If the restart variant is filled in we will use it on a restart, but by default, we just use the SPCC_1TOGREEN call in all cases. This is handy if your language distinguishes between the first and second time you do something.

- As much as possible all calls are full sentences and only trigger one at a time. We have to make special exceptions for numbers in a phrase. In those cases, the message is split into two parts with the second part having a _PT2 appended to it. In addition, the call SPCC_GOODJOB is optionally appended to calls like SPCC_IN1ST if your position is improving. And the calls SPCC_FUEL_RACEx are optionally appended to the calls SPCC_FUEL_xLAPS calls to let you know if you have enough fuel for the race or not.

- The actual calling out of numbers has gotten quite intricate. By default, we ask that you record numbers for each place value (0-9, 10,20,30...90, 100,200...900, etc) and we can piece these calls together to build up a number. In addition, you can optionally fill in any number from 11-99 if you want to avoid piecing samples together or need to handle them specially. For example, in English, we call out "eleven" rather than "ten one" for the number 11 and so we fill that number in. I recommend you just go ahead and record all the numbers, it will sound smoother in the end.

- Some languages treat numbers differently based on the numbers around them. So the number 1 may be said differently than the 1 in 21. To help with that we have an optional set of numbers that have _EQ appended to them. These numbers will be called only if we have an exact match (they are equal) to the number. So 1 would use the SPCC_N1_EQ call if available but 21 would be made up of the SPCC_N20 + SPCC_N1 calls. The N0-N9 calls only check that the tens place is zero, all other calls (N100, N2000, etc) test for an exact match.

- Some languages, like German, call the 10's place after the 1's place. Filling in the SPCC_AND_TEN call will force us to switch the order and use whatever phrase is in the AND_TEN call between the 1 and 10 values. So the number 111 would be called out as SPCC_N100 + SPCC_N1 + SPCC_AND_TEN + SPCC_N10

- When calling the fractional part of a decimal we always call each number out one at a time so the number 1.23 is called SPCC_N1 + SPCC_POINT + SPCC_N2 + SPCC_N3 and optionally SPCC_DECIMAL is appended to the end if provided. This avoids any troubles with fractional place values as in "thirty-two thousandths" for 0.032

Original posts here: