1. 多模态概述
多模态技术,指的是通过跨模态对齐(如将图像与描述文本关联)和信息互补(如视频结合语音理解情感),实现更全面的感知能力。例如,大模型不仅能理解“苹果”的文字描述,还能识别图像中的苹果并关联其味道、用途等知识。常见的多模态类型包括文生图、文生视频、图片理解等等。
这里我列了一张表格,整理出当下主流的多模态大模型及其用途:
多模态场景 | 常用模型 | 备注 |
图-文(Image-to-Text) |
|
|
文-图(Text-to-Image) |
| 这些是行业领先的生成图像的模型,基于文本描述生成高质量图像。 |
文-视频(Text-to-Video) |
| 通过文字描绘,生成专业级别的视频。 |
视频-文(Video-to-Text) | GPT-4o | GPT-4o能够对音视频流进行解读和理解。 |
TTS(Text-to_Speech) |
| 生成接近人类的语音,仅需几秒钟的语音样本即可生成高质量音频。 |
ASR(Speech-to-Text) | Whisper | 开源的语音识别系统,用于将语音转录为文本。 |
OCR(Optical Character Recognition) |
| GPT-4V和EasyOCR等模型和技术在图像文本识别任务中表现优异。 |
了解了多模态大模型的分类及应用场景之后,下面我们就从 OpenAI 入手,实战下多模态的功能。
2. 文生图
在当前的发展阶段,文生图可以说应该是应用范围最广、且发展最成熟的多模态应用场景之一了,在各大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 模型还支持图片编辑、图片伸缩、换脸等功能,大家如果感兴趣的话,可以参考官网文档进行学习,这里就不做展开了。
3. 图片理解
对于 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} 传入。
图片识别的结果如下:
这张图片描绘了一只可爱的灰色猫咪正在沙发上安静地睡觉。猫咪蜷缩成一个圆球,显得非常舒适和放松。沙发上有几只不同颜色的靠垫,而背景的光线柔和,营造出温馨、宁静的居家气氛。整体画面让人感到放松和愉悦。
4. 文本转语音
介绍完了图片,我们再来看下多模态中的 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("音频生成成功")
这部分的代码也非常简单,主要需要关注如下几个参数:
- model: 指定语音模型,目前可选的只有tts-1和tts-1-hd。
- voice: 设置音色,TTS 模型内置了多种音色,如alloy、ash等,可以根据不同场景进行选择。
- input: 音频内容。
小结
本篇文章中,我们介绍了当下在大模型领域非常火爆的多模态功能,并以 OpenAI 的相关模型为例,具体讲解了如何实现文生图、图片理解和文本转语音等功能。
多模态相关技术目前还不算非常成熟,内容的一致性、流畅度、指令遵从等一些列问题还有待解决。相信随着大模型能力的快速提升,多模态将会被越来越广泛的应用到各类业务场景中。毕竟,图片、音频、视频才是对人类更加友好的内容形态。