Skip to main content
Glama
README.md
# 本地图文小剧场自动化(OpenVINO / Intel 版)

> Copyright 2026 **MWnv1**(GitHub: https://github.com/MWnv1)
> 个人站点:https://imworkingnow.cc.cd | https://imwn.cc.cd | https://imwn.dpdns.org
> 许可:**Apache License 2.0**(见 `LICENSE`、`NOTICE`)
> 版本生成时间:**2026-11-07 09:31:28 +08:00**(Asia/Shanghai / UTC 2026-11-07T01:31:28Z / Unix 1794015088)

剧本 → 背景与角色立绘 → 台词配音 → 镜头画面(含字幕)→ 成片,全本地离线运行,
通过 MCP 暴露给 LobeChat 分步调用。

## 目录结构

```
D:\AI_T_MCP\
├─ server.py            # MCP Server(stdio),LobeChat 的入口
├─ pipeline_full.py     # 流水线 + 命令行入口(也可让本地 LLM 写剧本)
├─ check_env.py         # 环境自检
├─ requirements.txt
├─ README.md
├─ output\              # 成片输出
├─ cache\               # 素材/音频/帧/片段缓存(可删)
└─ theater\
   ├─ __init__.py       # 路径与公用工具(绝对路径锚定)
   ├─ script_parser.py  # 剧本结构化
   ├─ ai_draw.py        # OpenVINO 绘图 + 离线抠图
   ├─ local_tts.py      # SAPI5 离线配音
   ├─ frame_compose.py  # 图层合成 + 字幕
   └─ video_export.py   # QSV/NVENC/libx264 导出
```

## 1. 环境

- **64 位 Python 3.11**(强烈建议;OpenVINO/optimum-intel 官方 wheel 目前只到 3.12 左右,
  本机默认的 3.14 装不上 openvino)
- **ffmpeg + ffprobe**(建议带 `h264_qsv` 的静态构建),把 `bin` 加进 PATH,
  或设 `FFMPEG_PATH` / `FFPROBE_PATH`
- Intel 显卡/NPU 驱动最新

```cmd
cd D:\AI_T_MCP
py -3.11 -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python check_env.py
```

> 仓库里的 `.venv` 是本次验证时用 3.14 建的,只装了 pillow / pyttsx3,**不要用它装 openvino**;
> 正式环境请按上面的 3.11 流程重建(或直接删掉把 `.venv` 重开)。

`check_env.py` 里 FAIL 必须先修;WARN 可以带病运行(会自动降级并打印告警)。

## 2. 模型摆放(默认 `D:\ai_models`,用 `MODEL_ROOT` 可改)

| 用途 | 目录 | 说明 |
|---|---|---|
| 绘图 | `D:\ai_models\flux-schnell-int4-ov` | Flux Schnell INT4 OpenVINO 预转换包 |
| 抠图 | `D:\ai_models\rembg\u2net.onnx` | 必须预置,否则**不会联网下载**,会降级为白底抠图 |
| 剧本 LLM(可选) | `D:\ai_models\qwen3-4b-int4-ov` | Qwen3-4B INT4 OpenVINO |

预转换包只要有 `openvino_model.xml/.bin` + `model_index.json` 之类即可;本项目
会优先用 `OVFluxPipeline` 加载 FLUX,旧版 optimum-intel 缺该类时回退
`OVStableDiffusionPipeline`。

## 3. 环境变量

| 变量 | 默认 | 作用 |
|---|---|---|
| `MODEL_ROOT` | `D:\ai_models` | 模型根目录 |
| `THEATER_CACHE` | `<项目>\cache` | 缓存根目录 |
| `FFMPEG_PATH` / `FFPROBE_PATH` | PATH 中 | 可执行文件绝对路径 |
| `DRAW_MODEL_DIR` | `$MODEL_ROOT\flux-schnell-int4-ov` | 绘图模型 |
| `DRAW_DEVICE` | `GPU` | `GPU` / `CPU` / `AUTO` |
| `DRAW_STEPS` / `DRAW_SIZE` | `4` / `1024` | 采样步数、出图边长 |
| `VIDEO_ENCODER` | `h264_qsv` | 不可用时自动回退 `libx264` |
| `QSV_QUALITY` | `23` | QSV 的 `-global_quality` |
| `X264_CRF` | `20` | 回退 x264 时的 CRF |
| `VIDEO_W` / `VIDEO_H` / `VIDEO_FPS` | `1920/1080/30` | 输出规格 |
| `TTS_RATE` | `180` | 语速 |
| `TTS_VOICE` / `TTS_VOICE_MAP` | 空 | 发音人;映射例 `小林=Huihui,阿杰=Kangkang` |
| `LLM_MODEL_DIR` / `LLM_DEVICE` | `$MODEL_ROOT\qwen3-4b-int4-ov` / `NPU` | 剧本生成 |

## 4. 剧本格式

```
【镜头1】
【小林:站位:左】
【阿杰:站位:右】
小林:这个模型真能离线跑?
阿杰:4bit 的,NPU 上 30 token/s。

【镜头2】机房门口
【旁白】夜色渐深。
阿杰:走吧,明天继续调。
```

- `【镜头N】` 后可接场景描述(会用来单独出背景)
- `【角色:站位:左/右/居中】` 可省略,省略时按角色数自动分配
- `场景:xxx` 会被当成镜头元信息,不会误判成台词

## 5. 命令行

```cmd
python pipeline_full.py --script script.txt --out output\demo.mp4
python pipeline_full.py --script script.txt --steps parse          :: 只看解析结果
python pipeline_full.py --requirement "两个程序员在机房聊本地AI小剧场" --out output\demo.mp4
```

## 6. LobeChat MCP 配置

```json
{
  "mcpServers": {
    "local-theater-auto": {
      "command": "python",
      "args": ["D:\\AI_T_MCP\\server.py"],
      "env": {
        "HF_HUB_OFFLINE": "1",
        "TRANSFORMERS_OFFLINE": "1",
        "MODEL_ROOT": "D:\\ai_models",
        "FFMPEG_PATH": "D:\\ai_tools\\ffmpeg\\bin\\ffmpeg.exe",
        "FFPROBE_PATH": "D:\\ai_tools\\ffmpeg\\bin\\ffprobe.exe"
      }
    }
  }
}
```

## 7. 本机(AMD + NVIDIA)跑这套代码的真实预期

这套代码按 Intel 平台写死,在你当前机器上:

- `h264_qsv` **不存在** → 导出会自动回退 `libx264`(慢一些,但能出片)
- `DRAW_DEVICE=GPU` 指的是 **Intel GPU**,AMD 核显/NVIDIA 都不适用 →
  绘图会报设备不可用。真要出图,需要换 CUDA/ComfyUI 后端(可用 `DRAW_DEVICE=CPU` 先跑通流程看效果,非常慢)
- `LLM_DEVICE=NPU` 需要 Intel NPU → 本机没有,写剧本这步不可用;剧本文本手写或外部模型给
- 合成、字幕、TTS(SAPI5)、拼接这几步与平台无关,可以正常跑

即:**流程、解析、字幕、配音、拼片可用;绘图与 NPU 推理需要 Intel 硬件。**

## 8. 本次已验证 / 未验证

已验证(本机实跑):

| 项目 | 结果 |
|---|---|
| 全部 9 个 .py 字节码编译 | 通过(`py_compile` 无报错) |
| `script_parser` 解析 `script.txt` | 3 镜头、角色 小林/阿杰;旁白不占站位、`【旁白】xxx` 正确进入台词 |
| `frame_compose` 合成 | 输出 1920×1080 PNG;长句自动折 3 行 + 省略号;半透明字幕条生效(像素采样变暗);3 角色同站"居中"自动均匀铺开不重叠 |
| `local_tts`(SAPI5) | 7 句全部产出非 0 字节 wav(81–181KB),无"只有第一句有声音"问题 |
| 时长解析 | 走 `wave` 兜底读出 2.50/4.11/3.03… 秒,不再回落 3.0 默认值 |
| `check_env` | 中文正常输出,FAIL/WARN 分级正确;检测到 2 个发音人(Huihui / Zira) |

未验证(缺依赖/模型,非代码问题):`ai_draw` 绘图(无 OPENVINO + 无模型)、
`video_export` 实际编码(本机无 ffmpeg)、`server.py` 的 MCP 握手(未装 mcp 包)。

## 9. 许可与署名

```
Copyright 2026 MWnv1 (GitHub: https://github.com/MWnv1)
Websites: https://imworkingnow.cc.cd | https://imwn.cc.cd | https://imwn.dpdns.org
License:  Apache License, Version 2.0  (SPDX: Apache-2.0)
```

- `LICENSE`:Apache-2.0 官方全文(未做任何删改)
- `NOTICE`:署名、站点、生成时间戳与第三方组件许可清单
- 每个 `.py` 文件头部均带 `SPDX-License-Identifier: Apache-2.0` + 版权/署名/站点/时间戳注释块
- 再分发时按 Apache-2.0 第 4 条:保留 LICENSE 与 NOTICE,修改过的文件需标注"已修改"

> 提示:`script.txt` 顶部那几行 `#` 注释会被解析器自动跳过,不影响剧本解析。