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.
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.
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.