
最近不少關(guān)注內(nèi)容生產(chǎn)的朋友都在討論一組行業(yè)數(shù)據(jù)2026年第一季度國內(nèi)新增微短劇中超過95%的作品在生產(chǎn)流程中運(yùn)用了 AI 生成能力。這個數(shù)字是否被統(tǒng)計口徑影響暫且不談但它確實說明一個問題AI 微短劇已經(jīng)從“嘗鮮”階段進(jìn)入“流水線”階段。作為一名偏工程向的技術(shù)博主我更關(guān)心的是這背后用了哪些模型、哪些流程、哪些可復(fù)用的工程方案。本文不打算做行業(yè)分析報告而是從開發(fā)者視角把 AI 生成微短劇的完整鏈路拆開文本劇本 / 分鏡 / 角色設(shè)定圖像角色一致性與場景生成視頻圖生視頻 / 文生視頻 / 多鏡頭拼接音畫TTS 配音、字幕對齊、混流封裝工程任務(wù)調(diào)度、質(zhì)量評估、內(nèi)容合規(guī)、成本控制無論你是剛接觸 AI 視頻生成的新手還是已經(jīng)在做 AI 應(yīng)用開發(fā)的工程師這篇文章都值得收藏備用。1. 背景AI 生成微短劇為什么突然爆發(fā)1.1 什么是 AI 生成微短劇微短劇是單集時長通常在 1 到 3 分鐘總集數(shù)幾十到上百集的豎屏視頻內(nèi)容。傳統(tǒng)微短劇需要劇組、演員、場地、拍攝設(shè)備周期和成本都不低而 AI 生成微短劇是指通過大模型自動完成劇本創(chuàng)作、分鏡設(shè)計、角色形象生成、視頻片段生成、配音配樂和字幕合成的過程。嚴(yán)格來說當(dāng)前行業(yè)里的“AI 生成”并不僅僅指“輸入一句 Prompt模型直接輸出一條完整視頻”。更常見的生產(chǎn)方式是這樣的用語言大模型生成劇本和對白用圖像生成模型產(chǎn)出角色立繪和場景圖用視頻生成模型把靜態(tài)圖變成動態(tài)鏡頭用語音合成模型生成角色配音最后通過剪輯腳本自動合并成片。所以你在數(shù)據(jù)里看到的“95%”大概率統(tǒng)計的是“制作環(huán)節(jié)引入了 AI 能力”而不是 100% 無人干預(yù)。這個口徑差異不影響我們理解技術(shù)趨勢但它決定了我們要以“人機(jī)協(xié)作流水線”的思路來搭建系統(tǒng)而不是指望一個模型解決所有問題。1.2 為什么 AI 能快速滲透微短劇產(chǎn)業(yè)鏈微短劇的生產(chǎn)有幾個特點恰好容易被 AI 滿足。第一內(nèi)容生產(chǎn)環(huán)節(jié)標(biāo)準(zhǔn)化。微短劇題材高度模板化比如逆襲、復(fù)仇、甜寵、懸疑劇情套路清晰非常適合大模型學(xué)習(xí)。用語言模型生成劇本比傳統(tǒng)編劇寫初稿快得多。第二豎屏短視頻對畫質(zhì)要求相對可控。相比院線電影豎屏小尺寸、短時長、強(qiáng)劇情沖突可以掩蓋一部分視頻生成模型在細(xì)節(jié)上的不足。第三AI 視頻生成模型的能力在快速迭代。從早期的“圖生視頻”只能讓人物做簡單動作到現(xiàn)在的多鏡頭、多角色交互、口型同步生成質(zhì)量已經(jīng)接近可用。第四成本和效率優(yōu)勢明顯。傳統(tǒng)短劇單集制作成本可能幾千到幾萬元而 AI 輔助制作可以把前期預(yù)演成本大幅壓縮并支持快速批量產(chǎn)出不同版本便于內(nèi)容測試。1.3 開發(fā)者在這個趨勢里能做什么從純開發(fā)角度看AI 微短劇本質(zhì)上是一個“多模型編排系統(tǒng)”。你可以參與的方向包括搭建 Prompt 工程和 Agent 工作流把劇本自動拆成分鏡封裝視頻生成 API實現(xiàn)異步任務(wù)調(diào)度設(shè)計角色一致性方案降低生成過程中的“換臉”問題開發(fā)基于 FFmpeg 的后期合成服務(wù)建設(shè)內(nèi)容合規(guī)與版權(quán)審核模塊。接下來的內(nèi)容我會從工程實現(xiàn)的角度把一套最小可用 AI 微短劇生產(chǎn)流水線拆給大家看。2. AI 微短劇生產(chǎn)的技術(shù)棧與工程架構(gòu)2.1 從劇本到成片的 AI 流水線一條典型的 AI 微短劇生產(chǎn)流水線可以分為六個階段劇本創(chuàng)作輸入故事梗概生成完整劇本分鏡拆解把劇本拆成場次、鏡頭輸出結(jié)構(gòu)化 JSON角色/場景設(shè)計生成角色正面圖、場景參考圖視頻生成根據(jù)每組分鏡素材生成視頻片段配音與字幕TTS 生成對白ASR/對齊模型生成字幕后期合成拼接片段、混音、壓制成片。每個階段之間通過標(biāo)準(zhǔn)化的數(shù)據(jù)格式傳輸核心數(shù)據(jù)載體是“分鏡 JSON”。只要分鏡 JSON 足夠規(guī)范后續(xù)步驟就能被不同的模型服務(wù)替換。2.2 核心模塊拆解從代碼工程的角度主要模塊如下模塊職責(zé)典型技術(shù)劇本生成服務(wù)根據(jù)劇情摘要生成劇本語言大模型 Prompt分鏡解析服務(wù)把劇本解析為結(jié)構(gòu)化鏡頭語言大模型 JSON Schema圖像生成服務(wù)生成角色、場景、關(guān)鍵幀擴(kuò)散模型 / 文生圖 API視頻生成服務(wù)圖生視頻 / 文生視頻視頻生成大模型音聲合成服務(wù)對白 TTS、背景音樂TTS 模型、BGM 素材庫后期合成服務(wù)片段合并、字幕封裝FFmpeg質(zhì)檢與調(diào)度服務(wù)任務(wù)狀態(tài)管理、質(zhì)量評分Redis、Celery、Ray2.3 技術(shù)選型與版本說明由于 AI 視頻生成模型迭代非??毂疚牟粫涯硞€具體模型版本寫死。實際項目中你需要根據(jù)預(yù)算、效果、延遲和合規(guī)要求做取舍。下面給出一個常見的基礎(chǔ)環(huán)境參考操作系統(tǒng)Ubuntu 22.04 / macOS 14Python 版本3.10 或 3.11依賴管理pip / conda主要 Python 庫requests、openai、Pillow、pydantic、ffmpeg-python視頻處理工具FFmpeg 6.x任務(wù)隊列Redis Celery規(guī)模小時可直接用線程池數(shù)據(jù)庫PostgreSQL 或 MySQL用于保存任務(wù)和素材元數(shù)據(jù)如果你的團(tuán)隊已經(jīng)使用了 Kubernetes可以把各模塊容器化再通過消息隊列串起來。如果只是個人項目先保證單機(jī)腳本能跑通再逐步拆分服務(wù)。3. 核心原理與關(guān)鍵配置3.1 文本生成劇本、分鏡與人設(shè)文本生成是整個流水線的起點它決定了后續(xù)所有環(huán)節(jié)的輸入質(zhì)量。很多人以為只要把一段劇情描述丟給大模型就能得到合格劇本。實際做的時候需要考慮幾個點Prompt 需要明確劇集風(fēng)格、人物關(guān)系、節(jié)奏和臺詞風(fēng)格輸出格式最好是嚴(yán)格的 JSON方便程序解析分鏡要比劇本更具體包含鏡頭運(yùn)動、場景、氛圍、人物動作人設(shè)卡需要固定角色外貌特征供圖像生成模型引用。下面是一個最簡單的“劇本轉(zhuǎn)分鏡”Prompt 示例你是微短劇分鏡策劃。請把用戶提供的劇本拆分為鏡頭列表。 每個鏡頭必須包含 - scene_id: 場次編號 - shot_id: 鏡頭編號 - location: 場景地點 - time: 日景/夜景 - characters: 出場角色 - action: 角色動作 - dialogue: 臺詞 - camera: 鏡頭運(yùn)動可選固定/推近/拉遠(yuǎn)/跟隨/環(huán)繞 - atmosphere: 氛圍關(guān)鍵詞 要求 1. 單集不超過 3 分鐘約 12-18 個鏡頭。 2. 每個鏡頭描述不超過兩句話。 3. 輸出 JSON 數(shù)組不要輸出額外內(nèi)容。使用大模型時建議把 temperature 調(diào)低到 0.2 左右讓輸出更穩(wěn)定。同時在解析大模型返回內(nèi)容時要處理代碼塊包裹、多余逗號等問題。3.2 圖像生成角色一致性AI 微短劇最讓人頭疼的問題之一就是“角色臉不穩(wěn)定”。同一角色第一集和第十集長得不一樣觀眾體驗很差。為了解決這個問題圖像生成階段需要做好“一致性控制”。常用方案有三種固定提示詞把角色外貌描述固定成一段“角色描述符”每次都拼到 Prompt 里參考圖 圖生圖在生成視頻時傳入角色正面照作為參考圖使用 LoRA 微調(diào)針對特定角色訓(xùn)練 LoRA生成時加載該模型。在工程上最簡單可控的是第二種為每個角色保存一張基準(zhǔn)圖后續(xù)圖像生成和視頻生成都帶上這張圖。這樣即使視頻生成模型本身不穩(wěn)定也能最大程度保持角色一致性。3.3 視頻生成從圖生視頻到多鏡頭拼接視頻生成是整條流水線里耗時最長、成本最高的環(huán)節(jié)。目前主流的生成方式分為兩大類文生視頻直接輸入文本描述生成完整視頻適合空鏡、環(huán)境鏡頭圖生視頻輸入角色或場景圖再配合運(yùn)動描述生成視頻適合有明確主體的鏡頭。在微短劇里圖生視頻更常用因為角色和場景需要保持統(tǒng)一。生成時可以配置分辨率、幀率、時長、動作幅度等參數(shù)。豎屏微短劇通常使用 1080x1920 或 720x1280 分辨率24 到 30 幀每秒。生成任務(wù)通常是異步的需要提交任務(wù)后輪詢狀態(tài)。下面是一個用 requests 提交視頻生成任務(wù)的示例# scripts/generate_video_clip.py import time import requests # 這里以通用視頻生成服務(wù)為例請按實際平臺文檔替換 API_BASE https://api.example.com/v1 TOKEN YOUR_API_TOKEN def submit_video_task(prompt: str, image_path: str, duration: int 5): 提交圖生視頻任務(wù)返回任務(wù)ID。 url f{API_BASE}/video/generations headers {Authorization: fBearer {TOKEN}} payload { prompt: prompt, image: image_path, duration: duration, resolution: 1080x1920, fps: 24, } resp requests.post(url, headersheaders, jsonpayload, timeout30) resp.raise_for_status() return resp.json()[task_id] def wait_for_video(task_id: str, timeout: int 600): 輪詢?nèi)蝿?wù)結(jié)果直到生成完成或超時。 url f{API_BASE}/video/tasks/{task_id} headers {Authorization: fBearer {TOKEN}} start time.time() while time.time() - start timeout: data requests.get(url, headersheaders, timeout30).json() status data.get(status) if status succeeded: return data[video_url] if status failed: raise RuntimeError(data.get(error, video generate failed)) time.sleep(5) raise TimeoutError(video task timeout) if __name__ __main__: task_id submit_video_task( prompt雨夜女主角撐傘走過老街鏡頭緩慢推近電影感, image_pathassets/heroine.png, duration5, ) video_url wait_for_video(task_id) print(生成完成:, video_url)這里需要注意不同服務(wù)商的 API 字段名可能不同比如有的叫prompt有的叫text有的需要image_url有的接受本地文件上傳。封裝時建議建一個統(tǒng)一的客戶端類把平臺差異收斂在內(nèi)部。3.4 配音與字幕TTS、對齊與硬字幕視頻畫面生成好后還需要配音和字幕。配音可以使用 TTS 模型也可以使用語音克隆技術(shù)為固定角色配置專屬音色。字幕則有兩種方案軟字幕單獨生成 SRT 文件播放器可切換硬字幕通過 FFmpeg 把字幕燒錄進(jìn)畫面。微短劇一般選擇硬字幕方便在平臺統(tǒng)一分發(fā)。字幕時間軸可以從原始對白文本和 TTS 音頻中計算出來也可以用 ASR 模型轉(zhuǎn)寫后對齊。下面的命令用 FFmpeg 把生成的字幕文件封裝進(jìn)視頻# 如果視頻無聲軌先加入配音 ffmpeg -y -i output/clip_001.mp4 -i output/clip_001.m4a \ -c:v copy -c:a aac -shortest output/clip_001_av.mp4 # 燒錄硬字幕 ffmpeg -y -i output/clip_001_av.mp4 -vf subtitlessubtitles.srt \ -c:v libx264 -pix_fmt yuv420p output/clip_001_final.mp4-vf subtitles需要 FFmpeg 編譯時開啟 libass 支持。如果沒有也可以先把字幕渲染成 PNG 序列再疊加。實際項目中我更推薦單獨生成內(nèi)嵌字幕因為后續(xù)如果文案要改只需要重新合一次不需要重新生成視頻。4. 完整實戰(zhàn)案例從劇本到成片的最小流水線4.1 項目需求與約定為了演示我們做一個最小閉環(huán)輸入一段 30 秒左右的劇本自動拆成分鏡并生成 3 個視頻片段最后合并成一個豎屏視頻。不追求生產(chǎn)級質(zhì)量只把流程跑通。項目目錄結(jié)構(gòu)如下ai-microdrama/ ├── scripts/ │ ├── storyboard_parser.py │ ├── generate_video_clip.py │ ├── merge_clips.sh │ └── quality_check.py ├── output/ │ ├── shots.json │ ├── clip_001.mp4 │ ├── clip_002.mp4 │ ├── clip_003.mp4 │ └── final.mp4 ├── assets/ │ ├── heroine.png │ └── hero.png └── requirements.txt假設(shè)我們使用一個語言大模型接口來解析劇本使用一個視頻生成接口來生成片段。為了便于替換我把所有服務(wù)細(xì)節(jié)都封裝在函數(shù)里。4.2 創(chuàng)建項目結(jié)構(gòu)先創(chuàng)建虛擬環(huán)境和依賴文件mkdir -p ai-microdrama/{scripts,output,assets} cd ai-microdrama python3 -m venv .venv source .venv/bin/activate pip install requests openai pydanticrequirements.txt內(nèi)容如下requests2.31.0 openai1.30.0 pydantic2.7.4 python-dotenv1.0.1版本號可以根據(jù)你本機(jī)環(huán)境調(diào)整核心思路是用環(huán)境變量管理密鑰避免硬編碼。4.3 劇本解析與分鏡生成創(chuàng)建scripts/storyboard_parser.py# scripts/storyboard_parser.py import json import os from openai import OpenAI # 如果使用其他大模型服務(wù)請?zhí)鎿Q base_url、model 與鑒權(quán)方式 client OpenAI( api_keyos.getenv(LLM_API_KEY), base_urlos.getenv(LLM_BASE_URL), ) def parse_script_to_shots(script_text: str): prompt f 你是一個微短劇分鏡策劃。請把下面的劇本拆分為分鏡JSON數(shù)組。 每個分鏡包含 - scene_id: 場次編號 - shot_id: 鏡頭編號 - location: 場景地點 - time: 日/夜 - characters: 出場角色 - action: 角色動作 - dialogue: 臺詞 - camera: 鏡頭運(yùn)動 - atmosphere: 氛圍關(guān)鍵詞 輸出示例 [ {{ scene_id: 1, shot_id: 1, location: 街角, time: 夜, characters: [林夏], action: 林夏撐傘快步走過路燈下, dialogue: , camera: 推近, atmosphere: 緊張 }} ] 劇本 {script_text} 只輸出 JSON 數(shù)組。 resp client.chat.completions.create( modelos.getenv(LLM_MODEL, your-model-name), messages[{role: user, content: prompt}], temperature0.2, ) content resp.choices[0].message.content.strip() # 兼容 json ... 包裹 if content.startswith(): content content.split(\n, 1)[1].rsplit(, 1)[0] return json.loads(content) if __name__ __main__: script_text ( 深夜林夏獨自走在暴雨中。 一輛黑色轎車停在她面前。 車窗緩緩落下一個神秘男人遞出一把傘。 林夏猶豫片刻接過了傘。 ) shots parse_script_to_shots(script_text) with open(output/shots.json, w, encodingutf-8) as f: json.dump(shots, f, ensure_asciiFalse, indent2) print(f分鏡生成完畢共 {len(shots)} 個鏡頭)這里的關(guān)鍵點有兩個一是 Prompt 給出了嚴(yán)格的 JSON Schema二是解析時對大模型常見輸出包裹做了兼容。如果你使用國產(chǎn)大模型字段名可能類似但整體思路一致。4.4 調(diào)用視頻生成 API 批量生成片段創(chuàng)建scripts/generate_video_clip.py并擴(kuò)展成批量版本# scripts/generate_video_clip.py import json import os import time import requests API_BASE os.getenv(VIDEO_API_BASE, https://api.example.com/v1) TOKEN os.getenv(VIDEO_API_TOKEN, YOUR_API_TOKEN) def submit_video_task(prompt: str, image_path: str, duration: int 5): url f{API_BASE}/video/generations headers {Authorization: fBearer {TOKEN}} payload { prompt: prompt, image: image_path, duration: duration, resolution: 1080x1920, fps: 24, } resp requests.post(url, headersheaders, jsonpayload, timeout30) resp.raise_for_status() return resp.json()[task_id] def wait_for_video(task_id: str, timeout: int 600): url f{API_BASE}/video/tasks/{task_id} headers {Authorization: fBearer {TOKEN}} start time.time() while time.time() - start timeout: data requests.get(url, headersheaders, timeout30).json() status data.get(status) if status succeeded: return data[video_url] if status failed: raise RuntimeError(data.get(error, video generate failed)) time.sleep(5) raise TimeoutError(video task timeout) def download_video(url: str, save_path: str): resp requests.get(url, streamTrue, timeout60) resp.raise_for_status() with open(save_path, wb) as f: for chunk in resp.iter_content(chunk_size8192): f.write(chunk) if __name__ __main__: os.makedirs(output, exist_okTrue) with open(output/shots.json, r, encodingutf-8) as f: shots json.load(f) # 只演示前3個鏡頭 for idx, shot in enumerate(shots[:3], start1): prompt ( f{shot[atmosphere]} f{shot[action]}鏡頭{shot[camera]} f豎屏微短劇風(fēng)格 ) # 實際項目中要根據(jù)角色名選擇對應(yīng)參考圖 image_path fassets/{shot[characters][0]}.png if shot[characters] else assets/heroine.png task_id submit_video_task(prompt, image_path, duration3) print(f鏡頭 {idx} 已提交任務(wù): {task_id}) video_url wait_for_video(task_id) save_path foutput/clip_{idx:03d}.mp4 download_video(video_url, save_path) print(f鏡頭 {idx} 已保存: {save_path})因為視頻生成耗時較長生產(chǎn)環(huán)境建議把單次耗時控制在 30 秒以內(nèi)并在任務(wù)失敗時記錄錯誤碼。上面代碼只是演示沒有加入重試機(jī)制真實項目里必須加。4.5 批量合成與成片輸出創(chuàng)建scripts/merge_clips.sh#!/usr/bin/env bash set -euo pipefail # 將生成的視頻片段按順序合并 cat output/concat_list.txt EOF file clip_001.mp4 file clip_002.mp4 file clip_003.mp4 EOF # 進(jìn)入輸出目錄執(zhí)行拼接避免路徑問題 cd output # 合并視頻 ffmpeg -y -f concat -safe 0 -i concat_list.txt \ -c:v libx264 -pix_fmt yuv420p -c:a aac -b:a 192k final.mp4 echo 合并完成: output/final.mp4這個腳本假設(shè)每個片段已經(jīng)是統(tǒng)一的編碼和分辨率。如果素材分辨率不一致建議先統(tǒng)一縮放再拼接。拼接前最好先用ffprobe檢查每個片段的編碼參數(shù)。4.6 運(yùn)行驗證執(zhí)行流程如下# 1. 安裝依賴 pip install -r requirements.txt # 2. 設(shè)置環(huán)境變量 export LLM_API_KEY你的大模型API Key export LLM_BASE_URLhttps://api.example.com export VIDEO_API_TOKEN你的視頻生成API Token # 3. 解析劇本成成分鏡 python scripts/storyboard_parser.py # 4. 生成前3個視頻片段 python scripts/generate_video_clip.py # 5. 合并成片 bash scripts/merge_clips.sh如果你看到output/final.mp4出現(xiàn)并且視頻可以正常播放說明最小流水線已經(jīng)跑通。后續(xù)可以接入更多鏡頭、加入配音和字幕甚至可以對接任務(wù)隊列做并發(fā)生產(chǎn)。5. 常見問題與排查思路AI 微短劇生產(chǎn)最大的特點就是“生成過程不穩(wěn)定”。下面我把高頻問題整理成表格供你排查時快速定位。| 問題現(xiàn)象 | 常見原因 | 解決