auto-video-generator-mcp


Nameauto-video-generator-mcp JSON
Version 3.0.0 PyPI version JSON
download
home_pagehttps://github.com/zgmurder/auto_video_generator-mcp
Summary基于MCP协议的智能视频生成系统,支持自动添加字幕、语音合成和视频剪辑功能
upload_time2025-07-27 03:59:50
maintainerNone
docs_urlNone
authorzgmurder
requires_python>=3.8
licenseMIT
keywords video mcp subtitle speech synthesis ffmpeg moviepy
VCS
bugtrack_url
requirements httpx fastmcp azure-cognitiveservices-speech pydub moviepy opencv-python Pillow jieba psutil
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Auto Video Generator MCP

[English](README_EN.md) | [中文](README.md)

一个基于 MCP (Model Context Protocol) 的智能视频生成系统,支持自动添加字幕、语音合成和视频剪辑功能。

##  功能特性

### 核心功能
- **智能视频剪辑**: 支持视频片段保留/剪切模式
- **自动删除重复帧/静止片段**: 一键检测并剪掉无效画面,提升视频精华度(可选参数,默认关闭)
- **自动字幕生成**: 智能文本分割和字幕样式自定义
- **语音合成**: 集成 Azure 语音服务,支持多种音色
- **多画质输出**: 支持 240p 到 1080p 多种画质预设
- **GPU 加速编码**: 支持 AMD AMF、NVIDIA NVENC、Intel QSV 硬件编码加速
- **异步任务处理**: 支持长时间任务的异步处理
- **时间标记控制**: 支持在文本中使用时间标记控制静默时间

### 技术特性
- **模块化架构**: 清晰的模块分离,易于维护和扩展
- **MCP 协议**: 基于 FastMCP 的标准化接口
- **配置管理**: 灵活的配置系统,支持环境变量
- **任务管理**: 完整的任务状态跟踪和管理
- **临时文件清理**: 自动清理处理过程中的临时文件

##  系统要求

### 软件依赖
- Python 3.8+
- FFmpeg (需要预先安装并配置到系统 PATH)
- Windows 系统 (字体路径配置)

### Python 依赖
```
httpx>=0.24.0
fastmcp>=0.1.0
azure-cognitiveservices-speech>=1.31.0
pydub>=0.25.1
moviepy>=1.0.3
opencv-python>=4.8.0
Pillow>=10.0.0
jieba>=0.42.1
```

##  安装配置

### 1. 克隆项目
```bash
git clone https://github.com/zgmurder/auto_video_generator-mcp.git
cd auto-video-generator-mcp
```

### 2. 安装依赖
```bash
pip install -r requirements.txt
```

### 3. 配置环境变量
```bash
# FFmpeg 路径配置 (可选)
export FFMPEG_PATH="path/to/ffmpeg"
export FFPROBE_PATH="path/to/ffprobe"

# 调试模式 (可选)
export DEBUG_MODE="true"
```

### 4. 启动服务器
```bash
python auto_generate_video_mcp_modular.py
```

服务器将在 `http://localhost:8000/sse` 启动。

##  使用指南

### 基本使用

#### 1. 简单视频生成
```python
# 生成带字幕和语音的视频
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    text="欢迎观看本视频,这是AI自动生成的解说。",
    voice_index=0,
    output_path="output.mp4"
)
```

#### 2. 自定义画质
```python
# 生成高清视频
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    text="高清视频内容",
    quality_preset="1080p"
)
```

#### 3. 视频片段处理
```python
# 保留指定片段 - 注意:segments必须是JSON字符串格式
segments = '[{"start": "00:00:05", "end": "00:00:15"}]'  # JSON字符串
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    text="片段解说",
    segments_mode="keep",
    segments=segments  # 传递JSON字符串,不是字典对象
)

# 剪切指定片段
segments = '[{"start": "00:00:10", "end": "00:00:20"}, {"start": "00:00:30", "end": "00:00:40"}]'
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    text="剪切片段解说",
    segments_mode="cut",
    segments=segments  # JSON字符串格式
)
```

### 高级功能

#### 1. 时间标记控制
```python
# 使用时间标记控制静默时间
text = "{5s}欢迎观看{5000ms}本视频由AI自动剪辑并添加智能字幕和语音解说。{2s}感谢您的观看!"
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    text=text
)
```

#### 2. 自定义字幕样式
```python
# 自定义字幕样式 - 注意:subtitle_style必须是JSON字符串格式
subtitle_style = '{"fontSize": 60, "color": "yellow", "bgColor": [0, 0, 0, 128]}'  # JSON字符串
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    text="自定义字幕样式",
    subtitle_style=subtitle_style  # 传递JSON字符串,不是字典对象
)

# 更多字幕样式示例
subtitle_style = '{"fontSize": 50, "color": "white", "bgColor": [0, 0, 0, 30], "marginX": 100, "marginBottom": 50}'
```

#### 3. 异步任务处理
```python
# 创建异步任务
task_id = await generate_auto_video_async(
    video_path="input.mp4",
    text="长时间处理任务"
)

# 查询任务状态
status = await get_task_status(task_id)

# 取消任务
await cancel_task(task_id)
```

#### 4. 自动删除重复帧/静止片段
```python
# 自动检测并剪掉视频中的静止/无聊片段(如长时间无动作画面)
# 方法1:使用配置文件中的参数
import json
with open("best_motion_clip_params.json", "r", encoding="utf-8") as f:
    motion_params = json.load(f)
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    output_path="output_motion_clip.mp4",
    enable_motion_clip=True,  # 启用自动静止片段检测
    motion_clip_params=json.dumps(motion_params)  # 转换为JSON字符串
)

# 方法2:直接传入JSON字符串参数
motion_params = '{"motion_threshold": 0.1, "min_static_duration": 2.0, "sample_step": 1}'  # JSON字符串
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    output_path="output_motion_clip.mp4",
    enable_motion_clip=True,
    motion_clip_params=motion_params  # 直接传递JSON字符串
)
```

#### 5. 极致GPU加速编码
```python
# 使用极致GPU优化进行视频编码,将显卡性能发挥到最大
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    text="极致GPU加速视频处理",
    enable_gpu_acceleration=True,  # 启用极致GPU加速
    gpu_type="auto",  # 自动检测GPU类型,或指定"amd"/"nvidia"/"intel"
    quality_preset="1080p"
)

# 获取系统性能信息
performance_info = await get_system_performance_info_mcp()

# 优化视频处理参数
optimized_config = await optimize_video_processing_mcp("input.mp4", "1080p")

# GPU性能基准测试
benchmark_result = await benchmark_gpu_performance_mcp()
```

> **重要说明**:
> - **JSON参数格式**: 所有配置参数(`segments`, `subtitle_style`, `auto_split_config`, `motion_clip_params`)都必须使用JSON字符串格式传递,不能直接传递字典对象。
> - **时间格式**: 视频片段时间格式为 "HH:MM:SS",例如 "00:00:05" 表示5秒。
> - **运动检测**: `enable_motion_clip=True` 时,系统会自动分析视频,检测并剪掉所有静止/重复帧片段。
> - **GPU优化**: `enable_gpu_acceleration=True` 时,系统会启用极致GPU优化,自动检测硬件配置并优化编码参数。
> - **极致GPU优化**: 包括多线程处理、内存优化、编码器调优、异步处理、缓存优化等。
> - **兼容性**: 不影响原有字幕、语音等功能,完全兼容。

##  JSON参数格式说明

### 重要提醒
所有配置参数都必须使用**JSON字符串格式**传递,不能直接传递字典对象。这是为了确保MCP协议的兼容性和数据传递的准确性。

### 参数格式示例

#### 1. 视频片段配置 (`segments`)
```json
[
  {"start": "00:00:05", "end": "00:00:15"},
  {"start": "00:00:30", "end": "00:00:45"}
]
```
**传递方式**: `segments='[{"start": "00:00:05", "end": "00:00:15"}]'`

#### 2. 字幕样式配置 (`subtitle_style`)
```json
{
  "fontSize": 50,
  "color": "white",
  "bgColor": [0, 0, 0, 30],
  "fontPath": "C:\\Windows\\Fonts\\msyh.ttc",
  "marginX": 100,
  "marginBottom": 50
}
```
**传递方式**: `subtitle_style='{"fontSize": 50, "color": "white"}'`

**支持的字段名格式**:
- 字体大小: `fontSize`, `font_size`, `size`
- 字体颜色: `color`, `font_color`, `fontColor`, `text_color`, `textColor`
- 背景颜色: `bgColor`, `bg_color`, `background_color`, `backgroundColor`
- 字体路径: `fontPath`, `font_path`, `font`
- 左右边距: `marginX`, `margin_x`, `margin`
- 底部边距: `marginBottom`, `margin_bottom`, `bottom_margin`
- 字幕高度: `height`, `subtitle_height`

**颜色格式支持**:
- 颜色名称: `"white"`, `"black"`, `"red"`, `"yellow"` 等
- 十六进制: `"#000000"`, `"#FFFFFF"` 等
- RGB数组: `[255, 255, 255]`
- RGBA数组: `[0, 0, 0, 30]` (最后一个数字是透明度)
- 透明背景: `"transparent"`

#### 3. 智能分割配置 (`auto_split_config`)
```json
{
  "max_chars_per_line": 20,
  "max_duration_per_segment": 5.0,
  "min_duration_per_segment": 1.0
}
```
**传递方式**: `auto_split_config='{"max_chars_per_line": 20, "max_duration_per_segment": 5.0}'`

#### 4. 运动检测配置 (`motion_clip_params`)
```json
{
  "motion_threshold": 0.1,
  "min_static_duration": 2.0,
  "sample_step": 1
}
```
**传递方式**: `motion_clip_params='{"motion_threshold": 0.1, "min_static_duration": 2.0}'`

### 常见错误示例
```python
# ❌ 错误:直接传递字典对象
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    segments=[{"start": "00:00:05", "end": "00:00:15"}]  # 错误!
)

# ✅ 正确:传递JSON字符串
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    segments='[{"start": "00:00:05", "end": "00:00:15"}]'  # 正确!
)

# ✅ 正确:支持多种字段名格式
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    text="测试字幕样式",
    subtitle_style='{"font_color": "#000000", "background_color": "transparent", "font_size": 36}'  # 支持多种字段名
)
```

##  配置说明

### 画质预设
| 预设 | 分辨率 | 比特率 | 适用场景 |
|------|--------|--------|----------|
| 240p | 426240 | 500k | 快速预览 |
| 360p | 640360 | 800k | 移动设备 |
| 480p | 854480 | 1.2M | 一般用途 |
| 720p | 1280720 | 2M | 默认设置 |
| 1080p | 19201080 | 4M | 最高质量 |

### 语音音色
- `voice_index=0`: zh-CN-XiaoxiaoNeural (默认)
- `voice_index=1-4`: 其他 Azure 语音音色

### 字幕样式配置
```json
{
    "fontSize": 50,
    "color": "white",
    "bgColor": [0, 0, 0, 30],
    "fontPath": "C:\\Windows\\Fonts\\msyh.ttc",
    "marginX": 100,
    "marginBottom": 50
}
```

##  MCP 工具函数说明

本项目基于 Model Context Protocol (MCP) 构建,提供了一套完整的视频生成工具函数。所有函数都通过 FastMCP 框架暴露为标准化接口,支持异步调用和任务管理。

### 核心视频生成函数

#### `generate_auto_video_mcp`
**主要视频生成接口**,支持完整的视频处理流程,包括语音合成、字幕生成、视频剪辑等。

**参数说明:**
- `video_path` (str): 输入视频文件路径 (必传)
- `text` (str): 要转换为语音的文本内容 (可选,为空时仅进行视频处理)
- `voice_index` (int): 语音音色索引,范围 0-4 (默认: 0)
  - 0: zh-CN-XiaoxiaoNeural (默认女声)
  - 1-4: 其他 Azure 语音音色
- `output_path` (str): 输出视频文件路径 (默认: "output_video.mp4")
- `segments_mode` (str): 视频片段处理模式 (默认: "keep")
  - "keep": 保留指定片段
  - "cut": 剪切指定片段
- `segments` (str): **视频片段配置,必须是JSON字符串格式** (可选)
  ```json
  [
    {"start": "00:00:05", "end": "00:00:15"}, 
    {"start": "00:00:30", "end": "00:00:45"}
  ]
  ```
  **注意**: 时间格式为 "HH:MM:SS",必须使用JSON字符串格式传递
- `subtitle_style` (str): **字幕样式配置,必须是JSON字符串格式** (可选)
  ```json
  {
    "fontSize": 50,
    "color": "white",
    "bgColor": [0, 0, 0, 30],
    "fontPath": "C:\\Windows\\Fonts\\msyh.ttc",
    "marginX": 100,
    "marginBottom": 50
  }
  ```
  **注意**: 必须使用JSON字符串格式传递,不能直接传递字典对象
- `auto_split_config` (str): **智能文本分割配置,必须是JSON字符串格式** (可选)
  ```json
  {
    "max_chars_per_line": 20,
    "max_duration_per_segment": 5.0,
    "min_duration_per_segment": 1.0
  }
  ```
  **注意**: 必须使用JSON字符串格式传递
- `quality_preset` (str): 输出视频画质预设 (默认: "720p")
  - 支持: "240p", "360p", "480p", "720p", "1080p"
- `enable_motion_clip` (bool): 是否启用自动静止片段检测 (默认: False)
- `motion_clip_params` (str): **运动检测参数配置,必须是JSON字符串格式** (可选)
  ```json
  {
    "motion_threshold": 0.1,
    "min_static_duration": 2.0,
    "sample_step": 1
  }
  ```
  **注意**: 必须使用JSON字符串格式传递,不能直接传递字典对象

**返回值:** JSON 字符串,包含处理结果和状态信息

**使用示例:**
```python
# 基本使用
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    text="欢迎观看本视频,这是AI自动生成的解说。",
    voice_index=0,
    output_path="output.mp4",
    quality_preset="1080p"
)

# 带JSON参数的高级使用
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    text="欢迎观看本视频,这是AI自动生成的解说。",
    voice_index=0,
    output_path="output.mp4",
    quality_preset="1080p",
    segments='[{"start": "00:00:05", "end": "00:00:15"}]',  # JSON字符串
    segments_mode="keep",
    subtitle_style='{"fontSize": 60, "color": "yellow", "bgColor": [0, 0, 0, 128]}',  # JSON字符串
    auto_split_config='{"max_chars_per_line": 25, "max_duration_per_segment": 4.0}',  # JSON字符串
    enable_motion_clip=True,
    motion_clip_params='{"motion_threshold": 0.15, "min_static_duration": 1.5, "sample_step": 2}'  # JSON字符串
)
```

#### `generate_auto_video_sync`
**同步视频生成接口**,适合短时间任务,会阻塞直到处理完成。

**参数:** 与 `generate_auto_video_mcp` 相同

**特点:**
- 同步执行,等待处理完成
- 适合短视频或快速处理
- 直接返回最终结果

#### `generate_auto_video_async`
**异步视频生成接口**,适合长时间任务,立即返回任务ID。

**参数:** 与 `generate_auto_video_mcp` 相同

**返回值:** 任务ID字符串

**特点:**
- 异步执行,不阻塞调用
- 适合长视频或复杂处理
- 需要通过任务管理接口查询状态

### 任务管理函数

#### `get_task_status(task_id: str)`
获取指定任务的详细状态信息。

**参数:**
- `task_id` (str): 任务ID

**返回值:** JSON 字符串,包含任务状态、进度、结果等信息
```json
{
  "task_id": "uuid-string",
  "status": "pending|running|completed|failed",
  "progress": 75,
  "result": "output_video.mp4",
  "error": null,
  "start_time": "2024-01-01T10:00:00",
  "created_at": "2024-01-01T09:55:00"
}
```

#### `list_all_tasks()`
列出系统中所有任务的概览信息。

**返回值:** JSON 字符串,包含所有任务的列表
```json
[
  {
    "task_id": "uuid-1",
    "status": "completed",
    "progress": 100,
    "created_at": "2024-01-01T09:55:00"
  },
  {
    "task_id": "uuid-2", 
    "status": "running",
    "progress": 45,
    "created_at": "2024-01-01T10:00:00"
  }
]
```

#### `cancel_task(task_id: str)`
取消正在运行的任务。

**参数:**
- `task_id` (str): 要取消的任务ID

**返回值:** 操作结果字符串

### 系统信息查询函数

#### `get_system_status()`
获取系统整体状态信息,包括配置、依赖、资源等。

**返回值:** JSON 字符串,包含系统状态
```json
{
  "ffmpeg_available": true,
  "azure_speech_configured": true,
  "font_available": true,
  "temp_directory": "C:\\temp",
  "max_concurrent_tasks": 5,
  "active_tasks": 2
}
```

#### `get_available_voice_options()`
获取所有可用的语音选项列表。

**返回值:** JSON 字符串,包含语音选项
```json
[
  {
    "index": 0,
    "name": "zh-CN-XiaoxiaoNeural",
    "description": "默认女声",
    "language": "zh-CN"
  },
  {
    "index": 1,
    "name": "zh-CN-YunxiNeural", 
    "description": "男声",
    "language": "zh-CN"
  }
]
```

### 参数验证函数

#### `validate_input_parameters(text: str, video_path: str, voice_index: int = 0)`
验证输入参数的有效性和完整性。

**参数:**
- `text` (str): 要验证的文本内容
- `video_path` (str): 要验证的视频文件路径
- `voice_index` (int): 要验证的语音索引

**返回值:** JSON 字符串,包含验证结果
```json
{
  "valid": true,
  "errors": [],
  "warnings": ["视频文件较大,建议使用异步处理"],
  "video_info": {
    "duration": 120.5,
    "resolution": "1920x1080",
    "format": "mp4"
  }
}
```

#### `get_generation_estimate(text: str, video_path: str)`
根据输入参数估算视频生成所需时间。

**参数:**
- `text` (str): 文本内容
- `video_path` (str): 视频文件路径

**返回值:** JSON 字符串,包含时间估算

#### `detect_video_motion_mcp(video_path: str, config_path: str = "best_motion_clip_params.json")`
**独立的运动检测工具**,用于分析视频中的静止片段。

**参数:**
- `video_path` (str): 要分析的视频文件路径
- `config_path` (str): 运动检测配置文件路径 (默认: "best_motion_clip_params.json")

**返回值:** JSON 字符串,包含检测结果
```json
{
  "video_path": "input.mp4",
  "config": {
    "motion_threshold": 0.1,
    "min_static_duration": 2.0,
    "sample_step": 1
  },
  "static_segments": [
    {
      "start": 5.2,
      "end": 8.5,
      "duration": 3.3
    }
  ],
  "timestamps": [
    {
      "start": "00:00:05.200",
      "end": "00:00:08.500"
    }
  ],
  "summary": {
    "total_segments": 5,
    "total_static_time": 15.6,
    "average_segment_duration": 3.12
  }
}
```

#### `optimize_video_motion_params_mcp(video_path: str, target_min_duration: float = 50.0, target_max_duration: float = 70.0)`
**运动检测参数优化工具**,自动寻找最佳参数以达到目标视频时长。

**参数:**
- `video_path` (str): 要优化的视频文件路径
- `target_min_duration` (float): 目标最小时长 (秒)
- `target_max_duration` (float): 目标最大时长 (秒)

**返回值:** JSON 字符串,包含优化结果
```json
{
  "success": true,
  "optimal_config": {
    "motion_threshold": 0.15,
    "min_static_duration": 1.5,
    "sample_step": 2
  },
  "message": "找到最优参数并已保存到配置文件"
}
```
```json
{
  "estimated_time": 180,
  "time_unit": "seconds",
  "factors": {
    "video_duration": 120,
    "text_length": 500,
    "processing_complexity": "medium"
  },
  "recommendation": "建议使用异步处理"
}
```

#### `get_system_performance_info_mcp()`
**系统性能信息工具**,获取详细的硬件配置和性能数据。

**返回值:** JSON 字符串,包含系统性能信息
```json
{
  "cpu": {
    "count": 12,
    "frequency": 2500.0,
    "usage": 21.3
  },
  "memory": {
    "total": 31,
    "available": 5,
    "usage": 81.2
  },
  "gpu": {
    "name": "AMD Radeon RX 580",
    "memory": 8,
    "driver": "22.40.00.01"
  }
}
```

#### `optimize_video_processing_mcp(video_path: str, target_quality: str = "720p")`
**视频处理优化工具**,根据系统配置自动优化处理参数。

**参数:**
- `video_path` (str): 要优化的视频文件路径
- `target_quality` (str): 目标画质预设

**返回值:** JSON 字符串,包含优化配置
```json
{
  "encoder": "hevc_amf",
  "preset": "speed",
  "quality": 18,
  "threads": 16,
  "buffer_size": 2048,
  "async_depth": 6,
  "bframes": 3,
  "ref_frames": 4,
  "enable_cache": true,
  "cache_size": 4096
}
```

#### `benchmark_gpu_performance_mcp()`
**GPU性能基准测试工具**,评估当前系统的视频处理能力。

**返回值:** JSON 字符串,包含性能测试结果
```json
{
  "processing_time": 3.45,
  "speed_multiplier": 2.90,
  "encoder": "hevc_amf",
  "threads": 16,
  "async_depth": 6,
  "performance_rating": "极佳 ⭐⭐⭐⭐⭐"
}
```

### 工具函数调用流程

#### 基本使用流程
1. **参数验证**: 使用 `validate_input_parameters()` 验证输入
2. **时间估算**: 使用 `get_generation_estimate()` 估算处理时间
3. **选择接口**: 根据估算时间选择同步或异步接口
4. **任务监控**: 异步任务使用 `get_task_status()` 监控进度
5. **结果获取**: 从返回结果中获取输出文件路径

#### 高级使用流程
1. **系统检查**: 使用 `get_system_status()` 检查系统状态
2. **语音选择**: 使用 `get_available_voice_options()` 选择合适的语音
3. **批量处理**: 使用 `list_all_tasks()` 管理多个任务
4. **异常处理**: 使用 `cancel_task()` 处理异常情况

### 错误处理

所有工具函数都包含完善的错误处理机制:

- **参数错误**: 返回详细的错误描述和修正建议
- **文件错误**: 检查文件存在性和格式有效性
- **系统错误**: 检查依赖项和系统资源
- **网络错误**: 处理 Azure 语音服务连接问题
- **处理错误**: 提供详细的错误日志和恢复建议

### 性能优化建议

1. **短视频 (< 30秒)**: 使用 `generate_auto_video_sync`
2. **长视频 (> 30秒)**: 使用 `generate_auto_video_async`
3. **批量处理**: 合理控制并发任务数量
4. **资源监控**: 定期检查系统状态和资源使用情况

##  项目结构

```
auto-video-generator-mcp/
 auto_generate_video_mcp_modular.py  # 主服务器文件
 auto_video_modules/                 # 核心模块目录
    __init__.py                     # 模块初始化
    config.py                       # 配置管理
    ffmpeg_utils.py                 # FFmpeg 工具
    mcp_tools.py                    # MCP 工具接口
    motion_detection_utils.py       # 运动检测工具
    gpu_optimization_utils.py       # GPU优化工具
    subtitle_utils.py               # 字幕处理
    video_utils.py                  # 视频处理
    voice_utils.py                  # 语音处理
 requirements.txt                    # Python 依赖
 README.md                          # 中文文档(默认)
 README_EN.md                       # 英文文档
```

##  故障排除

### 常见问题

#### 1. FFmpeg 未找到
**错误**: `FFmpeg not found in system PATH`
**解决**: 确保 FFmpeg 已安装并添加到系统 PATH,或设置 `FFMPEG_PATH` 环境变量。

#### 2. Azure 语音服务错误
**错误**: `Azure Speech Service authentication failed`
**解决**: 检查 `AZURE_SPEECH_KEY` 和 `AZURE_SPEECH_REGION` 环境变量配置。

#### 3. 字体文件未找到
**错误**: `Font file not found`
**解决**: 确保系统安装了微软雅黑字体,或修改 `config.py` 中的字体路径。

#### 4. 内存不足
**错误**: `Memory error during video processing`
**解决**: 使用较低的画质预设,或减少并发任务数量。

### 调试模式
设置环境变量 `DEBUG_MODE=true` 启用详细日志输出。

##  贡献指南

1. Fork 项目
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 打开 Pull Request

##  许可证

本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。

##  支持

如有问题或建议,请通过以下方式联系:

- 提交 Issue
- 发送邮件至项目维护者
- 查看项目 Wiki 获取更多信息

##  更新日志

### v3.0.0
- 重构为模块化架构
- 添加异步任务处理
- 支持多种画质预设
- 改进配置管理系统

### v2.0.0
- 添加智能文本分割
- 支持时间标记控制
- 改进字幕样式配置

### v1.0.0
- 初始版本发布
- 基础视频生成功能
- Azure 语音服务集成

##  使用场景示例

### 1. 教育视频制作
```python
# 为教学视频添加解说
result = await generate_auto_video_mcp(
    video_path="lecture.mp4",
    text="欢迎来到今天的课程。我们将学习人工智能的基础知识。首先,让我们了解什么是机器学习。",
    voice_index=0,
    quality_preset="720p",
    subtitle_style='{"fontSize": 60, "color": "white", "bgColor": [0, 0, 0, 50]}'  # JSON字符串
)
```

### 2. 产品演示视频
```python
# 产品功能演示
result = await generate_auto_video_mcp(
    video_path="product_demo.mp4",
    text="这款产品具有以下特点:{2s}第一,操作简单易用。{1s}第二,功能强大全面。{1s}第三,性价比极高。",
    voice_index=1,
    subtitle_style='{"fontSize": 60, "color": "yellow", "bgColor": [0, 0, 0, 30]}'  # JSON字符串
)
```

### 3. 视频剪辑和优化
```python
# 仅进行视频处理,不添加语音
result = await generate_auto_video_mcp(
    video_path="raw_video.mp4",
    text="",  # 空文本,只进行视频处理
    segments_mode="cut",
    segments='[{"start": "00:00:10", "end": "00:00:20"}]',  # JSON字符串
    quality_preset="1080p",
    enable_gpu_acceleration=True  # 启用极致GPU优化
)
```

##  大模型调用指南

### 重要提醒
当大模型调用本系统的工具函数时,**所有配置参数都必须使用JSON字符串格式**,不能直接传递字典对象。

### 正确的调用方式

#### 1. 基本视频生成
```python
# ✅ 正确:所有参数都是字符串格式
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    text="欢迎观看本视频",
    voice_index=0,
    output_path="output.mp4",
    quality_preset="720p"
)
```

#### 2. 带JSON参数的调用
```python
# ✅ 正确:JSON参数使用字符串格式
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    text="视频内容",
    segments='[{"start": "00:00:05", "end": "00:00:15"}]',  # JSON字符串
    subtitle_style='{"fontSize": 50, "color": "white"}',  # JSON字符串
    motion_clip_params='{"motion_threshold": 0.1, "min_static_duration": 2.0}',  # JSON字符串
    enable_gpu_acceleration=True
)
```

#### 3. 错误示例
```python
# ❌ 错误:直接传递字典对象
result = await generate_auto_video_mcp(
    video_path="input.mp4",
    segments=[{"start": "00:00:05", "end": "00:00:15"}],  # 错误!
    subtitle_style={"fontSize": 50, "color": "white"},  # 错误!
    motion_clip_params={"motion_threshold": 0.1}  # 错误!
)
```

### JSON字符串构建方法
```python
import json

# 方法1:使用json.dumps()
segments = json.dumps([{"start": "00:00:05", "end": "00:00:15"}])
subtitle_style = json.dumps({"fontSize": 50, "color": "white"})

# 方法2:直接写字符串
segments = '[{"start": "00:00:05", "end": "00:00:15"}]'
subtitle_style = '{"fontSize": 50, "color": "white"}'
```

##  最佳实践

### 1. 性能优化
- 对于长视频,建议使用异步任务处理
- 根据需求选择合适的画质预设
- 定期清理临时文件

### 2. 文本处理
- 合理使用时间标记控制节奏
- 避免过长的单段文本
- 利用智能分割功能优化字幕显示

### 3. 错误处理
- 始终检查输入参数的有效性
- 监控任务状态,及时处理异常
- 使用调试模式排查问题

##  特色功能

### 智能文本分割
系统会自动将长文本分割成适合显示的字幕片段,确保良好的观看体验。

### 时间标记语法
支持在文本中使用时间标记来控制静默时间:
- `{5s}` - 5秒静默
- `{5000ms}` - 5000毫秒静默
- `{2.5s}` - 2.5秒静默

### 多任务并发
支持同时处理多个视频生成任务,提高工作效率。

### 实时状态监控
提供完整的任务状态跟踪,实时了解处理进度。

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/zgmurder/auto_video_generator-mcp",
    "name": "auto-video-generator-mcp",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "zgmurder <zgmurder@example.com>",
    "keywords": "video, mcp, subtitle, speech, synthesis, ffmpeg, moviepy",
    "author": "zgmurder",
    "author_email": "zgmurder <zgmurder@example.com>",
    "download_url": null,
    "platform": null,
    "description": "\ufeff# Auto Video Generator MCP\r\n\r\n[English](README_EN.md) | [\u4e2d\u6587](README.md)\r\n\r\n\u4e00\u4e2a\u57fa\u4e8e MCP (Model Context Protocol) \u7684\u667a\u80fd\u89c6\u9891\u751f\u6210\u7cfb\u7edf\uff0c\u652f\u6301\u81ea\u52a8\u6dfb\u52a0\u5b57\u5e55\u3001\u8bed\u97f3\u5408\u6210\u548c\u89c6\u9891\u526a\u8f91\u529f\u80fd\u3002\r\n\r\n##  \u529f\u80fd\u7279\u6027\r\n\r\n### \u6838\u5fc3\u529f\u80fd\r\n- **\u667a\u80fd\u89c6\u9891\u526a\u8f91**: \u652f\u6301\u89c6\u9891\u7247\u6bb5\u4fdd\u7559/\u526a\u5207\u6a21\u5f0f\r\n- **\u81ea\u52a8\u5220\u9664\u91cd\u590d\u5e27/\u9759\u6b62\u7247\u6bb5**: \u4e00\u952e\u68c0\u6d4b\u5e76\u526a\u6389\u65e0\u6548\u753b\u9762\uff0c\u63d0\u5347\u89c6\u9891\u7cbe\u534e\u5ea6\uff08\u53ef\u9009\u53c2\u6570\uff0c\u9ed8\u8ba4\u5173\u95ed\uff09\r\n- **\u81ea\u52a8\u5b57\u5e55\u751f\u6210**: \u667a\u80fd\u6587\u672c\u5206\u5272\u548c\u5b57\u5e55\u6837\u5f0f\u81ea\u5b9a\u4e49\r\n- **\u8bed\u97f3\u5408\u6210**: \u96c6\u6210 Azure \u8bed\u97f3\u670d\u52a1\uff0c\u652f\u6301\u591a\u79cd\u97f3\u8272\r\n- **\u591a\u753b\u8d28\u8f93\u51fa**: \u652f\u6301 240p \u5230 1080p \u591a\u79cd\u753b\u8d28\u9884\u8bbe\r\n- **GPU \u52a0\u901f\u7f16\u7801**: \u652f\u6301 AMD AMF\u3001NVIDIA NVENC\u3001Intel QSV \u786c\u4ef6\u7f16\u7801\u52a0\u901f\r\n- **\u5f02\u6b65\u4efb\u52a1\u5904\u7406**: \u652f\u6301\u957f\u65f6\u95f4\u4efb\u52a1\u7684\u5f02\u6b65\u5904\u7406\r\n- **\u65f6\u95f4\u6807\u8bb0\u63a7\u5236**: \u652f\u6301\u5728\u6587\u672c\u4e2d\u4f7f\u7528\u65f6\u95f4\u6807\u8bb0\u63a7\u5236\u9759\u9ed8\u65f6\u95f4\r\n\r\n### \u6280\u672f\u7279\u6027\r\n- **\u6a21\u5757\u5316\u67b6\u6784**: \u6e05\u6670\u7684\u6a21\u5757\u5206\u79bb\uff0c\u6613\u4e8e\u7ef4\u62a4\u548c\u6269\u5c55\r\n- **MCP \u534f\u8bae**: \u57fa\u4e8e FastMCP \u7684\u6807\u51c6\u5316\u63a5\u53e3\r\n- **\u914d\u7f6e\u7ba1\u7406**: \u7075\u6d3b\u7684\u914d\u7f6e\u7cfb\u7edf\uff0c\u652f\u6301\u73af\u5883\u53d8\u91cf\r\n- **\u4efb\u52a1\u7ba1\u7406**: \u5b8c\u6574\u7684\u4efb\u52a1\u72b6\u6001\u8ddf\u8e2a\u548c\u7ba1\u7406\r\n- **\u4e34\u65f6\u6587\u4ef6\u6e05\u7406**: \u81ea\u52a8\u6e05\u7406\u5904\u7406\u8fc7\u7a0b\u4e2d\u7684\u4e34\u65f6\u6587\u4ef6\r\n\r\n##  \u7cfb\u7edf\u8981\u6c42\r\n\r\n### \u8f6f\u4ef6\u4f9d\u8d56\r\n- Python 3.8+\r\n- FFmpeg (\u9700\u8981\u9884\u5148\u5b89\u88c5\u5e76\u914d\u7f6e\u5230\u7cfb\u7edf PATH)\r\n- Windows \u7cfb\u7edf (\u5b57\u4f53\u8def\u5f84\u914d\u7f6e)\r\n\r\n### Python \u4f9d\u8d56\r\n```\r\nhttpx>=0.24.0\r\nfastmcp>=0.1.0\r\nazure-cognitiveservices-speech>=1.31.0\r\npydub>=0.25.1\r\nmoviepy>=1.0.3\r\nopencv-python>=4.8.0\r\nPillow>=10.0.0\r\njieba>=0.42.1\r\n```\r\n\r\n##  \u5b89\u88c5\u914d\u7f6e\r\n\r\n### 1. \u514b\u9686\u9879\u76ee\r\n```bash\r\ngit clone https://github.com/zgmurder/auto_video_generator-mcp.git\r\ncd auto-video-generator-mcp\r\n```\r\n\r\n### 2. \u5b89\u88c5\u4f9d\u8d56\r\n```bash\r\npip install -r requirements.txt\r\n```\r\n\r\n### 3. \u914d\u7f6e\u73af\u5883\u53d8\u91cf\r\n```bash\r\n# FFmpeg \u8def\u5f84\u914d\u7f6e (\u53ef\u9009)\r\nexport FFMPEG_PATH=\"path/to/ffmpeg\"\r\nexport FFPROBE_PATH=\"path/to/ffprobe\"\r\n\r\n# \u8c03\u8bd5\u6a21\u5f0f (\u53ef\u9009)\r\nexport DEBUG_MODE=\"true\"\r\n```\r\n\r\n### 4. \u542f\u52a8\u670d\u52a1\u5668\r\n```bash\r\npython auto_generate_video_mcp_modular.py\r\n```\r\n\r\n\u670d\u52a1\u5668\u5c06\u5728 `http://localhost:8000/sse` \u542f\u52a8\u3002\r\n\r\n##  \u4f7f\u7528\u6307\u5357\r\n\r\n### \u57fa\u672c\u4f7f\u7528\r\n\r\n#### 1. \u7b80\u5355\u89c6\u9891\u751f\u6210\r\n```python\r\n# \u751f\u6210\u5e26\u5b57\u5e55\u548c\u8bed\u97f3\u7684\u89c6\u9891\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    text=\"\u6b22\u8fce\u89c2\u770b\u672c\u89c6\u9891\uff0c\u8fd9\u662fAI\u81ea\u52a8\u751f\u6210\u7684\u89e3\u8bf4\u3002\",\r\n    voice_index=0,\r\n    output_path=\"output.mp4\"\r\n)\r\n```\r\n\r\n#### 2. \u81ea\u5b9a\u4e49\u753b\u8d28\r\n```python\r\n# \u751f\u6210\u9ad8\u6e05\u89c6\u9891\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    text=\"\u9ad8\u6e05\u89c6\u9891\u5185\u5bb9\",\r\n    quality_preset=\"1080p\"\r\n)\r\n```\r\n\r\n#### 3. \u89c6\u9891\u7247\u6bb5\u5904\u7406\r\n```python\r\n# \u4fdd\u7559\u6307\u5b9a\u7247\u6bb5 - \u6ce8\u610f\uff1asegments\u5fc5\u987b\u662fJSON\u5b57\u7b26\u4e32\u683c\u5f0f\r\nsegments = '[{\"start\": \"00:00:05\", \"end\": \"00:00:15\"}]'  # JSON\u5b57\u7b26\u4e32\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    text=\"\u7247\u6bb5\u89e3\u8bf4\",\r\n    segments_mode=\"keep\",\r\n    segments=segments  # \u4f20\u9012JSON\u5b57\u7b26\u4e32\uff0c\u4e0d\u662f\u5b57\u5178\u5bf9\u8c61\r\n)\r\n\r\n# \u526a\u5207\u6307\u5b9a\u7247\u6bb5\r\nsegments = '[{\"start\": \"00:00:10\", \"end\": \"00:00:20\"}, {\"start\": \"00:00:30\", \"end\": \"00:00:40\"}]'\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    text=\"\u526a\u5207\u7247\u6bb5\u89e3\u8bf4\",\r\n    segments_mode=\"cut\",\r\n    segments=segments  # JSON\u5b57\u7b26\u4e32\u683c\u5f0f\r\n)\r\n```\r\n\r\n### \u9ad8\u7ea7\u529f\u80fd\r\n\r\n#### 1. \u65f6\u95f4\u6807\u8bb0\u63a7\u5236\r\n```python\r\n# \u4f7f\u7528\u65f6\u95f4\u6807\u8bb0\u63a7\u5236\u9759\u9ed8\u65f6\u95f4\r\ntext = \"{5s}\u6b22\u8fce\u89c2\u770b{5000ms}\u672c\u89c6\u9891\u7531AI\u81ea\u52a8\u526a\u8f91\u5e76\u6dfb\u52a0\u667a\u80fd\u5b57\u5e55\u548c\u8bed\u97f3\u89e3\u8bf4\u3002{2s}\u611f\u8c22\u60a8\u7684\u89c2\u770b\uff01\"\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    text=text\r\n)\r\n```\r\n\r\n#### 2. \u81ea\u5b9a\u4e49\u5b57\u5e55\u6837\u5f0f\r\n```python\r\n# \u81ea\u5b9a\u4e49\u5b57\u5e55\u6837\u5f0f - \u6ce8\u610f\uff1asubtitle_style\u5fc5\u987b\u662fJSON\u5b57\u7b26\u4e32\u683c\u5f0f\r\nsubtitle_style = '{\"fontSize\": 60, \"color\": \"yellow\", \"bgColor\": [0, 0, 0, 128]}'  # JSON\u5b57\u7b26\u4e32\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    text=\"\u81ea\u5b9a\u4e49\u5b57\u5e55\u6837\u5f0f\",\r\n    subtitle_style=subtitle_style  # \u4f20\u9012JSON\u5b57\u7b26\u4e32\uff0c\u4e0d\u662f\u5b57\u5178\u5bf9\u8c61\r\n)\r\n\r\n# \u66f4\u591a\u5b57\u5e55\u6837\u5f0f\u793a\u4f8b\r\nsubtitle_style = '{\"fontSize\": 50, \"color\": \"white\", \"bgColor\": [0, 0, 0, 30], \"marginX\": 100, \"marginBottom\": 50}'\r\n```\r\n\r\n#### 3. \u5f02\u6b65\u4efb\u52a1\u5904\u7406\r\n```python\r\n# \u521b\u5efa\u5f02\u6b65\u4efb\u52a1\r\ntask_id = await generate_auto_video_async(\r\n    video_path=\"input.mp4\",\r\n    text=\"\u957f\u65f6\u95f4\u5904\u7406\u4efb\u52a1\"\r\n)\r\n\r\n# \u67e5\u8be2\u4efb\u52a1\u72b6\u6001\r\nstatus = await get_task_status(task_id)\r\n\r\n# \u53d6\u6d88\u4efb\u52a1\r\nawait cancel_task(task_id)\r\n```\r\n\r\n#### 4. \u81ea\u52a8\u5220\u9664\u91cd\u590d\u5e27/\u9759\u6b62\u7247\u6bb5\r\n```python\r\n# \u81ea\u52a8\u68c0\u6d4b\u5e76\u526a\u6389\u89c6\u9891\u4e2d\u7684\u9759\u6b62/\u65e0\u804a\u7247\u6bb5\uff08\u5982\u957f\u65f6\u95f4\u65e0\u52a8\u4f5c\u753b\u9762\uff09\r\n# \u65b9\u6cd51\uff1a\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u53c2\u6570\r\nimport json\r\nwith open(\"best_motion_clip_params.json\", \"r\", encoding=\"utf-8\") as f:\r\n    motion_params = json.load(f)\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    output_path=\"output_motion_clip.mp4\",\r\n    enable_motion_clip=True,  # \u542f\u7528\u81ea\u52a8\u9759\u6b62\u7247\u6bb5\u68c0\u6d4b\r\n    motion_clip_params=json.dumps(motion_params)  # \u8f6c\u6362\u4e3aJSON\u5b57\u7b26\u4e32\r\n)\r\n\r\n# \u65b9\u6cd52\uff1a\u76f4\u63a5\u4f20\u5165JSON\u5b57\u7b26\u4e32\u53c2\u6570\r\nmotion_params = '{\"motion_threshold\": 0.1, \"min_static_duration\": 2.0, \"sample_step\": 1}'  # JSON\u5b57\u7b26\u4e32\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    output_path=\"output_motion_clip.mp4\",\r\n    enable_motion_clip=True,\r\n    motion_clip_params=motion_params  # \u76f4\u63a5\u4f20\u9012JSON\u5b57\u7b26\u4e32\r\n)\r\n```\r\n\r\n#### 5. \u6781\u81f4GPU\u52a0\u901f\u7f16\u7801\r\n```python\r\n# \u4f7f\u7528\u6781\u81f4GPU\u4f18\u5316\u8fdb\u884c\u89c6\u9891\u7f16\u7801\uff0c\u5c06\u663e\u5361\u6027\u80fd\u53d1\u6325\u5230\u6700\u5927\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    text=\"\u6781\u81f4GPU\u52a0\u901f\u89c6\u9891\u5904\u7406\",\r\n    enable_gpu_acceleration=True,  # \u542f\u7528\u6781\u81f4GPU\u52a0\u901f\r\n    gpu_type=\"auto\",  # \u81ea\u52a8\u68c0\u6d4bGPU\u7c7b\u578b\uff0c\u6216\u6307\u5b9a\"amd\"/\"nvidia\"/\"intel\"\r\n    quality_preset=\"1080p\"\r\n)\r\n\r\n# \u83b7\u53d6\u7cfb\u7edf\u6027\u80fd\u4fe1\u606f\r\nperformance_info = await get_system_performance_info_mcp()\r\n\r\n# \u4f18\u5316\u89c6\u9891\u5904\u7406\u53c2\u6570\r\noptimized_config = await optimize_video_processing_mcp(\"input.mp4\", \"1080p\")\r\n\r\n# GPU\u6027\u80fd\u57fa\u51c6\u6d4b\u8bd5\r\nbenchmark_result = await benchmark_gpu_performance_mcp()\r\n```\r\n\r\n> **\u91cd\u8981\u8bf4\u660e**\uff1a\r\n> - **JSON\u53c2\u6570\u683c\u5f0f**: \u6240\u6709\u914d\u7f6e\u53c2\u6570\uff08`segments`, `subtitle_style`, `auto_split_config`, `motion_clip_params`\uff09\u90fd\u5fc5\u987b\u4f7f\u7528JSON\u5b57\u7b26\u4e32\u683c\u5f0f\u4f20\u9012\uff0c\u4e0d\u80fd\u76f4\u63a5\u4f20\u9012\u5b57\u5178\u5bf9\u8c61\u3002\r\n> - **\u65f6\u95f4\u683c\u5f0f**: \u89c6\u9891\u7247\u6bb5\u65f6\u95f4\u683c\u5f0f\u4e3a \"HH:MM:SS\"\uff0c\u4f8b\u5982 \"00:00:05\" \u8868\u793a5\u79d2\u3002\r\n> - **\u8fd0\u52a8\u68c0\u6d4b**: `enable_motion_clip=True` \u65f6\uff0c\u7cfb\u7edf\u4f1a\u81ea\u52a8\u5206\u6790\u89c6\u9891\uff0c\u68c0\u6d4b\u5e76\u526a\u6389\u6240\u6709\u9759\u6b62/\u91cd\u590d\u5e27\u7247\u6bb5\u3002\r\n> - **GPU\u4f18\u5316**: `enable_gpu_acceleration=True` \u65f6\uff0c\u7cfb\u7edf\u4f1a\u542f\u7528\u6781\u81f4GPU\u4f18\u5316\uff0c\u81ea\u52a8\u68c0\u6d4b\u786c\u4ef6\u914d\u7f6e\u5e76\u4f18\u5316\u7f16\u7801\u53c2\u6570\u3002\r\n> - **\u6781\u81f4GPU\u4f18\u5316**: \u5305\u62ec\u591a\u7ebf\u7a0b\u5904\u7406\u3001\u5185\u5b58\u4f18\u5316\u3001\u7f16\u7801\u5668\u8c03\u4f18\u3001\u5f02\u6b65\u5904\u7406\u3001\u7f13\u5b58\u4f18\u5316\u7b49\u3002\r\n> - **\u517c\u5bb9\u6027**: \u4e0d\u5f71\u54cd\u539f\u6709\u5b57\u5e55\u3001\u8bed\u97f3\u7b49\u529f\u80fd\uff0c\u5b8c\u5168\u517c\u5bb9\u3002\r\n\r\n##  JSON\u53c2\u6570\u683c\u5f0f\u8bf4\u660e\r\n\r\n### \u91cd\u8981\u63d0\u9192\r\n\u6240\u6709\u914d\u7f6e\u53c2\u6570\u90fd\u5fc5\u987b\u4f7f\u7528**JSON\u5b57\u7b26\u4e32\u683c\u5f0f**\u4f20\u9012\uff0c\u4e0d\u80fd\u76f4\u63a5\u4f20\u9012\u5b57\u5178\u5bf9\u8c61\u3002\u8fd9\u662f\u4e3a\u4e86\u786e\u4fddMCP\u534f\u8bae\u7684\u517c\u5bb9\u6027\u548c\u6570\u636e\u4f20\u9012\u7684\u51c6\u786e\u6027\u3002\r\n\r\n### \u53c2\u6570\u683c\u5f0f\u793a\u4f8b\r\n\r\n#### 1. \u89c6\u9891\u7247\u6bb5\u914d\u7f6e (`segments`)\r\n```json\r\n[\r\n  {\"start\": \"00:00:05\", \"end\": \"00:00:15\"},\r\n  {\"start\": \"00:00:30\", \"end\": \"00:00:45\"}\r\n]\r\n```\r\n**\u4f20\u9012\u65b9\u5f0f**: `segments='[{\"start\": \"00:00:05\", \"end\": \"00:00:15\"}]'`\r\n\r\n#### 2. \u5b57\u5e55\u6837\u5f0f\u914d\u7f6e (`subtitle_style`)\r\n```json\r\n{\r\n  \"fontSize\": 50,\r\n  \"color\": \"white\",\r\n  \"bgColor\": [0, 0, 0, 30],\r\n  \"fontPath\": \"C:\\\\Windows\\\\Fonts\\\\msyh.ttc\",\r\n  \"marginX\": 100,\r\n  \"marginBottom\": 50\r\n}\r\n```\r\n**\u4f20\u9012\u65b9\u5f0f**: `subtitle_style='{\"fontSize\": 50, \"color\": \"white\"}'`\r\n\r\n**\u652f\u6301\u7684\u5b57\u6bb5\u540d\u683c\u5f0f**:\r\n- \u5b57\u4f53\u5927\u5c0f: `fontSize`, `font_size`, `size`\r\n- \u5b57\u4f53\u989c\u8272: `color`, `font_color`, `fontColor`, `text_color`, `textColor`\r\n- \u80cc\u666f\u989c\u8272: `bgColor`, `bg_color`, `background_color`, `backgroundColor`\r\n- \u5b57\u4f53\u8def\u5f84: `fontPath`, `font_path`, `font`\r\n- \u5de6\u53f3\u8fb9\u8ddd: `marginX`, `margin_x`, `margin`\r\n- \u5e95\u90e8\u8fb9\u8ddd: `marginBottom`, `margin_bottom`, `bottom_margin`\r\n- \u5b57\u5e55\u9ad8\u5ea6: `height`, `subtitle_height`\r\n\r\n**\u989c\u8272\u683c\u5f0f\u652f\u6301**:\r\n- \u989c\u8272\u540d\u79f0: `\"white\"`, `\"black\"`, `\"red\"`, `\"yellow\"` \u7b49\r\n- \u5341\u516d\u8fdb\u5236: `\"#000000\"`, `\"#FFFFFF\"` \u7b49\r\n- RGB\u6570\u7ec4: `[255, 255, 255]`\r\n- RGBA\u6570\u7ec4: `[0, 0, 0, 30]` (\u6700\u540e\u4e00\u4e2a\u6570\u5b57\u662f\u900f\u660e\u5ea6)\r\n- \u900f\u660e\u80cc\u666f: `\"transparent\"`\r\n\r\n#### 3. \u667a\u80fd\u5206\u5272\u914d\u7f6e (`auto_split_config`)\r\n```json\r\n{\r\n  \"max_chars_per_line\": 20,\r\n  \"max_duration_per_segment\": 5.0,\r\n  \"min_duration_per_segment\": 1.0\r\n}\r\n```\r\n**\u4f20\u9012\u65b9\u5f0f**: `auto_split_config='{\"max_chars_per_line\": 20, \"max_duration_per_segment\": 5.0}'`\r\n\r\n#### 4. \u8fd0\u52a8\u68c0\u6d4b\u914d\u7f6e (`motion_clip_params`)\r\n```json\r\n{\r\n  \"motion_threshold\": 0.1,\r\n  \"min_static_duration\": 2.0,\r\n  \"sample_step\": 1\r\n}\r\n```\r\n**\u4f20\u9012\u65b9\u5f0f**: `motion_clip_params='{\"motion_threshold\": 0.1, \"min_static_duration\": 2.0}'`\r\n\r\n### \u5e38\u89c1\u9519\u8bef\u793a\u4f8b\r\n```python\r\n# \u274c \u9519\u8bef\uff1a\u76f4\u63a5\u4f20\u9012\u5b57\u5178\u5bf9\u8c61\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    segments=[{\"start\": \"00:00:05\", \"end\": \"00:00:15\"}]  # \u9519\u8bef\uff01\r\n)\r\n\r\n# \u2705 \u6b63\u786e\uff1a\u4f20\u9012JSON\u5b57\u7b26\u4e32\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    segments='[{\"start\": \"00:00:05\", \"end\": \"00:00:15\"}]'  # \u6b63\u786e\uff01\r\n)\r\n\r\n# \u2705 \u6b63\u786e\uff1a\u652f\u6301\u591a\u79cd\u5b57\u6bb5\u540d\u683c\u5f0f\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    text=\"\u6d4b\u8bd5\u5b57\u5e55\u6837\u5f0f\",\r\n    subtitle_style='{\"font_color\": \"#000000\", \"background_color\": \"transparent\", \"font_size\": 36}'  # \u652f\u6301\u591a\u79cd\u5b57\u6bb5\u540d\r\n)\r\n```\r\n\r\n##  \u914d\u7f6e\u8bf4\u660e\r\n\r\n### \u753b\u8d28\u9884\u8bbe\r\n| \u9884\u8bbe | \u5206\u8fa8\u7387 | \u6bd4\u7279\u7387 | \u9002\u7528\u573a\u666f |\r\n|------|--------|--------|----------|\r\n| 240p | 426240 | 500k | \u5feb\u901f\u9884\u89c8 |\r\n| 360p | 640360 | 800k | \u79fb\u52a8\u8bbe\u5907 |\r\n| 480p | 854480 | 1.2M | \u4e00\u822c\u7528\u9014 |\r\n| 720p | 1280720 | 2M | \u9ed8\u8ba4\u8bbe\u7f6e |\r\n| 1080p | 19201080 | 4M | \u6700\u9ad8\u8d28\u91cf |\r\n\r\n### \u8bed\u97f3\u97f3\u8272\r\n- `voice_index=0`: zh-CN-XiaoxiaoNeural (\u9ed8\u8ba4)\r\n- `voice_index=1-4`: \u5176\u4ed6 Azure \u8bed\u97f3\u97f3\u8272\r\n\r\n### \u5b57\u5e55\u6837\u5f0f\u914d\u7f6e\r\n```json\r\n{\r\n    \"fontSize\": 50,\r\n    \"color\": \"white\",\r\n    \"bgColor\": [0, 0, 0, 30],\r\n    \"fontPath\": \"C:\\\\Windows\\\\Fonts\\\\msyh.ttc\",\r\n    \"marginX\": 100,\r\n    \"marginBottom\": 50\r\n}\r\n```\r\n\r\n##  MCP \u5de5\u5177\u51fd\u6570\u8bf4\u660e\r\n\r\n\u672c\u9879\u76ee\u57fa\u4e8e Model Context Protocol (MCP) \u6784\u5efa\uff0c\u63d0\u4f9b\u4e86\u4e00\u5957\u5b8c\u6574\u7684\u89c6\u9891\u751f\u6210\u5de5\u5177\u51fd\u6570\u3002\u6240\u6709\u51fd\u6570\u90fd\u901a\u8fc7 FastMCP \u6846\u67b6\u66b4\u9732\u4e3a\u6807\u51c6\u5316\u63a5\u53e3\uff0c\u652f\u6301\u5f02\u6b65\u8c03\u7528\u548c\u4efb\u52a1\u7ba1\u7406\u3002\r\n\r\n### \u6838\u5fc3\u89c6\u9891\u751f\u6210\u51fd\u6570\r\n\r\n#### `generate_auto_video_mcp`\r\n**\u4e3b\u8981\u89c6\u9891\u751f\u6210\u63a5\u53e3**\uff0c\u652f\u6301\u5b8c\u6574\u7684\u89c6\u9891\u5904\u7406\u6d41\u7a0b\uff0c\u5305\u62ec\u8bed\u97f3\u5408\u6210\u3001\u5b57\u5e55\u751f\u6210\u3001\u89c6\u9891\u526a\u8f91\u7b49\u3002\r\n\r\n**\u53c2\u6570\u8bf4\u660e:**\r\n- `video_path` (str): \u8f93\u5165\u89c6\u9891\u6587\u4ef6\u8def\u5f84 (\u5fc5\u4f20)\r\n- `text` (str): \u8981\u8f6c\u6362\u4e3a\u8bed\u97f3\u7684\u6587\u672c\u5185\u5bb9 (\u53ef\u9009\uff0c\u4e3a\u7a7a\u65f6\u4ec5\u8fdb\u884c\u89c6\u9891\u5904\u7406)\r\n- `voice_index` (int): \u8bed\u97f3\u97f3\u8272\u7d22\u5f15\uff0c\u8303\u56f4 0-4 (\u9ed8\u8ba4: 0)\r\n  - 0: zh-CN-XiaoxiaoNeural (\u9ed8\u8ba4\u5973\u58f0)\r\n  - 1-4: \u5176\u4ed6 Azure \u8bed\u97f3\u97f3\u8272\r\n- `output_path` (str): \u8f93\u51fa\u89c6\u9891\u6587\u4ef6\u8def\u5f84 (\u9ed8\u8ba4: \"output_video.mp4\")\r\n- `segments_mode` (str): \u89c6\u9891\u7247\u6bb5\u5904\u7406\u6a21\u5f0f (\u9ed8\u8ba4: \"keep\")\r\n  - \"keep\": \u4fdd\u7559\u6307\u5b9a\u7247\u6bb5\r\n  - \"cut\": \u526a\u5207\u6307\u5b9a\u7247\u6bb5\r\n- `segments` (str): **\u89c6\u9891\u7247\u6bb5\u914d\u7f6e\uff0c\u5fc5\u987b\u662fJSON\u5b57\u7b26\u4e32\u683c\u5f0f** (\u53ef\u9009)\r\n  ```json\r\n  [\r\n    {\"start\": \"00:00:05\", \"end\": \"00:00:15\"}, \r\n    {\"start\": \"00:00:30\", \"end\": \"00:00:45\"}\r\n  ]\r\n  ```\r\n  **\u6ce8\u610f**: \u65f6\u95f4\u683c\u5f0f\u4e3a \"HH:MM:SS\"\uff0c\u5fc5\u987b\u4f7f\u7528JSON\u5b57\u7b26\u4e32\u683c\u5f0f\u4f20\u9012\r\n- `subtitle_style` (str): **\u5b57\u5e55\u6837\u5f0f\u914d\u7f6e\uff0c\u5fc5\u987b\u662fJSON\u5b57\u7b26\u4e32\u683c\u5f0f** (\u53ef\u9009)\r\n  ```json\r\n  {\r\n    \"fontSize\": 50,\r\n    \"color\": \"white\",\r\n    \"bgColor\": [0, 0, 0, 30],\r\n    \"fontPath\": \"C:\\\\Windows\\\\Fonts\\\\msyh.ttc\",\r\n    \"marginX\": 100,\r\n    \"marginBottom\": 50\r\n  }\r\n  ```\r\n  **\u6ce8\u610f**: \u5fc5\u987b\u4f7f\u7528JSON\u5b57\u7b26\u4e32\u683c\u5f0f\u4f20\u9012\uff0c\u4e0d\u80fd\u76f4\u63a5\u4f20\u9012\u5b57\u5178\u5bf9\u8c61\r\n- `auto_split_config` (str): **\u667a\u80fd\u6587\u672c\u5206\u5272\u914d\u7f6e\uff0c\u5fc5\u987b\u662fJSON\u5b57\u7b26\u4e32\u683c\u5f0f** (\u53ef\u9009)\r\n  ```json\r\n  {\r\n    \"max_chars_per_line\": 20,\r\n    \"max_duration_per_segment\": 5.0,\r\n    \"min_duration_per_segment\": 1.0\r\n  }\r\n  ```\r\n  **\u6ce8\u610f**: \u5fc5\u987b\u4f7f\u7528JSON\u5b57\u7b26\u4e32\u683c\u5f0f\u4f20\u9012\r\n- `quality_preset` (str): \u8f93\u51fa\u89c6\u9891\u753b\u8d28\u9884\u8bbe (\u9ed8\u8ba4: \"720p\")\r\n  - \u652f\u6301: \"240p\", \"360p\", \"480p\", \"720p\", \"1080p\"\r\n- `enable_motion_clip` (bool): \u662f\u5426\u542f\u7528\u81ea\u52a8\u9759\u6b62\u7247\u6bb5\u68c0\u6d4b (\u9ed8\u8ba4: False)\r\n- `motion_clip_params` (str): **\u8fd0\u52a8\u68c0\u6d4b\u53c2\u6570\u914d\u7f6e\uff0c\u5fc5\u987b\u662fJSON\u5b57\u7b26\u4e32\u683c\u5f0f** (\u53ef\u9009)\r\n  ```json\r\n  {\r\n    \"motion_threshold\": 0.1,\r\n    \"min_static_duration\": 2.0,\r\n    \"sample_step\": 1\r\n  }\r\n  ```\r\n  **\u6ce8\u610f**: \u5fc5\u987b\u4f7f\u7528JSON\u5b57\u7b26\u4e32\u683c\u5f0f\u4f20\u9012\uff0c\u4e0d\u80fd\u76f4\u63a5\u4f20\u9012\u5b57\u5178\u5bf9\u8c61\r\n\r\n**\u8fd4\u56de\u503c:** JSON \u5b57\u7b26\u4e32\uff0c\u5305\u542b\u5904\u7406\u7ed3\u679c\u548c\u72b6\u6001\u4fe1\u606f\r\n\r\n**\u4f7f\u7528\u793a\u4f8b:**\r\n```python\r\n# \u57fa\u672c\u4f7f\u7528\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    text=\"\u6b22\u8fce\u89c2\u770b\u672c\u89c6\u9891\uff0c\u8fd9\u662fAI\u81ea\u52a8\u751f\u6210\u7684\u89e3\u8bf4\u3002\",\r\n    voice_index=0,\r\n    output_path=\"output.mp4\",\r\n    quality_preset=\"1080p\"\r\n)\r\n\r\n# \u5e26JSON\u53c2\u6570\u7684\u9ad8\u7ea7\u4f7f\u7528\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    text=\"\u6b22\u8fce\u89c2\u770b\u672c\u89c6\u9891\uff0c\u8fd9\u662fAI\u81ea\u52a8\u751f\u6210\u7684\u89e3\u8bf4\u3002\",\r\n    voice_index=0,\r\n    output_path=\"output.mp4\",\r\n    quality_preset=\"1080p\",\r\n    segments='[{\"start\": \"00:00:05\", \"end\": \"00:00:15\"}]',  # JSON\u5b57\u7b26\u4e32\r\n    segments_mode=\"keep\",\r\n    subtitle_style='{\"fontSize\": 60, \"color\": \"yellow\", \"bgColor\": [0, 0, 0, 128]}',  # JSON\u5b57\u7b26\u4e32\r\n    auto_split_config='{\"max_chars_per_line\": 25, \"max_duration_per_segment\": 4.0}',  # JSON\u5b57\u7b26\u4e32\r\n    enable_motion_clip=True,\r\n    motion_clip_params='{\"motion_threshold\": 0.15, \"min_static_duration\": 1.5, \"sample_step\": 2}'  # JSON\u5b57\u7b26\u4e32\r\n)\r\n```\r\n\r\n#### `generate_auto_video_sync`\r\n**\u540c\u6b65\u89c6\u9891\u751f\u6210\u63a5\u53e3**\uff0c\u9002\u5408\u77ed\u65f6\u95f4\u4efb\u52a1\uff0c\u4f1a\u963b\u585e\u76f4\u5230\u5904\u7406\u5b8c\u6210\u3002\r\n\r\n**\u53c2\u6570:** \u4e0e `generate_auto_video_mcp` \u76f8\u540c\r\n\r\n**\u7279\u70b9:**\r\n- \u540c\u6b65\u6267\u884c\uff0c\u7b49\u5f85\u5904\u7406\u5b8c\u6210\r\n- \u9002\u5408\u77ed\u89c6\u9891\u6216\u5feb\u901f\u5904\u7406\r\n- \u76f4\u63a5\u8fd4\u56de\u6700\u7ec8\u7ed3\u679c\r\n\r\n#### `generate_auto_video_async`\r\n**\u5f02\u6b65\u89c6\u9891\u751f\u6210\u63a5\u53e3**\uff0c\u9002\u5408\u957f\u65f6\u95f4\u4efb\u52a1\uff0c\u7acb\u5373\u8fd4\u56de\u4efb\u52a1ID\u3002\r\n\r\n**\u53c2\u6570:** \u4e0e `generate_auto_video_mcp` \u76f8\u540c\r\n\r\n**\u8fd4\u56de\u503c:** \u4efb\u52a1ID\u5b57\u7b26\u4e32\r\n\r\n**\u7279\u70b9:**\r\n- \u5f02\u6b65\u6267\u884c\uff0c\u4e0d\u963b\u585e\u8c03\u7528\r\n- \u9002\u5408\u957f\u89c6\u9891\u6216\u590d\u6742\u5904\u7406\r\n- \u9700\u8981\u901a\u8fc7\u4efb\u52a1\u7ba1\u7406\u63a5\u53e3\u67e5\u8be2\u72b6\u6001\r\n\r\n### \u4efb\u52a1\u7ba1\u7406\u51fd\u6570\r\n\r\n#### `get_task_status(task_id: str)`\r\n\u83b7\u53d6\u6307\u5b9a\u4efb\u52a1\u7684\u8be6\u7ec6\u72b6\u6001\u4fe1\u606f\u3002\r\n\r\n**\u53c2\u6570:**\r\n- `task_id` (str): \u4efb\u52a1ID\r\n\r\n**\u8fd4\u56de\u503c:** JSON \u5b57\u7b26\u4e32\uff0c\u5305\u542b\u4efb\u52a1\u72b6\u6001\u3001\u8fdb\u5ea6\u3001\u7ed3\u679c\u7b49\u4fe1\u606f\r\n```json\r\n{\r\n  \"task_id\": \"uuid-string\",\r\n  \"status\": \"pending|running|completed|failed\",\r\n  \"progress\": 75,\r\n  \"result\": \"output_video.mp4\",\r\n  \"error\": null,\r\n  \"start_time\": \"2024-01-01T10:00:00\",\r\n  \"created_at\": \"2024-01-01T09:55:00\"\r\n}\r\n```\r\n\r\n#### `list_all_tasks()`\r\n\u5217\u51fa\u7cfb\u7edf\u4e2d\u6240\u6709\u4efb\u52a1\u7684\u6982\u89c8\u4fe1\u606f\u3002\r\n\r\n**\u8fd4\u56de\u503c:** JSON \u5b57\u7b26\u4e32\uff0c\u5305\u542b\u6240\u6709\u4efb\u52a1\u7684\u5217\u8868\r\n```json\r\n[\r\n  {\r\n    \"task_id\": \"uuid-1\",\r\n    \"status\": \"completed\",\r\n    \"progress\": 100,\r\n    \"created_at\": \"2024-01-01T09:55:00\"\r\n  },\r\n  {\r\n    \"task_id\": \"uuid-2\", \r\n    \"status\": \"running\",\r\n    \"progress\": 45,\r\n    \"created_at\": \"2024-01-01T10:00:00\"\r\n  }\r\n]\r\n```\r\n\r\n#### `cancel_task(task_id: str)`\r\n\u53d6\u6d88\u6b63\u5728\u8fd0\u884c\u7684\u4efb\u52a1\u3002\r\n\r\n**\u53c2\u6570:**\r\n- `task_id` (str): \u8981\u53d6\u6d88\u7684\u4efb\u52a1ID\r\n\r\n**\u8fd4\u56de\u503c:** \u64cd\u4f5c\u7ed3\u679c\u5b57\u7b26\u4e32\r\n\r\n### \u7cfb\u7edf\u4fe1\u606f\u67e5\u8be2\u51fd\u6570\r\n\r\n#### `get_system_status()`\r\n\u83b7\u53d6\u7cfb\u7edf\u6574\u4f53\u72b6\u6001\u4fe1\u606f\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u4f9d\u8d56\u3001\u8d44\u6e90\u7b49\u3002\r\n\r\n**\u8fd4\u56de\u503c:** JSON \u5b57\u7b26\u4e32\uff0c\u5305\u542b\u7cfb\u7edf\u72b6\u6001\r\n```json\r\n{\r\n  \"ffmpeg_available\": true,\r\n  \"azure_speech_configured\": true,\r\n  \"font_available\": true,\r\n  \"temp_directory\": \"C:\\\\temp\",\r\n  \"max_concurrent_tasks\": 5,\r\n  \"active_tasks\": 2\r\n}\r\n```\r\n\r\n#### `get_available_voice_options()`\r\n\u83b7\u53d6\u6240\u6709\u53ef\u7528\u7684\u8bed\u97f3\u9009\u9879\u5217\u8868\u3002\r\n\r\n**\u8fd4\u56de\u503c:** JSON \u5b57\u7b26\u4e32\uff0c\u5305\u542b\u8bed\u97f3\u9009\u9879\r\n```json\r\n[\r\n  {\r\n    \"index\": 0,\r\n    \"name\": \"zh-CN-XiaoxiaoNeural\",\r\n    \"description\": \"\u9ed8\u8ba4\u5973\u58f0\",\r\n    \"language\": \"zh-CN\"\r\n  },\r\n  {\r\n    \"index\": 1,\r\n    \"name\": \"zh-CN-YunxiNeural\", \r\n    \"description\": \"\u7537\u58f0\",\r\n    \"language\": \"zh-CN\"\r\n  }\r\n]\r\n```\r\n\r\n### \u53c2\u6570\u9a8c\u8bc1\u51fd\u6570\r\n\r\n#### `validate_input_parameters(text: str, video_path: str, voice_index: int = 0)`\r\n\u9a8c\u8bc1\u8f93\u5165\u53c2\u6570\u7684\u6709\u6548\u6027\u548c\u5b8c\u6574\u6027\u3002\r\n\r\n**\u53c2\u6570:**\r\n- `text` (str): \u8981\u9a8c\u8bc1\u7684\u6587\u672c\u5185\u5bb9\r\n- `video_path` (str): \u8981\u9a8c\u8bc1\u7684\u89c6\u9891\u6587\u4ef6\u8def\u5f84\r\n- `voice_index` (int): \u8981\u9a8c\u8bc1\u7684\u8bed\u97f3\u7d22\u5f15\r\n\r\n**\u8fd4\u56de\u503c:** JSON \u5b57\u7b26\u4e32\uff0c\u5305\u542b\u9a8c\u8bc1\u7ed3\u679c\r\n```json\r\n{\r\n  \"valid\": true,\r\n  \"errors\": [],\r\n  \"warnings\": [\"\u89c6\u9891\u6587\u4ef6\u8f83\u5927\uff0c\u5efa\u8bae\u4f7f\u7528\u5f02\u6b65\u5904\u7406\"],\r\n  \"video_info\": {\r\n    \"duration\": 120.5,\r\n    \"resolution\": \"1920x1080\",\r\n    \"format\": \"mp4\"\r\n  }\r\n}\r\n```\r\n\r\n#### `get_generation_estimate(text: str, video_path: str)`\r\n\u6839\u636e\u8f93\u5165\u53c2\u6570\u4f30\u7b97\u89c6\u9891\u751f\u6210\u6240\u9700\u65f6\u95f4\u3002\r\n\r\n**\u53c2\u6570:**\r\n- `text` (str): \u6587\u672c\u5185\u5bb9\r\n- `video_path` (str): \u89c6\u9891\u6587\u4ef6\u8def\u5f84\r\n\r\n**\u8fd4\u56de\u503c:** JSON \u5b57\u7b26\u4e32\uff0c\u5305\u542b\u65f6\u95f4\u4f30\u7b97\r\n\r\n#### `detect_video_motion_mcp(video_path: str, config_path: str = \"best_motion_clip_params.json\")`\r\n**\u72ec\u7acb\u7684\u8fd0\u52a8\u68c0\u6d4b\u5de5\u5177**\uff0c\u7528\u4e8e\u5206\u6790\u89c6\u9891\u4e2d\u7684\u9759\u6b62\u7247\u6bb5\u3002\r\n\r\n**\u53c2\u6570:**\r\n- `video_path` (str): \u8981\u5206\u6790\u7684\u89c6\u9891\u6587\u4ef6\u8def\u5f84\r\n- `config_path` (str): \u8fd0\u52a8\u68c0\u6d4b\u914d\u7f6e\u6587\u4ef6\u8def\u5f84 (\u9ed8\u8ba4: \"best_motion_clip_params.json\")\r\n\r\n**\u8fd4\u56de\u503c:** JSON \u5b57\u7b26\u4e32\uff0c\u5305\u542b\u68c0\u6d4b\u7ed3\u679c\r\n```json\r\n{\r\n  \"video_path\": \"input.mp4\",\r\n  \"config\": {\r\n    \"motion_threshold\": 0.1,\r\n    \"min_static_duration\": 2.0,\r\n    \"sample_step\": 1\r\n  },\r\n  \"static_segments\": [\r\n    {\r\n      \"start\": 5.2,\r\n      \"end\": 8.5,\r\n      \"duration\": 3.3\r\n    }\r\n  ],\r\n  \"timestamps\": [\r\n    {\r\n      \"start\": \"00:00:05.200\",\r\n      \"end\": \"00:00:08.500\"\r\n    }\r\n  ],\r\n  \"summary\": {\r\n    \"total_segments\": 5,\r\n    \"total_static_time\": 15.6,\r\n    \"average_segment_duration\": 3.12\r\n  }\r\n}\r\n```\r\n\r\n#### `optimize_video_motion_params_mcp(video_path: str, target_min_duration: float = 50.0, target_max_duration: float = 70.0)`\r\n**\u8fd0\u52a8\u68c0\u6d4b\u53c2\u6570\u4f18\u5316\u5de5\u5177**\uff0c\u81ea\u52a8\u5bfb\u627e\u6700\u4f73\u53c2\u6570\u4ee5\u8fbe\u5230\u76ee\u6807\u89c6\u9891\u65f6\u957f\u3002\r\n\r\n**\u53c2\u6570:**\r\n- `video_path` (str): \u8981\u4f18\u5316\u7684\u89c6\u9891\u6587\u4ef6\u8def\u5f84\r\n- `target_min_duration` (float): \u76ee\u6807\u6700\u5c0f\u65f6\u957f (\u79d2)\r\n- `target_max_duration` (float): \u76ee\u6807\u6700\u5927\u65f6\u957f (\u79d2)\r\n\r\n**\u8fd4\u56de\u503c:** JSON \u5b57\u7b26\u4e32\uff0c\u5305\u542b\u4f18\u5316\u7ed3\u679c\r\n```json\r\n{\r\n  \"success\": true,\r\n  \"optimal_config\": {\r\n    \"motion_threshold\": 0.15,\r\n    \"min_static_duration\": 1.5,\r\n    \"sample_step\": 2\r\n  },\r\n  \"message\": \"\u627e\u5230\u6700\u4f18\u53c2\u6570\u5e76\u5df2\u4fdd\u5b58\u5230\u914d\u7f6e\u6587\u4ef6\"\r\n}\r\n```\r\n```json\r\n{\r\n  \"estimated_time\": 180,\r\n  \"time_unit\": \"seconds\",\r\n  \"factors\": {\r\n    \"video_duration\": 120,\r\n    \"text_length\": 500,\r\n    \"processing_complexity\": \"medium\"\r\n  },\r\n  \"recommendation\": \"\u5efa\u8bae\u4f7f\u7528\u5f02\u6b65\u5904\u7406\"\r\n}\r\n```\r\n\r\n#### `get_system_performance_info_mcp()`\r\n**\u7cfb\u7edf\u6027\u80fd\u4fe1\u606f\u5de5\u5177**\uff0c\u83b7\u53d6\u8be6\u7ec6\u7684\u786c\u4ef6\u914d\u7f6e\u548c\u6027\u80fd\u6570\u636e\u3002\r\n\r\n**\u8fd4\u56de\u503c:** JSON \u5b57\u7b26\u4e32\uff0c\u5305\u542b\u7cfb\u7edf\u6027\u80fd\u4fe1\u606f\r\n```json\r\n{\r\n  \"cpu\": {\r\n    \"count\": 12,\r\n    \"frequency\": 2500.0,\r\n    \"usage\": 21.3\r\n  },\r\n  \"memory\": {\r\n    \"total\": 31,\r\n    \"available\": 5,\r\n    \"usage\": 81.2\r\n  },\r\n  \"gpu\": {\r\n    \"name\": \"AMD Radeon RX 580\",\r\n    \"memory\": 8,\r\n    \"driver\": \"22.40.00.01\"\r\n  }\r\n}\r\n```\r\n\r\n#### `optimize_video_processing_mcp(video_path: str, target_quality: str = \"720p\")`\r\n**\u89c6\u9891\u5904\u7406\u4f18\u5316\u5de5\u5177**\uff0c\u6839\u636e\u7cfb\u7edf\u914d\u7f6e\u81ea\u52a8\u4f18\u5316\u5904\u7406\u53c2\u6570\u3002\r\n\r\n**\u53c2\u6570:**\r\n- `video_path` (str): \u8981\u4f18\u5316\u7684\u89c6\u9891\u6587\u4ef6\u8def\u5f84\r\n- `target_quality` (str): \u76ee\u6807\u753b\u8d28\u9884\u8bbe\r\n\r\n**\u8fd4\u56de\u503c:** JSON \u5b57\u7b26\u4e32\uff0c\u5305\u542b\u4f18\u5316\u914d\u7f6e\r\n```json\r\n{\r\n  \"encoder\": \"hevc_amf\",\r\n  \"preset\": \"speed\",\r\n  \"quality\": 18,\r\n  \"threads\": 16,\r\n  \"buffer_size\": 2048,\r\n  \"async_depth\": 6,\r\n  \"bframes\": 3,\r\n  \"ref_frames\": 4,\r\n  \"enable_cache\": true,\r\n  \"cache_size\": 4096\r\n}\r\n```\r\n\r\n#### `benchmark_gpu_performance_mcp()`\r\n**GPU\u6027\u80fd\u57fa\u51c6\u6d4b\u8bd5\u5de5\u5177**\uff0c\u8bc4\u4f30\u5f53\u524d\u7cfb\u7edf\u7684\u89c6\u9891\u5904\u7406\u80fd\u529b\u3002\r\n\r\n**\u8fd4\u56de\u503c:** JSON \u5b57\u7b26\u4e32\uff0c\u5305\u542b\u6027\u80fd\u6d4b\u8bd5\u7ed3\u679c\r\n```json\r\n{\r\n  \"processing_time\": 3.45,\r\n  \"speed_multiplier\": 2.90,\r\n  \"encoder\": \"hevc_amf\",\r\n  \"threads\": 16,\r\n  \"async_depth\": 6,\r\n  \"performance_rating\": \"\u6781\u4f73 \u2b50\u2b50\u2b50\u2b50\u2b50\"\r\n}\r\n```\r\n\r\n### \u5de5\u5177\u51fd\u6570\u8c03\u7528\u6d41\u7a0b\r\n\r\n#### \u57fa\u672c\u4f7f\u7528\u6d41\u7a0b\r\n1. **\u53c2\u6570\u9a8c\u8bc1**: \u4f7f\u7528 `validate_input_parameters()` \u9a8c\u8bc1\u8f93\u5165\r\n2. **\u65f6\u95f4\u4f30\u7b97**: \u4f7f\u7528 `get_generation_estimate()` \u4f30\u7b97\u5904\u7406\u65f6\u95f4\r\n3. **\u9009\u62e9\u63a5\u53e3**: \u6839\u636e\u4f30\u7b97\u65f6\u95f4\u9009\u62e9\u540c\u6b65\u6216\u5f02\u6b65\u63a5\u53e3\r\n4. **\u4efb\u52a1\u76d1\u63a7**: \u5f02\u6b65\u4efb\u52a1\u4f7f\u7528 `get_task_status()` \u76d1\u63a7\u8fdb\u5ea6\r\n5. **\u7ed3\u679c\u83b7\u53d6**: \u4ece\u8fd4\u56de\u7ed3\u679c\u4e2d\u83b7\u53d6\u8f93\u51fa\u6587\u4ef6\u8def\u5f84\r\n\r\n#### \u9ad8\u7ea7\u4f7f\u7528\u6d41\u7a0b\r\n1. **\u7cfb\u7edf\u68c0\u67e5**: \u4f7f\u7528 `get_system_status()` \u68c0\u67e5\u7cfb\u7edf\u72b6\u6001\r\n2. **\u8bed\u97f3\u9009\u62e9**: \u4f7f\u7528 `get_available_voice_options()` \u9009\u62e9\u5408\u9002\u7684\u8bed\u97f3\r\n3. **\u6279\u91cf\u5904\u7406**: \u4f7f\u7528 `list_all_tasks()` \u7ba1\u7406\u591a\u4e2a\u4efb\u52a1\r\n4. **\u5f02\u5e38\u5904\u7406**: \u4f7f\u7528 `cancel_task()` \u5904\u7406\u5f02\u5e38\u60c5\u51b5\r\n\r\n### \u9519\u8bef\u5904\u7406\r\n\r\n\u6240\u6709\u5de5\u5177\u51fd\u6570\u90fd\u5305\u542b\u5b8c\u5584\u7684\u9519\u8bef\u5904\u7406\u673a\u5236\uff1a\r\n\r\n- **\u53c2\u6570\u9519\u8bef**: \u8fd4\u56de\u8be6\u7ec6\u7684\u9519\u8bef\u63cf\u8ff0\u548c\u4fee\u6b63\u5efa\u8bae\r\n- **\u6587\u4ef6\u9519\u8bef**: \u68c0\u67e5\u6587\u4ef6\u5b58\u5728\u6027\u548c\u683c\u5f0f\u6709\u6548\u6027\r\n- **\u7cfb\u7edf\u9519\u8bef**: \u68c0\u67e5\u4f9d\u8d56\u9879\u548c\u7cfb\u7edf\u8d44\u6e90\r\n- **\u7f51\u7edc\u9519\u8bef**: \u5904\u7406 Azure \u8bed\u97f3\u670d\u52a1\u8fde\u63a5\u95ee\u9898\r\n- **\u5904\u7406\u9519\u8bef**: \u63d0\u4f9b\u8be6\u7ec6\u7684\u9519\u8bef\u65e5\u5fd7\u548c\u6062\u590d\u5efa\u8bae\r\n\r\n### \u6027\u80fd\u4f18\u5316\u5efa\u8bae\r\n\r\n1. **\u77ed\u89c6\u9891 (< 30\u79d2)**: \u4f7f\u7528 `generate_auto_video_sync`\r\n2. **\u957f\u89c6\u9891 (> 30\u79d2)**: \u4f7f\u7528 `generate_auto_video_async`\r\n3. **\u6279\u91cf\u5904\u7406**: \u5408\u7406\u63a7\u5236\u5e76\u53d1\u4efb\u52a1\u6570\u91cf\r\n4. **\u8d44\u6e90\u76d1\u63a7**: \u5b9a\u671f\u68c0\u67e5\u7cfb\u7edf\u72b6\u6001\u548c\u8d44\u6e90\u4f7f\u7528\u60c5\u51b5\r\n\r\n##  \u9879\u76ee\u7ed3\u6784\r\n\r\n```\r\nauto-video-generator-mcp/\r\n auto_generate_video_mcp_modular.py  # \u4e3b\u670d\u52a1\u5668\u6587\u4ef6\r\n auto_video_modules/                 # \u6838\u5fc3\u6a21\u5757\u76ee\u5f55\r\n    __init__.py                     # \u6a21\u5757\u521d\u59cb\u5316\r\n    config.py                       # \u914d\u7f6e\u7ba1\u7406\r\n    ffmpeg_utils.py                 # FFmpeg \u5de5\u5177\r\n    mcp_tools.py                    # MCP \u5de5\u5177\u63a5\u53e3\r\n    motion_detection_utils.py       # \u8fd0\u52a8\u68c0\u6d4b\u5de5\u5177\r\n    gpu_optimization_utils.py       # GPU\u4f18\u5316\u5de5\u5177\r\n    subtitle_utils.py               # \u5b57\u5e55\u5904\u7406\r\n    video_utils.py                  # \u89c6\u9891\u5904\u7406\r\n    voice_utils.py                  # \u8bed\u97f3\u5904\u7406\r\n requirements.txt                    # Python \u4f9d\u8d56\r\n README.md                          # \u4e2d\u6587\u6587\u6863\uff08\u9ed8\u8ba4\uff09\r\n README_EN.md                       # \u82f1\u6587\u6587\u6863\r\n```\r\n\r\n##  \u6545\u969c\u6392\u9664\r\n\r\n### \u5e38\u89c1\u95ee\u9898\r\n\r\n#### 1. FFmpeg \u672a\u627e\u5230\r\n**\u9519\u8bef**: `FFmpeg not found in system PATH`\r\n**\u89e3\u51b3**: \u786e\u4fdd FFmpeg \u5df2\u5b89\u88c5\u5e76\u6dfb\u52a0\u5230\u7cfb\u7edf PATH\uff0c\u6216\u8bbe\u7f6e `FFMPEG_PATH` \u73af\u5883\u53d8\u91cf\u3002\r\n\r\n#### 2. Azure \u8bed\u97f3\u670d\u52a1\u9519\u8bef\r\n**\u9519\u8bef**: `Azure Speech Service authentication failed`\r\n**\u89e3\u51b3**: \u68c0\u67e5 `AZURE_SPEECH_KEY` \u548c `AZURE_SPEECH_REGION` \u73af\u5883\u53d8\u91cf\u914d\u7f6e\u3002\r\n\r\n#### 3. \u5b57\u4f53\u6587\u4ef6\u672a\u627e\u5230\r\n**\u9519\u8bef**: `Font file not found`\r\n**\u89e3\u51b3**: \u786e\u4fdd\u7cfb\u7edf\u5b89\u88c5\u4e86\u5fae\u8f6f\u96c5\u9ed1\u5b57\u4f53\uff0c\u6216\u4fee\u6539 `config.py` \u4e2d\u7684\u5b57\u4f53\u8def\u5f84\u3002\r\n\r\n#### 4. \u5185\u5b58\u4e0d\u8db3\r\n**\u9519\u8bef**: `Memory error during video processing`\r\n**\u89e3\u51b3**: \u4f7f\u7528\u8f83\u4f4e\u7684\u753b\u8d28\u9884\u8bbe\uff0c\u6216\u51cf\u5c11\u5e76\u53d1\u4efb\u52a1\u6570\u91cf\u3002\r\n\r\n### \u8c03\u8bd5\u6a21\u5f0f\r\n\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf `DEBUG_MODE=true` \u542f\u7528\u8be6\u7ec6\u65e5\u5fd7\u8f93\u51fa\u3002\r\n\r\n##  \u8d21\u732e\u6307\u5357\r\n\r\n1. Fork \u9879\u76ee\r\n2. \u521b\u5efa\u529f\u80fd\u5206\u652f (`git checkout -b feature/AmazingFeature`)\r\n3. \u63d0\u4ea4\u66f4\u6539 (`git commit -m 'Add some AmazingFeature'`)\r\n4. \u63a8\u9001\u5230\u5206\u652f (`git push origin feature/AmazingFeature`)\r\n5. \u6253\u5f00 Pull Request\r\n\r\n##  \u8bb8\u53ef\u8bc1\r\n\r\n\u672c\u9879\u76ee\u91c7\u7528 MIT \u8bb8\u53ef\u8bc1 - \u67e5\u770b [LICENSE](LICENSE) \u6587\u4ef6\u4e86\u89e3\u8be6\u60c5\u3002\r\n\r\n##  \u652f\u6301\r\n\r\n\u5982\u6709\u95ee\u9898\u6216\u5efa\u8bae\uff0c\u8bf7\u901a\u8fc7\u4ee5\u4e0b\u65b9\u5f0f\u8054\u7cfb\uff1a\r\n\r\n- \u63d0\u4ea4 Issue\r\n- \u53d1\u9001\u90ae\u4ef6\u81f3\u9879\u76ee\u7ef4\u62a4\u8005\r\n- \u67e5\u770b\u9879\u76ee Wiki \u83b7\u53d6\u66f4\u591a\u4fe1\u606f\r\n\r\n##  \u66f4\u65b0\u65e5\u5fd7\r\n\r\n### v3.0.0\r\n- \u91cd\u6784\u4e3a\u6a21\u5757\u5316\u67b6\u6784\r\n- \u6dfb\u52a0\u5f02\u6b65\u4efb\u52a1\u5904\u7406\r\n- \u652f\u6301\u591a\u79cd\u753b\u8d28\u9884\u8bbe\r\n- \u6539\u8fdb\u914d\u7f6e\u7ba1\u7406\u7cfb\u7edf\r\n\r\n### v2.0.0\r\n- \u6dfb\u52a0\u667a\u80fd\u6587\u672c\u5206\u5272\r\n- \u652f\u6301\u65f6\u95f4\u6807\u8bb0\u63a7\u5236\r\n- \u6539\u8fdb\u5b57\u5e55\u6837\u5f0f\u914d\u7f6e\r\n\r\n### v1.0.0\r\n- \u521d\u59cb\u7248\u672c\u53d1\u5e03\r\n- \u57fa\u7840\u89c6\u9891\u751f\u6210\u529f\u80fd\r\n- Azure \u8bed\u97f3\u670d\u52a1\u96c6\u6210\r\n\r\n##  \u4f7f\u7528\u573a\u666f\u793a\u4f8b\r\n\r\n### 1. \u6559\u80b2\u89c6\u9891\u5236\u4f5c\r\n```python\r\n# \u4e3a\u6559\u5b66\u89c6\u9891\u6dfb\u52a0\u89e3\u8bf4\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"lecture.mp4\",\r\n    text=\"\u6b22\u8fce\u6765\u5230\u4eca\u5929\u7684\u8bfe\u7a0b\u3002\u6211\u4eec\u5c06\u5b66\u4e60\u4eba\u5de5\u667a\u80fd\u7684\u57fa\u7840\u77e5\u8bc6\u3002\u9996\u5148\uff0c\u8ba9\u6211\u4eec\u4e86\u89e3\u4ec0\u4e48\u662f\u673a\u5668\u5b66\u4e60\u3002\",\r\n    voice_index=0,\r\n    quality_preset=\"720p\",\r\n    subtitle_style='{\"fontSize\": 60, \"color\": \"white\", \"bgColor\": [0, 0, 0, 50]}'  # JSON\u5b57\u7b26\u4e32\r\n)\r\n```\r\n\r\n### 2. \u4ea7\u54c1\u6f14\u793a\u89c6\u9891\r\n```python\r\n# \u4ea7\u54c1\u529f\u80fd\u6f14\u793a\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"product_demo.mp4\",\r\n    text=\"\u8fd9\u6b3e\u4ea7\u54c1\u5177\u6709\u4ee5\u4e0b\u7279\u70b9\uff1a{2s}\u7b2c\u4e00\uff0c\u64cd\u4f5c\u7b80\u5355\u6613\u7528\u3002{1s}\u7b2c\u4e8c\uff0c\u529f\u80fd\u5f3a\u5927\u5168\u9762\u3002{1s}\u7b2c\u4e09\uff0c\u6027\u4ef7\u6bd4\u6781\u9ad8\u3002\",\r\n    voice_index=1,\r\n    subtitle_style='{\"fontSize\": 60, \"color\": \"yellow\", \"bgColor\": [0, 0, 0, 30]}'  # JSON\u5b57\u7b26\u4e32\r\n)\r\n```\r\n\r\n### 3. \u89c6\u9891\u526a\u8f91\u548c\u4f18\u5316\r\n```python\r\n# \u4ec5\u8fdb\u884c\u89c6\u9891\u5904\u7406\uff0c\u4e0d\u6dfb\u52a0\u8bed\u97f3\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"raw_video.mp4\",\r\n    text=\"\",  # \u7a7a\u6587\u672c\uff0c\u53ea\u8fdb\u884c\u89c6\u9891\u5904\u7406\r\n    segments_mode=\"cut\",\r\n    segments='[{\"start\": \"00:00:10\", \"end\": \"00:00:20\"}]',  # JSON\u5b57\u7b26\u4e32\r\n    quality_preset=\"1080p\",\r\n    enable_gpu_acceleration=True  # \u542f\u7528\u6781\u81f4GPU\u4f18\u5316\r\n)\r\n```\r\n\r\n##  \u5927\u6a21\u578b\u8c03\u7528\u6307\u5357\r\n\r\n### \u91cd\u8981\u63d0\u9192\r\n\u5f53\u5927\u6a21\u578b\u8c03\u7528\u672c\u7cfb\u7edf\u7684\u5de5\u5177\u51fd\u6570\u65f6\uff0c**\u6240\u6709\u914d\u7f6e\u53c2\u6570\u90fd\u5fc5\u987b\u4f7f\u7528JSON\u5b57\u7b26\u4e32\u683c\u5f0f**\uff0c\u4e0d\u80fd\u76f4\u63a5\u4f20\u9012\u5b57\u5178\u5bf9\u8c61\u3002\r\n\r\n### \u6b63\u786e\u7684\u8c03\u7528\u65b9\u5f0f\r\n\r\n#### 1. \u57fa\u672c\u89c6\u9891\u751f\u6210\r\n```python\r\n# \u2705 \u6b63\u786e\uff1a\u6240\u6709\u53c2\u6570\u90fd\u662f\u5b57\u7b26\u4e32\u683c\u5f0f\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    text=\"\u6b22\u8fce\u89c2\u770b\u672c\u89c6\u9891\",\r\n    voice_index=0,\r\n    output_path=\"output.mp4\",\r\n    quality_preset=\"720p\"\r\n)\r\n```\r\n\r\n#### 2. \u5e26JSON\u53c2\u6570\u7684\u8c03\u7528\r\n```python\r\n# \u2705 \u6b63\u786e\uff1aJSON\u53c2\u6570\u4f7f\u7528\u5b57\u7b26\u4e32\u683c\u5f0f\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    text=\"\u89c6\u9891\u5185\u5bb9\",\r\n    segments='[{\"start\": \"00:00:05\", \"end\": \"00:00:15\"}]',  # JSON\u5b57\u7b26\u4e32\r\n    subtitle_style='{\"fontSize\": 50, \"color\": \"white\"}',  # JSON\u5b57\u7b26\u4e32\r\n    motion_clip_params='{\"motion_threshold\": 0.1, \"min_static_duration\": 2.0}',  # JSON\u5b57\u7b26\u4e32\r\n    enable_gpu_acceleration=True\r\n)\r\n```\r\n\r\n#### 3. \u9519\u8bef\u793a\u4f8b\r\n```python\r\n# \u274c \u9519\u8bef\uff1a\u76f4\u63a5\u4f20\u9012\u5b57\u5178\u5bf9\u8c61\r\nresult = await generate_auto_video_mcp(\r\n    video_path=\"input.mp4\",\r\n    segments=[{\"start\": \"00:00:05\", \"end\": \"00:00:15\"}],  # \u9519\u8bef\uff01\r\n    subtitle_style={\"fontSize\": 50, \"color\": \"white\"},  # \u9519\u8bef\uff01\r\n    motion_clip_params={\"motion_threshold\": 0.1}  # \u9519\u8bef\uff01\r\n)\r\n```\r\n\r\n### JSON\u5b57\u7b26\u4e32\u6784\u5efa\u65b9\u6cd5\r\n```python\r\nimport json\r\n\r\n# \u65b9\u6cd51\uff1a\u4f7f\u7528json.dumps()\r\nsegments = json.dumps([{\"start\": \"00:00:05\", \"end\": \"00:00:15\"}])\r\nsubtitle_style = json.dumps({\"fontSize\": 50, \"color\": \"white\"})\r\n\r\n# \u65b9\u6cd52\uff1a\u76f4\u63a5\u5199\u5b57\u7b26\u4e32\r\nsegments = '[{\"start\": \"00:00:05\", \"end\": \"00:00:15\"}]'\r\nsubtitle_style = '{\"fontSize\": 50, \"color\": \"white\"}'\r\n```\r\n\r\n##  \u6700\u4f73\u5b9e\u8df5\r\n\r\n### 1. \u6027\u80fd\u4f18\u5316\r\n- \u5bf9\u4e8e\u957f\u89c6\u9891\uff0c\u5efa\u8bae\u4f7f\u7528\u5f02\u6b65\u4efb\u52a1\u5904\u7406\r\n- \u6839\u636e\u9700\u6c42\u9009\u62e9\u5408\u9002\u7684\u753b\u8d28\u9884\u8bbe\r\n- \u5b9a\u671f\u6e05\u7406\u4e34\u65f6\u6587\u4ef6\r\n\r\n### 2. \u6587\u672c\u5904\u7406\r\n- \u5408\u7406\u4f7f\u7528\u65f6\u95f4\u6807\u8bb0\u63a7\u5236\u8282\u594f\r\n- \u907f\u514d\u8fc7\u957f\u7684\u5355\u6bb5\u6587\u672c\r\n- \u5229\u7528\u667a\u80fd\u5206\u5272\u529f\u80fd\u4f18\u5316\u5b57\u5e55\u663e\u793a\r\n\r\n### 3. \u9519\u8bef\u5904\u7406\r\n- \u59cb\u7ec8\u68c0\u67e5\u8f93\u5165\u53c2\u6570\u7684\u6709\u6548\u6027\r\n- \u76d1\u63a7\u4efb\u52a1\u72b6\u6001\uff0c\u53ca\u65f6\u5904\u7406\u5f02\u5e38\r\n- \u4f7f\u7528\u8c03\u8bd5\u6a21\u5f0f\u6392\u67e5\u95ee\u9898\r\n\r\n##  \u7279\u8272\u529f\u80fd\r\n\r\n### \u667a\u80fd\u6587\u672c\u5206\u5272\r\n\u7cfb\u7edf\u4f1a\u81ea\u52a8\u5c06\u957f\u6587\u672c\u5206\u5272\u6210\u9002\u5408\u663e\u793a\u7684\u5b57\u5e55\u7247\u6bb5\uff0c\u786e\u4fdd\u826f\u597d\u7684\u89c2\u770b\u4f53\u9a8c\u3002\r\n\r\n### \u65f6\u95f4\u6807\u8bb0\u8bed\u6cd5\r\n\u652f\u6301\u5728\u6587\u672c\u4e2d\u4f7f\u7528\u65f6\u95f4\u6807\u8bb0\u6765\u63a7\u5236\u9759\u9ed8\u65f6\u95f4\uff1a\r\n- `{5s}` - 5\u79d2\u9759\u9ed8\r\n- `{5000ms}` - 5000\u6beb\u79d2\u9759\u9ed8\r\n- `{2.5s}` - 2.5\u79d2\u9759\u9ed8\r\n\r\n### \u591a\u4efb\u52a1\u5e76\u53d1\r\n\u652f\u6301\u540c\u65f6\u5904\u7406\u591a\u4e2a\u89c6\u9891\u751f\u6210\u4efb\u52a1\uff0c\u63d0\u9ad8\u5de5\u4f5c\u6548\u7387\u3002\r\n\r\n### \u5b9e\u65f6\u72b6\u6001\u76d1\u63a7\r\n\u63d0\u4f9b\u5b8c\u6574\u7684\u4efb\u52a1\u72b6\u6001\u8ddf\u8e2a\uff0c\u5b9e\u65f6\u4e86\u89e3\u5904\u7406\u8fdb\u5ea6\u3002\r\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "\u57fa\u4e8eMCP\u534f\u8bae\u7684\u667a\u80fd\u89c6\u9891\u751f\u6210\u7cfb\u7edf\uff0c\u652f\u6301\u81ea\u52a8\u6dfb\u52a0\u5b57\u5e55\u3001\u8bed\u97f3\u5408\u6210\u548c\u89c6\u9891\u526a\u8f91\u529f\u80fd",
    "version": "3.0.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/zgmurder/auto_video_generator-mcp/issues",
        "Documentation": "https://github.com/zgmurder/auto_video_generator-mcp#readme",
        "Homepage": "https://github.com/zgmurder/auto_video_generator-mcp",
        "Repository": "https://github.com/zgmurder/auto_video_generator-mcp"
    },
    "split_keywords": [
        "video",
        " mcp",
        " subtitle",
        " speech",
        " synthesis",
        " ffmpeg",
        " moviepy"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f74f5b15c9b95c4118155f631125b0f90a228b85f6b25cc7e4335504ddb019f6",
                "md5": "70dc13568118dfeff153bca0c367d9d1",
                "sha256": "36479484e3dd2893c0e17cd2030254bf487587a65d036c1444da5f3965a0d142"
            },
            "downloads": -1,
            "filename": "auto_video_generator_mcp-3.0.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "70dc13568118dfeff153bca0c367d9d1",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 56768,
            "upload_time": "2025-07-27T03:59:50",
            "upload_time_iso_8601": "2025-07-27T03:59:50.063129Z",
            "url": "https://files.pythonhosted.org/packages/f7/4f/5b15c9b95c4118155f631125b0f90a228b85f6b25cc7e4335504ddb019f6/auto_video_generator_mcp-3.0.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-27 03:59:50",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "zgmurder",
    "github_project": "auto_video_generator-mcp",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "httpx",
            "specs": [
                [
                    ">=",
                    "0.24.0"
                ]
            ]
        },
        {
            "name": "fastmcp",
            "specs": [
                [
                    ">=",
                    "0.1.0"
                ]
            ]
        },
        {
            "name": "azure-cognitiveservices-speech",
            "specs": [
                [
                    ">=",
                    "1.31.0"
                ]
            ]
        },
        {
            "name": "pydub",
            "specs": [
                [
                    ">=",
                    "0.25.1"
                ]
            ]
        },
        {
            "name": "moviepy",
            "specs": [
                [
                    ">=",
                    "1.0.3"
                ]
            ]
        },
        {
            "name": "opencv-python",
            "specs": [
                [
                    ">=",
                    "4.8.0"
                ]
            ]
        },
        {
            "name": "Pillow",
            "specs": [
                [
                    ">=",
                    "10.0.0"
                ]
            ]
        },
        {
            "name": "jieba",
            "specs": [
                [
                    ">=",
                    "0.42.1"
                ]
            ]
        },
        {
            "name": "psutil",
            "specs": [
                [
                    ">=",
                    "5.9.0"
                ]
            ]
        }
    ],
    "lcname": "auto-video-generator-mcp"
}
        
Elapsed time: 1.17763s