目录
前言
大家好,今天咱们做一期 关于Vision - 视觉功能的API调用,包括对于这个功能的一些理解,后面我还会附带一个具体的效果视频
什么是视觉功能API?
视觉功能API是一种基于人工智能和计算机视觉技术的接口,允许开发者在应用程序中集成图像和视频处理能力。这些API利用深度学习算法,能够自动分析和理解图像与视频内容,从而实现图像识别、物体检测、场景描述等功能。
主要功能
-
图像识别与分类:
- 通过视觉功能API,可以自动识别图像中的物体,并对其进行分类。例如,识别图片中的动物、车辆、建筑物等。
-
视频内容分析:
- 视觉功能API可以逐帧分析视频内容,提取关键信息,生成视频描述,甚至可以进行实时监控与告警。
-
场景描述与自动旁白:
- API不仅能识别图像和视频中的物体,还能理解场景,并生成相应的自然语言描述。例如,自动为视频生成旁白脚本,提高视频内容的可访问性。
-
面部识别与情感分析:
- 通过面部识别技术,API可以识别和验证个人身份,甚至能够分析面部表情,判断情感状态。
应用场景
-
媒体与娱乐:
- 在视频制作和编辑中,视觉功能API可以自动生成视频旁白,提高生产效率,节省人力成本。
-
安防与监控:
- 在安防领域,通过实时视频分析,API可以帮助识别潜在威胁,提供即时告警,提升安全性。
-
电子商务:
- 在线零售商可以利用视觉功能API进行产品推荐和视觉搜索,提升用户购物体验。
-
医疗健康:
- 通过分析医学影像,API可以辅助医生诊断疾病,提高诊断准确率和效率。
技术优势
- 高精度识别:利用最先进的深度学习算法,视觉功能API能够提供高精度的图像和视频识别能力。
- 易于集成:通过标准化的API接口,开发者可以轻松地将视觉功能集成到现有的应用程序中。
- 实时处理:支持实时图像和视频分析,能够在毫秒级别内提供分析结果,适用于对速度要求高的应用场景。
示例:使用 GPT 的视觉能力获取视频描述
- 导入必要的库:
cv2
(OpenCV):用于读取视频。base64
:用于将图像编码为 base64。time
:用于时间操作。openai
:用于与 OpenAI API 交互。os
:用于获取环境变量中的 API 密钥。requests
:用于发送 HTTP 请求。
from IPython.display import display, Image, Audio
import cv2 # We're using OpenCV to read video, to install !pip install opencv-python
import base64
import time
from openai import OpenAI
import os
import requests
- 初始化 OpenAI 客户端:
- 从环境变量中获取 OpenAI API 密钥。如果没有设置环境变量,可以直接在代码中设置 API 密钥。
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY", "<your OpenAI API key if not set as env var>"))
- 读取视频并提取帧:
- 使用 OpenCV 读取视频文件
bison.mp4
。 - 循环读取视频中的每一帧,将其编码为 base64 格式,并存储在
base64Frames
列表中。 - 强调一下,读取到每一帧后直接持久化一下,免得在测试过程中重复读取视频浪费时间。
- 使用 OpenCV 读取视频文件
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.")
# 保存 base64Frames 到文件中
with open("data/base64_frames.json", "w") as f:
json.dump(base64Frames, f)
print("json field created complete")
在这个过程中,视频 bison.mp4
被逐帧读取,并将每一帧编码为 JPEG 格式的图像,然后再转换为 base64 编码字符串,存储在 base64Frames
列表中
-------------------------------------------------------------------------------------------------------------------
我们通过逐帧显示视频帧来确认它们是否正确读取
注:这个地方我强调一下,此处代码可以忽略,这段代码在 Jupyter Notebook 中运行时,图像会显示在 Notebook 的输出单元格中。具体来说,每次调用 clear_output 方法时,Notebook 会在同一个输出单元格中更新显示的图像,模拟视频播放效果。
如果你在本地 Python 环境中(非 Jupyter Notebook)运行这段代码,是看不到图像显示的,因为 display
和 Image
函数是 IPython 库的一部分,专门用于 Jupyter Notebook 中的显示。
display_handle = display(None, display_id=True)
for img in base64Frames:
clear_output(wait=True)
display(Image(data=base64.b64decode(img.encode("utf-8"))))
time.sleep(0.025)
这个代码片段中,我们使用 display
函数初始化一个显示句柄,然后循环遍历 base64Frames
列表,将每一帧解码并显示出来,间隔时间为 0.025 秒。
生成视频描述
在确认帧读取正确后,我们准备生成视频的描述。我们不需要发送每一帧给 GPT 模型,只需要发送部分帧即可。
-
构建提示信息:
PROMPT_MESSAGES
包含了用户的请求内容和部分帧(每隔 50 帧取一帧)。
-
发送请求给 GPT 模型:
- 使用
client.chat.completions.create
方法发送请求,并指定模型为gpt-4o
。
- 使用
PROMPT_MESSAGES = [
{
"role": "user",
"content": [
"这些是我想上传的视频帧。生成一个吸引人的描述,注意我要中文的描述,要有一些哲理性,我可以随视频一起上传",
*map(lambda x: {"image": x, "resize": 768}, base64Frames[0::50]),
],
},
]
params = {
"model": "gpt-4o",
"messages": PROMPT_MESSAGES,
"max_tokens": 200,
}
result = client.chat.completions.create(**params)
print(result.choices[0].message.content)
为视频生成旁白
接下来,我们为视频生成旁白脚本,并使用 TTS API 生成语音。
-
构建旁白提示信息:
PROMPT_MESSAGES
包含了请求的内容和部分帧(每隔 60 帧取一帧)。 -
发送请求给 GPT 模型:使用
client.chat.completions.create
方法,获取旁白脚本。 - 使用 TTS API 生成语音: 将旁白脚本传递给 TTS API 生成语音文件,并显示音频。
video_duration = 19 # 视频时长,单位为秒
characters_per_second = 4 # 假设每秒的语速为4个字
max_characters = int(video_duration * characters_per_second) # 最大字数
# 假设宽度调整为768像素,计算相应的高度
width = 720
aspect_ratio = 9 / 16 # 竖版视频的宽高比
height = int(width / aspect_ratio)
# 将调整后的宽高作为字典中的值
resize_values = (width, height)
PROMPT_MESSAGES = [
{
"role": "user",
"content": [
"这些是视频的帧,请用David Attenborough 的风格 给我生成一个简短的中文旁白脚本,最好风格上再浪漫一些 ,回复的内容只包括旁边并将其限制在最多{}个单词以内.".format(max_characters),
*map(lambda x: {"image": x, "resize": resize_values}, base64Frames[0::60]),
],
},
]
params = {
"model": "gpt-4o",
"messages": PROMPT_MESSAGES,
"max_tokens": 500,
}
result = client.chat.completions.create(**params)
print(result.choices[0].message.content)
response = requests.post(
"https://api.openai.com/v1/audio/speech",
headers={
"Authorization": f"Bearer {os.environ['OPENAI_API_KEY']}",
},
json={
"model": "tts-1-1106",
"input": result.choices[0].message.content,
"voice": "onyx",
"volume": 0.8,
},
)
audio = b""
for chunk in response.iter_content(chunk_size=1024 * 1024):
audio += chunk
with open("data/output_audio.mp3", "wb") as f:
f.write(audio)
通过这些步骤,我们实现了从视频帧提取、生成视频描述和旁白脚本,到最后生成语音旁白的完整流程
总结
视觉功能API正在改变我们与图像和视频互动的方式。通过为应用程序赋予视觉理解能力,这些API不仅提升了用户体验,还开创了全新的应用场景。无论是媒体、安防、电子商务还是医疗领域,视觉功能API都将为各行各业带来前所未有的创新和变革。