voelspriet/aiwhisperer

GitHub: voelspriet/aiwhisperer

一款用于 PDF 脱敏分块、突破云端 AI 上传限制并降低敏感数据暴露风险的工具。

Stars: 46 | Forks: 6

# AIWhisperer [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/) [![License: CC0](https://img.shields.io/badge/license-CC0-green.svg)](https://creativecommons.org/publicdomain/zero/1.0/) [![Version](https://img.shields.io/badge/version-0.5.0-orange.svg)](https://github.com/voelspriet/aiwhisperer/releases) ** 基于 DPG Media 课程。Whisper 你的文档给 AI——以降低暴露敏感数据的风险。** ## 为什么这个工具存在 **问题 1:文件太大无法上传** 你有一个 170 MB 的调查文件。你尝试使用云 AI: - ChatGPT:“上传失败” - Claude.ai:“不支持大于 31 MB 的文件” - Gemini:“文件大于 100 MB” 你的文件太大以至于不能失败,但又大到无法上传。AIWhisperer 将 PDF 转换为文本(体积缩小最高达 92%)并将其拆分成云 AI 可以处理的块。 **问题 2:太敏感而无法上传,本地运行又太慢** 你有机密文档。本地 AI 是安全的,但速度令人痛苦——云 AI 几分钟完成,本地 AI 却要数小时。因此你仍然上传到云 AI,但未脱敏,只希望一切顺利。 AIWhisperer 给你一条中间路径:本地脱敏,云端分析,本地解码。你获得云 AI 的速度,同时减少敏感数据的暴露。 ## 它是如何工作的 | 步骤 | 位置 | 发生什么 | |:----:|:-----:|:-------------| | 1 | 本地 | **转换** - PDF 转文本(对扫描页使用 OCR) | | 2 | 本地 | **拆分** - 分成块(每块 500 页) | | 3 | 本地 | **编码** - 用占位符替换名称 | | | | `John Smith` → `PERSON_001` | | | | `+31 6 12345678` → `PHONE_001` | | | | 保存 `mapping.json` 到本地 | | 4 | 云端 | **上传** 脱敏文件到 AI(NotebookLM 等) | | 5 | 云端 | **AI 分析** - 发现模式,构建时间线 | | 6 | 本地 | **下载** AI 输出 | | 7 | 本地 | **解码** - 使用 `mapping.json` 还原真实名称 | **这减少了——但不能完全消除——暴露敏感数据的风险。始终在上传前检查脱敏输出。** ## 你可以对 AI “低语”什么? 一旦文档脱敏,就可以向 AI 提问: - **构建时间线** - “创建所有事件的编年时间线” - **发现联系** - “谁和谁沟通?绘制关系图” - **识别模式** - “哪些电话号码一起出现?哪些地点重叠?” - **总结** - “这份 4000 页调查的关键发现是什么?” - **提取数据** - “列出所有带有日期和金额的财务交易” - **交叉引用** - “哪些人出现在多个文档中?” AI 使用 `PERSON_001`、`PHONE_002`、`PLACE_003`。分析完成后,AIWhisperer 还原真实名称:`PERSON_001` → `John Smith`、`PHONE_002` → `+32 489 66 70 88` 等。 **结果:** 在减少敏感数据暴露的情况下实现 AI 驱动的分析。 ## 重要警告 **ALWAYS CHECK THE OUTPUT BEFORE UPLOADING TO AI.** 此工具并不完美。检测可能遗漏内容。在上传任何脱敏文档前: 1. **检查脱敏输出** - 打开文件并验证敏感数据是否已被替换 2. **先使用 `--dry-run`** - 查看在提交前会检测到什么 3. **检查唯一标识符** - 职位、罕见事件或具体描述仍可能识别身份: - 不良:`"PERSON_001, the mayor of Springfield"` → 仍可识别 - 不良:`"PERSON_001 arrested in Europe's largest drug bust"` → 事件本身识别了该人 - 良好:`"PERSON_001 transferred money to PERSON_002"` → 安全 4. **先用样本数据测试** - 在处理真实机密文档前先测试 5. **你需承担责任** - 此工具是辅助,但 **你** 必须验证输出是否安全 **没有检测是 100% 准确的。** 拼写不寻常的名称、新模式或边缘情况可能漏过。拿不准时,请手动检查。 ## 这个工具背后的故事 此工具源于一次真实调查:一个 170 MB 的可卡因走私案卷宗,包含法院命令、窃听记录、基站数据、逮捕令、银行对账单和审讯协议。 问题在于?你不应该将机密文件上传到云 AI。即使你想这么做: - ChatGPT:“上传失败” - Gemini:“文件大于 100 MB” - Claude.ai:“你不得上传大于 31 MB 的文件” 解决方案?**本地编码 → 云端分析 → 本地解码。** 阅读完整故事:**[用 AI 快速阅读大规模刑事调查](https://www.digitaldigging.org/p/speed-reading-a-massive-criminal)** - *如何在 20 分钟内弄懂 4,713 页而不泄露数据* ## 概念 ``` BEFORE: "On 16/10/2023, officers arrested John Smith at 123 Harbor Road. He was hired by Marcus Johnson." AFTER: "On 16/10/2023, officers arrested PERSON_001 at ADDRESS_001. He was hired by PERSON_002." AI OUTPUT: "Timeline shows PERSON_001 arrested on 16/10/2023, connected to PERSON_002 who runs COMPANY_001, COMPANY_002 and COMPANY_003" DECODED: "Timeline shows John Smith arrested on 16/10/2023, connected to Marcus Johnson who runs Hideout 1, Hideout 2 and Hideout 3" ``` **变化的内容:** 姓名、地点、电话、邮箱、IBAN、车辆、地址 **保持不变的内容:** 结构、关系、模式、日期、金额 ## 快速开始 ### 安装 #### 选项 1:macOS 应用(Apple Silicon) 从 [Releases](https://github.com/voelspriet/aiwhisperer/releases) 下载 `.dmg` 安装程序——无需 Python。 1. 下载 `AIWhisperer-x.x.x-arm64.dmg` 2. 打开 DMG 并运行 `install.command` 3. 在终端运行 `aiwhisperer --help` 注意:该应用未签名。首次运行时,右键点击并选择“打开”以绕过 Gatekeeper。 #### 选项 2:pip 安装(所有平台) ``` # 使用 spaCy 和 OCR 支持安装(推荐) pip install aiwhisperer[spacy,ocr] # 下载荷兰语语言模型 python -m spacy download nl_core_news_sm # 其他可用语言:en, de, fr, it, es # 检查已安装内容和缺失项 aiwhisperer check ``` `check` 命令会精确显示已安装内容及如何修复缺失依赖: ``` $ aiwhisperer check AIWhisperer Dependency Check =================================== Python: 3.10.5 (OK) PDF Conversion: [x] marker-pdf: Installed (best accuracy) [x] pymupdf: Installed [x] tesseract: Installed (OCR fallback) NER Detection: [x] spaCy: Installed (v3.8.11) Language Models: [x] nl: nl_core_news_sm [ ] en: en_core_web_sm -> Fix: python -m spacy download en_core_web_sm ``` ### 命令行 **两种工作流:** ``` # 工作流程 1:非机密文件(仅转换) aiwhisperer convert document.pdf # 工作流程 2:机密文件(一步转换 + 清洗) aiwhisperer convert document.pdf --sanitize ``` **大型机密文件的完整工作流:** ``` # 步骤 1:转换并清洗(对大文件使用拆分) aiwhisperer convert investigation.pdf --split --max-pages 500 --sanitize # 创建: # investigation_part1.txt ← 纯文本 # investigation_part1_sanitized.txt ← 发送至 AI # investigation_part1_mapping.json ← 保留此文件 LOCAL # 重要:在上传前检查清洗后的文件! # 确保没有敏感数据泄露。 # 步骤 2:将清洗后的文件上传至 NotebookLM # 要求 AI 构建时间线、发现模式等。 # 步骤 3:保存 AI 输出,然后解码还原真实名称 aiwhisperer decode ai_analysis.txt -m investigation_part1_mapping.json # 结果:完整分析并恢复真实名称 ``` 对于较小文件(小于约 50 MB),可以跳过 `--split` 参数。 ### Python API ``` from aiwhisperer import encode, decode, Mapping from aiwhisperer.converter import convert_pdf # 转换 PDF 为文本 text, metadata = convert_pdf("investigation.pdf") # 编码 sanitized, mapping = encode(text, language='nl') # 保存 open("sanitized.txt", "w").write(sanitized) mapping.save("mapping.json") # 重要:在上传前检查 sanitized.txt! # ... 将 sanitized.txt 发送至 AI,获取分析结果 ... # 解码 ai_output = open("ai_analysis.txt").read() final = decode(ai_output, mapping) open("final_report.txt", "w").write(final) ``` ## PDF 转换 AIWhisperer 包含内置的 PDF 转文本功能,支持对扫描文档使用 OCR。 ### OCR 后端 | 后端 | 准确度 | 安装 | |------|--------|------| | **marker-pdf**(推荐) | 优秀 | `pip install marker-pdf` | | **pytesseract**(备用) | 良好 | `pip install pymupdf pytesseract pdf2image` + Tesseract | marker-pdf 底层使用 Surya OCR——目前最准确的 OCR 解决方案之一。 ### 用法 ``` # 转换 PDF(自动选择最佳后端) aiwhisperer convert document.pdf # 强制使用特定后端 aiwhisperer convert document.pdf --backend marker # 将大 PDF 拆分为多个文本文件 aiwhisperer convert large.pdf --split --max-pages 500 # 仅显示 PDF 信息 aiwhisperer convert document.pdf --info ``` ### 安装 Tesseract(备用) 如果 marker-pdf 不适用于你: ``` # macOS brew install tesseract tesseract-lang # Ubuntu/Debian apt install tesseract-ocr tesseract-ocr-nld tesseract-ocr-deu tesseract-ocr-fra # Windows:从 https://github.com/UB-Mannheim/tesseract/wiki 下载 ``` ## 检测到什么内容 | 类别 | 示例 | 捕获内容 | |------|------|----------| | **人物** | `Jan de Vries`, `El Mansouri Brahim` | 通过 NER 和上下文模式识别的姓名 | | **地点** | `Antwerpen`, `te Wuustwezel` | 城市、`te X`、`richting X` 模式 | | **电话** | `+32 489 66 70 88`, `052/26.08.60` | 比利时、荷兰及国际格式 | | **邮箱** | `jan@example.com` | 标准邮箱模式 | | **IBAN** | `BE44 3770 8065 345` | 欧洲银行账户 | | **车辆** | `Fiat Ducato`, `BMW X5` | 50 多个汽车品牌和型号 | | **道路** | `N133`, `A12`, `E19` | 欧洲道路编号 | | **街道** | `Stationstraat`, `Koning Albertlaan` | 荷兰/比利时街道名 | | **地址** | `Dorpstraat 31/301` | 包含门牌号的完整地址 | | **出生日期** | `26/04/1993`(附近有“geboren”) | 上下文中的出生日期 | | **ID** | `123456782` | 荷兰 BSN(验证通过)、比利时国家编号 | ## 常见问题 ### 为什么不直接上传到 AI? **安全性。** 刑事调查、医疗记录、法律文件——你不应该将这些上传到云 AI。AIWhisperer 让你在不暴露真实数据的情况下获得 AI 分析。 **大小限制。** 大多数聊天机器人无法处理大文件: - ChatGPT:“上传失败” - Gemini:“文件大于 100 MB” - Claude.ai:“不得上传大于 31 MB 的文件” 原始工作流使用 **Claude Code**(本地运行,无上传限制)进行文件转换,并使用 **NotebookLM** 分析脱敏文本。 ### AI 能否从上下文中猜出 PERSON_001 是谁? 可以,如果有唯一标识符。请参见上方的 **⚠️ 重要警告** 部分。始终在上传前检查脱敏输出。 ### 扫描版 PDF 怎么办? AIWhisperer 处理的是文本。对于扫描文档: 1. 先用 OCR 将 PDF 转换为文本(Claude Code 可协助) 2. 然后脱敏文本输出 3. 原始文章描述了以这种方式处理 565 页扫描内容的过程 ### 为什么是 6 种语言? 每种语言都有独立的 spaCy NER 模型,基于本地文本训练: - `nl` 荷兰语 - `nl_core_news_sm` - `en` 英语 - `en_core_web_sm` - `de` 德语 - `de_core_news_sm` - `fr` 法语 - `fr_core_news_sm` - `it` 意大利语 - `it_core_news_sm` - `es` 西班牙语 - `es_core_news_sm` ### 这能在法庭上采纳吗? **可以。** AI 不是证据。它是一盏探照灯。 你在法庭上出示原始数据并解释推理过程。辩护方可检查相同文档。他们不需要审核算法,因为算法没有生成证据——只生成了路线图。 这就像 Ctrl+F 不破坏证据链一样,模式识别在匿名数据上也不会破坏。它加速了调查,但不会取代验证。 **示例:** 假设 AI 发现:*“PERSON_A 在转账给 COMPANY_X 前三天与 PERSON_B 见面。”* 这不是你在法庭上提交的结论。这是一个线索。你回到原始文档——第 847 页、第 1,203 页、第 3,421 页。证据就在那里。AI 帮你找到该看哪里——用 20 分钟代替 5 天。 ### 检测准确度如何? 检测使用多层机制: 1. **spaCy NER** - 上下文感知的姓名和地点识别 2. **模式匹配** - 对结构化数据(电话、邮箱、IBAN)具有高置信度 3. **上下文标记** - 捕获 NER 可能遗漏的 `te Wuustwezel`、`richting Antwerpen` 等模式 始终使用 `--dry-run` 进行测试运行,查看会检测到什么。 ### 如果漏掉了怎么办? `--dry-run` 标志会显示确切将被替换的内容。如果遗漏了: 1. 检查是否应添加该模式 2. 对于一次性情况,在上传前手动编辑 3. 在 GitHub 上报告问题 ### 能否对多个文档使用一致的占位符? 可以。重用相同的映射: ``` mapping = Mapping() for doc in documents: sanitized, mapping = encode(doc, mapping=mapping) # PERSON_001 在所有文档中指代同一人 ``` ## 实际结果 来自原始调查: - **输入:** 170 MB PDF,4,713 页,1,053,356 个词 - **转换后:** 13.8 MB 文本(缩小 92%) - **处理时间:** 20 分钟(相比 5 天人工) - **输出:** 包含所有关联的完整时间线 机器擅长它擅长的事——模式识别、重复提取、组织混乱。你擅长人类做的事——判断、上下文、知道什么时候不对劲。 ## 支持的语言 | 代码 | 语言 | 模型 | |------|------|-------| | `nl` | 荷兰语 | `nl_core_news_sm` | | `en` | 英语 | `en_core_web_sm` | | `de` | 德语 | `de_core_news_sm` | | `fr` | 法语 | `fr_core_news_sm` | | `it` | 意大利语 | `it_core_news_sm` | | `es` | 西班牙语 | `es_core_news_sm` | ## 高级选项 ### 脱敏策略 ``` aiwhisperer encode doc.txt --strategy replace # PERSON_001 (default, reversible) aiwhisperer encode doc.txt --strategy redact # [PERSON] (not reversible) aiwhisperer encode doc.txt --strategy mask # J** d* V**** (partial) aiwhisperer encode doc.txt --strategy hash # a1b2c3d4 (one-way) ``` ### 检测后端 ``` aiwhisperer encode doc.txt --backend hybrid # spaCy + patterns (default) aiwhisperer encode doc.txt --backend patterns # patterns only (no spaCy needed) ``` ### 预览检测 ``` aiwhisperer encode doc.txt --dry-run # Shows what would be replaced aiwhisperer analyze doc.txt # Full detection statistics ``` ## 致谢与引用 ### 原始故事 **[用 AI 快速阅读大规模刑事调查](https://www.digitaldigging.org/p/speed-reading-a-massive-criminal)** *如何在 20 分钟内弄懂 4,713 页而不泄露数据* 作者:Henk van Ess,2026 年 1 月 ### 代码来源 - 脱敏策略基于 [mstack.nl](https://mstack.nl/blogs/anonymize-pii-llm/) - spaCy NER 集成遵循 [spaCy 文档](https://spacy.io/) - BSN 验证使用荷兰 [11-检验算法](https://nl.wikipedia.org/wiki/Burgerservicenummer) - 可选:[Microsoft Presidio](https://github.com/microsoft/presidio)、[GLiNER](https://github.com/urchade/GLiNER) ### Henk van Ess 增加的功能 - 车辆品牌/型号检测 - 道路编号检测(N/A/E/R) - 基于上下文的定位检测 - 基于上下文的姓名检测 - 为 AI 上下文生成图例 - 大文件分块支持 - 真实世界测试与验证 ## 许可证 CC0 1.0 通用 - 公共领域 “这就是当今真正的技能:知道该按哪些按钮,以及知道何时停止按下并开始思考。”
标签:AI上传, CC0许可, NotebookLM, OCR, PDF压缩, PDF瘦身, 二进制发布, 云AI分析, 分块处理, 占位符替换, 大文件处理, 安全上传, 开源工具, 敏感数据, 数据匿名化, 数据脱敏, 文件大小优化, 文本提取, 文档处理, 文档拆分, 映射表, 本地预处理, 网络安全, 调查文件分析, 逆向工具, 隐私保护