使用 Python 从音频中提取摩斯密码

这篇具有很好参考价值的文章主要介绍了使用 Python 从音频中提取摩斯密码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本人并非专业人士,在部分专业名词的表述上可能会出现错误,敬请谅解

前段时间在 BugKu 做题时碰到了这么一题 铁子,来一道 - Bugku CTF
(WriteUp 可见同学的博客 【BugKu】铁子,来一道_s1ameseL的博客-CSDN博客)
在解题过程中有一步,需要从音频中提取出摩斯密码。看了同学写的 WriteUp 后,我突发奇想,决定写一个自动从音频中提取摩斯密码的程序,于是就有了这么个工具

Github地址: https://github.com/Ling-Ink/MorseAudioDecoder

编写过程

1.载入音频

在这里使用的是 python 的 wave

# 加载音频
audio = wave.open(sys.argv[1], 'rb')

# 读音频信息
params = audio.getparams()
print(params)
n_channels, _, sample_rate, n_frames = params[:4]

# 读频谱信息
str_wave_data = audio.readframes(n_frames)
audio.close()

# 将频谱信息转为数组
wave_data = np.frombuffer(str_wave_data, dtype=np.short).T

2.提取数据

计算出横轴的时间轴后,使用 pylab 库绘制频谱图像

time = np.arange(0, n_frames) * (1.0 / sample_rate)
pylab.plot(time, wave_data)
pylab.show()

结果如下
摩尔斯电码音频识别,python,音视频,开发语言,笔记
对于如何区分长(“-”)与短(“.”),我想到的方法是计算出所有信号的平均长度,大于平均长度的即为长(“-”)

# 计算平均频率
wave_avg = int(sum([abs(x / 10) for x in wave_data]) / len(wave_data))

在此处有个小插曲,由于音频的波形呈现正弦型,所以在带有信息的区域也会出现频率值为0的情况,最终生成的数据也无法转换为摩斯密码
摩尔斯电码音频识别,python,音视频,开发语言,笔记
后来在 Python 波形处理_Rone-X的博客-CSDN博客 这篇博客中发现可以取一段区域内的平均值
比较代码如下,使用了 tqdm 库显示绘制进度

# 绘制摩斯图像
morse_block_sum = 0  # 待划分的数据
morse_block_length = 0  # 待划分的数据长度
morse_arr = []
time_arr = []
pbar = tqdm(wave_data, desc="Drawing Morse Image")
for i in pbar:
    # 高于平均值记为 1 ,反之为 0
    if abs(i) > wave_avg:
        morse_block_sum += 1
    else:
        morse_block_sum += 0
    morse_block_length += 1
    # 将数据按照指定长度划分
    if morse_block_length == 100:
        # 计算划分块的平均值
        if math.sqrt(morse_block_sum / 100) > 0.5:
            morse_arr.append(1)
        else:
            morse_arr.append(0)
        # 横坐标
        time_arr.append(len(time_arr))
        morse_block_length = 0
        morse_block_sum = 0

最后生成的图像如下
摩尔斯电码音频识别,python,音视频,开发语言,笔记
接着取出 0 位和 1 位的长度信息

# 摩斯电码 按信号长度存储
morse_type = []
morse_len = []
# 摩斯电码长度     0  1
morse_obj_sum = [0, 0]
morse_obj_len = [0, 0]
for i in morse_arr:
    if len(morse_type) == 0 or morse_type[len(morse_type) - 1] != i:
        morse_obj_len[i] += 1
        morse_obj_sum[i] += 1
        morse_type.append(i)
        morse_len.append(1)
    else:
        morse_obj_sum[i] += 1
        morse_len[len(morse_type) - 1] += 1

# 计算信息与空位的平均长度
morse_block_avg = morse_obj_sum[1] / morse_obj_len[1]
morse_blank_avg = morse_obj_sum[0] / morse_obj_len[0]

与平均长度比较

# 转换为摩斯电码
morse_result = ""
for i in range(len(morse_type)):
    if morse_type[i] == 1:
        # 大于平均长度为"-"
        if morse_len[i] > morse_block_avg:
            morse_result += "-"
        # 小于平均长度即为"."
        elif morse_len[i] < morse_block_avg:
            morse_result += "."
    # 大于平均空位长度的为分割
    elif morse_type[i] == 0:
        if morse_len[i] > morse_blank_avg:
            morse_result += "/"

3.解码数据

使用如下字典解码

morse_dict = {
    '.-': 'A', '-...': 'B', '-.-.': 'C', '-..': 'D', '.': 'E', '..-.': 'F',
    '--.': 'G', '....': 'H', '..': 'I', '.---': 'J', '-.-': 'K', '.-..': 'L',
    '--': 'M', '-.': 'N', '---': 'O', '.--.': 'P', '--.-': 'Q', '.-.': 'R',
    '...': 'S', '-': 'T', '..-': 'U', '...-': 'V', '.--': 'W', '-..-': 'X',
    '-.--': 'Y', '--..': 'Z',

    '.----': '1', '..---': '2', '...--': '3', '....-': '4', '.....': '5',
    '-....': '6', '--...': '7', '---..': '8', '----.': '9', '-----': '0',

    '.-.-.-': '.', '---...': ':', '--..--': ',', '-.-.-.': ';', '..--..': '?',
    '-...-': '=', '.----.': '\'', '-..-.': '/', '-.-.--': '!', '-....-': '-',
    '..--.-': '_', '.-..-.': '"', '-.--.': '(', '-.--.-': ')', '...-..-': '$',
    '.--.-.': '@'
}
# 摩斯电码解码
morse_array = morse_result.split("/")
plain_text = ""
for morse in morse_array:
    plain_text += morse_dict[morse]

plain_text 变量中即为解码后的数据

验证

摩尔斯电码音频识别,python,音视频,开发语言,笔记

参考:
利用python自动解析摩斯电码音频文件_如何从音频中提取摩斯密码_Rabbit_Gray的博客-CSDN博客
使用Python绘制语音信号的波形图_python画信号图_进击的小杨人的博客-CSDN博客
Python 波形处理_Rone-X的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-717508.html

到了这里,关于使用 Python 从音频中提取摩斯密码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Python轻松识别音频中文字(Whisper)

    在开会或是讨论问题的时候,我们总有一些内容需要记录下来。但由于各种原因,我们无法做到全面细致的记录。事后我们可能需要补充这些细节性内容,而回放视频或是录音费时费力,这时候语音识别可以帮助我们轻松解决这一痛点。目前,常见的语音识别服务以收费的居

    2024年02月09日
    浏览(40)
  • BUUCTF-MD5强弱比较-MD5()的万能密码-tornado框架注入-中文电码

    第六周 第三次 目录 学习到的知识 1.MD5强弱比较可以都可以使用数组绕过 2.基于MD5()的万能密码    ffifdyop WEB [BJDCTF2020]Easy MD5 ​编辑[护网杯 2018]easy_tornado Crypto 信息化时代的步伐 凯撒?替换?呵呵! Misc 神秘龙卷风 1.MD5强弱比较可以都可以使用数组绕过 2.基于MD5()的万能密码

    2023年04月12日
    浏览(57)
  • 如何用python提取音频

    可以使用 Python 的多种库来提取音频。其中一种方法是使用 ffmpeg 库。 首先,需要安装 ffmpeg 库,可以使用以下命令进行安装: 然后,可以使用以下代码来提取音频: 在这段代码中,我们首先读取了视频文件,然后使用 audio 属性提取了视频文件中的音频流,最后使用 ffmpeg.

    2024年02月11日
    浏览(39)
  • 通过python如何实现视频提取音频,并将音频转文本

    大致思路: (1)使用moviepy库中的VideoFileClip类读取视频文件,并将其转换为音频文件; (2)使用pydub库中的splitonsilence函数将音频文件分割成多个音频片段,以便进行语音识别; (3)使用SpeechRecognition库中的Recognizer类进行语音识别,并将识别结果写入文本文件中 注意: 将

    2024年02月05日
    浏览(72)
  • python怎么提取视频中的音频

    目录 操作步骤 1. 安装MoviePy库: 2. 导入MoviePy库和所需的模块: 3. 提取音频: 可能遇到的问题 1. 编解码器支持: 2. 依赖项安装: 3. 文件路径问题: 4. 内存消耗: 5. 输出文件大小: 注意事项 1. 文件格式支持: 2. 安装依赖项: 3. 内存消耗: 4. 文件路径准确性: 5. 音频质量

    2024年02月10日
    浏览(40)
  • 【python】基于librosa库提取音频特征

    librosa.amplitude_to_db 是一个音频处理库librosa中的一个函数,用于将音频信号的幅度转换为分贝(dB)单位的值。在音频处理中,分贝是一种常用的单位,用于表示信号的相对强度。 该函数的输入参数是音频信号的幅度值,可以是单个值或者一个数组。它会将输入的幅度值转换为

    2024年04月17日
    浏览(49)
  • 使用FFMPEG提取音频数据

      我的上一篇博文中已经介绍了FFmpeg,讲解了下载与安装的方式,并在命令行下将视频数据提取为图片数据,如有需要请查看:使用FFMPEG提取图片数据   提取的音频格式有很多种,在这里只讲解两种格式的提取:mp3、wav。mp3格式和wav格式都是数字音频格式,wav格式是最接

    2024年02月06日
    浏览(41)
  • 提取视频中的音频 Python只需要三行代码!

    身处数据爆炸增长的信息时代,各种各样的数据都飞速增长,视频数据也不例外。我们可以使用 python 来提取视频中的音频,而这 仅仅需要安装一个体量很小的 python 库,然后执行三行代码! 语音数据在数据分析领域极为重要。比如可以分析语义、口音、根据人的情绪等等。

    2023年04月09日
    浏览(40)
  • python之pyAudioAnalysis:音频特征提取分析文档示例详解

    PyAudioAnalysis是一个开源的Python库,用于从音频文件中提取特征并进行分析。它提供了一系列音频处理函数,可以帮助开发者实现音频分类、情感识别、语音分析等多种任务。在本文中,我们将详细介绍如何使用PyAudioAnalysis进行音频特征提取和分析。 音频特征提取 PyAudioAnalys

    2024年02月16日
    浏览(45)
  • 工具学习——使用OpenSmile提取音频特征

    openSMILE(open-source Speech and Music Interpretation by Large-space Extraction)是一个开源工具包,用于语音和音乐信号的音频特征提取和分类。openSMILE广泛应用于情感计算的自动情感识别。openSMILE完全免费用于研究目的。 在下述网页下载opensmile的安装包,链接 然后进入“/home/public/gl/Mul

    2024年02月20日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包