Electronic Arts MicroTalk

From MultimediaWiki
Revision as of 11:11, 27 October 2017 by Fatbag (talk | contribs) (→‎Huffman tables: Fix output command)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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