- 多模态概述 ========
多模态技术,指的是通过跨模态对齐(如将图像与描述文本关联)和信息互补(如视频结合语音理解情感),实现更全面的感知能力。例如,大模型不仅能理解“苹果”的文字描述,还能识别图像中的苹果并关联其味道、用途等知识。
常见的多模态类型包括文生图、文生视频、图片理解等等。
这里我列了一张表格,整理出当下主流的多模态大模型及其用途:
了解了多模态大模型的分类及应用场景之后,下面我们就从 OpenAI 入手,实战下多模态的功能。
- 文生图 ======
在当前的发展阶段,文生图可以说应该是应用范围最广、且发展最成熟的多模态应用场景之一了,在各大AIGC 应用中都可以看到各类根据文字生成图片的功能。
OpenAI 的DALL-E、Stable Diffusion 和 Midjourney 都是比较主流的图片模型,这里我们通过代码演示下 DALL-E 的具体用法。
import os
import dotenv
# 导入openai依赖库
from openai import OpenAI
# 加载环境变量
dotenv.load_dotenv()
# 创建OpenAI客户端
client = OpenAI(base_url=os.getenv("OPENAI_API_BASE"))
# 调用images.generate接口,生成图片
resp = client.images.generate(
model="dall-e-3", # 指定模型,可选dall-e-2和dall-e-3(默认)
prompt="一只英短蓝猫,正躺在沙发上睡觉,非常惬意", # 生成图片的Prompt
n=1, # 生成图片的数量
quality="hd", # 图片质量,可选hd和standard(默认)
size="1024x1024", # 图片尺寸
style="natural", # 图片风格,可选vivid和natural(默认)
response_format="url", # 返回图片的格式,可选url和b64_json(默认)
)
# 打印生成图片的url
print(resp.data[0].url)
代码比较简单,这里对一些 API 参数进行补充说明:
-
model:指定生成图片的模型,可选的模型有 dall-e-2和dall-e-3,默认为 dall-e-3。
-
prompt:生成图片的描述。
-
n: 生成图片的数量
-
quality: 图片质量,可选值为 standard(标准)和 hd (高清),默认为 standard。如果采用 hd 质量的话,生成图片的细节会更加精细、图像一致性也更好。该参数仅 dall-e-3 模型生效。
-
response_format: 返回图片的格式,可选值为 url 和 b64_json,默认为 url。通常来说,url 适用于生成在线图片,而 b64_json 适应于本地图片。注:如果采用 url 模式,则该图片仅在60分钟内有效。
-
size: 图片尺寸,针对 dall-e-3 模型,可选值为 1024x1024、1792x1024 和 1024x1792。
-
style: 图片风格,有 vivid 和 natural 两种:vivid 为生动风,图片更富创造性;而 natural 为写实风,图片更自然、贴近现实。默认值为 vavid。
执行上面的代码,就可以生成一张蓝猫睡觉的图片。
除了图片生成之外,DALL-E 模型还支持图片编辑、图片伸缩、换脸等功能,大家如果感兴趣的话,可以参考官网文档进行学习,这里就不做展开了。
- 图片理解 =======
对于 gpt-4o 及以上的模型,即可以在 ChatCompletion 接口中,通过传入图片 url 的方式,实现图片理解的功能。参考代码如下:
import base64
import os
import dotenv
from openai import OpenAI
# 加载环境变量
dotenv.load_dotenv()
# 创建OpenAI客户端
client = OpenAI(base_url=os.getenv("OPENAI_API_BASE"))
# 读取本地图片并进行base64编码
with open("./data/cat.png", "rb") as image_file:
encoded_image = base64.b64encode(image_file.read()).decode('utf-8')
# 调用chat.completions.create接口,并指定content type为图片
response = client.chat.completions.create(
model="gpt-4o-mini", # 使用gpt-4o-mini模型
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "给我讲下这张图片描绘了什么,用中文回答。"},
{
"type": "image_url", # 指定content类型为image_url,并将本地图片的base64编码后的路径传递过去
"image_url": {
"url": f"data:image/png;base64,{encoded_image}",
}
},
],
}
],
max_tokens=300,
)
# 打印结果
print(response.choices[0].message.content)
这里的 API 也非常简单,还是通用的 Chat Completion 格式,只是需要特别注意下 image_url 的用法:
-
针对在线图片,可以直接传入图片的公网 url ,模型会将图片下载后再进行处理。
-
针对本地图片,需要首先对图片进行 BASE64 编码,之后把编码后的路径按照固定格式:data:image/png;base64,{encoded_image} 传入。
图片识别的结果如下:
这张图片描绘了一只可爱的灰色猫咪正在沙发上安静地睡觉。
猫咪蜷缩成一个圆球,显得非常舒适和放松。
沙发上有几只不同颜色的靠垫,而背景的光线柔和,
营造出温馨、宁静的居家气氛。整体画面让人感到放松和愉悦。
- 文本转语音 ========
介绍完了图片,我们再来看下多模态中的 Audio 语音类型。
OpenAI 提供了一个 TTS (Text-to-Speech)模型,可以根据文本生成语音,非常适合新闻播报、电子书阅读类的 app 来使用。
下面我们看下具体的代码。
import os
import dotenv
from openai import OpenAI
# 加载环境变量
dotenv.load_dotenv()
# 创建OpenAI客户端
client = OpenAI(base_url=os.getenv("OPENAI_API_BASE"))
# 指定文件路径
speech_file_path = "./data/静夜思.mp3"
# 指定语言内容
text = "床前明月光,疑似地上霜。举头望明月,低头思故乡"
# 调用TTS API,生成音频文件
response = client.audio.speech.create(
model="tts-1", # 指定模型,可选tts-1和tts-1-hd
voice="alloy", # 指定音色,TTS模型支持多种音色,如alloy、ash等
input=text, # 指定文本内容
)
# 将音频文件保存到本地
response.stream_to_file(speech_file_path)
print("音频生成成功")
我把最终生成的音频也附在文档中,大家可以感受一下效果!
- 小结 =====
本篇文章中,我们介绍了当下在大模型领域非常火爆的多模态功能,并以 OpenAI 的相关模型为例,具体讲解了如何实现文生图、图片理解和文本转语音等功能。
多模态相关技术目前还不算非常成熟,内容的一致性、流畅度、指令遵从等一些列问题还有待解决。相信随着大模型能力的快速提升,多模态将会被越来越广泛的应用到各类业务场景中。毕竟,图片、音频、视频才是对人类更加友好的内容形态。