利用 GPT 的视觉能力和 TTS API 来处理视频并添加旁白 [译]

这个笔记本演示了如何利用 GPT 的视觉能力来处理视频内容。GPT-4 无法直接接收视频作为输入,但我们可以通过视觉识别功能以及全新的 128K 上下文窗口,一次性描述视频中的所有静态画面。我们将通过两个实例来演示如何操作:

  1. 利用 GPT-4 来描述一个视频的内容
  2. 结合 GPT-4 和 TTS API 为视频创造旁白
from IPython.display import display, Image, Audio
import cv2 # We're using OpenCV to read video
import base64
import time
import openai
import os
import requests

1. 利用 GPT 的视觉能力描述视频

我们首先利用 OpenCV 技术从一个展示野牛和狼的自然 视频 中提取画面:

video = cv2.VideoCapture("data/bison.mp4")
base64Frames = []
while video.isOpened():
success, frame = video.read()
if not success:
break
_, buffer = cv2.imencode(".jpg", frame)
base64Frames.append(base64.b64encode(buffer).decode("utf-8"))
video.release()
print(len(base64Frames), "frames read.")
618 frames read.

确保我们正确捕获了画面,我们将它们展示出来:

display_handle = display(None, display_id=True)
for img in base64Frames:
display_handle.update(Image(data=base64.b64decode(img.encode("utf-8"))))
time.sleep(0.025)

获得视频画面后,我们构建了一个提示并发送请求给 GPT(注意,我们不需要发送每一帧画面给 GPT,它能理解整个视频的情况):

PROMPT_MESSAGES = [
{
"role": "user",
"content": [
"These are frames from a video that I want to upload. Generate a compelling description that I can upload along with the video.",
*map(lambda x: {"image": x, "resize": 768}, base64Frames[0::10]),
],
},
]
params = {
"model": "gpt-4-vision-preview",
"messages": PROMPT_MESSAGES,
"api_key": os.environ["OPENAI_API_KEY"],
"headers": {"Openai-Version": "2020-11-07"},
"max_tokens": 200,
}
result = openai.ChatCompletion.create(**params)
print(result.choices[0].message.content)

标题:生存本能:野牛与狼在冰原上的史诗般对峙

描述: 在被雪覆盖的平原上,一场原始且扣人心弦的生存戏剧正在上演,这里,强壮的野牛与一群决心捕食的狼群展开对决。视频在冬日的银装素裹中捕捉到了这场惊心动魄的捕食者与猎物之间的互动。在生死存亡的边缘,每一个移动都是大自然舞台上的生与死的较量。观众将看到这些庄严的生物进行永恒的斗争,它们展示出野生世界中的力量、坚韧和不屈的精神。和我们一起,进入自然恢复力的心脏地带,见证动物王国中生命循环的最真实写照。#Wildlife #Nature #Survival #BisonVsWolves

2. 用 GPT-4 和 TTS API 制作视频旁白

我们将尝试用大卫·艾登堡的风格,为一段视频制作旁白。就用视频中同样的画面,引导 GPT 来帮我们撰写一段简短的文本:

PROMPT_MESSAGES = [
{
"role": "user",
"content": [
"These are frames of a video. Create a short voiceover script in the style of David Attenborough. Only include the narration.",
*map(lambda x: {"image": x, "resize": 768}, base64Frames[0::10]),
],
},
]
params = {
"model": "gpt-4-vision-preview",
"messages": PROMPT_MESSAGES,
"api_key": os.environ["OPENAI_API_KEY"],
"headers": {"Openai-Version": "2020-11-07"},
"max_tokens": 500,
}
result = openai.ChatCompletion.create(**params)
print(result.choices[0].message.content)

在无边无际的冬日白雪中,自然界的生生不息上演着永恒而赤裸的生存戏码。在这片考验生物存亡的严苛舞台上,一群灰狼已经将目光锁定在了牛群中的一头野牛——一场关乎生命和食物的搏斗即将拉开序幕。

这场狼群的围猎行动策划严密,每一只狼都了然于心它的任务。在严寒的空气中,它们的肌肉绷紧,呼吸可见,悄无声息地靠近猎物,伺机找到破绽。而野牛,这个庞然大物,依靠千百万年锻造的本能站稳脚跟,其巨大的身影在刺眼的白雪中投下了一道孤影。

这是一场生与死的交响乐,每一个动作,每一次虚晃,都关乎着生命的重量。狼群交替发起攻势,一边保持体力,一边逐渐削弱猎物。曾经是野牛坚实后盾的牛群,如今已经逃之夭夭,远远散开,这生动地告诉我们,在这野性的领地里,生存的法则永远高于血缘的羁绊。

随着一阵紧张的活动——狼群开始收网。尽管野牛力大无穷,但它已经力不从心,喘息急促,行动迟缓。狼群嗅到了胜利的气息。它们不懈地追击,这正是自然法则残酷而又壮丽的见证。

当这场斗争走向它不可避免的结局时,我们再次认识到这片野生天地的精妙平衡。生与死,斗争与生存——这循环永续,每个故事都在雪地上一笔一划地被书写,只要狼还在这片冰原上巡行,野牛还在这片土地上漫步。

现在我们可以把这段文本交给 TTS API,让它帮我们把这段旁白变成 mp3 音频。

response = requests.post(
"https://api.openai.com/v1/audio/speech",
headers={
"Authorization": f"Bearer {os.environ['OPENAI_API_KEY']}",
},
json={
"model": "tts-1",
"input": result.choices[0].message.content,
"voice": "onyx",
},
)
audio = b""
for chunk in response.iter_content(chunk_size=1024 * 1024):
audio += chunk
Audio(audio)