使用Python进行莫尔斯音频解码

时间:2017-03-25 05:00:17

标签: python audio morse-code

我一直想尝试创建一个摩尔斯电码音频解码器一段时间,这将通过麦克风采用莫尔斯电码输入音频并使用python将其解码为英语。现在我的首要任务是能够识别dits和dahs。我尝试接近解码器的这一部分的方法如下:

import pyaudio
import struct
import math
from datetime import datetime

thresh = 0.002
sample_period = 0.01
RATE = 44100
sample_cycles = int(RATE*sample_period)
SHORT_NORMALIZE = (1.0/32768.0)

CHANNELS = 2
FORMAT=pyaudio.paInt16

def rms(sample):
    count = len(sample)/2
    format = "%dh"%(count)
    shorts = struct.unpack( format, sample )

    sum_squares = 0.0
    for i in shorts:

        n = i * SHORT_NORMALIZE
        sum_squares += n*n

    return math.sqrt( sum_squares / count )

pa=pyaudio.PyAudio()


stream = pa.open(format = FORMAT,                      
         channels = CHANNELS,                          
         rate = RATE,                                  
         input = True,                                 
         frames_per_buffer = sample_cycles)


thresh_final=thresh
list1=""
counter=0
for i in range(1000):
    try:
        sample=stream.read(sample_cycles)
    except IOError:
        print("Error Recording")

    amp=rms(sample)

    if amp>thresh:
        list1+="1"
    else:
        list1+="0"
list1=list1.split("0")
print(list1)
for i in range(len(list1)):
    if len(list1[i])==45:
        print ("Dah")
    elif len(list1[i])==15:
        print("Dit")

守则/目标的快速摘要:

  1. 以0.01秒的间隔拍摄音频样本
  2. 通过RMS获取样本的振幅
  3. 如果0.01s样本的幅度大于阈值(仅设置用于识别是否有哔哔声),请添加' 1'到其他字符串' 0'
  4. 然后通过零将字符串拆分为列表(因为这些将是哔声之间的间隙)
  5. 如果子列表的长度= 15(15 * 0.01s = 0.15s,这是我用于dahs的时间)打印' dit'以及如果子列表的长度= 45 print' dah'
  6. 正如您所知道的那样,效率并不高,所以有关如何处理摩尔斯电码音频解码的建议吗?

    受其他帖子影响的代码:Detect tap with pyaudio from live mic

1 个答案:

答案 0 :(得分:1)

如果您仍在寻找答案,我找到了一个名为morse-to-text - defaultpython库,它将.wav莫尔斯代码文件转换为text

如果您有mp3,请先将其转换为wav 您可以使用内置的python waveffmpeg或外部包装库pydub
以下是使用pydub的示例,因为它非常易于使用。

from pydub import AudioSegment

codefile_mp3 = "sampleMorseCode.mp3"
codefile_wav = "sampleMorseCode.wav"
mcode = AudioSegment.from_mp3(codefile_mp3)
mcode.export(codefile_wav , format="wav")

将莫尔斯代码文件转换为wav后,您可以按如下方式运行morse-to-text.py命令行,或在python脚本中调用。

C:\morse-to-text>morse-to-text.py sampleMorseCode.wav

输出:

.-.. .- | .-. . ... .--. ..- . ... - .- | -.. . | . ... - . | -. .. ...- . .-..
| . ... | .- .-.. ..-. .-. . -.. | ...- .- .. .-..
LA RESPUESTA DE ESTE NIVEL ES ALFRED VAIL

它还会生成大量有关信号的数据,例如spectrogramfftfrequencyfilter等(如果您有兴趣的话。

Usage: C:\morse-to-text\morse-to-text.py soundfile.wav [--report[=pdf|=png]]

我刚刚从网上获得了一个样本莫尔斯代码文件。因此它不是英文的 希望这可以帮助。