view doc/AMR-EFR-conversion @ 506:2d6da062c452

libgsmhr1/sp_rom.[ch]: import original
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 19 Jun 2024 01:55:54 +0000
parents 78739fda2856
children
line wrap: on
line source

Please see our AMR-EFR-philosophy article for an analysis of differences between
EFR and MR122 (12k2 mode of AMR), and for a discussion of how we handle the
relation between these two codecs.  The following article was written in late
2022, before these issues were properly understood:

2022-December description
-------------------------

We have two simple utilities that allow one to experiment with "dumb" bit-
shuffling conversion between AMR 12k2 and EFR codec formats, to explore
capabilities and limitations of this approach.

gsm-amr2efr reads an AMR speech recording in RFC 4867 storage format (the common
.amr format) and converts it to EFR in gsmx format.  The AMR input to this
utility must consists of MR122 frames only - no other AMR modes, no SID and no
NO_DATA gaps.  The intent is that one can take a starting speech sample in WAV
format, encode it into AMR with amrnb-enc from opencore-amrnb (by default that
utility produces MR122 encoding without DTX), and then convert the AMR output to
EFR with gsm-amr2efr.  One can then encode the same starting-point WAV speech
sample with gsmefr-encode (matching official EFR from ETSI) and compare the two
EFR outputs.  When you do this experiment, you will see that the two EFR outputs
will be different (you can then analyze encoded speech parameter diffs with
gsmrec-dump), but each version can be fed to an EFR decoder, resulting in
OK-sounding speech.

gsm-efr2amr performs the opposite conversion: it reads an EFR session recording
in gsmx format and converts it to AMR storage format.  The input to gsm-efr2amr
is allowed to contain Themyscira BFI markers in addition to EFR frames; these
BFI markers will be turned into AMR NO_DATA frames.  The same input can also
contain EFR SID frames - however, gsm-efr2amr will not detect them and won't
give them any special handling, instead they will be bit-reshuffled into MR122
just like EFR speech frames.  The result of such "dumb" conversion is invalid
AMR, and when you decode it with amrnb-dec, you will hear some strange noises.

2024-April addendum
-------------------

In addition to the SID issue noted above (if the input to gsm-efr2amr contains
any SID frames, the output will be invalid AMR), these dumb conversion methods
fail to take action on any embedded decoder homing frames.  The correct DHF is
different between EFR and MR122, hence a better converter could be made to
recognize EFR DHFs in EFR->AMR direction and convert them to MR122 DHF, and do
the opposite in AMR->EFR direction.  However, the implementation of AMR in
libopencore-amrnb has the homing feature stripped out altogether, hence doing
DHF conversion would be pointless as long as amrnb-enc and amrnb-dec utilities
are involved.

Thoughts on more proper conversion
==================================

Imagine this hypothetical scenario: you operate a GSM network, and you
preferentially use EFR codec.  You are then able to obtain TrFO interconnection
with some other mobile network of more "modern" kind, and that "modern" network
uses AMR exclusively, with no ability to use any GSM-only codecs.  (The latter
situation holds for UMTS and VoLTE, for example.)  Ordinarily, under these
circumstances TrFO won't be possible - instead you have to interconnect in
G.711, have each side transcode its respective codec, and put up with double
transcoding.  But what if the AMR side can be told to use MR122 only, without
any of the lower modes?  Such arrangement would make no sense in GSM (just use
EFR instead and save the headache of dealing with AMR), but it might be sensible
to ask the UMTS/VoLTE side for that MR122-only config of AMR-NB.

In this hypothetical scenario, would it be possible to pass speech frames
transparently, doing only the necessary bit reshuffling, and only invoke some
slick innovative algorithm during speech pauses to translate between EFR and
AMR SID paradigms?

Right now this idea is fantasy only.  I don't know enough about VoLTE to tell
whether or not an MR122-only config of AMR-NB would work there, I have no idea
what codec config VoLTE operators run with currently when the other end of the
call is G.711 PSTN, and there is very little chance that any of the nation-scale
mobile operators would agree to a private peering interconnect with some tiny
community GSM network - while interconnection through fully public, open-to-
everyone IP-PSTN routes allows only G.711 and nothing else, no cellular TrFO.

Nonetheless, the idea of TrFO conversion between EFR and MR122-only AMR remains
interesting as a theoretical exercise, and we currently leave it there, just as
food for thought.