第37讲|多模态 AI 开发:图片、语音、视频的编程新疆界

1 阅读1分钟

金句:文字是思想的第一层压缩,图片是第二层,视频是第三层。多模态 AI 让你可以用任何一层与代码对话。


一、多模态时代的开发新场景

2025 年,多模态 AI 已经成熟到可以用于生产环境。以下是一些真实的开发场景:

场景一:截图转代码

  • 截取设计稿图片 → 直接生成对应的 React 组件

场景二:语音驱动开发

  • 用语音描述功能需求 → 生成代码(在开车时也能"编程")

场景三:图表理解

  • 上传 ERD 图或架构图 → 生成对应的代码实现

场景四:UI Bug 报告

  • 截取 Bug 界面 → AI 分析视觉问题并生成修复代码

二、图片转代码:设计稿直出前端

方法一:使用 Claude Vision

import anthropic
import base64

def screenshot_to_code(image_path: str, framework: str = "React") -> str:
    """将 UI 截图转换为前端代码"""
    
    with open(image_path, "rb") as f:
        image_data = base64.standard_b64encode(f.read()).decode("utf-8")
    
    # 检测图片格式
    extension = image_path.split(".")[-1].lower()
    media_type_map = {
        "jpg": "image/jpeg", "jpeg": "image/jpeg",
        "png": "image/png", "gif": "image/gif", "webp": "image/webp"
    }
    media_type = media_type_map.get(extension, "image/png")
    
    client = anthropic.Anthropic()
    
    message = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=4096,
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "image",
                        "source": {
                            "type": "base64",
                            "media_type": media_type,
                            "data": image_data,
                        },
                    },
                    {
                        "type": "text",
                        "text": f"""请将这个 UI 截图转换为 {framework} 组件代码。

要求:
1. 使用 TypeScript
2. 样式使用 Tailwind CSS
3. 尽量还原视觉效果(颜色、间距、字体大小)
4. 交互元素(按钮、输入框)添加基本的状态管理
5. 组件名根据 UI 内容合理命名
6. 添加必要的 Props 类型定义

直接输出代码,不需要解释。"""
                    }
                ],
            }
        ],
    )
    
    return message.content[0].text

# 使用示例
code = screenshot_to_code("design_mockup.png", "React")
print(code)

方法二:使用 GPT-4 Vision

from openai import OpenAI
import base64

client = OpenAI()

def analyze_ui_bug(screenshot_path: str, bug_description: str) -> str:
    """分析 UI Bug 并生成修复建议"""
    
    with open(screenshot_path, "rb") as f:
        image_data = base64.b64encode(f.read()).decode("utf-8")
    
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "image_url",
                        "image_url": {
                            "url": f"data:image/png;base64,{image_data}"
                        }
                    },
                    {
                        "type": "text",
                        "text": f"""用户报告了以下 UI 问题:
{bug_description}

请分析截图,找出:
1. 视觉上的问题(布局错位、颜色异常等)
2. 可能的 CSS 原因
3. 具体的修复代码建议(Tailwind CSS 或普通 CSS)"""
                    }
                ]
            }
        ],
        max_tokens=2048
    )
    
    return response.choices[0].message.content

三、语音驱动开发

构建语音编程助手

# voice_coding_assistant.py
import openai
import anthropic
import tempfile
import os
from pathlib import Path

def transcribe_audio(audio_file_path: str) -> str:
    """使用 Whisper 将语音转文字"""
    client = openai.OpenAI()
    
    with open(audio_file_path, "rb") as audio_file:
        transcription = client.audio.transcriptions.create(
            model="whisper-1",
            file=audio_file,
            language="zh"  # 中文
        )
    
    return transcription.text

def voice_to_code(audio_file_path: str, context: str = "") -> dict:
    """语音描述需求 → 生成代码"""
    
    # 第一步:语音转文字
    print("🎤 正在识别语音...")
    text_requirement = transcribe_audio(audio_file_path)
    print(f"识别结果:{text_requirement}")
    
    # 第二步:文字转代码
    print("💻 正在生成代码...")
    client = anthropic.Anthropic()
    
    message = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=4096,
        messages=[{
            "role": "user",
            "content": f"""请根据以下语音描述生成代码:

描述:{text_requirement}

项目上下文:{context if context else "TypeScript 全栈项目"}

请生成完整的实现代码,包含必要的注释。"""
        }]
    )
    
    return {
        "requirement": text_requirement,
        "code": message.content[0].text
    }

# 实时录音版本(需要 pyaudio)
def record_and_code(duration: int = 10, context: str = ""):
    """录制语音并生成代码"""
    import pyaudio
    import wave
    
    print(f"🎙 开始录音({duration}秒)...")
    
    # 录音配置
    CHUNK = 1024
    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 16000
    
    p = pyaudio.PyAudio()
    stream = p.open(
        format=FORMAT, channels=CHANNELS,
        rate=RATE, input=True, frames_per_buffer=CHUNK
    )
    
    frames = []
    for _ in range(0, int(RATE / CHUNK * duration)):
        data = stream.read(CHUNK)
        frames.append(data)
    
    stream.stop_stream()
    stream.close()
    p.terminate()
    
    # 保存为临时文件
    with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp:
        wf = wave.open(tmp.name, 'wb')
        wf.setnchannels(CHANNELS)
        wf.setsampwidth(p.get_sample_size(FORMAT))
        wf.setframerate(RATE)
        wf.writeframes(b''.join(frames))
        wf.close()
        
        result = voice_to_code(tmp.name, context)
    
    os.unlink(tmp.name)
    return result

四、图表理解:从架构图生成代码

ERD 图转 Prisma Schema

def erd_to_prisma_schema(erd_image_path: str) -> str:
    """将 ERD 图转换为 Prisma Schema"""
    
    with open(erd_image_path, "rb") as f:
        image_data = base64.standard_b64encode(f.read()).decode("utf-8")
    
    client = anthropic.Anthropic()
    
    message = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=4096,
        messages=[{
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "source": {
                        "type": "base64",
                        "media_type": "image/png",
                        "data": image_data,
                    }
                },
                {
                    "type": "text",
                    "text": """请分析这个 ERD(实体关系图),生成对应的 Prisma Schema。

要求:
1. 准确识别所有实体(表)和字段
2. 识别关系类型(一对一、一对多、多对多)
3. 推断合适的数据类型(String、Int、DateTime 等)
4. 添加适当的索引(主键、外键、唯一约束)
5. 添加 createdAt 和 updatedAt 字段(如果图中没有)
6. 使用 cuid() 作为默认 ID 生成策略

直接输出 Prisma Schema 代码。"""
                }
            ]
        }]
    )
    
    return message.content[0].text

五、多模态 AI 的能力边界

 效果好的场景:
 清晰的 UI 截图  生成基础组件
 简单的 ERD  Prisma Schema
 流程图  代码逻辑框架
 错误截图  问题诊断

⚠️ 效果一般的场景:
 复杂的手绘草图
 低分辨率截图
 包含大量文字的图表

 不适合的场景:
 需要精确像素还原的 UI(应该用设计系统组件)
 从视频中实时生成代码(延迟问题)
 复杂业务逻辑的图表理解

章节小结:多模态 AI 开发让你可以用截图、语音、图表和 AI 交流,大幅降低"想法到代码"的摩擦。最实用的三个场景:设计稿截图转组件(节省 70% 的 UI 还原时间)、架构图转代码框架(快速搭建项目骨架)、UI Bug 截图分析(准确定位视觉问题)。这些工具组合起来,让设计师和非编程人员也能参与到 Vibe Coding 的工作流中。