1 Star 0 Fork 0

bluekey2000/magic

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
Readme.txt 14.08 KB
一键复制 编辑 原始数据 按行查看 历史
huangli 提交于 2024-12-20 10:26 . 完成一个文生图
要基于 ComfyUI API 构建一个商业级别的大语言模型问答、AI绘画、AI配音和AI视频创作的全栈项目,可以结合 Nuxt3, Vue3, Node.js, NestJS, TypeScript, PixiJS 等技术来实现。在这个项目中,ComfyUI API 可以作为 AI 任务的核心引擎,提供图像生成、图像编辑、视频生成等功能,而大语言模型问答和语音合成可以通过其他API(如 OpenAI、Google Cloud TTS)来实现。
1. 项目概述
此项目需要一个前端和后端架构,能够提供多种 AI 服务(包括但不限于问答、绘画、配音和视频创作),并通过 ComfyUI API 来处理图像生成相关的功能。
2. 项目功能模块
大语言模型问答(基于 OpenAI 等):通过输入用户的问题,调用后端的 GPT-3 或 GPT-4 API 进行自然语言理解与回答。
AI 绘画(基于 ComfyUI API):用户输入文本描述,调用 ComfyUI API 生成图像。
AI 配音(基于 Google Cloud TTS 或 Amazon Polly):将文本转化为语音。
AI 视频创作(基于其他视频生成服务):将文本描述生成短视频,结合图像和配音。
后端(NestJS):管理业务逻辑、处理 API 请求、与 AI 服务进行集成。
3. 技术栈
前端:Nuxt3、Vue3、PixiJS、Axios
后端:NestJS、Node.js、TypeScript、ComfyUI API、OpenAI API、Google Cloud TTS
数据库:使用 MMongoDB 来管理用户数据、生成的图像/视频历史记录等。
容器化部署:Docker 和 Docker Compose
云服务:如 AWS 或 Google Cloud 来部署后端服务,或使用自定义服务器。
4. 项目架构设计
前端(Nuxt3 + Vue3 + PixiJS)
Nuxt3:用于构建前端页面,支持 SSR、SSG 和客户端渲染。
Vue3:构建响应式组件。
PixiJS:用于渲染图像和动画,特别适用于 AI 绘画和视频创作。
前端目录结构:
frontend/
├── assets/ # 静态资源(图像、音频、视频)
├── components/ # Vue3 组件
│ ├── AIChat.vue # AI 问答组件
│ ├── AIDrawing.vue # AI 绘画组件
│ ├── AIVoice.vue # AI 配音组件
│ └── AIVideo.vue # AI 视频创作组件
├── layouts/ # 布局文件
├── pages/ # 页面文件
│ ├── index.vue # 主页
│ ├── about.vue # 关于页面
├── store/ # Vuex 状态管理
├── plugins/ # 插件,初始化服务
├── nuxt.config.ts # Nuxt3 配置文件
└── tsconfig.json # TypeScript 配置
核心功能:
AI 问答组件(AIChat.vue): 提供用户输入的接口,通过后端调用 GPT 模型进行问答。
vue
复制代码
<template>
<div>
<textarea v-model="userInput" placeholder="请输入你的问题"></textarea>
<button @click="askQuestion">提问</button>
<div v-if="response">
<p>AI回答:</p>
<p>{{ response }}</p>
</div>
</div>
</template>
<script lang="ts">
import { ref } from 'vue';
import axios from 'axios';
export default {
setup() {
const userInput = ref('');
const response = ref('');
const askQuestion = async () => {
try {
const result = await axios.post('/api/ai/chat', { query: userInput.value });
response.value = result.data.answer;
} catch (error) {
console.error(error);
}
};
return { userInput, response, askQuestion };
},
};
</script>
AI 绘画组件(AIDrawing.vue): 用户输入描述,调用 ComfyUI API 生成图像。
vue
复制代码
<template>
<div>
<input v-model="description" placeholder="描述你的图像" />
<button @click="generateImage">生成图像</button>
<div v-if="imageUrl">
<img :src="imageUrl" alt="Generated Image" />
</div>
</div>
</template>
<script lang="ts">
import { ref } from 'vue';
import axios from 'axios';
export default {
setup() {
const description = ref('');
const imageUrl = ref('');
const generateImage = async () => {
try {
const result = await axios.post('/api/ai/drawing', { description: description.value });
imageUrl.value = result.data.imageUrl;
} catch (error) {
console.error(error);
}
};
return { description, imageUrl, generateImage };
},
};
</script>
AI 配音组件(AIVoice.vue): 用户输入文本,调用语音合成服务生成配音。
vue
复制代码
<template>
<div>
<textarea v-model="textToConvert" placeholder="输入要配音的文本"></textarea>
<button @click="convertToVoice">生成配音</button>
<audio v-if="audioUrl" :src="audioUrl" controls></audio>
</div>
</template>
<script lang="ts">
import { ref } from 'vue';
import axios from 'axios';
export default {
setup() {
const textToConvert = ref('');
const audioUrl = ref('');
const convertToVoice = async () => {
try {
const result = await axios.post('/api/ai/voice', { text: textToConvert.value });
audioUrl.value = result.data.audioUrl;
} catch (error) {
console.error(error);
}
};
return { textToConvert, audioUrl, convertToVoice };
},
};
</script>
后端(NestJS + Node.js + TypeScript + ComfyUI API)
NestJS:作为后端框架,处理所有 API 请求,负责与 AI 服务(如 ComfyUI、GPT、TTS)进行通信。
ComfyUI API:集成到后端中,处理与图像生成相关的请求。
后端目录结构:
backend/
├── src/
│ ├── app.module.ts # 主模块
│ ├── ai/
│ │ ├── ai.controller.ts # AI 请求处理
│ │ ├── ai.service.ts # 业务逻辑
│ ├── common/ # 通用模块
│ ├── main.ts # 启动文件
├── tsconfig.json # TypeScript 配置
└── nest-cli.json # NestJS 配置
核心功能:
AI 绘画(基于 ComfyUI): 后端接收前端请求,调用 ComfyUI API 来生成图像。
ai.controller.ts 示例:
import { Controller, Post, Body } from '@nestjs/common';
import { AiService } from './ai.service';
@Controller('ai')
export class AiController {
constructor(private readonly aiService: AiService) {}
@Post('drawing')
async generateImage(@Body() body: { description: string }) {
const image = await this.aiService.generateImage(body.description);
return { imageUrl: image };
}
}
AI 问答(基于 OpenAI 或类似 API): 后端接收用户输入,调用 OpenAI GPT API 进行自然语言处理。
ai.service.ts 示例:
import { Injectable } from '@nestjs/common';
import axios from 'axios';
@Injectable()
export class AiService {
async generateImage(description: string): Promise<string> {
const response = await axios.post('COMFYUI_API_URL', {
description,
});
return response.data.imageUrl; // 假设返回图像的 URL
}
async askQuestion(query: string): Promise<string> {
const response = await axios.post('OPENAI_API_URL', {
query,
});
return response.data.answer; // 假设返回 AI 答案
}
}
继续完善 AI 绘画 的整个流程,我们将重点描述如何在后端集成 ComfyUI API 来完成图像生成的任务,确保从前端请求到生成的图像文件返回,整个过程高效且无缝。
AI 绘画整个流程:
1. 前端请求绘画
在前端,用户输入描述并提交请求,我们通过 axios 将请求发送到后端的 API。前端组件的核心是通过用户输入的文本描述调用后端绘画接口,然后显示生成的图像。
我们已经在之前的部分展示了 AIDrawing.vue 组件的实现,前端调用后端 API,获取生成的图像 URL 后,展示在页面上。
vue
复制代码
<template>
<div>
<input v-model="description" placeholder="描述你的图像" />
<button @click="generateImage">生成图像</button>
<div v-if="imageUrl">
<img :src="imageUrl" alt="Generated Image" />
</div>
</div>
</template>
<script lang="ts">
import { ref } from 'vue';
import axios from 'axios';
export default {
setup() {
const description = ref('');
const imageUrl = ref('');
const generateImage = async () => {
try {
const result = await axios.post('/api/ai/drawing', { description: description.value });
imageUrl.value = result.data.imageUrl;
} catch (error) {
console.error(error);
}
};
return { description, imageUrl, generateImage };
},
};
</script>
2. 后端集成 ComfyUI API
在后端,我们将请求转发到 ComfyUI API 来生成图像。ComfyUI 提供了图像生成接口,用户的描述会作为输入,生成相应的图像。
我们需要在后端实现与 ComfyUI API 的集成,并处理生成图像的逻辑。
2.1 安装依赖
我们使用 axios 来发送 HTTP 请求到 ComfyUI API,首先安装 axios(如果尚未安装):
bash
复制代码
npm install axios
2.2 后端服务实现
在 NestJS 后端,我们将通过 ai.service.ts 中的逻辑调用 ComfyUI API 生成图像,并返回图像 URL。这里假设 ComfyUI API 提供了一个图像生成的端点。
ai.service.ts 示例:
typescript
复制代码
import { Injectable } from '@nestjs/common';
import axios from 'axios';
@Injectable()
export class AiService {
// ComfyUI API URL
private readonly comfyUiUrl = 'http://comfyui_api_url/generate'; // 替换为实际的 ComfyUI API URL
// 调用 ComfyUI 生成图像
async generateImage(description: string): Promise<string> {
try {
const response = await axios.post(this.comfyUiUrl, {
description: description, // 描述文本
});
// 假设返回的响应中有一个 'imageUrl' 字段,表示生成图像的 URL
return response.data.imageUrl; // 返回生成图像的 URL
} catch (error) {
console.error('Error during image generation:', error);
throw new Error('图像生成失败');
}
}
}
2.3 后端控制器实现
接下来,我们创建一个控制器来处理前端的 API 请求。控制器会调用 AiService 中的方法,获取生成的图像 URL,并返回给前端。
ai.controller.ts 示例:
typescript
复制代码
import { Controller, Post, Body } from '@nestjs/common';
import { AiService } from './ai.service';
@Controller('ai')
export class AiController {
constructor(private readonly aiService: AiService) {}
@Post('drawing')
async generateImage(@Body() body: { description: string }) {
const imageUrl = await this.aiService.generateImage(body.description);
return { imageUrl }; // 返回生成的图像 URL
}
}
2.4 配置跨域请求(CORS)
确保前端和后端能够正常通信,我们需要配置 CORS(跨域资源共享)。在 NestJS 中,可以在 main.ts 中进行全局配置:
main.ts 示例:
typescript
复制代码
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
// 配置 CORS,允许前端访问后端 API
app.enableCors();
await app.listen(3000);
}
bootstrap();
2.5 测试 ComfyUI 图像生成
确保 ComfyUI API 能正常工作,发送一条测试请求,检查是否返回图像链接。
假设 ComfyUI API 返回一个包含 imageUrl 字段的响应,确保在 AiService 中调用正确的 API URL 并正确处理响应。
3. 流程总结
前端用户输入描述:用户在前端界面输入描述文本,并点击生成图像按钮。
前端发送请求到后端:前端通过 axios 向后端 /api/ai/drawing 发送请求,包含用户的描述文本。
后端处理请求并调用 ComfyUI API:后端接收到请求后,调用 ComfyUI API 来生成图像。
后端返回生成的图像 URL:生成的图像通过 ComfyUI API 返回一个图像 URL,后端将此 URL 返回给前端。
前端展示生成的图像:前端接收到图像 URL 后,将图像显示在页面上。
4. 附加功能:图像保存与管理
在实际商业级应用中,可能需要保存生成的图像,并对其进行管理。可以将生成的图像 URL 保存到数据库中,便于用户查看历史记录。
例如,我们可以使用 MongoDB 或 MySQL 来保存图像的 URL 和其他相关信息。
数据库模型示例(使用 TypeORM):
typescript
复制代码
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class Image {
@PrimaryGeneratedColumn()
id: number;
@Column()
description: string;
@Column()
imageUrl: string;
}
保存图像信息到数据库:
在 AiService 中,我们可以在图像生成后,将其 URL 保存到数据库。
typescript
复制代码
import { Injectable } from '@nestjs/common';
import axios from 'axios';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Image } from './image.entity';
@Injectable()
export class AiService {
private readonly comfyUiUrl = 'http://comfyui_api_url/generate';
constructor(
@InjectRepository(Image)
private readonly imageRepository: Repository<Image>
) {}
async generateImage(description: string): Promise<string> {
try {
const response = await axios.post(this.comfyUiUrl, {
description: description,
});
const imageUrl = response.data.imageUrl;
// 保存生成的图像信息到数据库
const image = new Image();
image.description = description;
image.imageUrl = imageUrl;
await this.imageRepository.save(image);
return imageUrl;
} catch (error) {
console.error('Error during image generation:', error);
throw new Error('图像生成失败');
}
}
}
这样,生成的图像不仅可以立即返回给前端,还能永久保存在数据库中,供后续管理和展示。
5. 总结
通过结合 ComfyUI API 和 NestJS,前端能够快速与后端交互,用户输入描述后,系统会调用 ComfyUI 生成图像并返回给前端展示。在实际的商业级项目中,我们还可以添加更多功能,如用户登录、图像历史记录管理等,并将生成的图像保存到数据库中,以便进一步使用。
这个流程可以扩展到更多的 AI 功能,例如文本到视频、语音合成等,逐步打造一个完整的 AI 应用平台。
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/bluekey2000/magic.git
git@gitee.com:bluekey2000/magic.git
bluekey2000
magic
magic
master

搜索帮助