rozetyp/voice-codec-modem
GitHub: rozetyp/voice-codec-modem
将数字数据隐藏在具有语音特征的音频中,使其经 Zoom、Discord、WhatsApp 及蜂窝语音编解码后仍可完整恢复的神经编解码调制解调器研究项目。
Stars: 0 | Forks: 0
# Voice-Codec Modem(语音编解码调制解调器)
将任意数字数据隐藏在具有语音特征形状的音频中,使其能够经受住 Zoom、Discord、WhatsApp 和蜂窝网络语音所使用的编解码器处理。六个经过训练的编解码器涵盖了从 76 bps(蜂窝网络语音)到 3196 bps(Zoom 级别)的速率范围,并在多种子验证中确认了 FEC 后零错误。端到端的“语音中藏语音”演示取得了成功:将第二路语音(Codec2)隐藏在听起来正常的通话中,并在另一端实现逐比特完美恢复。
这是一个研究项目,而非商业产品。该编解码器并非全新方法(它基于 Juvela 2024 年发表的 codec-in-loop 训练框架,并加入了水印级别的隐写术思想)。本文发布的内容是在速率、可听度和信道之间取得权衡的可复现 Pareto 曲线,并附带每个数据点的工作代码和可试听演示。
[音频演示](#listen) · [快速入门](#quickstart) · [Pareto 前沿](#pareto-frontier) · [有效与无效](#honest-limitations)
## 本项目提供什么
| 信道 | 实际应用场景 | 最佳可靠速率 |
|---|---|---|
| Opus 48k AUDIO | Discord, 音乐模式 WebRTC | 4000 bps 调制解调器音调, 2000 bps 语音主导, 933 bps 真实语音载体 |
| Opus 24k VOIP | Zoom, Teams, 现代 WebRTC | 3196 bps 调制解调器音调, 800 bps 语音纹理, 270 bps 真实语音载体 |
| Opus 12k VOIP | WhatsApp, Signal 语音 | 3196 bps(仅限调制解调器音调) |
| **AMR-NB 12.2k** | **2G/3G 蜂窝网络语音, PSTN** | 带有重复编码的 **76 bps 真实语音载体** |
所有数据均为通过真实的 ffmpeg-libopus 或 ffmpeg-amrnb(而非替代模型)进行 FEC 后、多种子验证的结果。在主要配置下,对每个检查点超过 76,000 比特的数据进行观察,未发现任何残留错误。
蜂窝网络的结果是最不寻常的特性:目前没有已知的 OSS 波形域方法能穿透 AMR-NB 工作。大多数音频水印技术针对的是 MP3/AAC 或 Opus。AMR-NB 蜂窝网络语音鲜少受到研究关注。
## 试听
[core/neural_codec/](core/neural_codec/) 及其子文件夹中包含了每种变体的可听 WAV 文件。涵盖了每种编解码器类别的原始载体、修改后以及经过编解码器处理的音频。
核心演示:在 Zoom 级别的 Opus 24k VOIP 下,以 2400 bps 的 Codec2 实现“语音中藏语音”:
```
.venv/bin/python core/neural_codec/voice_within_voice_demo.py --length_s 10 --codec2_mode 2400
# 输出: core/neural_codec/demo_outputs/
# 01_original_16k.wav 掩护语音 (真实语音)
# 05_transmitted_carrier_audio_16k.wav 窃听者听到的内容 (合成, modem 音调)
# 07_recovered_voice_within_voice_16k.wav 恢复的第二路语音 (与 Codec2 比特级一致)
```
全新低速率演示:使用真实语音发声作为载体承载 Codec2 700C,通过 stego_opus + Opus 24k VOIP 嵌入:
```
say "Meet me at the warehouse at midnight." -o /tmp/hidden.aiff # macOS TTS
ffmpeg -i /tmp/hidden.aiff -ar 8000 -ac 1 -f s16le /tmp/hidden.raw
python3 app/voice_within_voice.py
# 输出: /tmp/voice_within_voice/
# tx.wav 嵌入数据的掩护语音 (可听到的嘶嘶声)
# rx.wav 经过 Opus 24k VOIP 往返传输后的相同文件
# hidden_recovered.wav 第二路语音 (Codec2 700C, 机械音但清晰可辨)
```
## 快速入门
```
git clone
cd voice-codec-modem
# 需要 Python 3.10+ (全局使用了类型联合语法)。
python3.12 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
# 系统工具
brew install ffmpeg codec2 # macOS
# 或: apt-get install ffmpeg codec2 (linux)
# 首个演示: 穿透 Opus 24k VOIP 的 3.2 kbps voice-within-voice
.venv/bin/python core/neural_codec/voice_within_voice_demo.py --length_s 10 --codec2_mode 2400
# 对任意 checkpoint 的多种子验证
.venv/bin/python core/neural_codec/eval_real_opus.py core/neural_codec/ckpt_n128_mixed.pt --seeds 5
# AMR-NB 蜂窝网络变体
.venv/bin/python core/neural_codec/cellular/amrnb_eval_with_rep.py
```
`app/` 目录中较新的韵律和堆叠信道演示使用了 `pyworld`,这需要额外的 setuptools 依赖。它们可以在系统 Python(已安装 pyworld)下运行,或者在一个 setuptools<80 的全新 venv 环境中运行。
## Pareto 前沿
五个非支配检查点,每个都位于速率与真实感及信道的权衡曲线上的不同位置。
| 检查点 | 可靠速率 | FEC 后 BER | 载体声音类似于 | 最适用场景 |
|---|---|---|---|---|
| `core/neural_codec/ckpt_n128_mixed.pt` | 3196 bps | 76 kbits 下 0.0000% | 调制解调器音调 | 纯速率,通过电话进行机器到机器通信 |
| `core/neural_codec/adversarial/ckpt_n128_adv.pt` | 2125 bps | 0.05%(每 2000 个比特出现 1 个错误) | 带有语音纹理的噪音 | 平衡速率与真实感 |
| `core/neural_codec/adversarial/ckpt_n64_adv.pt` | 1598 bps | 0.0000% | 带有语音纹理的噪音 | 较低速率的语音纹理 |
| `core/neural_codec/sequence/ckpt_seq_adv.pt` | 799 bps | 0.0000% | 带有跨符号包络的类语音咿呀声 | 追求极致真实感;在 mel-L1 指标上最接近真实语音 |
| `core/neural_codec/stego/ckpt_stego_p3.pt` | 270 bps (Opus 24k VOIP) 或 933 bps (Opus 48k AUDIO) | 0.0000% | 带有可听见的嘶嘶声的真实人类语音 | 真实语音载体 |
| `core/neural_codec/cellular/ckpt_amrnb_real.pt` | 76 bps | 重复编码后 0.58% | 带有可听见的嘶嘶声的真实人类语音 | 蜂窝网络语音(目前已知唯一的方法) |
较新的堆叠信道通过 pyworld 音高调制增加了一个 5 bps 的韵月子信道;能够完美抵御任何语音编解码器,包括扬声器到麦克风的原声回路。
## 仓库结构
```
voice-codec-modem/
├── core/
│ ├── neural_codec/ IID neural codecs, headline 3196 bps
│ │ ├── adversarial/ IID + adversarial realism, 29-31% closer to real speech
│ │ ├── sequence/ SEQ codec with cross-symbol coherence
│ │ ├── stego/ Real-speech-cover stego, 270 bps via Opus 24k VOIP
│ │ ├── cellular/ AMR-NB cellular variant, 76 bps reliable
│ │ ├── prosody/ Pitch-modulation modem (5 bps reliable, any codec)
│ │ └── composite_attempt/ Documented negative result (TRIZ band-split)
│ ├── triz_pitch/ Hand-coded modem (175 bps reliable, no neural net)
│ └── slow_ghost.py, production_modem.py, ... Earlier prototypes, retired (see Reality Check)
├── app/
│ ├── voice_within_voice.py Codec2 700C through stacked stego_opus + prosody
│ ├── test_stacked_channel.py Stego + prosody together
│ ├── test_prosody_modem.py Pitch-modulation standalone
│ ├── modal_probe_*.py Multi-codec shootout, EnCodec/Mimi/DAC analysis
│ ├── modal_train_encodec_opus.py Failed EnCodec encoder fine-tune (kept for reference)
│ └── pipelines.py, server.py FastAPI POC for in-browser encode/decode
├── tests/ Validation scripts and audio fixtures
├── tools/ Real-codec test harness
└── Dockerfile, railway.json, .railwayignore Deployed POC config (separate from research)
```
## 工作原理
神经编解码器是一个端到端学习的编码器/解码器对,并将真实编解码器包含在训练循环中。
```
data bytes
-> Reed-Solomon (255,191) interleaved encode
-> bits
-> Encoder (1D conv stack, 3-32M params)
-> 30 ms audio frames at 16 kHz
-> ffmpeg -c:a libopus -b:a 24k -application voip (the channel)
-> Decoder (mirror conv stack)
-> bit logits
-> RS decode
-> data bytes
```
训练将可微替代信道(低通加成形噪声)与每 25 次迭代执行一次的真实 Opus 直通步骤混合使用。直通技巧在正向传播中运行真实的 ffmpeg-libopus 的同时,将梯度作为恒等映射穿透不可微的编解码器。这弥补了单信道替代训练无法跨越的替代模型与真实环境之间的差距。
对于 AMR-NB,替代模型完全失效(ACELP 编码与替代分布相差太远),因此训练的每一步都在真实的 ffmpeg-amrnb 中进行。每步耗时增加五到十倍,但这是在蜂窝网络语音上实现收敛的唯一途径。
隐写变体采用了不同的路径:编码器接收(载体语音,比特)并产生一个附加在真实录制的人类语音上的微小扰动。该载体就是编解码器在心理声学上倾向于保留的语音。比特作为幅度掩蔽的微小扰动潜藏在底层。
`core/triz_pitch/` 中的手工编码的 TRIZ 反转调制解调器不使用神经网络。它合成了有声音频,其中 Opus 保留的特征(音高、增益、频谱倾斜度)本身就是数据。三个正交信道被堆叠,然后通过 GF(256) 上的比特交织 Reed-Solomon 编码。可靠速率为 175 bps,在 152 kbits 中未观察到错误,无需 GPU。
## 客观的局限性
这是一个研究项目。有些功能不起作用,有些未被测量,或者低于已发表的最先进水平。
**在早期 README 草稿中宣传但实际未能如期工作的内容:**
- `slow_ghost.py` 声称达到 2.7 kbps。实际只有 10 bps,且其解码器是一个未训练的 `nn.Module`。
- `production_modem.py` 声称带有 FEC 的速率为 800 bps。即使在无编解码器的情况下也无法完成往返通信;能量阈值解码器与编码器的电平不匹配。BER 约为 50%。
- `band_energy_modulation.py` 及相关文件声称达到 1-2 kbps,但仅针对文件内的 `mock_opus_codec` 进行了测试,而该编解码器实际上只是 A 加权高斯噪声。未针对真实的 libopus 进行测试。
这些代码被保留在仓库中,并在 [现实检验](#reality-check) 部分附带了醒目的失效声明。它们不属于可用的工作集。
**未测试或低于最先进水平的内容:**
- AMR-WB, EVS, G.711, G.722。尚未对主要的蜂窝网络和 PSTN 编解码器进行表征。
- 对抗性隐写分析的鲁棒性。从未针对真实的检测器进行过训练。
- 实时双向全双工。所有的往返测试都是基于文件的;没有抖动、丢包或同步前导码。
- 真实的蜂窝网络条件。AMR-NB 仅通过 ffmpeg 进行了测试。
- 不可感知性。最好的隐写变体信噪比约为 13 dB(可听见的嘶嘶声)。未能达到真正的水印级不可感知性(>25 dB SNR)。
- 76 bps 的 AMR-NB 数据远低于已发表的基于编解码器内部 QIM 的 AMR 隐写术(Tian 等人 2018 年报告为 1-3 kbps)。合理的区别在于,我们的是盲波形域(发送端产生正常的 WAV),而已发表的方法是编解码器内部的(发送端在量化期间修改 AMR 编码器)。这属于不同的问题类别。既不更好,也不是全新方法。
**本项目不是:**
- 不是商业产品。AudioSeal 以更好的不可感知性占据了水印市场;我们处于曲线上不同的点(容量更高,存在可听见的载体)。
- 不是研究突破。所用方法均已发表(Juvela 2024 年的 codec-in-loop 训练,水印级隐写模式)。
- 不是全新方法。其贡献在于提供了一条可复现的 Pareto 曲线、有效的代码,以及对这些技术在三类语音编解码器上实际表现的诚实描述。
## 现实检验
在审计早期 README 草稿时发现的差异。记录在案以防重蹈覆辙。
- `slow_ghost.py` 声称达到 2.7 kbps 和 1.15% BER。实际代码只有 10 bps。没有在任何地方测量 BER。解码器具有随机的、未训练的权重。已废弃。
- `production_modem.py` 声称“生产就绪”的 800 bps 以及 <0.5% BER。该脚本的解码器阈值与其自身的编码器电平不匹配;即使没有编解码器也无法完成往返通信。“99.9% 编解码器存活率”字符串是硬编码的,而非实测结果。已废弃。
- “LLM 语义压缩倍增有效容量”的说法将信道比特率与信息率混为一谈。已删除。
- `utils/ACTION_PLAN_10KBPS.py` 大小为 0 字节。其他 `utils/*.py` 文件是用散文写成的 Python,而不是可运行的代码。
- 之前“10 kbps 可靠”的目标是理想化的,从未通过真实的 Opus 进行过验证。
## 先前工作
这里使用的方法均已发表。本工作是将这些方法应用于更广泛的 Pareto 前沿并提供可复现产出的应用,而非一种全新技术。
- **Codec-in-loop 神经水印**:[Juvela 2024, "Audio Codec Augmentation for Robust Collaborative Watermarking"](https://arxiv.org/abs/2409.13382)。本仓库中使用的直通训练程序即出自本文。
- **AMR 编解码器内部隐写术**:[Tian 等人 2018, "An AMR adaptive steganography algorithm based on minimizing distortion"](https://link.springer.com/article/10.1007/s11042-017-4860-1)。报告通过编解码器内部 QIM 实现 1-3 kbps 速率。这是蜂窝网络编解码器隐写术已发表的最先进技术。速率高于本仓库,因为它直接修改了 AMR 编码器,而不是盲目穿透它。
- **AudioSeal**:[Meta 2024](https://github.com/facebookresearch/audioseal),MIT 许可证。主导的 OSS 音频水印系统。不可感知性优于我们;容量较低(16 比特/秒)。处于 Pareto 曲线上不同的点。
- **SilentCipher**:[Sony 2024](https://github.com/sony/silentcipher)。30 比特/秒,近乎不可察觉。
- **WavMark**:[Github](https://github.com/wavmark/wavmark)。32 比特/秒。
- **GGWave**:[Georgi Gerganov](https://github.com/ggerganov/ggwave)。声学数据调制解调器,可靠穿透空气的速率为 8-16 bps,发出可听见的啁啾声。
## 可复现性
所有核心数据均可通过仓库中的脚本复现:
- 3.2 kbps 神经编解码器:`core/neural_codec/voice_within_voice_demo.py`
- 任何检查点的多种子验证:`core/neural_codec/eval_real_opus.py --seeds 5`
- AMR-NB 蜂窝网络变体:`core/neural_codec/cellular/amrnb_eval_with_rep.py`
- 对抗性真实感:`core/neural_codec/adversarial/realism_eval.py`
- 带有真实语音载体的隐写:`core/neural_codec/stego/stego_listen.py`
- 手工编码的 TRIZ调制解调器:`core/triz_pitch/v5_final_validate.py`
## 许可证
Apache License 2.0。完整文本请参见 [LICENSE](LICENSE)。Apache 2.0 包含明确的专利授权,这对于音频水印工作很重要,因为该领域拥有诸多活跃专利(Verance/Cinavia, Audible Magic, NexGuard)。
## 致谢
部分检查点的多样性测试训练使用了 LibriSpeech dev-clean 数据集。早期的隐写变体使用了两段剪辑训练数据(一段合成朗读,一段 Lex Fridman 的音频片段)。整个项目使用真实的 ffmpeg-libopus 和 ffmpeg-amrnb-encoder 作为信道实现。
标签:AMR-NB, Discord, DNS解析, meg, Opus, TruffleHog, VoIP, WebRTC, WhatsApp, Zoom, 信号处理, 信息安全, 凭据扫描, 学术论文, 开源项目, 抗压缩隐写, 数字水印, 数字通信, 数据透传, 数据隐写, 深度学习, 神经音频合成, 编解码器, 网络信息收集, 语音编码, 语音通信, 语音隐藏, 逆向工具, 隐秘通信, 音频调制解调器