十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从零构建AI漫剧生成系统:Stable Diffusion与多模态AIGC实战指南

从零构建AI漫剧生成系统:Stable Diffusion与多模态AIGC实战指南 最近在AI内容创作领域一个名为《大唐吞妖录》的系列作品引发了广泛讨论。它并非传统意义上的动画或漫画而是利用AI图像生成、语音合成和视频剪辑技术将网络小说动态视觉化的新型“漫剧”。这类内容以其惊人的产出速度、天马行空的画面和强节奏的叙事吸引了大量观众。对于开发者、内容创作者和技术爱好者而言其背后的技术栈和实现流程无疑是一个值得深挖的富矿。本文将从一个技术实现的角度全面拆解如何从零开始构建一个类似的AI漫剧生成系统。我们将覆盖从核心概念、技术选型、环境搭建到剧本处理、图像生成、语音合成、视频剪辑的完整闭环流程并提供可运行的代码示例和工程化实践。无论你是想了解AIGC应用落地还是希望自己动手创作这篇文章都将提供一份详尽的实战指南。1. 背景与核心概念什么是AI漫剧在深入技术细节之前我们首先要厘清几个关键概念。AI漫剧是一种新兴的数字内容形式。它通常指利用人工智能技术自动或半自动地将文字剧本多为网络小说章节转换为包含角色、场景、对话和旁白的短视频序列。其核心特点是AI驱动生产画面由文生图模型如Stable Diffusion生成配音由文本转语音模型生成。效率极高传统动画分钟级成本AI漫剧可以做到小时级甚至更短时间产出。风格化强烈画面可以轻松统一在玄幻、武侠、科幻等特定风格下。低成本试错非常适合个人创作者或小团队进行IP的视觉化探索和快速内容迭代。与之容易混淆的概念是“动画”和“动态漫画”。传统动画依赖手绘或3D建模逐帧制作成本高昂。动态漫画则是在静态漫画基础上添加简单的平移、缩放、镜头效果。AI漫剧的本质是“基于AI生成资产的视频剪辑”它的每一帧画面都是独立生成的静态图通过剪辑和动效串联成视频。《大唐吞妖录》这类作品的成功验证了“强剧情快节奏AI视觉”这一模式的可行性。对于技术人来说它本质上是一个多模态AIGC应用工程问题涉及自然语言处理、计算机视觉、语音技术和音视频处理等多个领域。2. 环境准备与版本说明要构建一个完整的AI漫剧生成流水线我们需要搭建一个覆盖前后端的开发环境。以下是一个推荐的技术栈和版本说明请注意部分工具版本迭代较快请根据实际情况调整。2.1 核心开发环境操作系统: Ubuntu 20.04 LTS 或 Windows 10/11 (WSL2推荐)。本文示例以Ubuntu为主。Python: 3.8 - 3.10版本。这是大多数AI库的核心语言。CUDA: 11.7 或 11.8 (如果你有NVIDIA GPU)。用于加速Stable Diffusion等模型。Docker Docker Compose: 用于容器化部署部分服务如Redis、MySQL。2.2 关键技术与工具库我们将系统拆解为几个模块每个模块对应不同的技术选型模块推荐技术/工具版本/备注剧本解析spaCy,NLTK, 或LTP用于分句、命名实体识别NER文生图Stable Diffusion WebUI(Automatic1111) 或ComfyUI推荐SD WebUI生态丰富图生图/精修ControlNet,IP-Adapter用于控制角色一致性、姿势、场景文本转语音Edge-TTS,VITS或 商用APIEdge-TTS免费VITS可本地部署视频合成MoviePy,FFmpegPython库底层依赖FFmpeg任务队列CeleryRedis处理长时生成任务后端框架FastAPI或Django快速构建APIFastAPI更轻量前端Vue.js/React用于构建管理界面可选2.3 项目初始化创建一个标准的Python项目目录结构# 创建项目目录 mkdir ai-comic-drama cd ai-comic-drama # 创建虚拟环境 (Python 3.8) python -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows # 创建核心目录 mkdir -p app/{core, scripts, utils} mkdir -p config mkdir -p outputs/{images, audio, videos, temp} mkdir -p logs # 初始化项目依赖文件 touch requirements.txt touch app/__init__.py touch main.py2.4 基础依赖安装编辑requirements.txt文件加入以下基础依赖# 核心框架与异步 fastapi0.104.1 uvicorn[standard]0.24.0 celery5.3.4 redis5.0.1 # 剧本处理 spacy3.7.2 zhon1.1.5 # 中文标点处理 # 图像处理与视频合成 Pillow10.1.0 moviepy1.0.3 numpy1.24.3 # 网络请求与工具 httpx0.25.1 pydantic2.5.0 python-dotenv1.0.0 loguru0.7.2然后安装依赖并下载SpaCy的中文模型pip install -r requirements.txt python -m spacy download zh_core_web_sm # 下载小型中文模型3. 核心流程与原理拆解一个完整的AI漫剧生成流程可以抽象为以下标准化流水线原始剧本 - 剧本解析 - 分镜提示词 - 文生图 - 图像后处理 - TTS生成语音 - 音画合成 - 最终视频3.1 剧本解析与分镜设计这是从文字到视觉的第一步也是最需要“人工智慧”的一步。目标是将一段小说文本拆解成一个个独立的视觉镜头分镜并为每个镜头生成详细的AI绘画提示词。核心任务分句与分段按照句号、感叹号、问号以及场景转换词如“与此同时”、“下一刻”进行切分。实体识别识别出人物、地点、动作、关键物体。例如从“林凡手持斩妖剑冷冷地盯着前方的狼妖”中识别出“林凡”人物、“斩妖剑”物体、“盯着”动作、“狼妖”人物/怪物。分镜逻辑决定一句话对应一个镜头还是多句话合并。通常一个完整的动作或对话回合可以作为一个分镜。提示词工程为每个分镜生成高质量的文生图提示词。这需要结合剧本描述和预设的风格化标签。示例代码一个简单的分镜解析器# app/core/script_parser.py import re import spacy from typing import List, Dict, Any from zhon.hanzi import punctuation as zh_punctuation class ScriptParser: def __init__(self): # 加载spacy中文模型 self.nlp spacy.load(zh_core_web_sm) # 定义场景转换关键词 self.scene_change_keywords [突然, 下一刻, 与此同时, 另一边, 转眼间, 只见] def split_into_scenes(self, text: str) - List[str]: 将剧本文本按句号和场景转换词切分成潜在的分镜句子 # 替换中文标点为英文标点换行便于分割 for p in zh_punctuation: text text.replace(p, p \n) # 额外根据场景转换词分割 for keyword in self.scene_change_keywords: text text.replace(keyword, \n keyword) scenes [s.strip() for s in text.split(\n) if s.strip()] return scenes def analyze_scene(self, scene_text: str) - Dict[str, Any]: 分析单个分镜提取实体和动作 doc self.nlp(scene_text) entities [] actions [] for ent in doc.ents: entities.append({text: ent.text, label: ent.label_}) # 简单的动词提取实际应用可能需要更复杂的依存句法分析 for token in doc: if token.pos_ VERB: actions.append(token.text) return { original_text: scene_text, entities: entities, actions: actions, tokens: [token.text for token in doc] } def generate_prompt(self, scene_analysis: Dict, style: str fantasy, chinese ink painting) - str: 根据场景分析和风格生成文生图提示词 entities_text , .join([e[text] for e in scene_analysis[entities]]) actions_text , .join(scene_analysis[actions]) # 构建基础提示词 base_prompt f{scene_analysis[original_text]}, {entities_text}, {actions_text} # 添加风格和质量标签 quality_tags masterpiece, best quality, detailed, 8k negative_prompt worst quality, low quality, normal quality, blurry, ugly full_prompt f{quality_tags}, {style}, {base_prompt} return full_prompt, negative_prompt # 使用示例 if __name__ __main__: parser ScriptParser() novel_text 林凡运转功法周身泛起金光。下一刻他猛地挥出一拳拳风化作猛虎扑向狼妖。狼妖嘶吼利爪迎上。 scenes parser.split_into_scenes(novel_text) for i, scene in enumerate(scenes): analysis parser.analyze_scene(scene) prompt, neg_prompt parser.generate_prompt(analysis) print(f分镜 {i1}: {scene}) print(f提示词: {prompt[:100]}...) print(- * 50)3.2 文生图与角色一致性这是技术核心也是最大的挑战。如何让不同分镜中的同一个角色如“林凡”看起来是同一个人解决方案使用LoRA模型为每个主要角色训练一个轻量化的LoRA模型。只需准备角色的一组图片20-30张在Stable Diffusion基础上进行微调即可在生成时通过触发词调用该角色形象。使用Reference ControlNet将一张设定好的角色原画作为参考图利用ControlNet控制新生成图像的风格、脸型、发型等特征使其与参考图保持一致。使用IP-Adapter这是更新的技术可以接受图像作为提示输入直接影响生成结果对保持角色、风格一致性非常有效。工程实践我们通常将角色与固定触发词绑定并在每个分镜的提示词中加入。例如提示词中包含character_linfan并在生成时加载对应的LoRA模型。3.3 语音合成与情感注入单纯的机械朗读会极大削弱剧情感染力。我们需要有情感、有角色区分度的语音。方案选择本地部署使用VITS、Bert-VITS2等开源项目可以训练特定角色的声音但需要一定的数据和算力。云服务API使用微软Azure、阿里云、腾讯云等提供的TTS服务情感和音色选择丰富质量高但有费用成本。折中方案使用Edge-TTS微软Edge浏览器语音技术的免费接口它支持多种语言和音色虽然可控性不如付费API但对于原型和低成本项目足够。关键点需要建立一个“角色-音色”映射表。在解析剧本对话时根据说话人标签调用对应的音色生成语音。4. 完整实战案例生成一段30秒的AI漫剧让我们通过一个完整的、简化的例子将上述流程串联起来。假设我们要生成《大唐吞妖录》的一个小片段。4.1 项目结构完善在之前创建的项目目录下补充以下文件ai-comic-drama/ ├── config/ │ ├── settings.py # 配置文件 │ └── characters.json # 角色定义名称、LoRA路径、音色ID ├── app/ │ ├── core/ │ │ ├── script_parser.py # 剧本解析器 │ │ ├── sd_client.py # Stable Diffusion API客户端 │ │ ├── tts_client.py # TTS客户端 │ │ └── video_composer.py # 视频合成器 │ ├── tasks/ # Celery异步任务 │ │ └── generate_scene.py │ └── utils/ │ └── file_utils.py ├── outputs/ ├── logs/ ├── main.py # FastAPI主入口 ├── requirements.txt └── .env # 环境变量4.2 配置与环境变量.env文件配置关键信息# Stable Diffusion WebUI 地址 (假设本地运行在7860端口) SD_WEBUI_URLhttp://127.0.0.1:7860 SD_WEBUI_AUTHNone # 如果设置了认证格式为 user:pass # TTS 配置 (以Edge-TTS为例) TTS_PROVIDERedge TTS_VOICEzh-CN-XiaoxiaoNeural # 中文女声 # 路径配置 OUTPUT_BASE_DIR./outputsconfig/characters.json定义角色{ 林凡: { lora_name: linfan_v1.safetensors, lora_weight: 0.8, tts_voice: zh-CN-YunxiNeural, trigger_word: linfan, young male cultivator, black hair, sharp eyes }, 狼妖: { lora_name: wolf_demon_v1.safetensors, lora_weight: 0.7, tts_voice: zh-CN-YunyangNeural, trigger_word: wolf demon, ferocious, green eyes, claws } }4.3 编写Stable Diffusion客户端我们需要通过API调用本地部署的SD WebUI。# app/core/sd_client.py import httpx import logging import asyncio from pathlib import Path from typing import Dict, Any, Optional from app.utils.file_utils import ensure_dir logger logging.getLogger(__name__) class StableDiffusionClient: def __init__(self, base_url: str, auth: Optional[str] None): self.base_url base_url.rstrip(/) self.auth auth self.client httpx.AsyncClient(timeout60.0) # 生成图片可能较慢 async def txt2img(self, prompt: str, negative_prompt: str , width: int 768, height: int 512, steps: int 30, cfg_scale: float 7.0, seed: int -1, lora_models: Dict[str, float] None) - Optional[Path]: 调用文生图API返回保存的图片路径 # 构建LoRA触发词字符串 lora_prompt_part if lora_models: for lora, weight in lora_models.items(): # SD WebUI 中LoRA的调用格式: lora:filename:weight lora_prompt_part f lora:{lora}:{weight} full_prompt prompt lora_prompt_part payload { prompt: full_prompt, negative_prompt: negative_prompt, width: width, height: height, steps: steps, cfg_scale: cfg_scale, seed: seed, sampler_name: DPM 2M Karras, save_images: True } try: logger.info(f生成图片提示词: {full_prompt[:100]}...) resp await self.client.post(f{self.base_url}/sdapi/v1/txt2img, jsonpayload) resp.raise_for_status() result resp.json() # 保存图片 import base64 from io import BytesIO from PIL import Image import time image_data result[images][0] image Image.open(BytesIO(base64.b64decode(image_data.split(,, 1)[0]))) output_dir Path(outputs/images) ensure_dir(output_dir) filename fscene_{int(time.time())}_{seed}.png filepath output_dir / filename image.save(filepath) logger.info(f图片已保存至: {filepath}) return filepath except Exception as e: logger.error(f调用Stable Diffusion API失败: {e}) return None async def close(self): await self.client.aclose()4.4 编写TTS客户端以Edge-TTS为例# app/core/tts_client.py import edge_tts import asyncio from pathlib import Path import logging from app.utils.file_utils import ensure_dir logger logging.getLogger(__name__) class TTSEdgeClient: def __init__(self, voice: str zh-CN-XiaoxiaoNeural): self.voice voice async def text_to_speech(self, text: str, character: str None) - Optional[Path]: 将文本转换为语音返回音频文件路径 # 可以从config/characters.json中根据character获取特定音色 voice self.voice if character: # 这里简化处理实际应从配置读取 if character 林凡: voice zh-CN-YunxiNeural elif character 狼妖: voice zh-CN-YunyangNeural output_dir Path(outputs/audio) ensure_dir(output_dir) filename faudio_{hash(text) 0xFFFFFFFF}.mp3 filepath output_dir / filename try: communicate edge_tts.Communicate(text, voice) await communicate.save(str(filepath)) logger.info(f语音生成成功: {filepath}) return filepath except Exception as e: logger.error(fTTS生成失败: {e}) return None4.5 编写视频合成器# app/core/video_composer.py from moviepy.editor import ImageClip, AudioFileClip, CompositeVideoClip, concatenate_videoclips from moviepy.video.fx.all import resize, fadein, fadeout from pathlib import Path import logging from app.utils.file_utils import ensure_dir logger logging.getLogger(__name__) class VideoComposer: def __init__(self, output_resolution(1920, 1080)): self.output_resolution output_resolution def create_scene_clip(self, image_path: Path, audio_path: Path, duration: float None) - ImageClip: 为单个分镜创建视频片段 # 读取图片 img_clip ImageClip(str(image_path)).set_duration(duration or 5) # 默认5秒 # 调整尺寸以适应输出分辨率保持比例填充黑边 img_clip resize(img_clip, heightself.output_resolution[1]) # 居中 img_clip img_clip.set_position((center, center)) # 如果有音频设置音频并调整时长 if audio_path and audio_path.exists(): audio_clip AudioFileClip(str(audio_path)) # 片段时长取图片默认时长和音频时长的最大值 clip_duration max(img_clip.duration, audio_clip.duration) img_clip img_clip.set_duration(clip_duration) img_clip img_clip.set_audio(audio_clip) # 添加淡入淡出效果 img_clip img_clip.fadein(0.5).fadeout(0.5) return img_clip def compose_video(self, scene_data_list: list, output_name: str final_output) - Path: 将多个分镜片段合成为完整视频 clips [] for scene_data in scene_data_list: # scene_data 应包含 image_path, audio_path, duration 等信息 clip self.create_scene_clip( scene_data[image_path], scene_data.get(audio_path), scene_data.get(duration) ) clips.append(clip) # 拼接所有片段 final_clip concatenate_videoclips(clips, methodcompose) # 输出文件 output_dir Path(outputs/videos) ensure_dir(output_dir) output_path output_dir / f{output_name}.mp4 # 写入视频文件codec和比特率可根据需要调整 final_clip.write_videofile( str(output_path), fps24, codeclibx264, audio_codecaac, temp_audiofiletemp-audio.m4a, remove_tempTrue ) logger.info(f视频合成完成: {output_path}) return output_path4.6 主流程串联与异步任务我们将耗时的生成任务放入Celery避免阻塞Web服务。# app/tasks/generate_scene.py from celery import Celery from app.core.script_parser import ScriptParser from app.core.sd_client import StableDiffusionClient from app.core.tts_client import TTSEdgeClient from app.core.video_composer import VideoComposer import asyncio import json from pathlib import Path # 创建Celery应用 celery_app Celery(ai_comic_tasks, brokerredis://localhost:6379/0) celery_app.task def generate_comic_drama_task(script_text: str, style: str fantasy, chinese ink painting): 异步任务生成整个漫剧 # 注意Celery任务内运行异步函数需要特殊处理这里简化写成同步调用异步 loop asyncio.new_event_loop() asyncio.set_event_loop(loop) try: result loop.run_until_complete(_async_generate(script_text, style)) return result finally: loop.close() async def _async_generate(script_text: str, style: str): 实际的异步生成流程 # 1. 初始化组件 parser ScriptParser() sd_client StableDiffusionClient(http://127.0.0.1:7860) tts_client TTSEdgeClient() composer VideoComposer() # 2. 解析剧本 scenes parser.split_into_scenes(script_text) scene_data_list [] # 3. 为每个分镜生成图像和语音 for i, scene_text in enumerate(scenes): print(f正在处理分镜 {i1}/{len(scenes)}: {scene_text}) # 分析场景生成提示词 analysis parser.analyze_scene(scene_text) prompt, neg_prompt parser.generate_prompt(analysis, style) # 简单判断角色实际应更复杂 lora_models {} if 林凡 in scene_text: lora_models[linfan_v1.safetensors] 0.8 if 狼妖 in scene_text: lora_models[wolf_demon_v1.safetensors] 0.7 # 调用SD生成图片 image_path await sd_client.txt2img(prompt, neg_prompt, seed-1, lora_modelslora_models) if not image_path: print(f分镜 {i1} 图片生成失败) continue # 调用TTS生成语音这里简单将整个分镜文本转为语音 audio_path await tts_client.text_to_speech(scene_text) scene_data_list.append({ image_path: image_path, audio_path: audio_path, text: scene_text }) # 4. 合成视频 if scene_data_list: video_path composer.compose_video(scene_data_list, output_name大唐吞妖录片段) print(f视频生成成功: {video_path}) return {status: success, video_path: str(video_path)} else: return {status: failed, reason: No scene generated} await sd_client.close()4.7 运行与验证启动依赖服务确保Redis和Stable Diffusion WebUI正在运行。# 启动Redis docker run -d -p 6379:6379 redis:alpine # 启动SD WebUI (假设已安装) cd /path/to/stable-diffusion-webui ./webui.sh --api --listen启动Celery Workercd /path/to/ai-comic-drama celery -A app.tasks.generate_scene worker --loglevelinfo触发任务可以写一个简单的Python脚本触发任务。# trigger_task.py from app.tasks.generate_scene import generate_comic_drama_task script 林凡运转功法周身泛起金光。他猛地挥出一拳拳风化作猛虎扑向狼妖。 result generate_comic_drama_task.delay(script, fantasy, chinese ink painting, detailed) print(f任务已提交ID: {result.id}) # 可以通过 result.get() 获取结果同步等待或使用Celery的结果后端异步查询查看结果任务完成后在outputs/videos/目录下找到生成的大唐吞妖录片段.mp4文件。5. 常见问题与排查思路在实际搭建和运行过程中你一定会遇到各种问题。以下是一些高频问题及其解决思路。问题现象可能原因排查步骤与解决方案Stable Diffusion API调用失败1. SD WebUI未启动或未启用--api参数。2. 网络端口不通。3. 请求超时。1. 检查SD WebUI进程和日志确认启动命令包含--api。2. 使用curl http://127.0.0.1:7860/sdapi/v1/txt2img测试API连通性。3. 在代码中增加httpx超时时间或检查GPU内存是否不足导致生成过慢。生成图片质量差、角色崩坏1. 提示词不够具体或存在冲突。2. LoRA模型未正确加载或权重不当。3. 基础模型不匹配。1. 精炼提示词使用更具体的描述善用负面提示词。2. 检查SD WebUI中LoRA模型是否已安装触发词格式lora:filename:weight是否正确。3. 尝试更换不同的基础大模型如chilloutmix,ghostmix等。角色一致性无法保持1. 不同分镜中角色提示词不一致。2. LoRA训练数据不足或质量差。3. 未使用ControlNet等约束手段。1. 建立角色词库确保每个分镜中同一角色的核心描述词相同。2. 增加LoRA训练图片的数量和多样性多角度、多表情。3. 结合使用IP-Adapter或Reference ControlNet以一张高质量原画作为参考。语音情感平淡、不匹配1. TTS引擎本身情感有限。2. 未对对话和旁白进行区分。3. 文本未进行预处理。1. 考虑使用情感更丰富的付费TTS API或在本地使用VITS微调角色音色和情感。2. 在剧本解析阶段标记出对话和说话人为不同角色分配不同音色。3. 在文本中加入SSML标签如prosody ratefast pitchhigh来调整语速和语调。视频合成卡顿或音画不同步1. 图片尺寸过大。2. MoviePy/FFmpeg处理效率问题。3. 音频时长与图片显示时长不匹配。1. 将图片统一缩放至视频分辨率大小减少实时处理开销。2. 使用write_videofile时尝试不同的codec和preset参数以平衡速度和质量。3. 在create_scene_clip函数中确保视频片段时长严格等于音频时长。Celery任务状态一直为PENDING1. Redis未启动或连接错误。2. Celery Worker未启动或未正确注册任务模块。3. 任务序列化问题。1. 检查Redis服务状态和连接字符串。2. 查看Worker日志确认任务模块路径正确使用-A参数指定正确的应用模块。3. 确保传递给任务的参数是可JSON序列化的。6. 最佳实践与工程建议将原型系统转化为一个稳定、可维护的生产级项目需要考虑更多工程化细节。6.1 配置与资源管理集中化配置所有API地址、模型路径、超时参数都应放在配置文件如config/settings.py或.env中并通过环境变量区分开发、测试、生产环境。模型版本管理LoRA模型、基础模型、ControlNet模型都应进行版本控制。在配置中指定模型版本避免因模型更新导致生成效果突变。资源清理建立定时任务清理outputs/temp等目录下的中间文件防止磁盘被占满。6.2 任务调度与队列优化优先级队列使用Celery的不同队列管理任务优先级。例如实时预览任务放入高优先级队列批量生成任务放入低优先级队列。任务重试与降级为网络调用如SD API、TTS API设置自动重试机制。当高清生成失败时可以降级为快速生成模式。进度反馈对于长视频生成任务可以通过WebSocket或轮询API向前端实时反馈每个分镜的生成进度。6.3 提示词工程与资产管理建立提示词模板库针对“战斗”、“对话”、“风景”、“特写”等不同场景预设高质量的提示词模板和负面提示词。角色资产库为每个主要角色建立资产档案包括标准立绘用于Reference、LoRA模型、专属音色ID、性格描述词库。风格一致性为整个项目定义视觉风格关键词如chinese ink painting, wuxia, dramatic lighting并将其作为基础提示词的一部分。6.4 性能与成本优化图片缓存对于常见的场景描述如“山林背景”、“客栈内部”可以预生成一批高质量背景图存入缓存避免每次重新生成。批量生成一次性提交多个分镜的图片生成请求利用SD WebUI的批处理功能比循环调用单次API效率更高。语音合成批处理与缓存同样将TTS请求批量处理并对相同的文本进行MD5哈希缓存避免重复生成。分辨率分级内部制作时使用较低分辨率如512x768进行快速预览和迭代定稿后再用高分辨率生成最终版。6.5 质量监控与迭代生成日志详细记录每个分镜的生成参数提示词、种子、模型、耗时和结果文件路径。这是排查问题和复现优秀效果的依据。人工审核环节在关键节点如角色定稿、重要场景设置人工审核点避免AI自由发挥导致剧情或人设跑偏。A/B测试对于重要的场景可以生成多个版本不同提示词、不同模型由创作者或小范围观众选择最佳版本。通过以上系统的工程化实践你可以将一个实验性的脚本升级为一个能够持续、稳定产出高质量AI漫剧的创作平台。这其中的技术挑战不再仅仅是调用AI API更多的是软件工程、流程管理和艺术指导的结合。
返回列表