Field · Build · LearnRadio brings people together
Amateur RadioCuriosity · Experimentation · Real connections

Projects Radio translator Discuss on GitHub

Prototype, Pi bench test next

Speak English.
They hear Italian.

The Offline Radio Translator is a Raspberry Pi that sits between your headset and your radio. You talk, it transmits what you said in Italian, Japanese or any of 27 other languages, and it puts the reply in your headphones in English. No internet, no cloud, no phone held up to a microphone.

Languages
English plus 29, translated both ways
Internet
Once, to install. Never on the air
Wait
5 to 12 s after a 10 s over on a Pi 4, estimated
Power
About 3 W idle to 11.5 W at full load
Hardware
Nothing to build, all off the shelf
Status
Prototype with 105 automated tests, not yet run on a Pi

Take it, read it, break it

The whole project is on GitHub under the MIT license: one Python tool, the installer, the operating guide and 105 automated tests. It has not run on a Raspberry Pi with the real models yet, and that is why it is public now. Clone it, run the tests, read the reviewer notes, and tell me what I got wrong.

It started as a what-if on Discord

The idea is David's
The build is mine

The idea is not mine. In October 2026, in a ham radio Discord channel, David Eisenhardt, W4DPE, was explaining where he draws the line on AI in the hobby. He used a translator as his example. You talk into a microphone plugged into a Pi 5, it turns your English into Italian and speaks it over the air, and you work phone with that much help and no more. He said he would be fine with that.

He had two worries. How much power does it burn, and does it only work because it was built on other people's work, taken without asking? A phone can already do most of this, he said, but it leans on somebody else's servers and it sounds bad held up to a radio microphone. He was looking for ground that both camps could stand on: the operators who will try anything new, and the ones who get called luddites for having real objections. If it ran locally on prebuilt libraries, at the wattage of a Pi, he called that a limit worth having.

I read that and said to myself, this does not need a large language model. That is an axe to slice a steak. The work is three small jobs in a row: turn speech into text, translate the text, speak the result. Each one has a small open model made for exactly that job, and all three fit on a Pi. They are still neural networks. They are just the right size for the work.

So I built it inside the limits he set.

The limits he set, and what the build does

Run locally
Everything runs on the Pi. It needs the internet once, to install.
Prebuilt libraries
whisper.cpp, Argos Translate on CTranslate2, Piper and Open JTalk. Nothing is trained at home.
The wattage of a Pi
About 3 W idle and 11.5 W at full load.
A real accessory, not a phone at the mic
Audio goes through a USB radio interface in both directions.
Straight about whose work it learned from
Every model's training source is listed below, clean or not.

Three things it will not do

Offline
Operator in control

Send your voice to a server

Speech recognition, translation and the synthetic voice all run on the board. It needs the internet once, to install. After that it works in a field with no signal bars.

Translate a callsign

Callsigns, signal reports, Q-codes, grid squares and frequencies are pulled out before translation and put back exactly. K1ABC stays K1ABC, and five nine stays five nine.

Key the radio on its own

The transmitter keys only after your own PTT press and a second press to confirm what is about to go out. No timer and no network request can key it.

From PTT to their speaker

Half-duplex
It translates between overs

Phone-mode radio is half-duplex: you talk, say "over", and the other station waits. So the box never has to translate while you speak. It records the whole over, translates it, then keys up. The processing time looks like a slow "over". Times on the left are Pi 4 estimates.

Transmit: you to the other station

  1. 0 s1
    YouPress PTT

    Hold the footswitch, or press Enter. This only tells the Pi to listen; the radio is not keyed.

  2. talking2
    YouSpeak English into the headset

    "Good morning K1ABC, you're five nine, thanks for the contact."

  3. release3
    YouRelease PTT

    Let go of the footswitch, or press Enter again. Recording stops (45 s limit).

  4. +3 to 7 s4
    PiSpeech to text

    whisper.cpp turns your voice into English text, on the Pi.

  5. 5
    PiJargon guard

    Callsigns, signal reports, Q-codes, grids and frequencies are set aside so the translator can't change them.

  6. +0.5 to 2 s6
    PiTranslate

    Argos Translate language pack, English → Italian. The jargon is put back exactly.

  7. +1.5 to 3 s7
    PiSynthesized voice

    Piper (or Open JTalk for Japanese) speaks the Italian. Callsigns come out in phonetics.

  8. your call8
    YouReview, then press again to send

    The screen shows what you said and what will go out. Press Enter to transmit. Anything else, or no answer in 20 s, discards it.

  9. keyed9
    RadioPi keys the transmitter

    CAT command through rigctld, the interface's RTS line, or VOX.

  10. on air10
    RadioDisclosure, message, station ID

    "Trasmissione tradotta automaticamente." then the Italian, then your call in English when an ID is due. A long message is cut to fit 90 s; the ID never is.

  11. ≤ 90 s11
    RadioUnkey

    Always: after an error, if the program is killed, or if the sound device stalls (a watchdog unkeys).

Receive: the other station to you

  1. they talk1
    RadioTheir Italian comes in

    Audio from the rig into the USB interface.

  2. silence2
    PiFind the over

    Signal level marks where they start and stop. Bursts of noise are ignored.

  3. 3
    PiSpeech to text, in Italian

    Known Whisper noise phrases are filtered out.

  4. 4
    PiTranslate Italian → English

    Same jargon guard on the way back.

  5. a few s5
    YouEnglish in your headphones

    The screen shows their original words beside the translation.

Receive is muted while you transmit, so the Pi never translates its own signal.

What the other station hears

Disclosure first
Your ID in English

One over, as it goes out
  1. Trasmissione tradotta automaticamente."Machine-translated transmission." Said first, in their language, on every over.
  2. Buongiorno Kilo 1 Alfa Bravo Charlie, sei 5 9, grazie per il collegamento.Your message. The callsign and signal report came through translation untouched.
  3. This is Whiskey 4 Delta Papa Echo.English ID (FCC §97.119): added to the end of your first over, and to any over that would otherwise end more than 10 minutes after the last ID. A recording of your own voice works too.

The other station needs nothing special. They hear a synthetic Italian voice and reply normally.

The hardware is off the shelf

Nothing to build
USB on both sides

Nothing to build. The Pi has no microphone input (and a Pi 5 has no headphone jack), so audio goes through USB on both sides.

YouUSB headsetMic in, translated receive audio out. Headphones keep that audio out of the mic.
USB
The boxRaspberry Pi 4 or 5Runs speech recognition, translation and the voice. 4 GB+ RAM, fan, 64-bit OS.
USB
InterfaceUSB radio interfaceDigirig, SignaLink or a CM108 card. Audio both ways, plus PTT.
radio cable
RigYour radioData port or mic jack. CAT over USB if the rig has it.
Local PTT: keyboard Enter (press to start, press to stop), or a switch from GPIO27 (pin 13) to ground (pin 14) that you hold while talking. Screen: a monitor or touchscreen showing the terminal, or SSH from a laptop. There is no web interface yet. Shortcut: a rig with built-in USB audio and CAT (an IC-7300, for example) replaces the interface.
PartNotes
Raspberry Pi 4B or Pi 5, 4 GB or moreThe pipeline uses about 1 to 1.5 GB of RAM
CoolingFan case on a Pi 4, Active Cooler on a Pi 5
32 GB+ microSD or USB SSDEngines plus one language pair: under 1 GB
USB headsetOr a USB sound card plus any headset
USB radio interface + radio cableDigirig, SignaLink or CM108; cable to suit the rig
12 V → 5 V buck converter3 A for a Pi 4, 5 A for a Pi 5; or a USB-C power bank
Footswitch (optional)Any momentary switch, or a USB footswitch

The one case that needs a small circuit: keying the radio directly from a Pi GPIO pin needs a transistor or opto-isolator board. CAT, the Digirig's RTS line or VOX avoid it.

English plus 29 languages

Both directions
Each with an offline voice

Each one has a translation pack in both directions with English, Whisper speech recognition, an offline voice, and its own spoken disclosure line (shown on each card).

Japanese uses Open JTalk because Piper has no Japanese voice. Callsign phonetics are spoken in katakana (キロ 1 アルファ…), since Open JTalk would otherwise spell "Kilo" letter by letter. The disclosure lines were written for this tool; a native speaker should check them before they go on the air. Argos also has Korean, Thai, Hebrew and Indonesian packs, but no offline voice exists for them yet.

Ham terms never reach the translator

Swapped out
Put back exactly

They are swapped out before translation and put back exactly. A bare number only counts as a report after words like "you're" or "signal", so "I'm 59" and "59 watts" stay numbers.

You sayScreen showsVoice says
K1ABC, or "kilo one alfa bravo charlie"K1ABCKilo 1 Alfa Bravo Charlie
"five nine", "5 by 9", "you're 59"5 95 9, in the voice's language
QTH, QSL, QRZ?, CQQTHQ T H
FN25dr, or "my grid is FN25"FN25drFoxtrot November 2 5 Delta Romeo
DL/K4DIA, K4DIA/PDL/K4DIADelta Lima stroke Kilo 4 Delta India Alfa
7,150 kHz7150 kHz7150 kilohertz
146.520 MHz146.520 MHz146 virgola 520 megahertz
73, and names in your glossary fileunchangedunchanged

If the model garbles the swapped-out terms, the tool translates the plain words between them piece by piece, splices the terms back in order, and flags that over on screen.

The operator stays in control

Six built-in rules
Keying is a physical act

Keying is a physical act

With review on (the default), the radio keys only after your own PTT press and a confirming press. The ID key sends your callsign directly. No timer or network request can key it.

Review before transmit

You see your words and the translation before anything goes out. Only Enter sends; any other key, or 20 s of silence, discards.

Station ID in English

FCC §97.119: your call in English phonetics on your first over, whenever 10 minutes would otherwise pass, and offered again when you quit. Nothing is sent on a timer. It refuses to transmit as N0CALL.

Disclosure on every over

"Machine-translated transmission", in their language, so nobody is misled about the synthetic voice.

Hard limits

45 s per recording, 90 s per transmission, and an unkey on every error, Ctrl-C, kill or dropped SSH session. Set the rig's own time-out timer too.

No voice cloning

Stock synthetic voices only. The box converts what you said; the only words it adds are the disclosure line and your ID.

Pi 4 or Pi 5: how long you wait

Estimates
Not measurements

Start with a Pi 4. Memory isn't the limit; CPU speed is, and the Pi 5 is rated 2 to 3× faster.

BoardSpeech modelVoice qualityWait per 10 s overDraw, idle → load
Raspberry Pi 4BWhisper basedefault voicesabout 5 to 12 sabout 3 → 6.5 W
Raspberry Pi 5Whisper base or smalldefault voicesabout 3 to 8 sabout 3 → 11.5 W

Estimates, not measurements. They come from published reports and the Pi 5's rated speed-up. Default voices are medium quality (Italian is x_low). The built-in bench command measures the real numbers on the board.

Where the models came from

Open-source engines
Training data stated

Everything runs locally from open-source engines. What each model learned from still matters, and none is perfectly clean:

StageModelTrained on
Speech to textWhisper (MIT weights)Audio collected from the web by OpenAI
TranslationArgos Translate packsMostly the OPUS collection: EU Parliament and UN records, volunteer sentences, and often film subtitles and web-crawled text. Each pack lists its sources.
VoicePiper voicesVaries per voice; each has a model card saved next to it. Many were fine-tuned from a voice with a non-commercial research license.
Japanese voiceOpen JTalk, nitech atr503CC BY 3.0, Nagoya Institute of Technology

Where it stands, and what is next

One step done
Five gates to go

The software works end to end and is tested, but it hasn't run on a Pi with the real models yet. Each step below has a pass/fail gate.

  • ✓
    Prototype built

    Tool, installer and 105 automated tests. Checked against real whisper.cpp, CTranslate2, Open JTalk and Hamlib. Code-reviewed, with the findings fixed.

  • Bench test on a Pi 4

    Gate: under 12 s of dead air for a 10 s over.

  • Practice mode with real speech

    Gate: callsigns, reports and Q-codes correct in 10 of 10 overs.

  • Into a dummy load

    Gate: clean audio with no ALC, ID on the first over, unkeys every time.

  • Receive a real Italian FM signal

    Gate: the meaning comes through on strong signals.

  • A full contact on simplex

    Gate: a complete QSO with a partner speaking the other language, no manual fixes.

Discuss this project on GitHub

Tried it, measured something different, or found a mistake? The conversation for every page on this site lives in GitHub Discussions. Bugs in the code itself go to the project's own issue list. A GitHub account is all it takes. Sign with your callsign.