前两天,搞了个微信 AI 小助理-小爱(AI)
,爸妈玩的不亦乐乎。
- 零风险!零费用!我把AI接入微信群,爸妈玩嗨了,附教程(下)
最近一直在迭代中,挖掘小爱
的无限潜力:
- 链接丢给它,精华吐出来!微信AI小助理太强了,附完整提示词
- 拥有一个能倾听你心声的「微信AI小助理」,是一种什么体验?
有朋友问:小爱
能否理解发送的表情包?来一场表情包斗图?
小爱
:害,表情包还得是我!不服来战!
今日分享,继续带大家实操:如何让小爱
能够接收表情包,并用合适的表情包回复你,和小爱
来一场斗图大战
!
要实现斗图
功能,我们先来拆解下步骤:
- 接收表情包:接收消息接口,成功获取表情包信息;
- 理解表情包:利用多模态大模型,生成表情包的文字描述;
- 回复表情包:原打算采用图片生成模型,生成合适的表情包,不过图片生成不可控,故采用公开的表情包接口,检索已有表情包。
效果咋样?
不多说了,上实操!
1. 接收表情包
微信消息中,表情包共分为两种:
- 官方提供的 emoji 表情,通常以 Unicode 字符的形式存在,因此能在各种设备之间正确显示;
- 社区制作的各种表情包,本质是一张图片。
如下图所示,如果是第一种表情包,Unicode 编码,本质上和文本没有区别,因此 LLM 是可以理解的,但是第二种表情包就需要特殊处理了。
微信消息中,第二种表情包都遵循 XML 文件格式:
<msg><emoji fromusername = "xxx" len = "16758" productid="" androidmd5="xx" androidlen="16758" cdnurl = "http://xxx;bizid=1023"></emoji></msg>
据此,我们就可以从消息中识别出表情包
类型。
接下来,我们可以从 XML 文件中拿到url
,进而获取表情包图片内容:
import xml.etree.ElementTree as ET
def handle_emoji(content=''):emoji = ET.fromstring(content).find('emoji')if emoji is not None:image_url = emoji.get('cdnurl').replace("&", "&")
2. 理解表情包
拿到表情包图片后,我们把它发送给多模态大模型
,来帮我们生成有关表情包的内容描述。
目前市面上有很多开源的 多模态大模型
,不过大多模型参数两大,部署成本高。
如果你是 GPT
付费用户,建议直接上 GPT-4o
的接口。
有没有免费的?
当然,对于希望白嫖玩玩的你,Google 家的gemini-1.5-flash
绝对值得拥有!
还不知道如何接入的小伙伴,可以回看教程:盘点 9 家免费且靠谱的AI大模型 API,统一封装,任性调用!
因为我们已经把 gemini-1.5-flash
接入了 OneAPI,所以参考 OpenAI 接口文档:https://platform.openai.com/docs/guides/vision进行接入,接口支持多张图片的输入
请求结构体的示例代码如下:
注:可以直接传入图片的 url,如果是本地图片,需进行 base64 编码。
def encode_image(image_path):with open(image_path, "rb") as image_file:return base64.b64encode(image_file.read()).decode('utf-8')base64_image = encode_image('output/emoji.jpg')messages = [{'role': 'user', 'content': [{"type": "text", "text": "describe this emoji image"},{"type": "image_url","image_url": {"url": f"data:image/jpeg;base64,{base64_image}"},}]}
]
让我们看看 gemini-1.5-flash
给上图中表情包的返回结果:
有没有发现:表情包中的文字识别错了,谋闷台
被识别成了求问台
!哎,毕竟免费,凑合着用吧!
当然,我们希望gemini-1.5-flash
也能用一个表情包回复我,不过gemini
表示做不到啊。
为此,可以简单修改下提示词:
这是用户发送的一个表情包图片,请理解图片内容,给我回复表情包的一个关键词,无需任何标点符号。
这样,gemini
就只会给我吐出一个关键词
,而不是上面的一坨英文。
接下来,我们就可以拿着这个关键词
,去请求表情包的接口,拿到相关的表情包。
3. 回复表情包
搜索了一番表情包接口,下面两个免费且靠谱的接口,分享给大家:
-
ALAPI:https://www.alapi.cn/api/view/97
-
接口盒子:https://api.aa1.cn/doc/apihzbqbsougou.html
注:两个请求的接口非常类似,每天都有免费额度,尽情薅吧,你用不完的!
首先,注册申请一个 token,然后官网测试一下:
没问题,我们来写个请求代码:
# 注意 GET 请求不用 data,应该使用 params。
def get_api_doutu(keyword='哈哈'):params= {"keyword": keyword,"page": 1,"type": 7,"token": al_api_token}response = requests.get("https://v2.alapi.cn/api/doutu", params=params)return response.json()
4. 效果展示
准备工作一切就绪,接下来我们就把整个过程串联起来。
四行核心代码,分别对应上述流程:
def handle_emoji(content='', from_name=''):emoji = ET.fromstring(content).find('emoji')image_url = emoji.get('cdnurl').replace("&", "&")reply_url = reply_emoji(image_url)send_message(to=from_name, content=reply_url, isRoom=False, message_type='file', base=base_url)
来一波斗图试试吧~
咋样?
小爱
真的理解我发的表情包了么?
来,我们看看日志:
红色箭头是 gemini
多模态大模型给的关键词
,分别对应上面例子中的表情包,好像也没啥毛病吧。
写在最后
本文通过简单三步为小爱
打造了表情包斗图
功能,不爽的时候找小爱
聊聊,一图胜千言!
大家有更好的想法,欢迎评论区交流。
如果本文对你有帮助,不妨点个免费的赞和收藏备用。
为了方便大家交流,新建了一个 AI 交流群
,欢迎感兴趣的小伙伴加入。
小爱
也在群里,想进群体验的朋友,公众号后台「联系我」即可,拉你进群。