M17 Voice OTA (over the air) is now possible using the Mobilinkd M17 KISS HT Android app (forked from Codec2Talkie), either a Mobilinkd TNC3 or Mobilinkd NucleoTNC, and a 9600-baud capable radio (requires direct access to the discriminator and modulator). They has been tested with a Kenwood TM-V71A and Kenwood TK-790.
The TX chain is Android App → TNC → Radio.
The RX chain is Radio → TNC → Android App.
The radio handles FM modulation/demodulation.
There is a physical connection between the radio and the TNC/Modem.
The TNC handles M17 baseband physical layer and data link layer encoding and decoding. This includes 4-FSK modulation/demodulation, sync word recognition, framing, convolutional encoding/decoding, Golay encoding, LICH assembly (if needed) and Link Setup Frame validation.
The TNC communicates with the Android app via KISS streaming protocol. Currently USB Serial and BLE are supported transports.
The Android app is responsible for the UI, constructing or decoding the Link Setup Frame, audio input/output, and Codec2 encoding. It currently only supports Codec2 3200bps mode.
The Android app can be found here: https://github.com/mobilinkd/m17-kiss-ht/releases
The NucleoTNC firmware can be found here: https://github.com/mobilinkd/NucleoTNC/releases
The TNC3 firmare can be found here: https://github.com/mobilinkd/tnc3-firmware/releases
Currently, the only config app that can be used to configure the NucleoTNC or TNC for M17 is the Python config app: https://github.com/mobilinkd/tnc1-python-config
Make no mistake, the firmware is highly speculative right now, designed to provide a working M17 voice implementation for M17 developers and experimenters.