接入视频
This commit is contained in:
parent
b989085ef5
commit
92c0bc7e52
112
src/router.ts
112
src/router.ts
@ -1,4 +1,4 @@
|
||||
// @routes-hash 45e23a536a13265ff62fe92b1cb71fe3
|
||||
// @routes-hash ee45dd26b9149e6eabf834c1fb5cfbb6
|
||||
import { Express } from "express";
|
||||
|
||||
import route1 from "./routes/agents/clearMemory";
|
||||
@ -36,33 +36,34 @@ import route32 from "./routes/novel/updateNovel";
|
||||
import route33 from "./routes/other/deleteAllData";
|
||||
import route34 from "./routes/other/getCaptcha";
|
||||
import route35 from "./routes/production/getProductionData";
|
||||
import route36 from "./routes/production/workbench/getVideoModelDetail";
|
||||
import route37 from "./routes/project/addProject";
|
||||
import route38 from "./routes/project/delProject";
|
||||
import route39 from "./routes/project/editProject";
|
||||
import route40 from "./routes/project/getProject";
|
||||
import route41 from "./routes/script/addScript";
|
||||
import route42 from "./routes/script/delScript";
|
||||
import route43 from "./routes/script/getScrptApi";
|
||||
import route44 from "./routes/script/updateScript";
|
||||
import route45 from "./routes/setting/agentDeploy/deployAgentModel";
|
||||
import route46 from "./routes/setting/agentDeploy/getAgentDeploy";
|
||||
import route47 from "./routes/setting/agentDeploy/updateKey";
|
||||
import route48 from "./routes/setting/dbConfig/clearData";
|
||||
import route49 from "./routes/setting/getTextModel";
|
||||
import route50 from "./routes/setting/loginConfig/getUser";
|
||||
import route51 from "./routes/setting/loginConfig/updateUserPwd";
|
||||
import route52 from "./routes/setting/memoryConfig/getMemory";
|
||||
import route53 from "./routes/setting/memoryConfig/sureMemory";
|
||||
import route54 from "./routes/setting/vendorConfig/addVendor";
|
||||
import route55 from "./routes/setting/vendorConfig/deleteVendor";
|
||||
import route56 from "./routes/setting/vendorConfig/getVendorList";
|
||||
import route57 from "./routes/setting/vendorConfig/modelTest";
|
||||
import route58 from "./routes/setting/vendorConfig/updateVendor";
|
||||
import route59 from "./routes/task/getMyTaskApi";
|
||||
import route60 from "./routes/task/getTaskCategories";
|
||||
import route61 from "./routes/task/taskDetails";
|
||||
import route62 from "./routes/test/test";
|
||||
import route36 from "./routes/production/workbench/generateVideo";
|
||||
import route37 from "./routes/production/workbench/getVideoModelDetail";
|
||||
import route38 from "./routes/project/addProject";
|
||||
import route39 from "./routes/project/delProject";
|
||||
import route40 from "./routes/project/editProject";
|
||||
import route41 from "./routes/project/getProject";
|
||||
import route42 from "./routes/script/addScript";
|
||||
import route43 from "./routes/script/delScript";
|
||||
import route44 from "./routes/script/getScrptApi";
|
||||
import route45 from "./routes/script/updateScript";
|
||||
import route46 from "./routes/setting/agentDeploy/deployAgentModel";
|
||||
import route47 from "./routes/setting/agentDeploy/getAgentDeploy";
|
||||
import route48 from "./routes/setting/agentDeploy/updateKey";
|
||||
import route49 from "./routes/setting/dbConfig/clearData";
|
||||
import route50 from "./routes/setting/getTextModel";
|
||||
import route51 from "./routes/setting/loginConfig/getUser";
|
||||
import route52 from "./routes/setting/loginConfig/updateUserPwd";
|
||||
import route53 from "./routes/setting/memoryConfig/getMemory";
|
||||
import route54 from "./routes/setting/memoryConfig/sureMemory";
|
||||
import route55 from "./routes/setting/vendorConfig/addVendor";
|
||||
import route56 from "./routes/setting/vendorConfig/deleteVendor";
|
||||
import route57 from "./routes/setting/vendorConfig/getVendorList";
|
||||
import route58 from "./routes/setting/vendorConfig/modelTest";
|
||||
import route59 from "./routes/setting/vendorConfig/updateVendor";
|
||||
import route60 from "./routes/task/getMyTaskApi";
|
||||
import route61 from "./routes/task/getTaskCategories";
|
||||
import route62 from "./routes/task/taskDetails";
|
||||
import route63 from "./routes/test/test";
|
||||
|
||||
export default async (app: Express) => {
|
||||
app.use("/api/agents/clearMemory", route1);
|
||||
@ -100,31 +101,32 @@ export default async (app: Express) => {
|
||||
app.use("/api/other/deleteAllData", route33);
|
||||
app.use("/api/other/getCaptcha", route34);
|
||||
app.use("/api/production/getProductionData", route35);
|
||||
app.use("/api/production/workbench/getVideoModelDetail", route36);
|
||||
app.use("/api/project/addProject", route37);
|
||||
app.use("/api/project/delProject", route38);
|
||||
app.use("/api/project/editProject", route39);
|
||||
app.use("/api/project/getProject", route40);
|
||||
app.use("/api/script/addScript", route41);
|
||||
app.use("/api/script/delScript", route42);
|
||||
app.use("/api/script/getScrptApi", route43);
|
||||
app.use("/api/script/updateScript", route44);
|
||||
app.use("/api/setting/agentDeploy/deployAgentModel", route45);
|
||||
app.use("/api/setting/agentDeploy/getAgentDeploy", route46);
|
||||
app.use("/api/setting/agentDeploy/updateKey", route47);
|
||||
app.use("/api/setting/dbConfig/clearData", route48);
|
||||
app.use("/api/setting/getTextModel", route49);
|
||||
app.use("/api/setting/loginConfig/getUser", route50);
|
||||
app.use("/api/setting/loginConfig/updateUserPwd", route51);
|
||||
app.use("/api/setting/memoryConfig/getMemory", route52);
|
||||
app.use("/api/setting/memoryConfig/sureMemory", route53);
|
||||
app.use("/api/setting/vendorConfig/addVendor", route54);
|
||||
app.use("/api/setting/vendorConfig/deleteVendor", route55);
|
||||
app.use("/api/setting/vendorConfig/getVendorList", route56);
|
||||
app.use("/api/setting/vendorConfig/modelTest", route57);
|
||||
app.use("/api/setting/vendorConfig/updateVendor", route58);
|
||||
app.use("/api/task/getMyTaskApi", route59);
|
||||
app.use("/api/task/getTaskCategories", route60);
|
||||
app.use("/api/task/taskDetails", route61);
|
||||
app.use("/api/test/test", route62);
|
||||
app.use("/api/production/workbench/generateVideo", route36);
|
||||
app.use("/api/production/workbench/getVideoModelDetail", route37);
|
||||
app.use("/api/project/addProject", route38);
|
||||
app.use("/api/project/delProject", route39);
|
||||
app.use("/api/project/editProject", route40);
|
||||
app.use("/api/project/getProject", route41);
|
||||
app.use("/api/script/addScript", route42);
|
||||
app.use("/api/script/delScript", route43);
|
||||
app.use("/api/script/getScrptApi", route44);
|
||||
app.use("/api/script/updateScript", route45);
|
||||
app.use("/api/setting/agentDeploy/deployAgentModel", route46);
|
||||
app.use("/api/setting/agentDeploy/getAgentDeploy", route47);
|
||||
app.use("/api/setting/agentDeploy/updateKey", route48);
|
||||
app.use("/api/setting/dbConfig/clearData", route49);
|
||||
app.use("/api/setting/getTextModel", route50);
|
||||
app.use("/api/setting/loginConfig/getUser", route51);
|
||||
app.use("/api/setting/loginConfig/updateUserPwd", route52);
|
||||
app.use("/api/setting/memoryConfig/getMemory", route53);
|
||||
app.use("/api/setting/memoryConfig/sureMemory", route54);
|
||||
app.use("/api/setting/vendorConfig/addVendor", route55);
|
||||
app.use("/api/setting/vendorConfig/deleteVendor", route56);
|
||||
app.use("/api/setting/vendorConfig/getVendorList", route57);
|
||||
app.use("/api/setting/vendorConfig/modelTest", route58);
|
||||
app.use("/api/setting/vendorConfig/updateVendor", route59);
|
||||
app.use("/api/task/getMyTaskApi", route60);
|
||||
app.use("/api/task/getTaskCategories", route61);
|
||||
app.use("/api/task/taskDetails", route62);
|
||||
app.use("/api/test/test", route63);
|
||||
}
|
||||
|
||||
@ -6,34 +6,38 @@ import { validateFields } from "@/middleware/middleware";
|
||||
const router = express.Router();
|
||||
|
||||
export default router.post(
|
||||
"/",
|
||||
validateFields({
|
||||
type: z.enum(["text", "image", "video", "all"]),
|
||||
}),
|
||||
async (req, res) => {
|
||||
const { type } = req.body;
|
||||
const data = await u.db("o_vendorConfig").select("id", "models", "name").first();
|
||||
if (!data) {
|
||||
return res.status(404).send({ error: "模型未找到" });
|
||||
}
|
||||
const models = JSON.parse(data.models!);
|
||||
if (type === "all") {
|
||||
const allData = models.filter((item: { type: string }) => item.type !== "video").map((item: { name: string; modelName: string; type: string }) => ({
|
||||
id: data.id,
|
||||
label: item.name,
|
||||
value: item.modelName,
|
||||
type: item.type,
|
||||
name: data.name,
|
||||
}));
|
||||
return res.status(200).send(success(allData));
|
||||
}
|
||||
const filteredData = models.filter((item: { type: string }) => item.type === type).map((item: { name: string; modelName: string; type: string }) => ({
|
||||
id: data.id,
|
||||
label: item.name,
|
||||
value: item.modelName,
|
||||
type: item.type,
|
||||
name: data.name,
|
||||
}));
|
||||
res.status(200).send(success(filteredData));
|
||||
"/",
|
||||
validateFields({
|
||||
type: z.enum(["text", "image", "video", "all"]),
|
||||
}),
|
||||
async (req, res) => {
|
||||
const { type } = req.body;
|
||||
const data = await u.db("o_vendorConfig").select("id", "models", "name").first();
|
||||
if (!data) {
|
||||
return res.status(404).send({ error: "模型未找到" });
|
||||
}
|
||||
const models = JSON.parse(data.models!);
|
||||
if (type === "all") {
|
||||
const allData = models
|
||||
.filter((item: { type: string }) => item.type !== "video")
|
||||
.map((item: { name: string; modelName: string; type: string }) => ({
|
||||
id: data.id,
|
||||
label: item.name,
|
||||
value: item.modelName,
|
||||
type: item.type,
|
||||
name: data.name,
|
||||
}));
|
||||
return res.status(200).send(success(allData));
|
||||
}
|
||||
const filteredData = models
|
||||
.filter((item: { type: string }) => item.type === type)
|
||||
.map((item: { name: string; modelName: string; type: string }) => ({
|
||||
id: data.id,
|
||||
label: item.name,
|
||||
value: item.modelName,
|
||||
type: item.type,
|
||||
name: data.name,
|
||||
}));
|
||||
res.status(200).send(success(filteredData));
|
||||
},
|
||||
);
|
||||
|
||||
70
src/routes/production/workbench/generateVideo.ts
Normal file
70
src/routes/production/workbench/generateVideo.ts
Normal file
@ -0,0 +1,70 @@
|
||||
import express from "express";
|
||||
import u from "@/utils";
|
||||
import { z } from "zod";
|
||||
import { v4 as uuidv4 } from "uuid";
|
||||
import { success } from "@/lib/responseFormat";
|
||||
import { validateFields } from "@/middleware/middleware";
|
||||
const router = express.Router();
|
||||
|
||||
export default router.post(
|
||||
"/",
|
||||
validateFields({
|
||||
scriptId: z.number(),
|
||||
projectId: z.number(),
|
||||
storyboardId: z.number(),
|
||||
prompt: z.string(),
|
||||
imageData: z.array(z.string()).optional(),
|
||||
model: z.string(),
|
||||
duration: z.number(),
|
||||
resolution: z.string(),
|
||||
audio: z.boolean().optional(),
|
||||
modeData: z.string(),
|
||||
}),
|
||||
async (req, res) => {
|
||||
const { scriptId, projectId, storyboardId, prompt, imageData, model, duration, resolution, audio, modeData } = req.body;
|
||||
console.log("%c Line:24 🍡 req.body", "background:#b03734", req.body);
|
||||
try {
|
||||
const relatedObjects = {
|
||||
id: storyboardId,
|
||||
projectId,
|
||||
type: "视频",
|
||||
};
|
||||
const systemPrompt = `你是一个专业的视频生成引擎,能够根据用户提供的提示词、图片和参数生成高质量的视频内容。请严格按照用户的需求进行视频创作,确保输出的视频符合以下要求:
|
||||
1. 视频内容必须与用户提供的提示词和图片相关联,准确反映用户的创意意图。
|
||||
2. 视频质量应达到专业水平,画面清晰、流畅,符合用户指定的分辨率和时长要求。
|
||||
3. 视频风格应与用户指定的模式数据相匹配,包括色彩、音乐、特效等元素。
|
||||
4. 视频中应包含用户提供的图片,并在视频中适当展示,以增强视频的视觉效果。
|
||||
5. 如果用户指定了音频,请确保视频中的音频与视频内容相匹配,符合用户的创意意图。`;
|
||||
const videoPath = `/${projectId}/video/${uuidv4()}.mp4`;
|
||||
const aiVideo = u.Ai.Video(model);
|
||||
await aiVideo.run({
|
||||
systemPrompt, // 系统提示词
|
||||
projectId: projectId,
|
||||
storyboardId: storyboardId,
|
||||
prompt: prompt,
|
||||
imageData: imageData,
|
||||
modeData: modeData,
|
||||
duration: duration,
|
||||
resolution: resolution,
|
||||
audio: audio,
|
||||
taskClass: "视频生成",
|
||||
describe: "根据提示词生成视频",
|
||||
relatedObjects: JSON.stringify(relatedObjects),
|
||||
});
|
||||
await aiVideo.save(videoPath); // 保存视频
|
||||
//保存视频信息到数据库
|
||||
// await u.db("o_video").insert({
|
||||
// resolution,
|
||||
// prompt,
|
||||
// filePath: videoPath,
|
||||
// model,
|
||||
// time: new Date(),
|
||||
// state: "生成成功",
|
||||
// scriptId: scriptId,
|
||||
// });
|
||||
res.status(200).send(success("视频生成成功"));
|
||||
} catch (error) {
|
||||
res.status(500).send({ error: "视频生成失败" });
|
||||
}
|
||||
},
|
||||
);
|
||||
@ -40,16 +40,9 @@ const vendorConfigSchema = z.object({
|
||||
modelName: z.string(),
|
||||
type: z.literal("video"),
|
||||
mode: z.array(
|
||||
z.enum([
|
||||
"singleImage",
|
||||
"multiImage",
|
||||
"gridImage",
|
||||
"startEndRequired",
|
||||
"endFrameOptional",
|
||||
"startFrameOptional",
|
||||
"text",
|
||||
"audioReference",
|
||||
"videoReference",
|
||||
z.union([
|
||||
z.enum(["singleImage", "multiImage", "gridImage", "startEndRequired", "endFrameOptional", "startFrameOptional", "text"]),
|
||||
z.array(z.enum(["audioReference", "videoReference", "textReference", "imageReference"])),
|
||||
]),
|
||||
),
|
||||
audio: z.union([z.literal("optional"), z.boolean()]),
|
||||
@ -100,16 +93,9 @@ export default router.post(
|
||||
modelName: z.string(),
|
||||
type: z.literal("video"),
|
||||
mode: z.array(
|
||||
z.enum([
|
||||
"singleImage",
|
||||
"multiImage",
|
||||
"gridImage",
|
||||
"startEndRequired",
|
||||
"endFrameOptional",
|
||||
"startFrameOptional",
|
||||
"text",
|
||||
"audioReference",
|
||||
"videoReference",
|
||||
z.union([
|
||||
z.enum(["singleImage", "multiImage", "gridImage", "startEndRequired", "endFrameOptional", "startFrameOptional", "text"]),
|
||||
z.array(z.enum(["audioReference", "videoReference", "textReference", "imageReference"])),
|
||||
]),
|
||||
),
|
||||
audio: z.union([z.literal("optional"), z.boolean()]),
|
||||
|
||||
@ -112,13 +112,28 @@ class AiImage {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
interface VideoConfig {
|
||||
projectId: number; // 项目ID
|
||||
storyboardId: number; // 关联的分镜ID
|
||||
systemPrompt?: string; // 系统提示词
|
||||
prompt: string; //视频提示词
|
||||
imageData: string[]; //输入的图片提示词
|
||||
modeData: string; //模式
|
||||
duration: number; // 视频时长,单位秒
|
||||
resolution: string; // 视频分辨率
|
||||
audio: boolean; // 是否需要配音
|
||||
taskClass: string; // 任务分类
|
||||
describe: string; // 任务描述
|
||||
relatedObjects: string; // 相关对象信息,便于后续分析和追踪
|
||||
}
|
||||
|
||||
class AiVideo {
|
||||
private key: `${number}:${string}`;
|
||||
private result: string = "";
|
||||
constructor(key: `${number}:${string}`) {
|
||||
this.key = key;
|
||||
}
|
||||
async run(input: ImageConfig) {
|
||||
async run(input: VideoConfig) {
|
||||
return withTaskRecord(this.key, input.taskClass, input.describe, input.relatedObjects, input.projectId, async (modelName) => {
|
||||
const fn = await getVendorTemplateFn("videoRequest", modelName);
|
||||
this.result = await fn(input);
|
||||
@ -137,7 +152,7 @@ class AiAudio {
|
||||
constructor(key: `${number}:${string}`) {
|
||||
this.key = key;
|
||||
}
|
||||
async run(input: ImageConfig) {
|
||||
async run(input: VideoConfig) {
|
||||
return withTaskRecord(this.key, input.taskClass, input.describe, input.relatedObjects, input.projectId, async (modelName) => {
|
||||
const fn = await getVendorTemplateFn("ttsRequest", modelName);
|
||||
this.result = await fn(input);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user