文本之外的三个维度

多模态是什么、为什么现在能用

"多模态"在 LLM 语境里指模型同时处理文本以外的信号——图像、音频、视频。2023 年中以前这是几个分离的技术栈:看图用 CNN、识图用 OCR 模型、语音识别 Whisper、语音合成另一个模型,彼此之间要靠脚本拼。2024 年起主流基座模型开始原生统一,GPT-4o、Claude Opus、Gemini、Qwen-VL 这些都是同一个模型同时处理多种输入。工程上带来两点本质变化:

  1. 你不再需要级联多个模型,一次 API 调用完成"看图 + 推理 + 答题"
  2. 调用方式和纯文本基本一致,只是 messages 里的 content 从字符串变成数组

本篇把三种模态(图像、语音、视频)分别讲清楚,给出最常用的 Python 代码模板,最后聊怎么判断"这个场景该不该上多模态"。

图像输入:让模型"看见"

协议上的变化只有一处:messages 里每条消息的 content 从字符串变成数组,可以混合文本块和图片块:

messages = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "这张图里有几只猫?"},
            {"type": "image_url", "image_url": {"url": "https://example.com/cats.jpg"}},
        ],
    }
]

image_urlurl 字段有三种形态都被支持:

  • 公网可访问的 HTTP(S) URL
  • data:image/jpeg;base64,... 的 data URL(本地图片常用这种)
  • 某些厂商还支持直接上传文件 id

最常见的场景是处理本地图片,用 base64 编码成 data URL:

# vision_demo.py
import base64
import os
from pathlib import Path
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()

client = OpenAI(
    api_key=os.getenv("OPENAI_API_KEY"),
    # GPT-4o 的 vision 稳定度目前最好
)


def image_to_data_url(path: str | Path) -> str:
    path = Path(path)
    suffix = path.suffix.lower().lstrip(".")
    mime = {"jpg": "jpeg", "jpeg": "jpeg", "png": "png", "webp": "webp", "gif": "gif"}[suffix]
    b64 = base64.b64encode(path.read_bytes()).decode()
    return f"data:image/{mime};base64,{b64}"


def describe(image_path: str, question: str = "详细描述这张图片") -> str:
    resp = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": question},
                    {"type": "image_url", "image_url": {"url": image_to_data_url(image_path)}},
                ],
            }
        ],
    )
    return resp.choices[0].message.content


if __name__ == "__main__":
    print(describe("./photo.jpg", "图里有多少人?他们在做什么?"))

整个过程不需要任何专门的"视觉库",纯 base64 + openai SDK。Claude、Qwen-VL 用法一致。

图像理解的典型场景

1. OCR + 版面理解——从扫描件、截图、表单里提取结构化信息。相比传统 OCR(Tesseract)的优势是能处理复杂版面、手写、表格等 Tesseract 吃力的场景:

describe(
    "invoice.png",
    "这是一张发票。请按以下 JSON 返回:{vendor, amount, date, items: [{name, quantity, price}]}。直接返回 JSON。"
)

配合第 04 篇的 Pydantic + response_format,可以得到高可靠的结构化结果。

2. 图表理解——让模型读 dashboard 截图、股票 K 线、统计图,总结趋势。对自动化报告生成很有用。

3. UI 分析——给它一张应用截图,让它指出"哪些元素是可点击的"、"这个 UI 有什么可用性问题"。用于 QA 自动化和设计评审。

4. 图片审核——分类图片是否违规、是否符合某个业务标签。比传统分类模型更灵活(不用重新训练就能加新类别)。

5. 多图对比——一次传多张图让模型比较差异。content 数组里塞多个 image_url 块即可。

模型选型与成本

2026 年初常用的多模态视觉模型:

模型强项价格是否开源
GPT-4o / GPT-4o-mini综合最强、稳定中 / 低闭源
Claude Opus 4 / Sonnet 4长文档理解、UI 分析中高闭源
Gemini 2.0 Pro视频原生支持、成本低闭源
Qwen2.5-VL-72B中文场景、开源/开源
Llama 3.2 Vision通用、可本地/开源

成本提醒:图片 token 计费比纯文本贵很多。GPT-4o 一张 1024×1024 的图大约折合 1105 个 token,相当于几百字的中文。高频图片处理场景要算好成本。模型一般支持"低清/高清"两档,低清档省 token 但对细节任务不够用,按场景选。

本地视觉模型

Ollama 支持部分视觉模型,可以本地跑:

ollama pull llama3.2-vision:11b
ollama pull qwen2.5-vl:7b

然后用 OpenAI SDK 指向 Ollama 调用(详见主线第 10 篇),API 和上面完全一样。

硬件门槛:视觉模型比同参数量的纯文本模型多占显存(图像编码器额外几 GB),11B 的视觉模型实际占用接近 16~20 GB。Mac 统一内存 32GB+ 或 16GB+ 独显的机器比较舒服。

语音:从文字到声音,从声音到文字

语音部分的两个核心能力:

  • ASR(Automatic Speech Recognition)——语音转文字
  • TTS(Text-to-Speech)——文字转语音

Whisper:事实标准的 ASR

OpenAI 开源的 Whisper 是目前 ASR 领域的事实基准,对中文支持很好:

# API 用法
with open("audio.mp3", "rb") as f:
    transcription = client.audio.transcriptions.create(
        model="whisper-1",
        file=f,
        language="zh",  # 可选,明确指定加速
    )
print(transcription.text)

本地运行用 faster-whisper(CTranslate2 优化版,比官方快几倍):

pip install faster-whisper
from faster_whisper import WhisperModel

model = WhisperModel("large-v3", device="cpu", compute_type="int8")
segments, info = model.transcribe("audio.mp3", beam_size=5)
for seg in segments:
    print(f"[{seg.start:.1f}s - {seg.end:.1f}s] {seg.text}")

本地 large-v3 模型 3GB,纯 CPU 跑实时率约 1.5~3 倍(1 分钟音频 20~40 秒出结果),GPU 快 10 倍以上。

TTS 选型

  • OpenAI TTStts-1 / tts-1-hd)——英文自然、中文一般、价格便宜
  • ElevenLabs——英文天花板,支持声音克隆,贵
  • MiniMax / 豆包——国内 API,中文拟人度最好
  • 开源 Fish-Speech / ChatTTS——本地部署,对硬件要求中等

OpenAI TTS 用法:

resp = client.audio.speech.create(
    model="tts-1",
    voice="alloy",  # 可选 alloy / echo / fable / onyx / nova / shimmer
    input="你好,今天天气不错",
)
resp.stream_to_file("output.mp3")

Realtime API:低延迟语音对话

OpenAI 2024 年推出的 Realtime API 支持通过 WebSocket 双向流式语音——麦克风音频进去,几百毫秒就能得到流式的语音回复,打断、语气识别都原生支持。这是做语音助手、面试辅助、实时翻译类产品的重要能力,但协议相对复杂,本篇不展开。

视频:主流进入的时间点

视频理解和生成在 2025 年进入主流。

视频理解——Gemini 原生支持,把视频文件直接作为 content 块传入,模型能理解动作、时间线、对话。典型应用:安防分析、会议总结、视频内容审核。其它厂商目前主要做法是"抽帧为图片序列",效果明显差一截。

视频生成——Sora、Veo、Runway Gen-3、Kling(国内)都达到了可用级别。Python 调用方式都是标准 REST API,input 是 prompt + 参数(时长、分辨率、运动强度),output 是生成的视频 URL。

当前实际体验:5~10 秒的短视频生成已经相当稳定,1 分钟以上的连续叙事仍然不稳。成本每分钟 1~5 美元不等,短期不是"人人可调"的平价能力。

一个真实场景 demo:截图辅助助手

整合成一个"你发截图它帮你看"的小工具:

# screenshot_helper.py
import streamlit as st
import base64
from openai import OpenAI
import os
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

st.set_page_config(page_title="截图助手", page_icon=":camera:")
st.title("截图分析助手")

uploaded = st.file_uploader("上传截图", type=["png", "jpg", "jpeg", "webp"])
mode = st.radio("模式", ["提取文字", "描述内容", "分析 UI", "自由提问"])

custom_q = st.text_input("自定义问题(仅在自由提问模式用)")

if uploaded and st.button("分析"):
    b64 = base64.b64encode(uploaded.getvalue()).decode()
    mime = uploaded.type or "image/png"
    data_url = f"data:{mime};base64,{b64}"

    prompts = {
        "提取文字": "把图片里所有可见文字按阅读顺序提取出来,保留段落结构。",
        "描述内容": "用三段话描述图片内容:1)整体场景 2)主要元素 3)可能的用途或背景。",
        "分析 UI": "这是一个应用/网页截图。请分析:1)主要功能区 2)可点击元素 3)可能的 UX 问题。",
        "自由提问": custom_q or "描述这张图",
    }

    with st.spinner("分析中..."):
        resp = client.chat.completions.create(
            model="gpt-4o",
            messages=[{
                "role": "user",
                "content": [
                    {"type": "text", "text": prompts[mode]},
                    {"type": "image_url", "image_url": {"url": data_url}},
                ],
            }],
            temperature=0,
        )
    st.markdown(resp.choices[0].message.content)

把主线第 11 篇的 Streamlit 套进来,20 几行代码就有一个可用的截图工具。想扩展就是多加几个预设 prompt 或接入 RAG 让它能查你的文档。

什么时候该用多模态

多模态能力强,但不是所有问题都适合。实际应用中多问一句"能不能先 OCR 成文本再处理"往往更划算:

该用多模态

  • 图像信息无法无损转成文本(图表、照片、UI 截图)
  • 要理解空间关系(物体位置、画面构图)
  • 视频/音频的原始载体本身就重要(情感、语调、动作)
  • 开发迭代快、不想搭多个模型级联

不一定要多模态

  • 纯文字扫描件——传统 OCR + 文本 LLM 更便宜更快
  • 结构化表单——专用 OCR 模型(PaddleOCR 等)准确率更高
  • 简单分类任务——轻量视觉分类模型(CLIP、YOLO)成本是 LLM 的 1%

一个经验法则:先用多模态做 POC,跑通后看是否有可替换的轻量方案。不要本末倒置,为了"用 LLM"而强行 LLM。

本篇要点

  • 多模态在协议层面只改一处:content 从字符串变成 text + image 块的数组
  • 图像模型选型:通用 GPT-4o、长文档/UI 选 Claude、开源 Qwen-VL / Llama Vision
  • 图像成本比纯文本贵数倍,高频场景要精算
  • 语音:Whisper 是 ASR 事实标准,TTS 按中英文场景选
  • 视频理解目前 Gemini 领先,视频生成 Sora / Kling 已达可用
  • 多模态不是万灵药,能用轻量专用模型解决的就别硬上 LLM

系列真正收尾

到这里"Python 新手的 AI 进阶之路"主线 12 篇 + 番外 8 篇彻底完整。回望一下你走过的知识地图:

  • 入门基础:环境搭建、API 调用、messages 协议
  • Prompt 与输出:Prompt 工程、Pydantic 结构化
  • 数据与检索:Embedding、向量、RAG 实战
  • 能力扩展:Function Calling、Agent、MCP、多模态
  • 部署与 UI:本地模型、Streamlit 应用
  • 工程化:异步并发、评测、监控、成本、微调、安全
  • 基础理论:LLM 历史、API 参数、Token、上下文、幻觉、开源

真正的学习从你用这些知识做一个有人用的产品开始。祝你写出有人爱用的东西。

相关阅读

版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:番外 8:多模态入门,图像、语音与视频

本文链接:https://www.sshipanoo.com/blog/ai/ai-for-python/番外08-多模态入门/

本文最后一次更新为 天前,文章中的某些内容可能已过时!