DSP Group Truespeech
- Format tag: 0x22
- Company: DSP Group
- Description and binaries: http://www.rarewares.org/rrw/truespeech.php
- Samples: http://samples.mplayerhq.hu/A-codecs/truespeech/
This is the codec developed by DSP Group. It operates on 8000 Hz, 16-bit mono PCM and have some fixed bitrates, Windows version supports 15:1 compression (~1 Kbps) only.
This codec employs LPC (Linear Predictive Coding) as almost every speech codec does.
Bitstream format
Frame (240 samples) is divided into 4 subframes.
Packed frame data holds 8-order filter used in synthesis, 4x7 pulse positions and values, offset in previously decoded frame.
All data is stored in 32-bit little-endian words and bits are read from the LSB.
Frame format
// 1st word 1 bit - previous filter selection mode the rest are 8 filter coefficients with the next bit allocation: 5, 5, 4, 4, 4, 3, 3, 3 // 2nd word 4x7 bits - offset2 values 0-3 4 bits - high 4 bits of offset1[0] // 3d word 2x14 bits - pulse values 0 and 1 4 bits - low 4 bits of offset1[1] // 4th word 2x14 bits - pulse values 2 and 3 4 bits - high 4 bits of offset1[1] // 5th word 4 bits - pulse offset 0 27 bits - pulse position 0 1 bit - offset1[0] bit 0 // 6th word 4 bits - pulse offset 1 27 bits - pulse position 1 1 bit - offset1[0] bit 1 // 7th word 4 bits - pulse offset 2 27 bits - pulse position 2 1 bit - offset1[0] bit 2 // 8th word 4 bits - pulse offset 3 27 bits - pulse position 3 1 bit - offset1[0] bit 3
previous filter selection mode flag - when set to one, first subframe uses filter average 2/3*prev_filt[] + 1/3*cur_filt[] and 1/3*prev_filt[]+2/3*cur_filt[] for the second subframe, otherwise previous filter coefficients are used for both; the third and fourth subframes always use current filter.
Technical details (for standard scheme)
Decoding flow:
unpack frame data reconstruct packed filter merge this filter with previous to create 4 filters for each subframe for each subframe { apply twopoint filter on some saved data place pulses (7 pulses for each subframe max) update saved filter apply main filter to subframe data (mostly pulses) }