ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ggwave Python 实战:用 send.py / receive.py 实现基于声音的数据传输

ggwave Python 实战:用 send.py / receive.py 实现基于声音的数据传输 通信物联网嵌入式【免费下载链接】ggwaveTiny>项目地址https://gitcode.com/GitHub_Trending/gg/ggwave点击查看免费下载本指南围绕仓库 examples/ggwave-py 目录下的两个 Python 示例脚本展开讲解如何基于ggwavePython 包把文本编码成音频波形播放出去再通过麦克风采集解码还原实现完整的数据通过声音传输data-over-sound闭环。读完本文你将掌握pip install ggwave的环境搭建、ggwave.encode发送端 API 与ggwave.init/ggwave.decode接收端 API 的完整用法并能独立运行 send.py 和 receive.py 完成一次端到端收发。环境准备安装 ggwave 与 pyaudio关联文档 examples/ggwave-py/README.md 明确指出使用示例前需要先安装ggwavePython 包pip install ggwave由于 send.py 与 receive.py 依赖pyaudio完成音频播放与采集需要额外安装它。在 Debian/Ubuntu 系系统上建议先通过 apt 安装 PortAudio 开发库再用 pip 安装 Python 绑定sudo apt-get install portaudio19-dev python-pyaudio python3-pyaudio pip install pyaudioportaudio19-dev提供跨平台的音频 I/O 底层库pyaudio是它的 Python 封装负责以指定的采样率、声道数和采样格式打开音频流。安装完成后可以用python -c import ggwave, pyaudio快速验证两个依赖均已就绪。发送端 send.py把文本编码成音频波形仓库中的 send.py 是发送端的完整实现核心逻辑只有几步生成波形、打开输出流、写入播放。import ggwave import pyaudio p pyaudio.PyAudio() # generate audio waveform for string hello python waveform ggwave.encode(hello python, protocolId 1, volume 20) print(Transmitting text hello python ...) stream p.open(formatpyaudio.paFloat32, channels1, rate48000, outputTrue, frames_per_buffer4096) stream.write(waveform, len(waveform)//4) stream.stop_stream() stream.close() p.terminate()ggwave.encode 的参数语义ggwave.encode(payload, protocolId1, volume20)中两个关键参数含义如下与 C 接口 ggwave_encode 一一对应protocolId编码协议编号示例中取1。在 cggwave.pxd 中可以看到协议枚举从GGWAVE_PROTOCOL_AUDIBLE_NORMAL0开始因此1对应GGWAVE_PROTOCOL_AUDIBLE_FAST属于可听频段、快速模式的协议。协议族可归纳为可听频段AUDIBLE、超声频段ULTRASOUND、双音调DT、多音调MT每种又分 Normal/Fast/Fastest 三档速度volume生成波形的音量范围[0, 100]。ggwave.h 的注释给出了明确建议usually 25 is OK and you should not go over 50即日常使用取 25 左右即可一般不要超过 50否则波形容易过载失真影响解码成功率。此外encode的默认volume为 10见 ggwave.pyx 的函数签名def encode(payload, protocolId 1, volume 10, instance None)示例脚本显式传入20以获得更好的可听度。pyaudio 输出流的配置要点发送端用p.open(formatpyaudio.paFloat32, channels1, rate48000, outputTrue, frames_per_buffer4096)打开单声道、48 kHz、float32 采样格式的播放流rate48000与 ggwave 的默认工作采样率一致。ggwave.h 中定义kDefaultSampleRate 48000.0f这是库内部处理音频的标称采样率formatpyaudio.paFloat32float32 采样格式对应 C 接口中的GGWAVE_SAMPLE_FORMAT_F32。ggwave 内部会把输入/输出音频按需重采样到统一工作采样率支持范围 100096000 Hzframes_per_buffer4096一次写入的缓冲帧数。stream.write(waveform, len(waveform)//4)的第二个参数是写入的帧数float32 单声道下每帧占 4 字节因此len(waveform)//4正好把整段波形全部写完。这也说明encode返回的是字节串bytes需要按采样格式的字节数换算成帧数。接收端 receive.py采集音频并实时解码仓库中的 receive.py 是接收端实现其核心是一个不断读麦克风 → 喂给解码器 → 输出结果的循环import ggwave import pyaudio p pyaudio.PyAudio() stream p.open(formatpyaudio.paFloat32, channels1, rate48000, inputTrue, frames_per_buffer1024) print(Listening ... Press CtrlC to stop) instance ggwave.init() try: while True: data stream.read(1024, exception_on_overflowFalse) res ggwave.decode(instance, data) if (not res is None): try: print(Received text: res.decode(utf-8)) except: pass except KeyboardInterrupt: pass ggwave.free(instance) stream.stop_stream() stream.close() p.terminate()实例生命周期init → decode → free接收端遵循典型的创建实例 → 逐帧解码 → 释放实例生命周期ggwave.init()使用默认参数创建解码实例内部对应ggwave_init不传参时等价于init(getDefaultParameters())ggwave.decode(instance, data)把麦克风采集到的一帧音频bytes送入解码器。C 层 ggwave_decode 的语义是持续喂入音频样本一旦检测到完整载荷就返回解码结果返回正数表示成功解码出n字节返回-1通常意味着背景噪声过大导致解析失败ggwave.free(instance)释放实例避免内存泄漏。帧大小与流配置的对应关系接收端使用frames_per_buffer1024的输入流循环中stream.read(1024)每次读取 1024 帧float32 单声道下对应 4096 字节。1024 恰好是 ggwave 默认的 FFT 帧大小kDefaultSamplesPerFrame 1024见 ggwave.h即解码器每次对一帧做一次频谱分析。帧大小会直接影响傅里叶频谱的分辨率bin 数量进而影响频率检测精度。解码结果的 UTF-8 处理ggwave.decode返回的是原始字节串且不是以\0结尾的字符串ggwave.h 对此有专门提醒。示例中通过res.decode(utf-8)转成文本并用try/except包裹以跳过无法按 UTF-8 解码的二进制载荷——这正说明 ggwave 不仅支持文本任何二进制字节序列都可以作为载荷传输。Python 绑定暴露的完整 APIggwave.pyxCython 绑定对外暴露了比示例脚本更完整的函数集合供你在自己的程序中按需调用函数作用对应 C 接口getDefaultParameters()获取默认实例参数ggwave_getDefaultParametersinit(parametersNone)创建解码/编码实例可传入自定义参数ggwave_initfree(instance)释放实例ggwave_freeencode(payload, protocolId1, volume10, instanceNone)把字符串或字节串编码为音频波形ggwave_encodedecode(instance, waveform)从音频波形解码出载荷失败返回Noneggwave_decodedisableLog()/enableLog()关闭/开启内部日志默认输出到 stderrggwave_setLogFilerxToggleProtocol(protocolId, state)开关接收协议state 取 0禁用或 1启用ggwave_rxToggleProtocoltxToggleProtocol(protocolId, state)开关发送协议ggwave_txToggleProtocol值得注意的实现细节encode在未传入instance时会临时自建一个默认实例、编码完成后立即释放own True分支因此发送端示例可以零实例地直接调用ggwave.encode而decode要求显式传入实例。此外encode内部会先以query ! 0方式向 C 层查询波形所需字节数再分配缓冲区执行真正编码从而避免缓冲区溢出。自定义参数init 的进阶用法ggwave.init(parameters)支持传入ggwave_Parameters结构体其字段定义于 cggwave.pxd 与 ggwave.h包括payloadLength 0时使用变长载荷带声音标记识别传输起止 0时按固定长度传输不发送标记适合载荷长度已知的场景sampleRateInp/sampleRateOut/sampleRate采集采样率、播放采样率与内部工作采样率典型取值范围 100096000 Hz不同时内部自动重采样samplesPerFrameFFT 帧大小默认 1024影响频谱 bin 数量sampleFormatInp/sampleFormatOut输入/输出采样格式U8/I8/U16/I16/F32operatingMode运行模式可组合GGWAVE_OPERATING_MODE_RX只收、GGWAVE_OPERATING_MODE_TX只发等位标志用于裁剪内存占用soundMarkerThreshold声音标记检测阈值默认 3.0。协议开关的实战价值通过rxToggleProtocol(protocolId, state)可以限定只启用需要的接收协议。ggwave.h 指出默认所有协议均启用而限制协议数量能减少误检false positives、提升传输准确率尤其当收发双方协议事先约定时。仓库测试 test-ggwave.py 正是以此为用例禁用协议 1 后新建实例解码同一波形返回None重新启用后解码恢复成功——验证了协议开关对解码结果的决定性影响。协议族与传输特性速查各协议的底层参数在 ggwave.h 的协议初始化表中可以查到字段含义freqStart为最低频率对应的 FFT bin 索引framesPerTx为传输单块数据所需帧数bytesPerTx为单块数据字节数extra为 2 表示单音调协议可听频段AUDIBLEfreqStart40Normal 每块 9 帧 3 字节、Fast 6 帧 3 字节、Fastest 3 帧 3 字节超声频段ULTRASOUNDfreqStart320同上帧结构但频率更高人耳不可闻适合需要静默传输的场景DT双音调freqStart24每块 9/6/3 帧、1 字节速度更快但数据密度低MT多音调freqStart24extra2同样 1 字节每块但使用多音调编码。选用原则可听频段适合演示和调试能听到声音确认发送超声频段适合需要不打扰用户的场景速度档位Normal/Fast/Fastest越快则传输时间越短但抗噪能力相对下降。完整实战跑通一次端到端收发两个脚本默认都是独立的进程实战时可在两台设备或同一台机器的两个终端分别运行终端 A 启动接收端python receive.py看到Listening ... Press CtrlC to stop后进入监听状态终端 B 运行发送端python send.py程序打印Transmitting text hello python ...后通过扬声器播放约几秒的音频观察终端 A解码成功后会打印Received text: hello python。注意要点发送与接收的采样率需一致示例均使用 48 kHz否则需在init参数中显式配置sampleRateInp使解码端自动重采样接收端必须在发送前启动否则会漏掉载荷的起始标记若环境噪声大导致解码失败可适当调低volume如 2530避免扬声器过载或改用超声频段协议如protocolId4对应的GGWAVE_PROTOCOL_ULTRASOUND_NORMAL见 cggwave.pxd 的枚举顺序若在无声卡设备上运行pyaudio.PyAudio()初始化会失败需要接入可用的音频输入输出设备。验证与测试官方测试脚本的启示仓库的 test-ggwave.py 提供了一条无需声卡即可验证 Python 绑定正确性的路径直接在内存中执行编码 → 解码往返断言解码结果与原始载荷逐字节一致res ! payload.encode()则退出码非 0。它还覆盖了协议开关对解码的影响可作为自研功能前的回归参考。运行方式为在构建好扩展模块的目录下执行python test-ggwave.py构建方法见 bindings/python/README.md 的make build说明。结合 send.py 与 receive.py一个典型的发送 → 传输 → 接收 → 解码完整链路即可搭建完成再配合协议切换、音量调节与自定义实例参数你可以在局域网配对、设备发现、IoT 静默通信等场景中复用这套数据通过声音传输的能力。赞分享通信物联网嵌入式【免费下载链接】ggwaveTiny>项目地址https://gitcode.com/GitHub_Trending/gg/ggwave点击查看免费下载相关推荐KernelSU 模块与 Magisk 模块的异同对比与双平台兼容开发指南KernelSU 模块与 Magisk 模块的异同对比与双平台兼容开发指南 KernelSU 与 Magisk 的模块机制在文件格式、安装目录和核心脚本语义上高通信物联网嵌入式ESP32终极指南用ggwave实现高效声音数据传输与优化ESP32终极指南用ggwave实现高效声音数据传输与优化 ggwave是一个小巧的数据声波传输库能让空气隔离的设备间通过声音交流小数据可用于文件分享、物通信物联网嵌入式ggwave声波传输技术让设备通过声音实现无缝数据传输的完整指南ggwave声波传输技术让设备通过声音实现无缝数据传输的完整指南 ggwave 是一个小巧的数据声波传输库能让空气隔离的设备间通过声音交流小数据可用于文件通信物联网嵌入式上一篇NodeMCU pipe 模块任务间字符流高效传递与管道式读写实战指南下一篇DDrawCompat终极指南让经典DirectX游戏在现代Windows上完美重生创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表