Audio analysis · No upload

Decode Morse audio to text on your device

Drop a recording of Morse code and read it as text, with the tone, timing and speed measured from the file.

Decoded text

    
    

    

The strip draws the tone's envelope in decibels, the threshold it was read against, and every burst counted as a dit or a dah. The line under the strip pairs each decoded character with its elements, so you can check any letter against the recording without playing it.

Statusidle Files— File— Duration— Sample rate— Tone— Unit— Speed— Network since file read—

One keyed tone, 100–3,000 Hz, channels averaged to mono. Refused with “could not find morse timing”: no steady tone, no single dominant tone, no clear on/off keying, under 4 tone bursts, or a pattern that is not morse. A recording over ten minutes is refused by name. Takes .wav, .wave, .mp3, .m4a, .aac, .ogg, .oga, .opus, .flac, .aif, .aiff and .weba.

How this decoder works

Your browser reads the file and decodes its audio. The decoder averages the channels to mono and cuts the samples into 4-millisecond frames. It finds the keyed tone by autocorrelating the loudest 32 milliseconds, anywhere from 100 to 3000 Hz, then compares the energy at that frequency with the total energy in the same 32-millisecond window; a share below 0.5 is refused. A Goertzel filter written in the page’s own JavaScript then reads the whole recording at that frequency, which reduces the effect of hiss and hum at other frequencies. The readout shows the tone in hertz, the timing unit in milliseconds and the speed in WPM.

The filtered envelope, in decibels, splits into two clusters, tone on and tone off. The threshold between them is set from your recording, with hysteresis so that ramped keying does not flicker across it. On and off runs shorter than 8 milliseconds are merged away as clicks. The tone-burst lengths cluster into dits and dahs, their measured centres set the timing unit, and the gaps are classified against multiples of that unit: inside a letter, between letters or between words. The ITU table then turns each element pattern into text.

The ITU table covers letters, digits, seven punctuation marks and the error prosign. Any other pattern is shown as dots and dashes, never guessed into the nearest letter, and if more than half the letters are unmapped the file is refused with “could not find morse timing”. Here “letters” counts every decoded letter group, mapped or unmapped. The keying has to change the level by at least 6 decibels. Files over ten minutes are refused by name, because the whole recording is decoded into memory. The page makes no sound: there is no playback and no Morse audio export.

Frequently asked questions

Is my recording uploaded anywhere?
No. The browser reads and decodes the recording, and JavaScript in this tab works out the envelope, the threshold and the timing, with no analysis library to download. The meter counts resource-timing entries from the first file read; it does not see earlier page requests or every network channel. The methodology page explains this and how to try the loaded tool offline.
How does it know how fast the morse was sent?
The speed is measured from your file, not assumed. The decoder groups the detected tone bursts into short and long ones, and because a dah is three timing units, the two cluster centres give two estimates of the unit, which are averaged. The WPM readout uses the PARIS relation: 1200 divided by the unit in milliseconds. Letter and word gaps are classified against that same unit, and a gap of five units or more counts as a word break. Farnsworth practice recordings stretch the gaps between letters beyond the standard three units, and any that reach five read as word breaks, so the transcript can show extra spaces even when the letters decode correctly.
Why does it say “could not find morse timing”?
Because the recording failed one of the decoder’s checks, and the text after “could not find morse timing” names which one: the recording has no steady tone, no single tone strong enough to read, keying that does not switch clearly on and off, too few tone bursts to measure the speed, or a rhythm that does not follow Morse structure. A refusal also clears the transcript, the alignment line and the strip.
What can't this decoder read?
Anything other than one keyed tone. The decoder cannot separate overlapping stations: it checks that the tone dominates the chosen 32-millisecond window and runs no mixture test on the whole recording, so a stronger station may be decoded alone, and mixtures can still produce misleading results. It does not transcribe a voice saying “dit dah”. Its working range is roughly 5–50 WPM.
Which audio formats work here?
WAV, MP3, FLAC, AIFF, M4A and AAC, OGG and Opus, and WebM audio, when your browser’s audio engine can decode the file’s codec. The page downloads no extra audio decoder. A file the browser cannot decode gets a named refusal, and so does any extension that is not on this list, even one your browser can play.

Related tools