init: heygen 队列

This commit is contained in:
2025-07-25 15:20:42 +08:00
commit 8301a19003
7 changed files with 1423 additions and 0 deletions

168
README.md Normal file
View File

@@ -0,0 +1,168 @@
# Multi-HeyGem 视频处理服务
Multi-HeyGem 是一个分布式视频处理服务,支持多机器并行处理视频和音频合成任务。该服务提供了 RESTful API 接口,可以方便地集成到其他系统中。
## 功能特点
- 支持多机器分布式处理
- 异步任务处理
- RESTful API 接口
- 任务状态追踪
- 支持回调通知
- 详细的日志记录
- 自动负载均衡
## 系统要求
配置机器信息:
编辑 `config/machines.json` 文件,添加您的处理机器信息:
```json
{
"machines": [
{
"name": "机器名称",
"host": "机器IP地址",
"port": 8000,
"max_concurrent": 1,
"enabled": true
}
]
}
```
## 启动服务
```bash
python api.py
```
服务将在 `http://0.0.0.0:8101` 启动。
## API 接口
通过 `http://localhost:8101/docs` 可查看 api 接口
### 创建任务
创建任务接口需要上传文件,以下是使用示例:
#### 同步生成示例(直接返回结果)
```python
import requests
import json
# API 服务地址
API_URL = "http://localhost:8101"
# 准备文件
files = {
'audio': ('audio.mp3', open('./samples/input/audio.mp3', 'rb')),
'video': ('video.mp4', open('./samples/input/video.mp4', 'rb'))
}
# 准备请求数据
data = {
'description': '测试任务'
}
# 发送同步生成请求
response = requests.post(
f"{API_URL}/tasks/sync",
files=files,
data=data
)
# 处理响应
if response.status_code == 200:
# 直接保存返回的视频流
output_path = './output/result.mp4'
with open(output_path, 'wb') as f:
f.write(response.content)
print(f"视频生成成功!已保存到: {output_path}")
else:
print(f"视频生成失败: {response.text}")
```
#### 异步调用示例
```python
import aiohttp
import aiofiles
import asyncio
async def create_task():
API_URL = "http://localhost:8101"
# 准备文件
audio_file_path = './samples/input/audio.mp3'
video_file_path = './samples/input/video.mp4'
# 创建 FormData
data = aiohttp.FormData()
# 添加音频文件
async with aiofiles.open(audio_file_path, 'rb') as f:
audio_content = await f.read()
data.add_field(
'audio_file',
audio_content,
filename='audio.mp3',
content_type='audio/mpeg'
)
# 添加视频文件
async with aiofiles.open(video_file_path, 'rb') as f:
video_content = await f.read()
data.add_field(
'video_file',
video_content,
filename='video.mp4',
content_type='video/mp4'
)
# 添加其他参数
data.add_field('description', '测试任务')
data.add_field('callback_url', 'http://your-callback-url.com/webhook') # 可选的回调地址
# 发送请求
async with aiohttp.ClientSession() as session:
async with session.post(f"{API_URL}/tasks", data=data) as response:
if response.status == 200:
task = await response.json()
print(f"任务创建成功任务ID: {task['task_id']}")
print(f"任务状态: {task['status']}")
# 查询任务状态
task_id = task['task_id']
async with session.get(f"{API_URL}/tasks/{task_id}") as status_response:
task_status = await status_response.json()
print(f"当前任务状态: {task_status['status']}")
else:
error_text = await response.text()
print(f"任务创建失败: {error_text}")
# 运行异步函数
asyncio.run(create_task())
```
### 任务状态说明
- `pending`: 任务等待处理
- `processing`: 任务正在处理中
- `completed`: 任务处理完成
- `failed`: 任务处理失败
### 回调通知
当任务状态发生变化时,如果设置了 `callback_url`,系统会向该地址发送 POST 请求,请求体包含:
```json
{
"task_id": "任务ID",
"status": "任务状态",
"completed_at": "完成时间",
"error_message": "错误信息(如果有)"
}
```