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
- 0 s1
YouPress PTT
Hold the footswitch, or press Enter. This only tells the Pi to listen; the radio is not keyed.
- talking2
YouSpeak English into the headset
"Good morning K1ABC, you're five nine, thanks for the contact."
- release3
YouRelease PTT
Let go of the footswitch, or press Enter again. Recording stops (45 s limit).
- +3 to 7 s4
PiSpeech to text
whisper.cpp turns your voice into English text, on the Pi.
- 5
PiJargon guard
Callsigns, signal reports, Q-codes, grids and frequencies are set aside so the translator can't change them.
- +0.5 to 2 s6
PiTranslate
Argos Translate language pack, English → Italian. The jargon is put back exactly.
- +1.5 to 3 s7
PiSynthesized voice
Piper (or Open JTalk for Japanese) speaks the Italian. Callsigns come out in phonetics.
- 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.
- keyed9
RadioPi keys the transmitter
CAT command through rigctld, the interface's RTS line, or VOX.
- 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.
- ≤ 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
- they talk1
RadioTheir Italian comes in
Audio from the rig into the USB interface.
- silence2
PiFind the over
Signal level marks where they start and stop. Bursts of noise are ignored.
- 3
PiSpeech to text, in Italian
Known Whisper noise phrases are filtered out.
- 4
PiTranslate Italian → English
Same jargon guard on the way back.
- 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
- Trasmissione tradotta automaticamente."Machine-translated transmission." Said first, in their language, on every over.
- Buongiorno Kilo 1 Alfa Bravo Charlie, sei 5 9, grazie per il collegamento.Your message. The callsign and signal report came through translation untouched.
- 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.
| Part | Notes |
|---|---|
| Raspberry Pi 4B or Pi 5, 4 GB or more | The pipeline uses about 1 to 1.5 GB of RAM |
| Cooling | Fan case on a Pi 4, Active Cooler on a Pi 5 |
| 32 GB+ microSD or USB SSD | Engines plus one language pair: under 1 GB |
| USB headset | Or a USB sound card plus any headset |
| USB radio interface + radio cable | Digirig, SignaLink or CM108; cable to suit the rig |
| 12 V → 5 V buck converter | 3 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 say | Screen shows | Voice says |
|---|---|---|
| K1ABC, or "kilo one alfa bravo charlie" | K1ABC | Kilo 1 Alfa Bravo Charlie |
| "five nine", "5 by 9", "you're 59" | 5 9 | 5 9, in the voice's language |
| QTH, QSL, QRZ?, CQ | QTH | Q T H |
| FN25dr, or "my grid is FN25" | FN25dr | Foxtrot November 2 5 Delta Romeo |
| DL/K4DIA, K4DIA/P | DL/K4DIA | Delta Lima stroke Kilo 4 Delta India Alfa |
| 7,150 kHz | 7150 kHz | 7150 kilohertz |
| 146.520 MHz | 146.520 MHz | 146 virgola 520 megahertz |
| 73, and names in your glossary file | unchanged | unchanged |
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.
| Board | Speech model | Voice quality | Wait per 10 s over | Draw, idle → load |
|---|---|---|---|---|
| Raspberry Pi 4B | Whisper base | default voices | about 5 to 12 s | about 3 → 6.5 W |
| Raspberry Pi 5 | Whisper base or small | default voices | about 3 to 8 s | about 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:
| Stage | Model | Trained on |
|---|---|---|
| Speech to text | Whisper (MIT weights) | Audio collected from the web by OpenAI |
| Translation | Argos Translate packs | Mostly the OPUS collection: EU Parliament and UN records, volunteer sentences, and often film subtitles and web-crawled text. Each pack lists its sources. |
| Voice | Piper voices | Varies 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 voice | Open JTalk, nitech atr503 | CC 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.