使用 Python 使用音频传输数据

Posted

技术标签:

【中文标题】使用 Python 使用音频传输数据【英文标题】:Transferring Data using Audio using Python 【发布时间】:2014-11-29 15:59:42 【问题描述】:

我有一个项目,涉及获取一个字符串并将其转换为一系列不同频率的声音,然后将声音读回原始文本。

机器 1:

“Hello World” --> 一些音频

机器 2:

一些音频 --> “Hello World”

是否有任何库或项目可以让我这样做?如果没有,关于如何实现这一点的任何建议?

【问题讨论】:

【参考方案1】:

您需要了解调制技术。正常程序是这样的:

使用一些纠错码使二进制数据冗余 将数据调制为离散信号 数模转换器 通过物理介质传输 A/D 转换器采样 解调 纠错

如果您想更简单地执行此操作,则可以跳过纠错部分,但这会带来风险,即您的整个数据在稍微不是最佳的环境下被损坏。

让我们快速浏览一下其中的软件部分。

添加纠错码

有很多代码可以做到这一点。一个非常简单的方法就是重复每个比特多次,并在纠错阶段取所有接收比特的平均值。

调制

您有一系列 1 和 0,并希望将其转换为波形。您可以通过将它们映射到不同的基本信号来做到这一点。在简单的情况下,这些信号可以只是不同频率的正弦信号,通常它们可以是任何信号,但应该是正交的以在统计上独立。 然后你需要指定一位将被发送多长时间,这称为符号长度。您发送信号的时间越长,就越容易检测到它,但是您每次发送的数据更少。请记住,我们正在创建一个离散信号,然后通过一些 D/A 转换器(我们的声卡)。

一个例子

我们希望使用 00110100 的正弦波发送 00110100 0 和 10000Hz 的正弦信号 0。我们选择符号长度为 1 毫秒,因此它是两个基本信号周期的倍数,这改善了形状。 所以我们发送一个频率为 5000 Hz 的正弦波持续 2 毫秒,然后是 10000 赫兹持续 2 毫秒,然后是 5000 赫兹持续 1 毫秒,10000 赫兹持续 1 毫秒,最后是 5000 赫兹持续 2 毫秒。 要为此创建采样点,我们必须选择一种音频格式。让我们使用 44 kHz 的采样频率。 执行此操作的代码类似于:

for bit in data:
    for i in range(0, sampling_frequency * symbol_length):
        signal.append(sin(i * sample_length * symbol_frequency(bit)))

sampling_frequency 大概是 44 kHz,symbol_length 是 1ms,sample_length 是 1/sampling_frequency,symbol_frequency 对于 0 是 5000 Hz,对于 1 是 10000 Hz。

解调

这可以通过相关函数来完成。基本上,您假设您有一个符号,然后查看您接收到的信号与该符号生成的信号有多相似。相似度是接收到的样本和理论样本的乘积在所有样本上的总和。如果您的频率与信号匹配,则整个信号的符号应该相等,因此这最终会产生一个很大的值,对于不同的频率,符号会在不同的点发生变化,并且最终都会在零附近的某个地方结束。对于我们的简单案例,您可以使用假设的 1 和假设的 0 来计算相关函数,然后使用较大的一个作为您收到的符号。

要读取您创建的音频并将其写入文件,您可以使用默认的 python 波形库:https://docs.python.org/2/library/wave.html

【讨论】:

这是一个符合您所说的项目。 github.com/romanz/amodem/blob/master/README.rst

以上是关于使用 Python 使用音频传输数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Python 中的 Youtube URL 流式传输音频(无需下载)?

多任务处理@Raspi?在流式传输音频时运行 python 脚本

从网络服务器流式传输音频

将音频缓冲区从 Python 脚本传输到 Go 服务器?

将音频和视频块从 python 中传输到 ffmpeg 的最佳方法

从python内存中的MPEG(.ts)文件中提取音频,而不将MPEG写入文件