FreeCalypso > hg > freecalypso-docs
comparison Voice-memo-feature @ 96:69061d044f05
Voice-memo-feature: new article
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Tue, 27 Dec 2022 20:23:55 +0000 |
| parents | |
| children | 80f0996bfd16 |
comparison
equal
deleted
inserted
replaced
| 95:8a45cd92e3c3 | 96:69061d044f05 |
|---|---|
| 1 The full Calypso hw+fw solution as delivered by TI (the relevant components here | |
| 2 are the DSP, the official L1 code and RiViera Audio Service) implements an | |
| 3 interesting feature called voice memos. It is actually two paired features: | |
| 4 | |
| 5 * Voice memo recording: in almost all states of the MS (no GSM network at all, | |
| 6 or idle mode, or in an active call) it is possible to activate an extra | |
| 7 instance of GSM 06.10 encoder that takes input from the microphone (and also | |
| 8 from the active call downlink if invoked during a speech call) and writes its | |
| 9 output into an otherwise-unused DSP buffer. The combination of L1 and RiViera | |
| 10 Audio Service then writes this speech recording into a file in FFS. | |
| 11 | |
| 12 * Voice memo playback: voice memo files recorded with the just-described VM | |
| 13 record feature can be played into the phone's speaker output. The operation | |
| 14 of playing a previously recorded voice memo is conceptually no different from | |
| 15 playing tones or melodies, and can likewise be done in any state: with no GSM | |
| 16 network at all, in idle mode, or in an active call. | |
| 17 | |
| 18 VM recording and VM playback cannot be active at the same time: they use the | |
| 19 same DSP buffer, and likely other mutually exclusive DSP resources too. | |
| 20 Furthermore, the same DSP buffer that is used for these VM features is also | |
| 21 used for TCH UL substitution debug/test feature described in the TCH-tap-modes | |
| 22 article - therefore, all 3 features (VM record, VM play and TCH UL play) need | |
| 23 to be treated as mutually exclusive in time. However, aside from this mutual | |
| 24 exclusion, it is very remarkable that VM recording or VM playback can be invoked | |
| 25 during an active speech call (which can use any codec!), and the extra instance | |
| 26 of FR1 encoder or decoder (always FR1) invoked by VM features is essentially | |
| 27 independent from the main TCH encoder and the main TCH decoder, all of which | |
| 28 run simultaneously. It is worth noting that all newer GSM speech codecs (HR1, | |
| 29 EFR and AMR) are much more computationally intensive than FR1, thus given that | |
| 30 the DSP has the necessary horsepower to run any one of those "heavy" codecs, it | |
| 31 probably isn't too much extra work to also run a simultaneous instance of | |
| 32 unidirectional (encoder only or decoder only) FR1. | |
| 33 | |
| 34 The entire voice memo facility was already fully implemented in the TCS211 code | |
| 35 delivery from TI, but prior to FreeCalypso there was no way to exercise it. In | |
| 36 order to exercise VM functionality in TCS211, one needs to invoke these RiViera | |
| 37 Audio Service API functions: | |
| 38 | |
| 39 audio_vm_record_start() | |
| 40 audio_vm_record_stop() | |
| 41 audio_vm_play_start() | |
| 42 audio_vm_play_stop() | |
| 43 | |
| 44 In FreeCalypso we've added some simple AT commands that call the just-listed API | |
| 45 functions, and the facility that has been there all along is now accessible to | |
| 46 play - it is the same situation as with Melody E1. | |
| 47 | |
| 48 FreeCalypso AT commands for voice memo testing | |
| 49 ============================================== | |
| 50 | |
| 51 AT@VMR="/pathname",dur,dtx | |
| 52 | |
| 53 This command initiates VM recording. The FFS pathname into which the recording | |
| 54 should be written must be given as a quoted string (and as a reminder, all FFS | |
| 55 pathnames must be absolute - there are no current directories in the firmware | |
| 56 architecture), and there is a second required argument that sets the maximum | |
| 57 size of the recording. The duration argument is a decimal integer, and it is | |
| 58 reckoned in 1000-word units: if you specify duration as 1, the maximum recording | |
| 59 size is 1000 words (2000 bytes), if you specify duration as 2, the maximum | |
| 60 recording size is 2000 words (4000 bytes), and so forth. If you record with DTX | |
| 61 disabled, each block of 1000 words corresponds to 1 second in time (every 20 ms | |
| 62 frame turns into a block of 20 words), thus with DTX disabled the duration | |
| 63 argument becomes the actual duration in seconds. However, if you record with | |
| 64 DTX enabled, then periods of silence will be written in a compressed format | |
| 65 described later in this article, and the time duration of the recording will | |
| 66 depend on how much silence there is. | |
| 67 | |
| 68 The dtx argument is 1 to enable DTX or 0 to disable it; the default is DTX | |
| 69 disabled. The employed FR1 DTX algorithm appears to be the same as would be | |
| 70 used for TCH/FS uplink, except that an "artificial" (there is no SACCH with | |
| 71 independent-of-GSM voice memos) TAF position is generated on every 16th audio | |
| 72 frame, i.e., every 320 ms. (Note the shortening of this SID interval compared | |
| 73 to official TCH, where it is 24 frames or 480 ms.) | |
| 74 | |
| 75 AT@VMRS | |
| 76 | |
| 77 This command stops any VM recording in progress, but it is rarely needed - the | |
| 78 recording will stop automatically when the size limit is reached. | |
| 79 | |
| 80 AT@VMP="/pathname" | |
| 81 | |
| 82 This command initiates playback of the VM recording contained in the named file | |
| 83 in FFS. The FFS pathname is the only argument. | |
| 84 | |
| 85 AT@VMPS | |
| 86 | |
| 87 This command stops any VM playback in progress, but it is rarely needed - the | |
| 88 playback will stop automatically when the end-marker is read from the file. | |
| 89 | |
| 90 Voice memo file format | |
| 91 ====================== | |
| 92 | |
| 93 Using fc-fsio, you can read out voice memo files written by the VM record | |
| 94 facility, and you can likewise construct your own memo files externally, upload | |
| 95 them into FC device FFS and then play them via the VM play facility. The format | |
| 96 of these files is determined by TI's firmware stack (RV Audio Service on top of | |
| 97 L1 on top of the DSP), but is fundamentally based on a DSP buffer that is just | |
| 98 like those used for TCH. The companion TCH-tap-modes article describes the | |
| 99 format of the DSP buffer from which TCH DL bits can be read out; in the present | |
| 100 article we are going to cover the differences specific to the voice memo | |
| 101 facility. | |
| 102 | |
| 103 When VM recording is done with DTX disabled, every 20 ms speech frame turns into | |
| 104 a block of 40 bytes in the memo file. This block of 40 bytes is produced from | |
| 105 20 16-bit words in the DSP buffer, each word turned into two bytes in LE order | |
| 106 by the ARM part of Calypso. The DSP buffer used for the VM facility has the | |
| 107 same overall format as the one used for TCH DL, described in the TCH-tap-modes | |
| 108 article - 3 status or header words followed by 17 words of payload, with the | |
| 109 latter words carrying a 260-bit FR1 codec frame in the bit order of GSM 05.03 | |
| 110 interface 1. As explained in the TCH-tap-modes article, speech codec payload | |
| 111 words are filled in the msb-to-lsb direction by the DSP, thus the natural byte- | |
| 112 oriented representation would be big-endian - but because the little-endian ARM | |
| 113 core sits in between the DSP and the on-media file format, the byte order in | |
| 114 voice memo files comes out "wrong". Oh well - it is what it is. | |
| 115 | |
| 116 Of the 3 header words that precede every 20 ms speech frame, words 1 and 2 | |
| 117 appear to be dummies - they have meaning related to the channel decoder block | |
| 118 in the case of TCH DL, but in the case of isolated-from-GSM voice memos, there | |
| 119 does not seem to be any meaning. However, header or status word 0, consisting | |
| 120 of bit flags, is still important, but the bit flags for the VM facility are | |
| 121 different from those of TCH DL. | |
| 122 | |
| 123 When VM recording is done with DTX disabled, status word 0 is observed to always | |
| 124 equal 0xC400 on every frame. However, when DTX is enabled, the following bits | |
| 125 are seen in status word 0: | |
| 126 | |
| 127 * Bit 15 will be set if this frame needs to be saved in its entirety, or cleared | |
| 128 if it is to be skipped. When VM recording code in L1S sees that the DSP has | |
| 129 delivered a frame with this status bit cleared, it will save only this status | |
| 130 word 0, i.e., 2 bytes will be written into the memo file instead of 40 bytes | |
| 131 for this 20 ms frame. On VM playback, the code likewise checks this bit to | |
| 132 see how many words need to be read from the file, so synchronization is | |
| 133 maintained. | |
| 134 | |
| 135 * Bit 14 appears to be the SP flag of GSM 06.31 section 5.1: set when a speech | |
| 136 frame has been generated, or cleared when a SID frame has been generated | |
| 137 instead. | |
| 138 | |
| 139 * Bit 11 is a TAF-like flag: when DTX is enabled, this bit is set in every 16th | |
| 140 frame generated by the DSP in the VM recording session, otherwise it is | |
| 141 cleared. | |
| 142 | |
| 143 * Bit 10 will always be set in every status word 0 that gets written to voice | |
| 144 memo files: this bit is set by the DSP when it has finished encoding a 20 ms | |
| 145 audio frame and is checked by L1S on every TDMA frame, serving as a | |
| 146 synchronization mechanism telling L1S when it needs to copy a speech frame | |
| 147 from the DSP to the memo file. | |
| 148 | |
| 149 When VM recording is done with DTX enabled, the recorded memo file will consist | |
| 150 of speech frames (header word 0xC400 or 0xCC00), SID frames (header word 0x8400 | |
| 151 or 0x8C00) and skipped frames consisting of only the header word 0x0400, with | |
| 152 the remaining words omitted. There will always be a present (not skipped) frame | |
| 153 in every 16th position (0xCC00 or 0x8C00), thus no 0x0C00 frames are ever seen. | |
| 154 | |
| 155 Every voice memo binary file ends with a 0xFBFF end-marker word; this end-marker | |
| 156 is needed because TCS211 fw architecture exhibits a separation between the | |
| 157 actual data reading and writing processes in L1S and the FFS read/write | |
| 158 interface provided by RiViera Audio Service, and because of this separation the | |
| 159 operational code in L1S can't "see" an EOF condition at the file system level. | |
| 160 | |
| 161 FreeCalypso tools for decoding voice memo files | |
| 162 =============================================== | |
| 163 | |
| 164 If you have recorded a voice memo with AT@VMR and then read it out with fc-fsio, | |
| 165 you can use additional FC tools to analyze it. The following tools are | |
| 166 available, split between FC host tools and GSM codec libs & utilities packages: | |
| 167 | |
| 168 * fc-vm2hex converts a binary VM recording into ASCII hex format, similar to | |
| 169 the old (2016) TCH DL recording format before it was extended in late 2022. | |
| 170 Every fully-written frame is emitted in the hex output as 3 space-separated | |
| 171 hex status words followed by a block of 66 hex digits giving the FR1 codec | |
| 172 frame in the unchanged bit order of TI's DSP, and every skipped frame (one | |
| 173 for which only status word 0 was written into the memo file) is emitted in | |
| 174 the hex output as just that one word. | |
| 175 | |
| 176 * gsmfr-dlcap-parse utility, originally written for parsing TCH DL capture | |
| 177 files, accepts TCH DL recording files in both old and new formats, and it also | |
| 178 accepts the output from fc-vm2hex as its input. The combination of fc-vm2hex | |
| 179 and gsmfr-dlcap-parse allows a developer or tinkerer to do thorough human | |
| 180 analysis of TCS211 VM recordings in both DTX-disabled and DTX-enabled modes. | |
| 181 | |
| 182 * There will soon be a new fc-vm2gsmx utility that will read binary VM recording | |
| 183 files (as you would read out with fc-fsio) and convert them into extended- | |
| 184 libgsm (gsmx) format defined in our GSM codec libraries & utilities package. | |
| 185 This gsmx format is an extension of the classic libgsm (GSM 06.10) format, | |
| 186 adding the possibility of SID frames and BFI markers (frame gaps) in addition | |
| 187 to regular speech frames, thus it can represent the content of a voice memo | |
| 188 recording made in DTX mode. These gsmx files can then be decoded into | |
| 189 playable WAV with our gsmfr-decode utility. | |
| 190 | |
| 191 FreeCalypso tools for external generation of voice memo files | |
| 192 ============================================================= | |
| 193 | |
| 194 Using FreeCalypso tools, you can produce an external speech recording in GSM | |
| 195 06.10 FR1 codec format, convert it into TCS211 VM format, upload it into FC | |
| 196 device FFS with fc-fsio, and then play these externally-produced voice memos | |
| 197 with AT@VMP. The steps are as follows: | |
| 198 | |
| 199 1) You can use gsmfr-encode to FR1-encode a speech sample from WAV into classic | |
| 200 .gsm format, or gsmfr-encode-r if the source is raw BE instead of WAV. | |
| 201 Alternatively, you can use any other off-the-shelf software that can encode | |
| 202 FR1 and write libgsm format; SoX shipped with Slackware includes the | |
| 203 necessary support. | |
| 204 | |
| 205 2) fc-gsm2vm converts a .gsm recording into non-DTX TCS211 VM format. | |
| 206 | |
| 207 At the present time we don't have any tools for producing external DTX-enabled | |
| 208 VM recordings: the main limitation is that at least to this Mother's knowledge, | |
| 209 the published source software community does not currently possess a GSM 06.10 | |
| 210 encoding library that has been extended with VAD and DTX functions. There is | |
| 211 classic libgsm from 1990s, used by everyone in the FOSS community who needs a | |
| 212 GSM 06.10 encoder or decoder, but it doesn't do DTX; we (FreeCalypso and | |
| 213 Themyscira Wireless) have produced our own libgsmfrp front-end that implements | |
| 214 Rx DTX handler functions (that's how we can properly decode FR1 streams that | |
| 215 contain SIDs and/or missing frames), but it doesn't help with DTX encoding. | |
| 216 Therefore, our ability to produce TCS211-compatible VM recordings externally is | |
| 217 currently limited to non-DTX mode. |
