【问题标题】:Morse Audio Decoding Using Python使用 Python 进行莫尔斯音频解码
【发布时间】:2017-03-25 05:00:17
【问题描述】:

我一直在尝试创建一个摩尔斯电码音频解码器,这将通过麦克风输入摩尔斯电码音频并使用 python 将其解码为英文。现在我的首要任务是能够识别嘀嘀嘀嘀。我尝试处理这部分解码器的方法如下:

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 打印,则遍历列表'dah'

正如您所见,这不是很有效,所以关于我如何处理摩尔斯电码音频解码的任何建议?

受另一个帖子影响的代码:Detect tap with pyaudio from live mic

【问题讨论】:

    标签: python audio morse-code


    【解决方案1】:

    如果您仍在寻找答案,我找到了一个名为 morse-to-text - default 的基于 python 的库,它将 .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]]
    

    我刚刚从网上获得了一个示例摩尔斯电码文件。因此它不是英文的。
    希望这可以帮助。

    【讨论】:

    • 遗憾的是,在将您的 (morse-to-text.py) 代码与您的 Googlecode archive(az、tppds 和维基百科)中包含的任何示例一起使用后,我收到以下错误:TypeError: ' numpy.float64' 对象不能解释为整数...有什么建议吗?
    • 您的数据被解释为 'numpy.float64' ,在运行 morse-to-text.py 之前,您可能需要先转换为 'integer'。尝试一下,否则将您的问题与数据分开发布并告诉我。那我可以看看。
    • 对于使用 Python3 的任何人,将大括号添加到 print,将第 87 行中的 min 更改为 int(min),将第 242 行更改为 if code in self.dic:
    猜你喜欢
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多