Electronic Arts MicroTalk
Jump to navigation
Jump to search
- Company: Electronic Arts
- Decoding: https://github.com/daddesio/utkencode
- Samples: http://niotso.org/utalk/
EA MicroTalk (also UTalk or UTK) is a linear-predictive speech codec used in various games by Electronic Arts. The earliest known game to use it is Beasts & Bumpkins (1997). The codec has a bandwidth of 11.025kHz (sampling rate 22.05kHz) and frame size of 20ms (432 samples) and only supports mono. It is typically encoded at 32 kbit/s.
The codec was reverse-engineered by trass3r on August 05, 2010 and was later analyzed by Andrew D'Addesio on January 12, 2012.
MicroTalk has been seen in several containers, depending on the game:
- PT/.m10 (Beasts and Bumpkins)
- Maxis UTK (The Sims Online, SimCity 4)
- SCxl (FIFA 2001 PS2, FIFA 2002 PS2)
Variants
There are a few variants of MicroTalk:
- MicroTalk 10:1 (codec_id=0x04 in EA SCxl) and MicroTalk 5:1 (codec_id=0x16) are really the same codec; the encoder simply chooses different compression parameters (reduced_bw is enabled in 10:1 and disabled in 5:1). MicroTalk 10:1 is typically encoded at 32kbit/s; 5:1 is encoded at 64kbit/s.
- MicroTalk Revision 3 (codec_revision=3 in SCxl) is a variant which supports raw PCM samples.
Huffman tables
Normal model (Table 0):
Huffman code | Output command | Meaning | Next model |
---|---|---|---|
0 0 | 4 | Insert one 0.0f | MDL_NORMAL |
0 1 | 5 | Insert one -1.0f | MDL_NORMAL |
1 0 | 6 | Insert one +1.0f | MDL_NORMAL |
1 1 0 0 | 9 | Insert one -2.0f | MDL_LARGEPULSE |
1 1 0 1 | 10 | Insert one +2.0f | MDL_LARGEPULSE |
1 1 1 0 0 | 13 | Insert one -3.0f | MDL_LARGEPULSE |
1 1 1 0 1 | 14 | Insert one +3.0f | MDL_LARGEPULSE |
1 1 1 1 0 0 | 17 | Insert one -4.0f | MDL_LARGEPULSE |
1 1 1 1 0 1 | 18 | Insert one +4.0f | MDL_LARGEPULSE |
1 1 1 1 1 0 0 | 21 | Insert one -5.0f | MDL_LARGEPULSE |
1 1 1 1 1 0 1 | 22 | Insert one +5.0f | MDL_LARGEPULSE |
1 1 1 1 1 1 0 0 | 25 | Insert one -6.0f | MDL_LARGEPULSE |
1 1 1 1 1 1 0 1 | 26 | Insert one +6.0f | MDL_LARGEPULSE |
1 1 1 1 1 1 1 0 | 0 | Insert a pulse with magnitude >= 7.0f | MDL_LARGEPULSE |
1 1 1 1 1 1 1 1 | 2 | Insert between 7 and 70 0.0fs | MDL_NORMAL |
Large-pulse model (Table 1):
Huffman code | Output command | Meaning | Next model |
---|---|---|---|
0 0 | 4 | Insert one 0.0f | MDL_NORMAL |
0 1 0 | 7 | Insert one -1.0f | MDL_NORMAL |
0 1 1 | 8 | Insert one +1.0f | MDL_NORMAL |
1 0 0 | 11 | Insert one -2.0f | MDL_LARGEPULSE |
1 0 1 | 12 | Insert one +2.0f | MDL_LARGEPULSE |
1 1 0 0 | 15 | Insert one -3.0f | MDL_LARGEPULSE |
1 1 0 1 | 16 | Insert one +3.0f | MDL_LARGEPULSE |
1 1 1 0 0 | 19 | Insert one -4.0f | MDL_LARGEPULSE |
1 1 1 0 1 | 20 | Insert one +4.0f | MDL_LARGEPULSE |
1 1 1 1 0 0 | 23 | Insert one -5.0f | MDL_LARGEPULSE |
1 1 1 1 0 1 | 24 | Insert one +5.0f | MDL_LARGEPULSE |
1 1 1 1 1 0 0 | 27 | Insert one -6.0f | MDL_LARGEPULSE |
1 1 1 1 1 0 1 | 28 | Insert one +6.0f | MDL_LARGEPULSE |
1 1 1 1 1 1 0 | 1 | Insert a pulse with magnitude >= 7.0f | MDL_LARGEPULSE |
1 1 1 1 1 1 1 | 3 | Insert between 7 and 70 0.0fs | MDL_NORMAL |