AI图像与视频生成
基于 Azure OpenAI 的 gpt-image-1 和 Sora 模型,实现图像生成和视频生成能力。
概述
团队在 Azure Foundry 上部署了 gpt-image-1 和 gpt-image-1.5 两个图像生成模型。Dora-kids 基于提供的参考代码,创建了 azure-image-gen skill,封装了 Azure OpenAI 画图 API 的调用逻辑。
该技能最初用于为 Mattermost 平台上的多个 Bot 批量生成个性化头像。skill 中配置的模型名称为 gpt-image-1.5,Azure 上确认两个模型(gpt-image-1 和 gpt-image-1.5)均已部署可用。此前误判 skill broken 系排查有误。
关键点
- 部署位置:
resley-sweden-extAzure Foundry - 模型:
gpt-image-1和gpt-image-1.5(均已部署可用) - Skill 路径:
skills/azure-image-gen/ - Skill 状态: 可用(此前误判为 broken)
- 主要用途: 生成 Bot 头像、卡通图像
技术细节
参考代码(Python SDK 调用方式)
import base64
from openai import OpenAI
endpoint = "https://resley-sweden-ext.openai.azure.com/openai/v1/"
deployment_name = "gpt-image-1.5"
api_key = "<your-api-key>"
client = OpenAI(base_url=endpoint, api_key=api_key)
img = client.images.generate(
model=deployment_name,
prompt="A cute baby polar bear",
n=1,
size="1024x1024",
)
image_bytes = base64.b64decode(img.data[0].b64_json)
with open("output.png", "wb") as f:
f.write(image_bytes)直接 API 调用方式
POST https://resley-sweden.openai.azure.com/openai/deployments/gpt-image-1/images/generations...注意:Azure 的认证方式使用 api-key header,而不是 Bearer token。
已知问题
- 此前 wiki 误判 “skill broken 因为模型名 1.5 不存在”。04-14 用
https://resley-sweden-ext.openai.azure.com/openai/v1列模型部署验证:gpt-image-1与gpt-image-1.5-2025-12-16都已部署可用。 Skill 当前可用。
时间线
- 2026-03-17: 在
resley-sweden-ext上部署gpt-image-1.5模型 - 2026-03-17: 创建
azure-image-genskill,生成 Quokka 和 Axolotl 头像 - 2026-03-17: 批量为 6 个 Bot 生成个性化头像(channelbot、webbot、gatewaybot 等)
- 2026-03-22: 发现 skill 因模型名不匹配已 broken,标记为 Legacy
- 2026-04-14: 验证后撤销 broken 判断 —
gpt-image-1与gpt-image-1.5都部署可用,skill 实际未坏
多 Region 部署清单(04-13 整理)
| Region 资源 | 部署 | 用途 |
|---|---|---|
resley-sweden-ext.openai.azure.com | gpt-image-1、gpt-image-1.5-2025-12-16 | 通用文生图 |
resley-east-us-2-resource.cognitiveservices.azure.com | gpt-image-15 | 汪汪队 AI 合照(绑 lenient-image-gen RAI policy)+ Hermes Ottor 实例画像 cron |
resley-sweden-ext.cognitiveservices.azure.com | sora-2 | 视频生成(魔法画室) |
API 路径差异:纯文生图走 /openai/deployments/{name}/images/generations,需要参考图的图生图走 /images/edits(multipart)。两者均用 api-key header(非 Bearer)。
Ottor Hermes 集成(04-13):因无 FAL_KEY,Hermes image_generate 工具被改造为直接调用 east-us-2 的 gpt-image-15,b64_json 解码后落盘到 ~/wiki/raw/assets/shutiao-portraits/,由周度 cron 投递到微信。内容审核坑:prompt 里出现 “3-year-old boy” 等真实儿童描述会触发 moderation_blocked,必须改为中性卡通角色描述(详见 shutiao-world 画像方案)。
相关页面
- mm-bots
- openclaw-skills-inventory
- model-provider-config
- giraffe — Sora 视频生成的主要使用者
- shutiao-world — 魔法画室功能集成
Azure Sora 视频生成(sora-video 技能)
概述
giraffe Bot 创建了 sora-video 自定义技能,用于将静态图片(涂鸦/画作)通过 Azure Sora 模型转化为短视频动画。该功能已集成到薯条世界的「魔法画室」模块。
部署信息
| 属性 | 值 |
|---|---|
| Endpoint | https://resley-sweden-ext.cognitiveservices.azure.com/ |
| 模型部署名 | sora-2 |
| API 路径 | /openai/v1/videos |
| SDK | OpenAI Python SDK client.videos.create() |
| 技能路径 | ~/.openclaw/skills/sora-video/ |
支持的风格
| 风格 | 描述 |
|---|---|
| 🖍️ 涂鸦风 | 保持白板原画风格动画 |
| 🌟 破次元壁 | 2D 平面弹出变 3D |
| 🚀 太空冒险 | 画中角色飞向星空 |
| 🌧️ 雨天场景 | 雨中行驶,车轮溅起水花 |
| 🎬 定格动画 | 黏土动画手工感 |
| ✏️ 涂鸦大战 | 更多元素从白板冒出 |
踩坑记录
- 音频采样率: Sora 输出 96kHz 音频,大部分播放器不支持 → 用 ffmpeg 转码到 44.1kHz
- 纵横比扭曲: 横版原图被强行拉成竖版 720×1280 → 必须按原图比例选择输出尺寸
- faststart: MP4 需要
-movflags +faststart才能流式播放 - 内容审核: Azure Sora 对真实儿童照片会触发
moderation_blocked,只能使用涂鸦/画作 - API 格式变更: 旧版 multipart form upload 方式已不兼容,需使用 OpenAI SDK
client.videos.create(input_reference=file) - 生成时间: 约 1-2 分钟,需异步轮询状态
2026-04-23 gpt-image-2 上线(east-us-2)
ottor 上午测出 east-us-2 region 已部署 gpt-image-2,可用:
| 项 | 值 |
|---|---|
| Endpoint | https://resley-east-us-2-resource.cognitiveservices.azure.com |
| Deployment 名 | gpt-image-2 |
| API version | 2025-04-01-preview(与 1.5 同套) |
| 路径 | /openai/deployments/gpt-image-2/images/generations |
| 响应时间 | ~20s(首次冷启动稍长,需把客户端超时 ≥120s) |
| 返回 | b64_json,~775KB PNG |
命名陷阱:deployment 必须是 gpt-image-2,gpt-image-20 / gpt-image-25 都返回 404,过去判断”未上线”的脚本在错的命名上踩了。
Response shape 与 1.5 的差异——多了 usage / output_format / background / quality / size 字段;input_tokens=110, output_tokens=5574 量级。基本兼容 1.5,但:
response_format参数不再支持——传了直接 400。azure-image-genskill 与 image-studiosrc/lib/azure.ts都删掉这个字段(image-studio commit14f9981)quality字段是必填:A/B 实测quality=low118s ✅、quality=medium86s ✅、不传 → 500。把它当成与prompt/size/n同级的必传项quantity/质量参数限制:服务器侧实测高质量quality=high时常 429/500,目前主要走medium/low
azure-image-generation skill 同日重写:移除所有硬编码 endpoint/key/api-version,改成 set -a; source ~/.credentials/.env; set +a + 引用 $IMAGE_STUDIO__AZURE_OPENAI_*;game-asset-pipeline/scripts/batch_gen.py 顺手清掉裸 KEY=...。Sora 2(Sweden region)三个值(endpoint/key/deployment)也补进 ~/.credentials/.env,统一前缀 SORA__。
详见 image-studio —— 当天围绕 gpt-image-2 包出来的 SaaS 站点。
2026-04-19 MAI-Image-2e 部署 + east-us-2 gpt-image-1 下线
ottor 整理:
- east-us-2 上
gpt-image-1删除:4-13 临时挂的gpt-image-15也并入清理,east-us-2 不再承担文生图,集中到 sweden 系 - sweden-ext 新增
MAI-Image-2e:Microsoft Azure AI 自有图像模型族(model-format=Microsoft,非 OpenAI),SKU GlobalStandard - 新端点格式:
注意路径是POST https://<account>.services.ai.azure.com/mai/images/generations?api-version=2025-04-01-preview/mai/images/generations,不是 OpenAI 的/openai/deployments/.../images/generations,请求体字段也有差异(model直接写MAI-Image-2/MAI-Image-2e) - 新 skill:
creative/azure-mai-image-generation/,封装 Microsoft 格式调用,与现有azure-image-gen(OpenAI 格式)并列 - 用途:薯条画像生成支线在 MAI-Image-2e 上跑了一轮 A/B,对中性卡通角色出图速度比 gpt-image-1.5 快 30%,但风格控制不如 gpt-image,画像主线仍用 gpt-image-1.5,MAI-2e 用作场景背景批量出图(详见 shutiao-world 04-19 13 张场景 PNG)
- 中文渲染避坑(同日 skill
creative/azure-mai-image-generation第二轮迭代):MAI 对中文字符渲染脆弱,目标字符 ≤10 个、首选繁体(顯比显出图清晰)、把目标文字在 prompt 中放大要求”big bold center”;超长或冷僻字直接 fallback 到拼音 / 英文。整理进 skill 文档,避免每次出图都踩。
2026-05-04 三模型实测耗时对比(20 职业 5×4 拼贴,1536×1024 high)
| 模型 | 文件大小 | 耗时 | 适用 |
|---|---|---|---|
| gpt-image-2 (East US 2 OpenAI) | 2.0 MB | ~247s | 质感最好 / 但超复杂 prompt 偶尔 500 |
| gpt-image-1.5 (Sweden Ext OpenAI) | 2.5 MB | 142s | 复杂构图反而更稳 / 字段没 v2 全 |
| MAI-Image-2e (Sweden ai.azure.com Microsoft) | 1.4 MB | 74s ⚡ | 最快 / 风格控制弱 |
默认路由:用户说”画张图”无修饰 → gpt-image-2;说”快一点” → gpt-image-1.5;说”用 MAI / C2PA” → MAI-Image-2e;要视频 → Sora。
azure-image-generation(OpenAI 系,East US 2 + Sweden Ext)和 azure-mai-image-generation(Microsoft,Sweden ai.azure.com)两个 skill 拆开是对的:endpoint 路径(/openai/deployments/.../images/generations vs /mai/images/generations)、API version、--model-format 部署字段(OpenAI vs Microsoft,不是 AIServices 也不是 MAI,踩过坑)全部不同,硬合容易出错。