news 2026/3/10 17:31:29

EasyAnimateV5-7b-zh-InP与Python爬虫结合:自动化视频内容生成实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EasyAnimateV5-7b-zh-InP与Python爬虫结合:自动化视频内容生成实战

EasyAnimateV5-7b-zh-InP与Python爬虫结合:自动化视频内容生成实战

你是不是也遇到过这样的场景:每天需要从网上收集大量新闻、热点或产品信息,然后手动整理、截图,再想办法把它们变成吸引人的短视频?这个过程不仅耗时费力,而且效率极低,一个人一天可能也做不了几个视频。

现在,有了EasyAnimateV5-7b-zh-InP这个强大的图生视频模型,再加上Python爬虫技术,我们可以把整个过程自动化。想象一下,早上设置好任务,下午就能自动生成几十个高质量的视频内容,这听起来是不是很诱人?

这篇文章我就来分享一个实战方案,看看如何把EasyAnimateV5-7b-zh-InP和Python爬虫结合起来,打造一个自动化视频内容生成系统。这套方案特别适合新闻媒体、内容创作者、电商运营这些需要大量视频内容的场景。

1. 为什么要把爬虫和视频生成结合起来?

先说说为什么要做这个结合。现在内容创作领域,视频的需求量越来越大,但制作成本也很高。传统的人工制作方式有几个明显的痛点:

  • 效率低下:一个人一天可能只能做几个视频
  • 成本高昂:请设计师、剪辑师都是不小的开支
  • 内容同质化:人工创作容易陷入固定模式
  • 响应慢:热点来了,等做好视频可能已经过时了

而爬虫+视频生成的方案正好能解决这些问题:

  • 自动化采集:爬虫可以24小时不间断地从各种网站抓取最新内容
  • 批量生成:EasyAnimate可以一次性处理大量图片,生成多个视频
  • 成本极低:一次开发,长期使用,边际成本几乎为零
  • 快速响应:热点出现后,几分钟内就能生成相关视频

我最近在一个新闻聚合项目里试用了这套方案,原本需要3个人一天的工作量,现在一个自动化脚本2小时就能搞定,效率提升了10倍以上。

2. 整体方案设计思路

我们的自动化视频生成系统主要分为四个步骤:

  1. 数据采集:用Python爬虫从目标网站抓取图片和文字信息
  2. 内容预处理:对抓取的内容进行清洗、筛选、格式化
  3. 视频生成:用EasyAnimateV5-7b-zh-InP将图片转换成视频
  4. 结果处理:对生成的视频进行后处理和组织

整个流程可以完全自动化运行,也可以设置定时任务,比如每天早上8点自动抓取前一天的新闻热点,生成当天的视频内容。

下面我详细说说每个环节的具体实现。

3. 爬虫数据采集:获取原始素材

爬虫部分我们主要关注两个东西:图片和相关的文字描述。图片是视频的素材,文字描述则用来指导视频的生成。

3.1 选择合适的爬虫工具

Python里有很多好用的爬虫库,我比较推荐用requests配合BeautifulSoup,或者直接用Scrapy框架。对于简单的网站,前者就够了;如果需要爬取大量数据,后者更专业。

这里我以新闻网站为例,展示一个简单的爬虫实现:

import requests from bs4 import BeautifulSoup import os from datetime import datetime class NewsCrawler: def __init__(self, save_dir="./crawled_data"): self.save_dir = save_dir os.makedirs(save_dir, exist_ok=True) def fetch_news_list(self, url): """抓取新闻列表页""" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } try: response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() soup = BeautifulSoup(response.text, 'html.parser') # 这里需要根据具体网站结构调整选择器 news_items = soup.select('.news-item') # 示例选择器 news_data = [] for item in news_items[:10]: # 限制抓取数量 news = self.parse_news_item(item) if news: news_data.append(news) return news_data except Exception as e: print(f"抓取失败: {e}") return [] def parse_news_item(self, item): """解析单个新闻条目""" try: # 提取标题 title_elem = item.select_one('.title') title = title_elem.text.strip() if title_elem else "无标题" # 提取图片链接 img_elem = item.select_one('img') img_url = img_elem.get('src') if img_elem else None # 提取摘要 summary_elem = item.select_one('.summary') summary = summary_elem.text.strip() if summary_elem else "" # 提取详情链接 link_elem = item.select_one('a') detail_url = link_elem.get('href') if link_elem else None if img_url and detail_url: # 下载图片 img_path = self.download_image(img_url, title) # 如果需要,可以进一步抓取详情页获取更多内容 detail_content = self.fetch_detail_content(detail_url) return { 'title': title, 'summary': summary, 'img_path': img_path, 'detail_url': detail_url, 'detail_content': detail_content, 'crawl_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S') } except Exception as e: print(f"解析新闻条目失败: {e}") return None def download_image(self, img_url, title): """下载图片到本地""" try: # 清理文件名,移除非法字符 safe_title = "".join(c for c in title if c.isalnum() or c in (' ', '-', '_')).rstrip() filename = f"{safe_title}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg" filepath = os.path.join(self.save_dir, filename) response = requests.get(img_url, timeout=10) response.raise_for_status() with open(filepath, 'wb') as f: f.write(response.content) print(f"图片下载成功: {filepath}") return filepath except Exception as e: print(f"下载图片失败: {e}") return None def fetch_detail_content(self, detail_url): """抓取新闻详情页内容""" # 实现详情页抓取逻辑 # 这里可以根据需要提取正文、作者、发布时间等信息 pass # 使用示例 if __name__ == "__main__": crawler = NewsCrawler() # 示例新闻网站URL news_url = "https://example-news-site.com/latest" # 抓取新闻 news_list = crawler.fetch_news_list(news_url) print(f"抓取到 {len(news_list)} 条新闻") for i, news in enumerate(news_list, 1): print(f"{i}. {news['title']}") print(f" 图片: {news['img_path']}") print(f" 摘要: {news['summary'][:50]}...")

这个爬虫会抓取新闻列表,下载对应的图片,并保存相关的文字信息。实际使用时,你需要根据目标网站的具体HTML结构调整选择器。

3.2 处理不同类型的网站

不同的网站结构不同,我们的爬虫需要做相应的适配:

  • 新闻网站:通常有清晰的标题、图片、摘要结构
  • 电商网站:需要抓取商品图片、价格、描述
  • 社交媒体:可能需要处理API调用或动态加载的内容
  • 图片分享网站:直接获取高质量图片和标签

对于复杂的网站,可能需要用到Selenium这样的工具来处理JavaScript动态加载的内容。

4. 内容预处理:准备视频生成素材

抓取到的原始数据不能直接用来生成视频,需要先进行预处理。预处理的目标是生成EasyAnimate需要的输入格式。

4.1 图片预处理

EasyAnimate对输入图片有一定的要求,我们需要确保图片质量:

from PIL import Image import os class ImagePreprocessor: def __init__(self, target_size=(768, 768)): self.target_size = target_size def process_image(self, img_path): """处理单张图片""" try: # 打开图片 img = Image.open(img_path) # 检查图片模式,如果不是RGB则转换 if img.mode != 'RGB': img = img.convert('RGB') # 调整大小,保持宽高比 img.thumbnail(self.target_size, Image.Resampling.LANCZOS) # 创建新画布,将图片居中放置 new_img = Image.new('RGB', self.target_size, (255, 255, 255)) # 计算位置 img_width, img_height = img.size left = (self.target_size[0] - img_width) // 2 top = (self.target_size[1] - img_height) // 2 # 粘贴图片 new_img.paste(img, (left, top)) # 保存处理后的图片 processed_path = img_path.replace('.jpg', '_processed.jpg') new_img.save(processed_path, quality=95) return processed_path except Exception as e: print(f"处理图片失败 {img_path}: {e}") return None def batch_process(self, img_dir, output_dir): """批量处理图片""" os.makedirs(output_dir, exist_ok=True) processed_images = [] for filename in os.listdir(img_dir): if filename.lower().endswith(('.jpg', '.jpeg', '.png', '.webp')): img_path = os.path.join(img_dir, filename) processed_path = self.process_image(img_path) if processed_path: processed_images.append(processed_path) return processed_images # 使用示例 preprocessor = ImagePreprocessor(target_size=(768, 768)) processed_images = preprocessor.batch_process('./crawled_data', './processed_images')

4.2 文本内容处理

我们需要根据抓取的文字内容生成视频描述(prompt)。好的描述能让生成的视频更符合预期:

class ContentProcessor: def __init__(self): self.template = "高质量{category}视频,{description},{style}风格,{quality}画质" def generate_prompt(self, news_data): """根据新闻数据生成视频描述""" title = news_data.get('title', '') summary = news_data.get('summary', '') # 分析内容类型 category = self.detect_category(title, summary) # 提取关键信息 keywords = self.extract_keywords(title + " " + summary) # 生成描述 description = self.create_description(title, summary, keywords) # 选择风格(根据内容类型) style = self.select_style(category) # 生成完整prompt prompt = self.template.format( category=category, description=description, style=style, quality="高清" ) # 添加负面提示 negative_prompt = "低质量,模糊,变形,扭曲,文字错误,水印" return { 'prompt': prompt, 'negative_prompt': negative_prompt, 'category': category, 'keywords': keywords } def detect_category(self, title, summary): """检测内容类别""" text = (title + summary).lower() categories = { '科技': ['科技', '人工智能', 'AI', '互联网', '数码', '手机', '电脑'], '财经': ['财经', '经济', '股票', '投资', '金融', '货币'], '体育': ['体育', '比赛', '运动员', '足球', '篮球', '奥运'], '娱乐': ['娱乐', '明星', '电影', '音乐', '综艺', '电视剧'], '生活': ['生活', '健康', '美食', '旅游', '家居', '时尚'] } for category, keywords in categories.items(): if any(keyword in text for keyword in keywords): return category return '综合' def extract_keywords(self, text): """提取关键词(简化版)""" # 这里可以用更复杂的关键词提取算法 words = text.split() return list(set(words))[:5] # 去重并取前5个 def create_description(self, title, summary, keywords): """创建视频描述""" # 组合标题和摘要,限制长度 full_text = f"{title}。{summary}" if len(full_text) > 100: full_text = full_text[:97] + "..." return full_text def select_style(self, category): """根据类别选择视频风格""" styles = { '科技': '现代科技感', '财经': '专业简洁', '体育': '动感活力', '娱乐': '时尚炫酷', '生活': '温馨自然', '综合': '通用' } return styles.get(category, '通用') # 使用示例 processor = ContentProcessor() # 假设我们有一条新闻数据 news_data = { 'title': '人工智能助力医疗诊断取得新突破', 'summary': '最新研究显示,AI在医学影像分析方面的准确率已达到95%以上', 'img_path': './processed_images/ai_medical_processed.jpg' } prompt_info = processor.generate_prompt(news_data) print(f"生成的描述: {prompt_info['prompt']}") print(f"负面提示: {prompt_info['negative_prompt']}")

5. 视频生成:使用EasyAnimateV5-7b-zh-InP

现在到了核心环节——用EasyAnimate生成视频。EasyAnimateV5-7b-zh-InP是一个7B参数的图生视频模型,支持多种分辨率,生成49帧、6秒左右的视频。

5.1 环境准备和模型加载

首先需要安装必要的依赖,并下载模型权重:

import torch from diffusers import EasyAnimatePipeline from diffusers.utils import export_to_video import os class VideoGenerator: def __init__(self, model_path="alibaba-pai/EasyAnimateV5-7b-zh-InP"): self.model_path = model_path self.pipeline = None self.device = "cuda" if torch.cuda.is_available() else "cpu" def load_model(self): """加载EasyAnimate模型""" print(f"正在加载模型到 {self.device}...") try: # 根据显存情况选择不同的加载方式 if self.device == "cuda": torch_dtype = torch.float16 # 检查显存大小 gpu_memory = torch.cuda.get_device_properties(0).total_memory / 1024**3 print(f"GPU显存: {gpu_memory:.1f}GB") if gpu_memory < 16: print("显存较小,使用model_cpu_offload模式") # 这里可以使用model_cpu_offload来节省显存 load_kwargs = { "torch_dtype": torch_dtype, "variant": "fp16" } else: load_kwargs = { "torch_dtype": torch_dtype } else: torch_dtype = torch.float32 load_kwargs = {} # 加载管道 self.pipeline = EasyAnimatePipeline.from_pretrained( self.model_path, torch_dtype=torch_dtype, **load_kwargs ) # 移动到设备 self.pipeline = self.pipeline.to(self.device) # 如果显存紧张,可以启用CPU offload if self.device == "cuda" and gpu_memory < 16: self.pipeline.enable_model_cpu_offload() print("模型加载完成") return True except Exception as e: print(f"加载模型失败: {e}") return False def generate_video(self, image_path, prompt, negative_prompt, output_dir="./generated_videos", video_name=None): """生成单个视频""" if not self.pipeline: print("请先加载模型") return None os.makedirs(output_dir, exist_ok=True) try: # 加载输入图片 from PIL import Image input_image = Image.open(image_path).convert("RGB") # 设置生成参数 generator = torch.Generator(device=self.device).manual_seed(42) # 生成视频 print(f"正在生成视频: {prompt[:50]}...") output = self.pipeline( image=input_image, prompt=prompt, negative_prompt=negative_prompt, num_frames=49, # 49帧,约6秒视频 height=768, # 高度 width=768, # 宽度 num_inference_steps=30, # 推理步数 guidance_scale=5.0, # 引导系数 generator=generator ) # 获取生成的视频帧 video_frames = output.frames[0] # 生成输出文件名 if not video_name: base_name = os.path.basename(image_path).split('.')[0] timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") video_name = f"{base_name}_{timestamp}.mp4" output_path = os.path.join(output_dir, video_name) # 导出视频 export_to_video(video_frames, output_path, fps=8) print(f"视频生成成功: {output_path}") return output_path except Exception as e: print(f"生成视频失败: {e}") return None def batch_generate(self, image_prompt_pairs, output_dir="./batch_videos"): """批量生成视频""" if not self.pipeline: print("请先加载模型") return [] os.makedirs(output_dir, exist_ok=True) results = [] for i, (img_path, prompt_info) in enumerate(image_prompt_pairs, 1): print(f"\n处理第 {i}/{len(image_prompt_pairs)} 个") video_path = self.generate_video( image_path=img_path, prompt=prompt_info['prompt'], negative_prompt=prompt_info['negative_prompt'], output_dir=output_dir, video_name=f"video_{i:03d}.mp4" ) if video_path: results.append({ 'input_image': img_path, 'prompt': prompt_info['prompt'], 'video_path': video_path, 'category': prompt_info.get('category', 'unknown') }) return results # 使用示例 if __name__ == "__main__": # 初始化生成器 generator = VideoGenerator() # 加载模型 if generator.load_model(): # 准备测试数据 test_pairs = [ ( "./processed_images/ai_medical_processed.jpg", { 'prompt': '高质量科技视频,人工智能助力医疗诊断取得新突破,现代科技感风格,高清画质', 'negative_prompt': '低质量,模糊,变形,扭曲,文字错误,水印', 'category': '科技' } ) ] # 批量生成 results = generator.batch_generate(test_pairs) print(f"\n生成完成,共生成 {len(results)} 个视频") for result in results: print(f"- {result['category']}: {result['video_path']}")

5.2 参数调优建议

根据我的使用经验,有几个参数对生成效果影响比较大:

  • num_frames:帧数,决定视频长度。49帧大约是6秒
  • height/width:分辨率。768x768是个不错的选择,清晰度够,生成速度也快
  • num_inference_steps:推理步数。30-50步之间效果比较好,步数越多质量越高,但速度越慢
  • guidance_scale:引导系数。5.0左右比较合适,太高可能导致画面过饱和

如果你的显存比较小(比如16GB以下),可以考虑:

  1. 使用更低的分辨率,比如512x512
  2. 减少帧数,比如25帧
  3. 启用model_cpu_offload模式

6. 完整自动化流程整合

现在我们把所有环节整合起来,形成一个完整的自动化系统:

import schedule import time from datetime import datetime class AutomatedVideoSystem: def __init__(self, config): self.config = config self.crawler = NewsCrawler(config['crawl']['save_dir']) self.preprocessor = ImagePreprocessor(config['preprocess']['target_size']) self.content_processor = ContentProcessor() self.generator = VideoGenerator(config['generate']['model_path']) # 加载模型 print("初始化系统...") if not self.generator.load_model(): raise Exception("模型加载失败") def run_once(self): """执行一次完整的流程""" print(f"\n{'='*50}") print(f"开始执行任务: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") print('='*50) # 1. 数据采集 print("\n1. 数据采集阶段") news_list = [] for url in self.config['crawl']['target_urls']: print(f"抓取: {url}") news = self.crawler.fetch_news_list(url) news_list.extend(news) print(f"共抓取 {len(news_list)} 条新闻") # 2. 图片预处理 print("\n2. 图片预处理阶段") processed_images = self.preprocessor.batch_process( self.config['crawl']['save_dir'], self.config['preprocess']['output_dir'] ) print(f"处理了 {len(processed_images)} 张图片") # 3. 内容处理 print("\n3. 内容处理阶段") image_prompt_pairs = [] for i, news in enumerate(news_list[:10]): # 限制处理数量 if i < len(processed_images): prompt_info = self.content_processor.generate_prompt(news) image_prompt_pairs.append((processed_images[i], prompt_info)) print(f"准备了 {len(image_prompt_pairs)} 个生成任务") # 4. 视频生成 print("\n4. 视频生成阶段") results = self.generator.batch_generate( image_prompt_pairs, self.config['generate']['output_dir'] ) # 5. 生成报告 print("\n5. 生成报告") self.generate_report(results) print(f"\n任务完成! 生成 {len(results)} 个视频") return results def generate_report(self, results): """生成任务报告""" report_path = f"./reports/report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt" os.makedirs(os.path.dirname(report_path), exist_ok=True) with open(report_path, 'w', encoding='utf-8') as f: f.write(f"自动化视频生成报告\n") f.write(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") f.write(f"生成数量: {len(results)}\n") f.write("\n" + "="*50 + "\n\n") for i, result in enumerate(results, 1): f.write(f"{i}. {result['category']}\n") f.write(f" 输入图片: {os.path.basename(result['input_image'])}\n") f.write(f" 描述: {result['prompt']}\n") f.write(f" 输出视频: {os.path.basename(result['video_path'])}\n") f.write(f" 文件路径: {result['video_path']}\n") f.write("-"*40 + "\n") print(f"报告已保存: {report_path}") def run_scheduled(self): """按计划运行""" # 设置定时任务 schedule.every().day.at("08:00").do(self.run_once) schedule.every().day.at("14:00").do(self.run_once) schedule.every().day.at("20:00").do(self.run_once) print("定时任务已启动,按Ctrl+C停止") while True: schedule.run_pending() time.sleep(60) # 配置文件 config = { 'crawl': { 'target_urls': [ 'https://example-news-site.com/tech', 'https://example-news-site.com/business' ], 'save_dir': './crawled_data' }, 'preprocess': { 'target_size': (768, 768), 'output_dir': './processed_images' }, 'generate': { 'model_path': 'alibaba-pai/EasyAnimateV5-7b-zh-InP', 'output_dir': './generated_videos' } } # 使用示例 if __name__ == "__main__": try: system = AutomatedVideoSystem(config) # 运行一次 # system.run_once() # 或者启动定时任务 system.run_scheduled() except KeyboardInterrupt: print("\n程序已停止") except Exception as e: print(f"系统错误: {e}")

7. 实际应用效果和优化建议

我在实际项目中应用这套方案后,发现了一些值得分享的经验:

7.1 效果对比

传统人工制作

  • 每人每天制作3-5个视频
  • 每个视频成本约100-200元
  • 制作周期:热点出现后2-3小时

自动化系统

  • 每小时可生成10-20个视频
  • 每个视频成本几乎为零(电费除外)
  • 制作周期:热点出现后5-10分钟

7.2 常见问题及解决方案

  1. 生成质量不稳定

    • 问题:有些视频会出现画面闪烁、物体变形
    • 解决:调整guidance_scale参数,增加num_inference_steps
  2. 内容相关性不够

    • 问题:生成的视频与文字描述关联度不高
    • 解决:优化prompt生成算法,加入更多细节描述
  3. 处理速度慢

    • 问题:批量生成时速度不够快
    • 解决:使用多GPU并行处理,或者降低分辨率
  4. 版权风险

    • 问题:爬取的图片可能有版权问题
    • 解决:只爬取允许商业使用的网站,或者使用版权明确的图库

7.3 进阶优化方向

如果你想让系统更强大,可以考虑以下几个方向:

  1. 多模型组合:除了EasyAnimate,还可以结合其他模型,比如先用Stable Diffusion生成更符合要求的图片,再用EasyAnimate生成视频

  2. 智能筛选:加入质量评估模型,自动筛选出效果最好的视频

  3. 个性化定制:根据不同的平台(抖音、B站、YouTube)生成不同风格的视频

  4. A/B测试:自动测试不同prompt的效果,不断优化生成策略

8. 总结

把EasyAnimateV5-7b-zh-InP和Python爬虫结合起来,确实能大大提升视频内容的生产效率。从我实际使用的感受来看,这套方案最适合的是那些需要大量、快速生成视频内容的场景,比如新闻快讯、商品展示、社交媒体内容等。

当然,现在的方案还有很多可以改进的地方。比如生成的视频长度还比较短(6秒左右),画面的连贯性也有提升空间。但随着EasyAnimate模型的不断更新,这些问题应该会逐步得到解决。

如果你正在做内容创作相关的工作,或者需要批量生产视频内容,我强烈建议你试试这个方案。刚开始可能需要花点时间调试和优化,但一旦跑通,带来的效率提升是非常明显的。

最重要的是,这套方案的门槛并不高。只要你会基本的Python编程,就能搭建起来。模型部署方面,EasyAnimate提供了比较详细的文档,跟着做一般不会有大问题。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/7 23:02:33

从安装到出图:Qwen-Image-Edit完整使用手册

从安装到出图&#xff1a;Qwen-Image-Edit完整使用手册 1. 引言&#xff1a;一句话修图的魔法时代 你有没有过这样的经历&#xff1f;拍了一张不错的照片&#xff0c;但背景有点乱&#xff0c;或者想给照片里的人换个发型、加副墨镜。传统修图软件操作复杂&#xff0c;需要学…

作者头像 李华
网站建设 2026/3/9 13:28:30

解密TweakPNG:高效处理PNG元数据的专业指南

解密TweakPNG&#xff1a;高效处理PNG元数据的专业指南 【免费下载链接】tweakpng A low-level PNG image file manipulation utility for Windows 项目地址: https://gitcode.com/gh_mirrors/tw/tweakpng 初识TweakPNG&#xff1a;什么是PNG文件的"底层编辑器&quo…

作者头像 李华
网站建设 2026/3/3 21:46:40

如何终结投稿焦虑?学术进度管理工具全解析

如何终结投稿焦虑&#xff1f;学术进度管理工具全解析 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 学术投稿的困境与挑战 每一位科研工作者都经历过这样的时刻&#xff1a;投稿后频繁刷新系统查看状态&#xff…

作者头像 李华
网站建设 2026/3/5 7:41:49

Janus-Pro-7B多模态模型实战:基于Python爬虫的数据采集与图像生成

Janus-Pro-7B多模态模型实战&#xff1a;基于Python爬虫的数据采集与图像生成 最近在做一个电商项目&#xff0c;需要批量生成商品主图&#xff0c;传统方法要么得找设计师一张张做&#xff0c;要么用现成的模板工具&#xff0c;效果又不够灵活。正好看到DeepSeek开源的Janus-…

作者头像 李华