TG中文搜索机器人 群聊短视频搜索:利用关键帧特征指纹(pHash)实现群内视频去重与语义检索
Telegram 群聊中的短视频越积越多后,重复转载、文件改名、重新压缩和裁剪片段会迅速降低搜索效率。管理员即使保存了消息 ID、文件名和发送者信息,也很难判断两个视频是否包含相同画面。
解决这一问题的关键,是从视频内容本身提取稳定特征:使用关键帧概括视觉内容,以感知哈希 pHash识别近似重复,再结合视觉或文本向量完成语义检索。本文给出一套适用于 Telegram 群组机器人的工程方案,并说明准确率、性能与隐私方面的边界。
🎯 为什么不能只依赖文件名和 file_id
文件名只能描述上传者愿意填写的信息,常见的随机名称、日期编号和“video_001.mp4”几乎没有检索价值。文件大小与 MD5、SHA-256 等加密哈希只能识别二进制完全一致的文件,视频经过转码后就会得到不同结果。
Telegram Bot API 返回的 file_unique_id 可以辅助识别同一平台文件,但不应被当作跨转码、跨来源的视频内容指纹。同一段画面只要被剪辑、加字幕或重新编码,仍可能表现为多个不同文件。
pHash 关注的是低频视觉结构,而不是原始字节,因此对轻度缩放、压缩、亮度变化具有一定容忍度。不过,pHash 本身不理解语义,它适合做近重复检测,真正的“搜索猫咪视频”“查找产品演示”还需要向量模型或文本识别能力。
🧱 系统架构:从群消息到可检索索引
一条完整流水线通常包括消息监听、文件下载、媒体探测、关键帧提取、pHash 计算、语义向量生成、索引写入和查询返回。Bot API 适合处理机器人可见的新消息,若要合规地处理历史消息,则需要根据权限与业务场景评估 MTProto 客户端方案。
Telegram Update
-> Download Queue
-> FFmpeg / ffprobe
-> Keyframe Sampling
-> pHash Fingerprints
-> CLIP Embeddings + OCR / ASR
-> PostgreSQL + pgvector
-> Search Bot Results
TG中文搜索机器人 建议将下载和特征计算放进独立任务队列,避免机器人在处理大文件时阻塞消息更新。数据库至少保存群组 ID、消息 ID、发布时间、视频时长、关键帧时间戳、指纹、向量和处理版本,搜索结果才能稳定跳回原消息。
数据表应保留哪些字段
video_id bigint
chat_id bigint
message_id bigint
file_unique_id text
duration_seconds integer
frame_timestamps jsonb
phash_list jsonb
embedding vector
caption_text text
feature_version integer
created_at timestamptz
feature_version 非常重要,因为抽帧规则和模型升级后,旧特征可能无法直接比较。通过版本字段进行灰度重建,能避免一次性重算全部历史视频。
TG中文搜索机器人 🎞️ 第一步:提取有代表性的关键帧
固定截取视频第一帧并不可靠,因为开头可能是黑屏、封面或片头动画。更实用的方式是结合场景切换检测与均匀采样,在控制计算成本的同时覆盖主要内容。
对于 30 秒以内的短视频,可以每 3 至 5 秒抽取一帧,并限制为 6 至 12 帧。较长视频应按时长动态调整采样间隔,同时过滤纯黑帧、模糊帧和高度相似的连续画面。
ffmpeg -i input.mp4 \
-vf "select='gt(scene,0.32)',scale=320:-1" \
-vsync vfr frames/frame-%04d.jpg
参数 scene=0.32 只是起始参考值,并不存在适合所有群组的万能阈值。影视剪辑、游戏录屏和商品展示的镜头节奏差异明显,应通过真实样本集评估后调整。
如果检测出的场景过少,可补充视频 10%、30%、50%、70% 和 90% 位置的均匀采样帧。若场景过多,则按清晰度、画面信息量和时间分布筛选,防止快节奏转场占满指纹集合。
🧬 第二步:计算 pHash 并判断重复视频
典型 pHash 会先把图像缩小并转为灰度,再执行离散余弦变换,最后根据低频系数生成固定长度二进制指纹。两个指纹之间使用汉明距离比较,距离越小,画面结构通常越相似。
from PIL import Image
import imagehash
left = imagehash.phash(Image.open("frame-a.jpg"))
right = imagehash.phash(Image.open("frame-b.jpg"))
distance = left - right
is_similar = distance <= 8
对于常见的 64 位 pHash,可先用汉明距离 6 至 10 作为候选阈值,但不能直接当作最终标准。字幕、水印、画中画、镜像翻转和大比例裁剪都可能让距离明显上升,而构图相似的静态画面也可能产生误报。
视频级判断不应只比较单帧,而应计算两组关键帧的最佳匹配比例。例如,两段视频至少有 60% 的关键帧在时间顺序上匹配,且匹配帧平均距离低于阈值时,再标记为疑似重复。
候选重复规则:
matched_frame_ratio >= 0.60
average_hamming_distance <= 8
duration_difference_ratio <= 0.20
minimum_matched_frames >= 3
为了提高检索速度,可将 64 位指纹存为无符号整数,并使用分桶、多索引哈希或 BK-tree 缩小候选集。最终复核阶段再加入视频时长、帧顺序、颜色直方图和局部特征,降低误判概率。
电报精准找群黑科技提示:
由于 Telegram 官方搜索对中文支持极差,很多优质的推广、技术和资源群组隐藏极深。如果你正在寻找相关的活跃社群,强烈推荐使用本站首页的 【TTSO - Telegram 智能搜索 Bot】。作为目前最好用的电报综合搜索导航,只需输入关键词,即可秒级触达数十万个精选 TG 中文群组、资源频道。一键直达,帮你节省 90% 的找群时间!
🔎 第三步:用多模态向量实现语义检索
pHash 只能回答“画面是否近似”,无法回答“视频里是否有人修理电脑”。要实现自然语言搜索,需要用 CLIP 一类多模态模型把关键帧和查询文本映射到同一向量空间,再按余弦相似度召回候选结果。
中文场景应选择明确支持中文文本的多语种模型,或先对查询进行规范化与翻译。每个视频可保存关键帧独立向量,也可以对多帧向量做平均池化,但独立向量更容易命中只出现数秒的重要场景。
同时利用字幕、语音和群消息文本
视觉模型可能无法准确理解画面中的小字、型号和专业术语,因此应使用 OCR 提取字幕与界面文字。视频音轨可通过语音识别生成转写文本,再与原消息标题、说明和标签一起建立全文索引。
查询时可以采用混合评分,将向量相似度、BM25 文本相关度、pHash 重复度和发布时间组合起来。对于精确型号搜索提高文本权重,对于“海边日落”这类视觉描述则提高图像向量权重。
final_score =
0.55 * visual_similarity +
0.30 * text_relevance +
0.10 * recency_score +
0.05 * quality_score
上述权重应来自真实点击与人工标注数据,而不是长期写死。上线初期可以收集“相关、无关、重复”三类反馈,定期计算 Precision@10、Recall@50 和重复识别 F1 分数。
TG中文搜索机器人 ⚙️ 性能优化与生产环境注意事项
TG中文搜索机器人 下载原视频通常比计算 pHash 更耗时,因此应设置文件大小、时长和并发限制,并缓存已经处理过的 file_unique_id。任务必须具备幂等性,同一条 Telegram 更新被重复投递时不能重复写入索引。
向量数量达到几十万后,可以使用 pgvector 的 HNSW 索引;规模继续增长时,再评估专用向量数据库。索引选择应基于延迟、召回率、更新频率和运维能力,而不是只看理论容量。
隐私与权限同样属于核心设计:只处理机器人获准访问的群组,不绕过 Telegram 权限获取内容,并提供数据删除和索引退出机制。下载文件、OCR 文本和向量都可能包含敏感信息,应实施访问控制、加密存储、日志脱敏和数据保留期限。
版权投诉或成员删除原消息后,系统应同步删除搜索索引和缓存副本。搜索结果也必须执行群组权限校验,避免用户通过机器人看到自己无权访问的私有群内容。
📊 如何建立可靠的评测集
从目标群组抽取真实样本,并人工标记完全重复、转码重复、裁剪重复、局部复用、语义相关和无关视频。评测集应覆盖横屏、竖屏、低清晰度、动态水印、硬字幕和镜像视频等常见情况。
重复检测要同时关注误报与漏报,因为误删正常内容的代价通常高于保留一条重复视频。建议机器人先返回“疑似重复”及来源消息,由管理员确认后再执行删除或折叠操作。
语义搜索则应观察前 5 条和前 10 条结果是否真正有用,并记录无结果查询。持续补充行业术语、中文别名和群内常用表达,通常比盲目更换大模型更能改善实际体验。
❓ 常见问题解答(FAQ)
pHash 能直接实现视频语义搜索吗?
不能,pHash 主要衡量画面的感知相似性,适合识别压缩、缩放后的近重复内容。语义搜索需要结合多模态向量、OCR、语音转写或消息文本索引。
汉明距离设置为多少最合适?
64 位 pHash 可以从 6 至 10 的范围开始测试,但最终阈值必须根据群内真实视频校准。单帧距离不足以确认重复,还应结合匹配帧比例、时长和时间顺序。
加字幕或水印后还能识别吗?
小面积水印通常不会完全破坏 pHash,但大字幕、边框和画中画会增加汉明距离。可以对画面中心区域生成补充指纹,并结合多个关键帧与向量相似度复核。
机器人能搜索加入前的历史视频吗?
Bot API 对历史消息访问存在限制,具体能力取决于机器人加入时间、权限和 Telegram 接口行为。需要历史回填时,应在获得群组授权并遵守平台规则的前提下评估 MTProto 客户端,同时严格限制数据用途。
小型群组需要部署向量数据库吗?
TG中文搜索机器人 数据量较小时,PostgreSQL 加 pgvector 通常足够,也便于同时管理消息元数据和权限关系。只有当向量规模、并发或跨区域需求明显增长时,才有必要引入更复杂的基础设施。
群聊视频检索的可靠方案不是单一算法,而是pHash 去重、视觉向量召回、文本检索、权限控制与人工反馈的组合。先从关键帧和疑似重复提示做小规模验证,再逐步增加 OCR、语音识别与混合排序,能以更可控的成本建立真正有用的群内视频搜索系统。

