Electronic Arts MicroTalk: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
(Maxis UTK is really EA MicroTalk) |
||
Line 1: | Line 1: | ||
* Company: [[Electronic Arts]] | |||
* Company: | * Decoding: https://github.com/daddesio/utkencode | ||
* | |||
* Samples: http://niotso.org/utalk/ | * 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 [[Electronic Arts SCxl|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 32kit/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): | |||
{| class="wikitable" border="1" | |||
|- | |||
!Huffman code | |||
!Output command | |||
1 | !Meaning | ||
2 | !Next model | ||
3 | |- | ||
4= | |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): | |||
{| class="wikitable" border="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 | |||
|27 | |||
|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 | |||
|} | |||
[[Category:Vocoders]] | [[Category:Vocoders]] |
Revision as of 13:57, 20 August 2017
- 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 32kit/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 | 27 | 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 |