文档

多模态与媒体

把图片、视频、表情的实际内容交给多模态模型。识别引擎是可选依赖,装不上就明确失败。

先体检

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 —— 这时返回空串,不编。