经过分幕后,内容理解的难度降低。我们可以通过MLLM + 问答的方式来将视频中的内容,提取成为文本形式的信息。最简单的例子是,直接让MLLM来描述视频中画面的内容。比较常用的MLLM:video-llama、minigpt4、vision-glm、mPLUG-Owl等。
【参考】: https://github.com/BradyFU/Awesome-Multimodal-Large-Language-Models
虽然经过分幕后,每一个幕的内容变得简单,但是由于数据分布跨度依然很大,开源模型并不能很好的了解游戏领域的很多信息,如游戏类型、一些专业术语等。所以我们还需对MLLM在游戏广告素材的数据上进行一轮微调,主要目的是提升模型再游戏领域知识和认知能力。
针对MLLM的微调,主要分为三个部分:数据构造 + 模型训练 + 评估标准。
实验结果显示,经过微调后的模型,在各项维度上的打分,都有所提高。
语音识别可以直接通过使用OpenAI开源的Whisper模型来实现,其不仅可以识别语音文案,还可以识别起止时间,甚至每个字词的起止时间,Whisper模型返回结果样例如下:
[
{
'start': 0.0,
'end': 2.22,
'text': '注意看,這個男人叫小帥。',
'word': [
[0.0, 0.24, '注意', 0.9580078125],
[0.24, 0.56, '看,', 0.99560546875],
[0.92, 1.12, '這個', 0.51611328125],
[1.12, 1.34, '男', 0.9970703125],
[1.34, 1.56, '人', 0.99951171875],
[1.56, 1.74, '叫', 0.99462890625],
[1.74, 1.98, '小', 0.9365234375],
[1.98, 2.22, '帥。', 0.98779296875]
]
}
]
前面有提到,基于假设:”只要多模态信息提取的足够全面、精准,即使不需要观看原视频,也可以了解视频中的内容“。我们只需要汇总前面提到的,不同模态的信息,并将其输入给ChatGPT,就可以让ChatGPT对素材的内容有足够的了解。
我们将画面、语音信息统一整理为SRT格式(SubRip 文件格式),即通常被用来作为视频字幕的数据格式。在我们的场景下,不仅限于字幕内容,还可以是画面内容的描述,或其他有专家模型识别得到的信息。下面样例展示了这种数据格式(部分):
100:00:00.0 --> 00:00:02.220
今天我发现了一款全新的射击手游
200:00:02.220 --> 00:00:02.940
暗区突围
300:00:02.940 --> 00:00:05.719
现在我给大家介绍下它特有的健康系统
400:00:30.0 --> 00:00:31.879
小心你的脑袋和胸部被击穿的话
500:00:31.879 --> 00:00:33.20
可是会丢了小命
600:00:33.20 --> 00:00:34.560
其中还有许多其他药品
700:00:34.560 --> 00:00:36.320
激素能让你兴奋起来
800:00:36.320 --> 00:00:37.560
如果你饿了或者渴了
900:00:37.560 --> 00:00:39.619
记得及时寻找食物和水分
1000:00:39.619 --> 00:00:40.820
最后提醒你一下
1100:00:40.820 --> 00:00:42.60
再次重回战场之前
1200:00:42.60 --> 00:00:43.899
记得把你的小身板收拾干净
使用STR这种数据格式有2个好处:
将画面内容、声音信息,都以SRT的格式汇总好后,可以以prompt输入的形式输入给ChatGPT,同时直接问ChatGPT关于视频内容的问题,就可以得到相应的理解结果。
比如下面的例子,展示了我们可以直接问ChatGPT,这个视频的卖点是什么:
question = "这个广告视频主要展示的卖点是什么?"
prompt = f"""
下面两段由三重反引号包含起来的两段内容,分别是一段广告视频的画面内容和音频内容。格式为SubRip字幕格式,分别包含了每一幕的起止时间以及该幕的内容。
画面内容:
```
{video_srt}
```
音频内容:
```
{audio_srt}
```
现在请你尽可能简短的回答我的问题:
{question}
"""
data = {"prompt": prompt,"model": "chatgpt",}
response = requests.post("http://xx.xx.xx.xx:xxxx/api/llm_chat", data=json.dumps(data))
result = response.content.decode()
为了方便使用,我们搭建了MLLM、语音识别、LLM对话等大模型的服务化接口(样例中隐去了IP和端口),通过前面样例中的这种方式,我们可以直接和LLM针对素材内容进行问答了。比如该样例中,可以直接询问模型,素材的卖点是什么。
经过封装后,用户仅需要像下面的例子中一样,一次调用,就可以得到最终理解结果。
with open("./3ec80c979e4e32a4e8b9fee9d9a23161.mp4", "rb") as f:
video = f.read()
question = "这个广告视频中体现的主要卖点是什么"
response = requests.post("http://xx.xx.xx.xx:xxxx/api/material_qa",
files={'video': video,
'question': (None, question)},
timeout=9999,)
# print(response.content.decode())
下面列举几个不同问题,模型给出的回答:
问题 | 回答 |
---|---|
这个广告视频中体现的主要卖点是什么 | 这个广告视频中主要卖点是这款设计手游的全新的健康系统和多种药品的使用。 |
视频的前3秒说了什么 | 视频的前3秒说了"今天我发现了一款全新的射击手游"。 |
视频中第20秒,画面中的士兵在做什么 | 视频中第20秒,画面中的士兵正在使用一支军用步枪,准备进行精确射击。 |
视频一开始,画面中的人穿什么衣服 | 视频一开始,画面中的人穿着军装。 |
对于传统的打标签的场景,也可以通过这种方式覆盖。只需要向模型说明”标签名“和”标签含义“即可:
tag_name = "系统介绍"
tag_caption = "指主要介绍游戏中的某个玩法系统的功能,以吸引玩家兴趣。"
prompt = f"""
下面两段由三重反引号包含起来的两段内容,分别是一段广告视频的画面内容和音频内容。格式为SubRip字幕格式,分别包含了每一幕的起止时间以及该幕的内容。
画面内容:
```
{video_srt}
```
音频内容:
```
{audio_srt}
```
请你找出,该视频中符合“{tag_caption}”的描述的地方。如果有,请回答“{tag_name}”;如果没有,请回答“无”。
"""
data = {"prompt": prompt,"model": "chatgpt",}
response = requests.post("http://xx.xx.xx.xx:xxxx/api/llm_chat", data=json.dumps(data))
result = response.content.decode()AI助手
根据这样的方法,我们可以对视频判断是否符合各个标签的描述,以此可以直接给视频打标。我们只需要便利待打标的所有标签描述,就可以得到最终打标结果:
tags = "问题引入,系统介绍"
response = requests.post("http://xx.xx.xx.xx:xxxx/api/material_tag",
files={'video': video,
'tags': (None, tags)},
timeout=9999,)
# print(response.content.decode())# 系统介绍
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。