Skip to content

仓库缺少 LICENSE,想确认许可条款后再提交贡献 #152

Description

@magicapple123

仓库缺少 LICENSE,想确认许可条款后再提交贡献

先说这个问题

仓库当前没有 LICENSE 文件(GitHub API 的 license 字段为 null)。

按默认著作权规则,没有许可证 = 「保留所有权利」。严格来说,别人(包括我)没有法律依据
去复制、修改、分发这份代码 —— 即使在 GitHub 上开 PR 这种协作形式,也是在默认授权框架下
才顺理成章。README 里写了「欢迎 PR」,但那是一句期望,不构成许可条款。

这会影响的不只是外部贡献者:

  • 想提 PR 的人不知道自己写的东西会以什么条款分发出去;
  • 想在自己公司内部部署的人不确定是否合规;
  • 你们将来如果打算接受外部代码,没有明确的 inbound 许可声明(CLA / DCO / 或直接
    声明 inbound=outbound)会留下隐患;
  • 如果哪天要用更严格或更宽松的条款重新发布,追溯历史贡献会很麻烦。

所以想先问一句:你们计划给仓库加一个许可证吗?如果加,倾向于哪个?

我个人建议 MIT 或 Apache-2.0 —— 这类本地工具项目最常见、对使用者最友好,
而且能立刻消除上面这些问题。如果你们倾向于别的条款(GPL、AGPL 或保留部分权利),
也完全没问题,只要明确下来就行。

只要许可证明确了,我这边随时可以按需要把下面几个贡献点拆成独立 PR 提上来。

我打算贡献什么

我在做 Windows 微信 4.x 聊天记录查看/导出/分析方向的开发,交叉对比过若干开源方案,
其中就包括这个项目。三层架构(native core + FastAPI 后端 + Vue 前端)分得很干净,
微信原生转写与本地 Whisper 双路线、账号维度的缓存与并发模型都做得比我见过的大部分方案好,
所以想反过来把我在自己项目里已经稳定运行、而这边还缺的东西贡献回来。

贡献点一:演示数据库种子脚本(最独立,建议先合)

仓库里已有的 tools/seed_ai_acceptance.py 生成的是明文 SQLite,而真实链路是 WCDB 加密的。
我写的 tools/seed_demo_database.py 生成的是真正按 WCDB/SQLCipher 页格式加密的演示账号,
可以直接跑通从「扫描账号目录」→「解密」→「读取」的完整链路。

两个刻意的设计:

  1. 不硬编码加密常量,而是 import 上游自己的 PAGE_SIZE / RESERVE_SIZE /
    _derive_sqlcipher_enc_key / _compute_page_hmac。这样上游改加密格式时,
    脚本会跟着一起失效,而不是悄悄产生错误数据 —— 我认为这一点比脚本本身更重要。
  2. 数据全是虚构的(wxid_demo_2026、昵称统一带「示例」、链接一律 example.com),
    覆盖单聊/群聊、文本/链接卡片/转账/系统提示/引用消息。
    用途是给测试、截图、新贡献者上手提供一个不含真实隐私的起点。

自校验实测(用上游自己的解密器):Page 1 HMAC verification passed、
successful_pages=7 failed_pages=0、reserved_space=80、自校验通过:成功解密 2/2。

涉及文件:tools/seed_demo_database.py、tests/test_seed_demo_database.py(5 项)、
docs/demo-database-seed.md。不碰任何产品逻辑,输出默认落在已在 .gitignore 的 output/demo/。

贡献点二:多协议云端语音识别适配器(engine="cloud")

现在识别只有两条路:本地 faster-whisper(要下 75 MB ~ 3.1 GB 模型 + 占 CPU/GPU)
和微信原生(依赖微信客户端在线)。两种情况覆盖不到:

  • 机器性能有限,本地跑一条语音要等十几秒;
  • 只想偶尔转写少量语音,不值得为它下模型、装 CUDA 运行库;
  • 手上已经有 OpenAI 兼容 / 阿里云百炼的额度,想直接复用。

我把它做成可替换的后端,支持三类协议:
openai_compatible(/audio/transcriptions multipart)、
dashscope_asr(/chat/completions + base64 input_audio)、
custom_multipart(字段名/请求头/响应路径全可配置)。

几个关键取舍:

  1. 默认不联网。 没配 base_url 时构建返回 None,所有既有路径行为完全不变。
  2. 缓存与本地路线共用。 复用同一张 transcript 表和同一套取音频/SILK 解码逻辑,
    只有 model 字段写成 cloud:<protocol>:<model> 做隔离。所以本地跑过的切云端
    不需要重新识别 —— 这点我认为比另起一套缓存重要得多。
  3. 不申请本地模型活动租约(云端路线完全不加载模型);并发默认 3、上限 8,
    因为瓶颈在服务商限流,不能按本地 CPU 并发推导,配成 64 会把账号打爆。
  4. 微信原生已转写的语音直接跳过,避免重复付费。
  5. 安全约束(要把用户语音上传出去,所以写得比较克制):明文 HTTP 只允许回环地址;
    不跟随重定向(防 Authorization 头被转发给未知主机);默认 25 MB / 硬上限 100 MB;
    错误信息不含本机路径、API Key 与响应正文;设置读接口永不回显 Key;
    配置落盘做白名单 + 长度限制 + 拒绝控制字符(手改 JSON 塞换行不能污染请求头)。

与 #151 的关系:我注意到 #151 正在改写语音转写这条路(批量入口、
SettingsDialog.vue、VoiceTranscriptionSidebar.vue、导出对话框的 exportTranscribeVoice)。
我刻意没有动那两个前端文件和 voice_transcription.py 里的识别逻辑,改动只限于
engine 白名单与分发这一层。所以这个 PR 建议等 #151 合入后我再 rebase 提交,
避免制造冲突。如果你希望更早看到代码,我也可以现在就提。

补充一句:项目里已有的 cdn_image_service.py 走第三方商业 CDN,和这个不冲突 ——
那条路依赖特定服务商的额度与兑换码,而这里是用户自己的接口地址与 Key。

贡献点三:批量高清原图自动化(想先问是否需要)

这个项目当前的高清图路线是商业 CDN。我自己项目里的做法不同:不依赖任何第三方服务,
直接在本地驱动微信客户端把聊天里的压缩图批量换回原图并归档。

但我在移植前想先确认价值:它依赖 Windows UI 自动化(热键、窗口句柄、资源监控),
移植成本不低且天然只支持 Windows,功能上和现有 CDN 路线有重叠。

所以想问:这个方向你们需要吗? 如果重叠部分你们觉得没必要,
我可以只挑其中不依赖 UI 自动化的部分(原图资源的识别、去重与归档)单独提。

关于测试

我用 uv + Python 3.11 跑了完整测试集,并且改动前后逐项对比:

测试数 失败 错误 跳过
基线(未改动) 2682 85 18 10
加上我的改动 2758 85 18 10

失败集合逐项比对完全相同(新增失败 0 项),新增的 76 项测试全部通过。

需要说明的是,上面的失败/错误在我这边本来就不是绿色,原因是环境缺件而非代码问题:

  • test_native_core_export_decrypt.py、test_macos_manual_launch.py 等需要预编译的
    wechatdb_client.dll,仓库里没有,直接 error;
  • 一批 macOS 用例在 Windows 上失败;
  • test_voice_transcription_contract.py::test_export_option_is_wired_from_dialog_to_backend
    在基线提交上就是红的:exportTranscribeVoice 在 ChatExportDialog.vue 与
    useChatExport.js 里都不存在 —— 看起来正是 feat: 升级本地语音识别并修复小程序图片导出与 Windows 回归 #151 的 diff 在补的东西。

所以我描述自己改动的测试结果时都是和基线对比给的,没有把既有失败算进来。
如果你们的 CI 装了原生库,失败集会比上面小得多。

小结

  1. 许可证:能给一个明确答复吗?这是我现在唯一的前置阻塞。
  2. 贡献点一(种子脚本):不碰产品逻辑、争议最小,许可证明确后我可以立刻提 PR。
  3. 贡献点二(云端 ASR):代码已完成并在 fork 上,建议等 feat: 升级本地语音识别并修复小程序图片导出与 Windows 回归 #151 后 rebase 再提。
  4. 贡献点三(高清原图):想先听你们意见,需要我再动手。

谢谢!

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions