Guillain-RDCDE/DS2-Anywhere

GitHub: Guillain-RDCDE/DS2-Anywhere

通过逆向工程解码被封锁三十年的 Olympus DSS/DS2 专有听写录音格式,提供纯 CLI、跨平台的开源替代方案。

Stars: 0 | Forks: 0

# DS2-Anywhere ![DS2-Anywhere — 在 Linux 上解码 Olympus DSS / DS2 听写文件,纯 CLI,无 GUI](https://raw.githubusercontent.com/Guillain-RDCDE/DS2-Anywhere/main/docs/assets/social-preview.png) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/Guillain-RDCDE/DS2-Anywhere/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Latest release](https://img.shields.io/github/v/release/Guillain-RDCDE/DS2-Anywhere)](https://github.com/Guillain-RDCDE/DS2-Anywhere/releases) ![Status](https://img.shields.io/badge/status-production-green) ![FFmpeg](https://img.shields.io/badge/FFmpeg-patches%20in%20review-orange) ![Platform](https://img.shields.io/badge/platform-linux-blue) **用一句话概括:** 医生、律师和警察将口述内容录入小型录音笔; 这些录音笔生成的文件格式被保密了三十年;本项目 在任何 Linux 机器上将其破解——并将修复方案回馈给所有人都在使用的开源工具。 几个素未谋面的陌生人撬开了一把三十年前的锁——一种专有的 语音 codec,医生、律师和警察向其中录入了数十亿秒的声音, 而地球上没有任何开源工具能够读取它。有人完成了第一部分的逆向工程。 其他人使其变得可移植,然后变得通用。我们在一个周末内将其投入生产—— 随后德国的一位律师从抽屉里翻出了一台旧录音笔,并交给我们一种 **连商业软件都无法解码的 codec。** 所以我们也破解了那个, 只花了一个下午,方法是在我们用它的 DLL 构建的调试器中,审问制造商自己的解码器。 所有这些都在这里:可用的代码,以及它是如何做到的具体过程。 ## 目录 - [新来的?三个通俗易懂的词](#new-here-three-words-in-plain-english) - [选择你的切入点](#pick-your-way-in) — 四扇门,选择你的深度 - [30 秒内试用](#try-it-in-30-seconds) - [一图看懂它的作用](#what-it-does-in-one-picture) - [技术轨迹](#the-technical-trail) — 故事,逐章展开 - [目前的进展](#where-it-stands-now) — 回馈给 FFmpeg 与数字保存 - [真实环境的数据](#real-world-numbers) - [本仓库包含什么](#whats-in-this-repo) - [鸣谢](#credits--proper-order) · [License](#license) ## 新来的?三个通俗易懂的词 - **Codec** — 将语音录音压缩成微小文件、并在播放时重建它的秘密“配方”。没有配方,文件只是一堆无法读取的噪声。 - **Decode**(以及 **demux**)— 将那个微小文件还原为声音。*Demux* 是第一步(将文件拆分为正确的小块,称为 *frames*);*decode* 是第二步(将 frames 转换为音频)。我们遇到的最棘手的 bug 大多在 *demux* 步骤中——让数据块正确对齐。 - **逆向工程(Reverse-engineering)** — 通过仔细观察,自己摸索出秘密配方,因为制造商从未公开过它。 就这些。下面的所有内容都是从这些基础概念逐步深入展开的。 ## 选择你的切入点 | | | |---|---| | 📖 **像读惊悚小说一样阅读** | **[故事 →](docs/THE-STORY.md)** — 没有代码,约 10 分钟。一个被锁定的格式,一场陌生人的接力,一个结果证明是人类的 bug,还有一个德国律师的抽屉。这确实发生过,每一个转折都链接到了证明它的章节。 | | 🔧 **跟随技术轨迹** | **[深入探索 ↓](#the-technical-trail)** — 从“`.ds2` 文件到底*是*什么”开始,直到在调试器下运行闭源解码器。即使你从未进行过任何逆向工程,也能轻松阅读。 | | 🌐 **立即解码一个文件** | **[打开浏览器解码器 →](https://guillain-rdcde.github.io/DS2-Anywhere/)** — 拖入一个 `.ds2`/`.dss`(Olympus、Grundig,甚至是加密的)并获取音频。无需上传,无需安装。 | | 🛠 **自己运行** | **[30 秒 ↓](#try-it-in-30-seconds)** — 拖入一个文件,输出一个 MP3。 | ## 30 秒内试用 ``` git clone https://github.com/Guillain-RDCDE/DS2-Anywhere cd DS2-Anywhere docker compose up --build # Web UI: http://localhost:8080/convertisseur.php # HTTP API: http://localhost:8765/health ``` 将 `.ds2` 或 `.dss` 文件拖放到 `examples/` 目录中,并通过 Web UI 进行转换。或者从 CLI 转换单个文件: ``` conv-dss-ds2-to-mp3 recording.ds2 # [ds2_qp 16000Hz, 31.8min] recording.mp3 OK (14.55 Mo in 10.3 s) ``` 生产环境安装(config + cron + systemd + Web UI):`sudo ./src/bin/install.sh`,或参考 [docs/02-integration.md](docs/02-integration.md)。 ## 一图看懂它的作用 用一张图概括全部意义:一个运行商业软件的 Windows VM,被一个小型的本地二进制程序所取代。 ``` BEFORE AFTER .ds2 ─► SSHFS ─► Windows VM ─► Switch.exe .ds2 ─► cron (Linux) │ │ ▼ ▼ .wav (mono) .mp3 (mono 64k) │ │ ▼ ▼ SSHFS back Whisper API │ │ ▼ ▼ glue script ready for transcription GUI app + Windows VM + SSHFS round-trip bash + native binary, all local, ~10s/file ``` 一个内置了商业软件的 Windows VM,被替换为了一个 bash 包装脚本、一个 cron 任务和一个原生二进制程序——全部在本地运行,每个文件处理仅需约 10 秒。 ## 技术轨迹 **从零开始。** `.dss`/`.ds2` 文件是被秘密算法(参见[上面的三个词](#new-here-three-words-in-plain-english))压缩得*极小*的语音录音。 “解码”它意味着重建原始的声音——要做到这一点,你需要那个制造商从未公开过的算法。下面的章节是我们无论如何也要将其搞定的过程。每一章都从基础讲起;你可以在任何一层停下。 1. **[三十年的锁](docs/01-reverse-engineering.md)** — DS2 文件是什么,为什么它 难以攻克,以及 Kieran Hirpara 如何从 Olympus 的 DLL 中逆向工程出 codec (这是天才之举——不是我们的功劳)。 2. **[投入生产环境](docs/02-integration.md)** — 将解码器转变为真正的 pipeline:CLI、cron、daemon、编码链。这是工程部分。 3. **[空块 bug](docs/06-the-empty-block-bug.md)** — 一个在我们测试的每一个文件上 都做到位精确(bit-exact)的解码器,但在暂停的录音上*却出错了*。十个死胡同, 十二行代码的修复。这是一个即使你从未接触过 DS2 也值得一读的侦探故事。 4. **[破解重同步块(re-sync block)](docs/07-cracking-the-resync-block.md)** — 续集: 我们在*一个用 Olympus 自身 DLL 构建的调试器内*运行了闭源的 Olympus 解码器, 并直接从芯片上读取了该格式最后一条未公开的规则。 5. **[重同步块,再续——以及进军 FFmpeg](docs/13-the-sp-resync-block.md)** — 第二次 施展同样的伎俩,针对 Olympus 的*另一种*格式(DSS SP)。我们重新托管了 供应商的解码器,从实时解析器中读取了规则,在一个分支中修复了它——而这一次 **将修复提交给了 FFmpeg 本身**(参见[目前的进展](#where-it-stands-now))。 6. **[那个不是 bug 的 bug](docs/10-the-reckoning-the-bug-that-wasnt.md)** — 故事的转折, 也是我们最引以为傲的章节。对一个“最后一个 bug”的严密论证([研究论文](docs/09-the-resync-excitation-anomaly.md)), 随后被*推翻*了——根本没有 bug;只是有人离开了麦克风。细致的工作是如何做到 自信满满却犯了错的,以及如何发现这一点。 7. **[破解 Grundig SP codec](docs/12-cracking-the-grundig-sp-codec.md)** — 终章。一种*没有人*能解码的 Grundig 鼻祖格式——我们不行,FFmpeg 不行, 连 Olympus 自己的软件也不行。我们提取了 Grundig 的解码器,在调试器下运行了它, 修补掉了它用来删除自身痕迹的指令,并以**位精确(bit-exact)**的方式重建了该 codec。 现在有了[原生 Python 解码器](grundig/)和 [FFmpeg 补丁](ffmpeg-upstream/patches/avcodec-grundig_sp-decoder.patch)。 ## 目前的进展 这项工作并没有在我们的服务器上止步——它正在被回馈给其他人都在使用的工具: - **纳入 FFmpeg。** FFmpeg 是 VLC、Chrome、OBS 以及互联网大部分应用的音视频 引擎。Olympus DS2 解码器 + demuxer 以及 DSS-SP 暂停录音修复 已经**提交至 `ffmpeg-devel` 邮件列表并正在审查中**; Grundig SP 解码器补丁紧随其后准备就绪。一旦合并,*所有*基于 FFmpeg 构建的程序都将永久免费读取这些文件——不再需要配方。 - **一份公开的规范。** [有史以来第一份](docs/SPEC-grundig-dss-sp.md) 为 Grundig DSS-SP codec 编写的规范,位精确(bit-exact)——这样就没有人需要再对其进行逆向工程了。 - **数字保存。** 一份 [PRONOM 提交](docs/preservation/PRONOM-submission.md) 以便档案和取证工具至少能够*识别*这些文件。 这就是项目的主线:不仅是为我们自己开锁,而是为所有人留下一扇敞开的门。 ## 真实环境的数据 决定发布的依据是**在相同的源文件上与参考 Windows 实现进行的 A/B 测试**, 而不仅仅是统计成功解码的数量: - **对比 Switch.exe 的 A/B 测试**(同一个 `.ds2`,两条处理链,两个 MP3 都通过相同的 Whisper API):转录结果**在功能上完全相同** — 16.2 % 对比 17.2 % 的低置信度词汇, 在 Whisper 自身每次运行的方差范围之内。这些处理链在下游是可以互换的。 - **35 / 35** 份真实的生产环境听写文件解码成功(6 小 48 分钟音频),零失败。 - 自上线以来进行了 **~3 200** 次 cron 传递,零错误。Windows VM 保持在待机状态, 原封未动。 对于 Grundig codec:在所有样本上与 Grundig 自己的解码器**逐字节完全一致**。 [完整方法论 →](docs/03-validation-campaign.md) ## 本仓库包含什么 - 📖 **[docs/](docs/)** — 上面的完整教学轨迹,以及[基准测试](docs/benchmarks/)。 - 🛠 **[src/](src/)** — 集成代码:CLI、cron、HTTP daemon、管理 Web UI。经过清理;这些模式可直接重用。 - 🎙 **[grundig/](grundig/)** — 原生 Grundig DSS-SP 解码器(纯 Python,位精确)及其数据表。 - 🎬 **[ffmpeg-upstream/](ffmpeg-upstream/)** — FFmpeg 补丁(DS2 解码器 + demuxer、DSS-SP 暂停录音修复以及 Grundig SP 解码器),包含提交给 `ffmpeg-devel` 的代码、它们的测试样本及附函。 - 📐 **[正式规范](docs/SPEC-grundig-dss-sp.md)** — 世界上首份公开的 Grundig DSS-SP codec 规范(位精确),外加一份 [PRONOM 提交](docs/preservation/PRONOM-submission.md),以便数字保存工具能够识别这些文件。 ## License MIT,与上游 codec 相同。分支、改编、部署——请保留对 codec 作者的署名。我们发布的是干净的重新实现和恢复的规范,绝不是供应商的专有代码。 *三十年紧锁,一条 bash 命令后。链条必须继续运转。🔓*
标签:应用安全, 自定义脚本, 请求拦截, 逆向工具