文档
2.
3.
多模态与媒体
把图片、视频、表情的实际内容交给多模态模型。识别引擎是可选依赖,装不上就明确失败。
先体检
wx.Vision.doctor() # 缺什么一目了然(含安装命令)
取「素材」—— 给多模态模型用
c = wx.Vision.content(msg) # 统一入口:按类型分派,给能直接喂模型的文件
c["ok"], c["kind"], c["path"] # emotion 还有 c["caption"](表情含义)
wx.Vision.image(msg) # 只取图片(微信的 wxgf/HEVC 会自动转 jpg)
wx.Vision.video(msg) # 只取视频(档位不够会降级给缩略图并注明 tier)
wx.Vision.emotion(msg) # 只取表情(走 CDN 直链,含 caption)
wx.Vision.ffmpeg(src, "-vf", "scale=512:-1", dst) # 任意转码 / 抽帧
读「说了什么」—— 要引擎
print(wx.Vision.see(msg)) # 图片 OCR / 语音转写
wx.Vision.ocr_image(path) # 只做 OCR
wx.Vision.voice_to_text(msg) # 只做语音转写
wx.Vision.see_moment_media(m) # 朋友圈图片:优先本地缓存,再试 CDN 直链
可选依赖
管道由库负责,识别引擎是可选 extra —— 装不上就明确失败,不假装成功。
| 能力 | 可选依赖(优先级从高到低) |
|---|---|
| 图片 / 音频转码 | WxParam.FFMPEG_PATH → 系统 ffmpeg → 常见安装位置 → imageio-ffmpeg |
| 语音转文字 | faster-whisper → openai-whisper |
| 图片 OCR | rapidocr-onnxruntime → paddleocr → 系统 tesseract |
一条命令装全套:
pip install imageio-ffmpeg rapidocr-onnxruntime faster-whisper
三类媒体的实测结论
微信 4.1.8.107 实测(验收脚本 tools/verify_multimodal.py,13/0):
| 类型 | 盘上拿到的是 | 库做了什么 | 结果 |
|---|---|---|---|
| 图片 | wxgf 容器(HEVC 裸流) |
定位真 VPS 起始码 → ffmpeg 转 jpg | 3/3 成功,1280×1708 JPEG |
| 视频 | 常常只有缩略图 | 先试 mp4;没有就降级给缩略图并如实标 tier |
本机只有 224×398 缩略图 |
| 表情 | 本地缓存加密不可直读 | 走消息 XML 的 cdnurl 直链下原始文件 |
64 帧 GIF 2.7 MB,长度宽高与声明逐字一致 |
三个关键坑
1. ffmpeg 装了但没进 PATH
一直以为「没有 ffmpeg」,图片只能落成 .wxgf。
WxParam.FFMPEG_PATH = r"D:\ruanjian\ffmpeg-8.0.1-full_build\bin\ffmpeg.exe"
现在会主动查 WxParam.FFMPEG_PATH、D:\ruanjian\ffmpeg-* 等常见位置。
2. packed_info 里的 md5 是缩略图 id,不是视频 id
拿它找 .mp4 永远找不到。视频的三个真 md5 在消息 XML 的
md5 / newmd5 / originsourcemd5 里。
3. DataStore.messages() 不返回 packed_info
它只在 get_message_row() 里 —— 从 msg.info 读会永远是 None。
media_content 会按需补查完整行。
关于微信语音
微信语音是 .silk,ffmpeg 不认识。只有文件头是 AMR 时能直接解,
否则需要 silk 解码器 —— 这时也会明确告诉你,而不是给你一个空文件。
表情的 caption(表情含义)
来自 emoticon.db 的 kStoreEmoticonCaptionsTable(实测 216 条,
如 送花 / 拽 / 尊嘟假嘟)。
⚠ 它只覆盖商店表情包;聊天里收到的自定义表情没有 caption —— 这时返回空串,不编。