我把多模态大模型接入了「小爱」,痛快来一场「表情包斗图」!

前两天,搞了个微信 AI 小助理-小爱(AI),爸妈玩的不亦乐乎。

最近一直在迭代中,挖掘小爱的无限潜力:

有朋友问:小爱能否理解发送的表情包?来一场表情包斗图?

小爱:害,表情包还得是我!不服来战!

今日分享,继续带大家实操:如何让小爱能够接收表情包,并用合适的表情包回复你,和小爱来一场斗图大战

要实现斗图功能,我们先来拆解下步骤:

  • 接收表情包:接收消息接口,成功获取表情包信息;
  • 理解表情包:利用多模态大模型,生成表情包的文字描述;
  • 回复表情包:原打算采用图片生成模型,生成合适的表情包,不过图片生成不可控,故采用公开的表情包接口,检索已有表情包。

效果咋样?

不多说了,上实操!

1. 接收表情包

微信消息中,表情包共分为两种:

  1. 官方提供的 emoji 表情,通常以 Unicode 字符的形式存在,因此能在各种设备之间正确显示;
  2. 社区制作的各种表情包,本质是一张图片。

如下图所示,如果是第一种表情包,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("&amp;", "&")

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. 回复表情包

搜索了一番表情包接口,下面两个免费且靠谱的接口,分享给大家:

注:两个请求的接口非常类似,每天都有免费额度,尽情薅吧,你用不完的!

首先,注册申请一个 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("&amp;", "&")
    reply_url = reply_emoji(image_url)
    send_message(to=from_name, content=reply_url, isRoom=False, message_type='file', base=base_url)

来一波斗图试试吧~

咋样?

小爱真的理解我发的表情包了么?

来,我们看看日志:

红色箭头是 gemini多模态大模型给的关键词,分别对应上面例子中的表情包,好像也没啥毛病吧。

写在最后

本文通过简单三步为小爱打造了表情包斗图功能,不爽的时候找小爱聊聊,一图胜千言!

大家有更好的想法,欢迎评论区交流。

如果本文对你有帮助,不妨点个免费的赞收藏备用。


为了方便大家交流,新建了一个 AI 交流群,欢迎感兴趣的小伙伴加入。

小爱也在群里,想进群体验的朋友,公众号后台「联系我」即可,拉你进群。

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值