TL;DR:纯文本 AI 已经不够用了。用户想「拍张图问问题」「用嘴说话发指令」。本文用 Python 实战多模态 AI 应用:图片理解(VLM)、语音转文字(ASR)、文字转语音(TTS),并组合成一个能听、能看、能说的 AI 助手。

1. 多模态能做什么

模态 能力 典型场景
文本 → 文本 对话、写作 客服、助手
图片 → 文本 看图说话 商品识别、文档 OCR
语音 → 文本 语音输入 语音助手、字幕
文本 → 语音 语音播报 有声读物、无障碍
全模态 看 + 听 + 说 智能音箱、机器人

2. 图片理解(VLM)

2.1 用 GPT-4o 分析图片

Python - 图片理解

from openai import OpenAI
import base64

client = OpenAI()

def encode_image(image_path: str) -> str:
    """将图片转为 base64"""
    with open(image_path, "rb") as f:
        return base64.b64encode(f.read()).decode("utf-8")

def analyze_image(image_path: str, question: str) -> str:
    """让 VLM 理解图片并回答问题"""
    base64_image = encode_image(image_path)

    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{
            "role": "user",
            "content": [
                {"type": "text", "text": question},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": f"data:image/jpeg;base64,{base64_image}"
                    }
                }
            ]
        }],
        max_tokens=500
    )
    return response.choices[0].message.content

# 使用示例
result = analyze_image(
    "screenshot.png",
    "这张截图里有什么错误?请指出问题所在"
)
print(result)

2.2 用开源模型(Qwen-VL)

Python - 通义千问 VL

# pip install transformers torch
from transformers import Qwen2VLForConditionalGeneration, AutoProcessor
from PIL import Image
import torch

model = Qwen2VLForConditionalGeneration.from_pretrained(
    "Qwen/Qwen2-VL-7B-Instruct",
    torch_dtype=torch.bfloat16,
    device_map="auto"
)
processor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct")

image = Image.open("screenshot.png")

messages = [{
    "role": "user",
    "content": [
        {"type": "image"},
        {"type": "text", "text": "描述这张图片的内容"}
    ]
}]

text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = processor(text=[text], images=[image], return_tensors="pt").to("cuda")

generated = model.generate(**inputs, max_new_tokens=256)
response = processor.batch_decode(
    generated,skip_special_tokens=True
)[0]
print(response)

3. 语音转文字(ASR)

3.1 用 Whisper 本地识别

Python - Whisper 语音识别

# pip install openai-whisper
import whisper

# 加载模型(base/small/medium/large)
model = whisper.load_model("medium")

# 识别音频
result = model.transcribe(
    "voice_input.mp3",
    language="zh",  # 指定中文
    task="transcribe"
)

print(result["text"])

3.2 用 API 版 Whisper(更快)

Python - OpenAI Audio API

from openai import OpenAI

client = OpenAI()

def speech_to_text(audio_path: str) -> str:
    """语音转文字"""
    with open(audio_path, "rb") as audio_file:
        transcript = client.audio.transcriptions.create(
            model="whisper-1",
            file=audio_file,
            language="zh"
        )
    return transcript.text

text = speech_to_text("voice_input.mp3")
print(text)

4. 文字转语音(TTS)

4.1 用 OpenAI TTS

Python - 文本转语音

from openai import OpenAI

client = OpenAI()

def text_to_speech(text: str, output_path: str = "output.mp3"):
    """文字转语音"""
    response = client.audio.speech.create(
        model="tts-1",
        voice="alloy",  # alloy/echo/fable/onyx/nova/shimmer
        input=text
    )
    response.stream_to_file(output_path)
    print(f"✅ 语音已保存到 {output_path}")

text_to_speech("你好,我是你的 AI 助手", "greeting.mp3")

4.2 用 Edge TTS(免费)

Python - Edge TTS

# pip install edge-tts
import asyncio
import edge_tts

async def edge_speak(text: str, output: str):
    # 中文声音:zh-CN-XiaoxiaoNeural(女)/ zh-CN-YunxiNeural(男)
    communicate = edge_tts.Communicate(text, voice="zh-CN-XiaoxiaoNeural")
    await communicate.save(output)

asyncio.run(edge_speak("你好,我是你的 AI 助手", "greeting.mp3"))

5. 组合:全能 AI 助手

把看、听、说串起来,做一个多模态助手:

Python - 多模态 AI 助手

from openai import OpenAI
import whisper
import edge_tts
import asyncio
import base64

client = OpenAI()

# 1. 听:语音转文字
asr_model = whisper.load_model("base")
user_text = asr_model.transcribe("input.mp3")["text"]
print(f"👂 用户说:{user_text}")

# 2. 看:如果有图片,一并理解
messages = [{"role": "user", "content": user_text}]
if image_path:
    with open(image_path, "rb") as f:
        img_b64 = base64.b64encode(f.read()).decode()
    messages[0]["content"] = [
        {"type": "text", "text": user_text},
        {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img_b64}"}}
    ]

# 3. 想:LLM 生成回答
response = client.chat.completions.create(
    model="gpt-4o",
    messages=messages
)
answer = response.choices[0].message.content
print(f"🤖 AI 说:{answer}")

# 4. 说:文字转语音
async def speak(text):
    communicate = edge_tts.Communicate(text, voice="zh-CN-XiaoxiaoNeural")
    await communicate.save("answer.mp3")

asyncio.run(speak(answer))
print("🔊 已生成语音回答")

6. 实战场景

场景 用到模态 实现方案
拍照解题 图→文 VLM 分析题目 + LLM 讲解
语音笔记 声→文 Whisper 转写 + 总结
智能客服 声→文→声 ASR + LLM + TTS
无障碍阅读 文→声 TTS 朗读长文
商品图搜索 图→文→向量 VLM 描述 + Embedding 检索

7. 成本对比

能力 方案 成本
图片理解 GPT-4o API ~$0.01/张
图片理解 Qwen-VL 本地 GPU 成本,无调用费
语音识别 Whisper API ~$0.006/分钟
语音识别 Whisper 本地 免费,需 GPU
语音合成 OpenAI TTS ~$0.015/1000字
语音合成 Edge TTS 完全免费

实测建议:

  • 快速开发 / 原型:全部用 API(GPT-4o + Whisper + TTS-1)
  • 生产降本:图片/语音用开源本地模型(Qwen-VL + Whisper),TTS 用 Edge TTS(免费)
  • 隐私要求高:全部本地部署(Qwen-VL + Whisper + Coqui TTS)

8. 常见问题

Q1:图片太大,API 报错怎么办?

压缩到 20MB 以内,分辨率建议 ≤ 2048px。用 PIL 处理:

Python - 图片压缩

from PIL import Image

img = Image.open("large.png")
img.thumbnail((2048, 2048))  # 等比缩放
img.save("compressed.jpg", quality=85)

Q2:语音识别不准怎么办?

  • 用 medium/large 模型(base 太小)
  • 降噪处理音频
  • 明确指定 language="zh"

Q3:TTS 声音太机械?

OpenAI TTS-1-HD 音质更好;Edge TTS 的 XiaoxiaoNeural 音色最自然(免费)。

9. 总结

多模态让 AI 从「打字机」变成「全能助手」:

  • :VLM 理解图片(GPT-4o / Qwen-VL)
  • :ASR 识别语音(Whisper)
  • :TTS 合成语音(OpenAI / Edge TTS)
入门路径:先用 API 串起「看图 + 说话」最小闭环(GPT-4o + TTS-1),跑通后按需替换为本地开源模型降本。

如果对你有帮助,欢迎在评论区分享你的多模态 AI 应用。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐