AIGC-Flow项目(三)接入Midjourney:使用net.dv8tion接入Discord,通过机器人实现Midjourney调用

728 阅读2分钟

原本是要写工作流设计,但是写过后总觉得有漏洞,先留着,重构后再发。

最近完成了Midjourney对接,这个对接的方法是从一个开源项目获得的,这个项目地址在之前的文章中写过:

搭建一个微信机器人,接入Midjourney

感兴趣的伙伴们可以尝试搭建看看。

搭建

引入包

<dependency>  
    <groupId>net.dv8tion</groupId>  
    <artifactId>JDA</artifactId>  
    <version>${jda.version}</version>  
    <exclusions>  
        <exclusion>  
        <groupId>club.minnced</groupId>  
        <artifactId>opus-java</artifactId>  
        </exclusion>  
    </exclusions>  
</dependency>  
  
<dependency>  
    <groupId>eu.maxschuster</groupId>  
    <artifactId>dataurl</artifactId>  
    <version>${dataurl.version}</version>  
</dependency>

第一个依赖项是JDA(Java Discord API),它是一个用于Java开发人员开发Discord机器人的库。JDA提供了与Discord API交互所需的所有功能,并且可以轻松地构建聊天机器人、播放音乐和执行其他操作。

在这个依赖项中,还有一个排除部分,排除了club.minnced:opus-java,这是一个用于音频编解码的库,JDA默认使用JDA-NAS(JDA Native Audio System)来处理音频编解码,因此排除了opus-java。

第二个依赖项是dataurl,它是一个Java库,用于处理data:URL格式的数据。data:URL格式是一种在URL中嵌入数据的方式,它可以将数据编码为Base64,并将其嵌入到URL中。dataurl库提供了一些方法来解析和创建data:URL格式的数据。这个库可以用于将图像或其他二进制数据编码为data:URL格式,以便在网络上传输或嵌入到HTML或CSS中。

代码

JAVA代码

image.png

image.png

代码太多,就不一个一个发了,在功能主流程可以跑通后就会发出来代码。

代码主要分为了三部分:Discord、Task部分、Midjourney部分

Discord:包含DiscordService、DiscordServiceImpl,主要实现对Discord的调用;

Task:包含TaskService、InMemoryTaskServiceImpl、NotifyService、NotifyServiceImpl,主要实现任务发布、任务执行、任务回调等服务。

Midjourney:通过Discord服务调用Midjourney机器人,目前系统中包含对Midjourney的describe、imagine、reset、upscale、variation命令,通过Discord的命令调用规则,编写JSON文件,对应几个命令的数据包。

image.png

Task模块设计

image.png

以imagin为例,在调用时会创建Task实例,并调用putTask将任务传入队列。

public MessageVO<String> submit(SubmitDTO submitDTO) {  
    if (submitDTO.getAction() == null) {  
        return MessageVO.validationError();  
    }  
    if ((submitDTO.getAction() == Action.UPSCALE || submitDTO.getAction() == Action.VARIATION)  
    && (submitDTO.getIndex() < 1 || submitDTO.getIndex() > 4)) {  
        return MessageVO.validationError();  
    }  
    Task task = new Task();  
    task.setNotifyHook(CharSequenceUtil.isBlank(submitDTO.getNotifyHook()) ? this.properties.getNotifyHook() : submitDTO.getNotifyHook());  

    task.setId(RandomUtil.randomNumbers(16));  
    task.setSubmitTime(System.currentTimeMillis());  
    task.setState(submitDTO.getState());  
    task.setAction(submitDTO.getAction());  
    task.setTaskInstanceCode(submitDTO.getTaskInstanceCode());  
    task.setTaskNodeInstanceCode(submitDTO.getTaskNodeInstanceCode());  

    MessageVO<Void> result;  
    if (Action.IMAGINE.equals(submitDTO.getAction())) {  
        String prompt = submitDTO.getPrompt();  
        if (CharSequenceUtil.isBlank(prompt)) {  
            return MessageVO.validationError();  
        }  
        task.setKey(task.getId());  
        task.setPrompt(prompt);  
        // String promptEn = this.translateService.translateToEnglish(prompt).trim();  
        //不调用翻译功能  
        task.setPromptEn(prompt);  
        task.setFinalPrompt("[" + task.getId() + "] " + prompt);  
        task.setDescription("/imagine " + submitDTO.getPrompt());  
        this.taskService.putTask(task.getId(), task);  
        result = this.discordService.imagine(task.getFinalPrompt());  
    }
    if (result.getCode() != MessageVO.SUCCESS_CODE) {  
        this.taskService.removeTask(task.getId());  
        return MessageVO.of(result.getCode(), result.getDescription());  
    }  
    return MessageVO.success(task.getId());  
}