摩斯密码音频有噪声时,我尝试了哪些处理办法

30 阅读3分钟

做摩斯密码音频解码时,最明显的问题不是“能不能播放音频”,而是怎么从一段不干净的声音里找出真正的点、划和间隔。

如果音频很干净,事情相对简单:哔声出现就是信号,消失就是间隔,再根据持续时间判断点和划。但实际上传的录音经常不理想,可能有背景噪声、音量忽大忽小、频率不稳定,或者节奏本身就不是标准机器生成的。

我在整理 Morse Coder 的音频解码流程时,主要尝试了几个方向。

Morse Coder 音频解码页面

1. 先把“目标频率”找出来

摩斯密码音频通常不是要识别所有声音,而是要找到一段比较稳定的 tone。

所以第一步不是直接切时间轴,而是先判断主要信号大概在哪个频率附近。这样做的好处是,可以减少背景人声、环境声或低频噪声的干扰。

但这里不能做得太死。不同录音设备、不同生成工具、不同播放环境,都会让频率有偏差。如果频率窗口太窄,真正的摩斯音可能被过滤掉;如果太宽,噪声又会混进来。

所以我的倾向是:默认给一个可用范围,同时保留调整空间。

2. 用阈值区分有声和静音

找到大致频率后,下一步是把音频切成“有声片段”和“静音片段”。

这一步看起来简单,其实很容易出问题。阈值太低,背景噪声会被当成信号;阈值太高,比较弱的点可能会被漏掉。

我尝试的思路是不要只看单个瞬间,而是看一小段窗口里的能量变化。这样可以减少偶发噪点对结果的影响,也能让点和划的边界更稳定一点。

带噪声的摩斯密码音频解码示意图

3. 不急着翻译,先还原点划节奏

很多错误不是发生在“摩斯码转文本”,而是发生在前面的节奏切分。

比如一个短哔声应该是点,一个长哔声应该是划;两个信号之间的短停顿表示同一个字符内部,长一点的停顿表示换到下一个字符,更长的停顿才表示单词间隔。

如果这一步切错了,后面的翻译再准确也没用。

所以我更愿意先生成一层中间结果:识别出的点、划和空格。用户可以先看这层结果是否合理,再看最终文本。这样可以判断问题到底出在音频识别,还是出在摩斯翻译。

4. 对不稳定节奏保持保守

机器生成的摩斯音通常比较规整,但真实录音不一定。

有些音频来自练习器,有些可能是人工敲出来的,有些经过二次录制或压缩。点和划的比例、字符间隔、单词间隔都可能有波动。

这种情况下,工具如果强行给一个很确定的最终文本,反而容易误导用户。我的处理思路是尽量把自动识别做出来,但不要把结果包装成“绝对正确”。对可疑片段,用户仍然需要复核。

5. 最后才进入文本翻译

当点、划和间隔相对可信之后,再做文本翻译就简单很多。

这也是我觉得音频解码流程应该分层的原因:音频信号处理是一层,摩斯码切分是一层,文本翻译又是一层。把这几层混在一起,只给最终答案,调试和使用体验都会变差。

Morse Coder 的音频解码工具目前就是围绕这个思路整理的:先帮助用户从音频里提取信号和摩斯码,再把结果放到可检查的翻译流程里。

可以参考 Morse Coder 音频解码工具。 后续的一个优化就是,结合AI语义分析,再把可能的错误字符码给它纠正过来。