多模态协同下的AIGC视频生成:通义万相 × DeepSeek × Qwen实战

在短视频内容爆炸式增长的今天,创意生产的速度已经远远跟不上平台对内容更新频率的要求。传统视频制作流程动辄数日,而AI驱动的内容生成却能在几分钟内完成从“一句话”到“一段动态影像”的跨越。但问题是——单一模型往往力不从心:语言理解弱、图像细节糙、动作连贯性差。

于是我们看到一个趋势正在成型:真正的生产力突破,不再来自某个“全能冠军”模型,而是多个专业引擎的协同作战。本文将带你深入构建一套融合 通义万相(视频生成)DeepSeek(语义理解与提示词优化)Qwen-Image(高精度图像生成与编辑) 的多模态创作系统,实现高质量、可控性强、可扩展的端到端视频自动化流程。


架构设计:分层解耦,各司其职

要让AI像专业团队一样协作,首先要明确分工。我们的系统采用“大脑-视觉中枢-运动引擎”三层架构,通过任务调度实现模块化运行:

graph TD
    A[用户输入<br>自然语言描述] --> B{DeepSeek-V3.1<br>语义解析与任务规划}
    B --> C[结构化提示词<br>风格/构图/动作指令]
    C --> D[Qwen-Image 镜像<br>关键帧生成与图像编辑]
    D --> E[通义万相2.2<br>图像到视频转换]
    E --> F[输出结果<br>动态视频片段]

    subgraph "本地推理环境"
        D
    end

    subgraph "云端服务"
        B
        E
    end

这套架构的核心思想是:把复杂问题拆解为可独立优化的子任务

  • DeepSeek-V3.1 担任“导演”,负责理解模糊意图、拆解剧本、生成专业级提示词;
  • Qwen-Image 是“美术指导+特效师”,产出高分辨率画面,并支持扩图、局部重绘等精细化操作;
  • 通义万相2.2 则作为“剪辑与动画师”,赋予静态图像以镜头运动和时间维度。

三者联动,形成一条完整的创意流水线。


环境部署:基于容器化的Qwen-Image本地化运行

为了保障图像生成的质量与响应速度,我们将 Qwen-Image 部署在本地GPU服务器上,避免频繁调用远程API带来的延迟和成本压力。推荐使用 Docker 容器化方式管理依赖与版本。

基础镜像配置

# Dockerfile.qwen-image
FROM nvcr.io/nvidia/pytorch:23.10-py3

RUN apt-get update && apt-get install -y \
    libgl1-mesa-glx \
    libglib2.0-0 \
    ffmpeg \
    git && rm -rf /var/lib/apt/lists/*

WORKDIR /workspace

COPY requirements-qwen.txt .
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \
    pip install -r requirements-qwen.txt

RUN git clone https://github.com/QwenLM/Qwen.git && \
    cd Qwen && git checkout v1.5

ENV MODEL_PATH="/models/Qwen-Image-Chat"

CMD ["python", "-m", "http.server", "8080"]

该镜像基于 NVIDIA PyTorch 官方镜像,确保 CUDA 和 cuDNN 兼容性,同时预装 OpenCV、FFmpeg 等多媒体处理库。

依赖管理

# requirements-qwen.txt
transformers==4.36.0
torch==2.1.0
torchvision==0.16.0
accelerate==0.25.0
sentencepiece==0.1.99
tiktoken==0.5.1
Pillow==10.1.0
numpy==1.24.3
opencv-python==4.8.1.78
gradio==3.50.2
modelscope==1.11.0
diffusers==0.25.0
xformers==0.0.23.post1

特别注意 xformers 的安装,它能显著提升显存利用率,在消费级显卡上也能流畅运行 1024×1024 图像生成。

启动脚本

#!/bin/bash
mkdir -p models logs

docker build -f Dockerfile.qwen-image -t qwen-image:latest .

docker run --gpus all \
  -v $(pwd)/models:/models \
  -v $(pwd)/output:/workspace/output \
  -p 8080:8080 \
  --shm-size="8gb" \
  --name qwen-image-container \
  qwen-image:latest

⚠️ 首次运行前需手动下载 Qwen-Image-Chat 模型权重至 /models 目录,可通过 Hugging Face 或 ModelScope 获取。

这种部署模式既保证了性能稳定,又便于后续集成进 Web API 或 GUI 工具链。


提示词工程:用 DeepSeek 打造“专业编剧”

很多用户输入只是零散的想法:“一只狐狸在雨夜的城市里跑。” 这样的描述交给模型,结果往往是随机性强、风格漂移严重。我们需要一个“翻译官”来将其转化为 AI 可执行的专业指令。

这就是 DeepSeek-V3.1 的价值所在——它不仅能理解中文语境下的双关、隐喻,还能主动补充视觉术语,完成从“想法”到“生产文档”的跃迁。

智能提示词增强器

import openai
import json

class PromptEnhancer:
    def __init__(self, api_key: str):
        self.api_key = api_key
        openai.api_key = api_key
        openai.api_base = "https://api.deepseek.com/v1"

    def enhance(self, raw_prompt: str, target_style: str = "cinematic") -> dict:
        system_prompt = """
你是一名资深视觉内容策划师,擅长将模糊的创意想法转化为可用于AI图像/视频生成的精确提示词。
请根据以下要求进行优化:
1. 明确主体对象、场景环境、光照条件、色彩基调、镜头语言
2. 使用专业术语如:low-angle shot, bokeh, rim light, matte painting 等
3. 对中英文混杂描述做规范化处理
4. 输出JSON格式,包含prompt和negative_prompt字段
5. 特别注意人物/角色的一致性表达
"""

        user_prompt = f"""
原始描述:{raw_prompt}
目标风格:{target_style}
请输出优化后的提示词(JSON格式):
"""

        response = openai.ChatCompletion.create(
            model="deepseek-chat",
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_prompt}
            ],
            temperature=0.6,
            response_format={"type": "json_object"}
        )

        return json.loads(response.choices[0].message.content)
实际效果对比
原始输入 优化后输出
“机械狐狸在下雨的夜晚穿过城市街道,灯光闪烁” "A cybernetic fox walking through neon-lit rainy streets at night, cyberpunk cityscape background, reflections on wet asphalt, cinematic lighting with blue and pink neon glow, low-angle tracking shot, detailed mechanical fur texture, glowing eyes..."

这一过程看似简单,实则极大提升了生成结果的可控性和一致性。更重要的是,它可以被批量调用,用于广告素材、社交媒体内容的规模化生产。


场景拆解与任务路由:让AI学会“分镜”

对于更复杂的剧本,比如包含多个场景或需要后期编辑的任务,我们必须引入任务调度机制。

设想这样一个剧本片段:

“机械狐狸从废墟中醒来,眼中闪过一道蓝光。

它跳上屋顶,俯瞰整座被霓虹灯照亮的城市。需要扩展左右两侧建筑群。

在雨中奔跑时,它的右腿出现故障,火花四溅。需修复腿部细节。”

这不仅仅是三张图的问题,还涉及 扩图(outpainting)局部重绘(inpainting) 等高级操作。如果全部丢给同一个模型处理,很容易出错。

因此我们设计了一个轻量级任务编排器:

class TaskOrchestrator:
    def __init__(self, prompt_enhancer):
        self.enhancer = prompt_enhancer

    def parse_script(self, script: str) -> list:
        scenes = re.split(r'---\n', script)
        tasks = []

        for i, scene in enumerate(scenes):
            if not scene.strip():
                continue

            analysis = self.enhancer.enhance(scene, "cinematic")
            task_type = self._infer_task_type(analysis["prompt"])

            tasks.append({
                "scene_id": i,
                "original": scene.strip(),
                "enhanced_prompt": analysis["prompt"],
                "negative_prompt": analysis.get("negative_prompt", ""),
                "task_type": task_type,
                "requires_editing": "inpainting" in task_type or "outpainting" in task_type
            })

        return tasks

    def _infer_task_type(self, prompt: str) -> str:
        keywords = {
            'inpainting': ['修复', '替换', '修改区域', '去掉'],
            'outpainting': ['扩展画面', '增加背景', '向外延伸'],
            'character_consistency': ['同一角色', '保持外观', '延续造型'],
            'full_generation': ['生成', '创建', '描绘']
        }

        for task, words in keywords.items():
            if any(w in prompt for w in words):
                return task

        return "full_generation"

这个模块的作用就像电影制片中的“分镜表”,将文本剧本自动映射为一系列可执行的操作指令,真正实现了 从叙事逻辑到生产流程的自动化转换


Qwen-Image 实战:不只是“画图”,更是“精修”

很多人以为文生图模型只要能“出图”就行,但在实际应用中,可控性 > 创意性。Qwen-Image 的最大优势在于它不仅生成能力强,而且具备强大的编辑能力。

高保真图像生成(1024×1024)

得益于其 200亿参数 MMDiT 架构,Qwen-Image 支持原生高分辨率输出,无需后期放大即可满足影视级需求。

class QwenImageGenerator:
    def __init__(self, model_path: str = "/models/Qwen-Image-Chat"):
        self.device = "cuda" if torch.cuda.is_available() else "cpu"
        self.model = AutoModelForCausalLM.from_pretrained(
            model_path,
            device_map="auto",
            torch_dtype=torch.float16,
            trust_remote_code=True
        ).eval()

        self.processor = AutoProcessor.from_pretrained(model_path, trust_remote_code=True)

    def generate(self, prompt: str, neg_prompt: str = "", size=(1024, 1024)) -> Image.Image:
        inputs = self.processor(text=prompt, images=None, return_tensors="pt").to(self.device)

        with torch.no_grad():
            output_ids = self.model.generate(
                **inputs,
                max_new_tokens=768,
                num_beams=3,
                do_sample=True,
                temperature=0.7,
                top_p=0.9,
                negative_prompt=neg_prompt
            )

        generated_texts = self.processor.batch_decode(
            [output_ids[i][len(inputs.input_ids[0]):] for i in range(output_ids.size(0))],
            skip_special_tokens=True
        )

        image = self.processor.decode_image(generated_texts[0])
        return image.resize(size) if image.size != size else image

生成一张 1024×1024 的赛博朋克风机械狐,平均耗时约 18 秒(RTX 4090),细节表现远超多数开源模型。


像素级编辑:扩图与局部重绘

这才是 Qwen-Image 的杀手锏。

扩展画面(Outpainting)

当客户说“把背景再拉宽一点”,传统做法是裁剪或拼接,而现在可以直接智能延展。

def expand_image(self, image: Image.Image, direction: str = "right", pixels: int = 256) -> Image.Image:
    orig_w, orig_h = image.size
    new_w = orig_w + (pixels if direction in ["left", "right"] else 0)
    new_h = orig_h + (pixels if direction in ["top", "bottom"] else 0)

    new_image = Image.new("RGB", (new_w, new_h), (0, 0, 0))
    paste_x = pixels if direction == "left" else 0
    paste_y = pixels if direction == "top" else 0
    new_image.paste(image, (paste_x, paste_y))

    mask = Image.new("L", (new_w, new_h), 0)
    draw = ImageDraw.Draw(mask)
    if direction == "right":
        draw.rectangle([orig_w, 0, new_w, new_h], fill=255)
    elif direction == "left":
        draw.rectangle([0, 0, pixels, new_h], fill=255)
    # ...其他方向类似

    edit_prompt = f"Extend the scene to the {direction}, maintain consistent style and perspective"
    inputs = self.processor(text=edit_prompt, images=new_image, masks=mask, return_tensors="pt").to(self.device)

    with torch.no_grad():
        outputs = self.model.generate(**inputs, max_new_tokens=512)

    return self.processor.decode_image(outputs[0])

这种方法在海报延展、横屏转竖屏等场景中极具实用价值。

局部重绘(Inpainting)

角色装备更换、瑕疵修复、表情调整……都可以通过指定区域重绘完成。

def inpaint_region(self, image: Image.Image, bbox: tuple, new_content: str) -> Image.Image:
    mask = Image.new("L", image.size, 0)
    draw = ImageDraw.Draw(mask)
    draw.rectangle(bbox, fill=255)

    prompt = f"Replace the selected area with {new_content}, keep surrounding context unchanged"
    inputs = self.processor(text=prompt, images=image, masks=mask, return_tensors="pt").to(self.device)

    with torch.no_grad():
        outputs = self.model.generate(**inputs, max_new_tokens=512)

    return self.processor.decode_image(outputs[0])

例如,只需框选机械狐的右腿,输入“sparking damaged metal joint”,就能精准修复并添加故障特效。


视频合成:通义万相实现“静→动”的飞跃

有了高质量的关键帧,下一步就是赋予它们生命。

图像转视频(Img2Vid)

通义万相提供了稳定的 image-to-video 接口,支持控制视频时长、分辨率和运镜逻辑。

class WanxiangVideoGenerator:
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.url = "https://dashscope.aliyuncs.com/api/v1/services/video/image-to-video"

    def encode_image(self, image_path: str) -> str:
        with open(image_path, "rb") as f:
            return base64.b64encode(f.read()).decode('utf-8')

    def generate_video(self, image_path: str, prompt: str, duration: float = 3.0) -> str:
        payload = {
            "model": "wanx-video-v1",
            "input": {
                "image": f"data:image/png;base64,{self.encode_image(image_path)}",
                "prompt": prompt,
                "duration": duration
            },
            "parameters": {
                "resolution": "1024*576"
            }
        }

        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }

        response = requests.post(self.url, headers=headers, json=payload)

        if response.status_code == 200:
            task_id = response.json()["output"]["task_id"]
            return self.poll_result(task_id)
        else:
            raise Exception(f"API Error: {response.text}")

通义万相的优势在于能保持较强的时序一致性,减少画面抖动和物体形变,尤其适合用于产品宣传短片、概念动画等对稳定性要求高的场景。


多段拼接与后期处理

最终成品通常由多个片段组成,我们使用 FFmpeg 进行无缝合并:

def concatenate_videos(video_urls: list, output_path: str):
    temp_files = []
    for i, url in enumerate(video_urls):
        path = f"temp_{i}.mp4"
        download_file(url, path)
        temp_files.append(path)

    with open("list.txt", "w") as f:
        for path in temp_files:
            f.write(f"file '{path}'\n")

    cmd = [
        "ffmpeg", "-f", "concat", "-safe", "0", "-i", "list.txt",
        "-c", "copy", "-y", output_path
    ]
    subprocess.run(cmd, check=True)

    for f in temp_files + ["list.txt"]:
        os.remove(f)

也可在此阶段加入音效、字幕、调色等处理,打造完整成片。


结语:迈向智能化内容工厂

这套“DeepSeek + Qwen-Image + 通义万相”三位一体的工作流,已经不仅仅是一个技术实验,而是可以投入实际生产的 AIGC 内容生产线。

它的意义在于:

  • 专业化分工:每个模型只做自己最擅长的事,整体效率最大化;
  • 本地+云端混合架构:兼顾性能、成本与灵活性;
  • 全流程自动化潜力:从剧本输入到成片输出,全程无需人工干预;
  • 高度可扩展:可接入更多模型(如语音合成、动作捕捉)形成更完整的生态。

未来的内容创作平台,不再是“人指挥AI”,而是“人设定目标,AI自主完成全流程”。而今天我们搭建的这套系统,正是通向那个未来的桥梁。

随着多模态大模型持续进化,我们可以预见:下一个爆款短视频,可能根本不是人类拍的,而是由一群AI协作完成的

Logo

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

更多推荐