From d4cfcd0a1ab00423220dd035635aac181b0dbd3a Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 27 Jun 2024 13:25:10 +0800 Subject: [PATCH] 【代码优化】AI:音乐生成 --- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/AiImageController.http | 13 +++++++++++++ yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/AiMusicController.java | 3 ++- yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/vo/AiSunoGenerateReqVO.java | 4 ++-- yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/config/YudaoAiAutoConfiguration.java | 2 +- yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/QianWenChatClientTests.java | 1 + yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoChatClientMainTests.java | 1 + yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoChatClientTests.java | 1 + yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoOkHttpTests.java | 1 + yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/YiYanChatTests.java | 1 + yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/image/OpenAiImageClientTests.java | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/music/SunoTests.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/openai/OpenAiImageClientTests.java | 69 --------------------------------------------------------------------- yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/suno/SunoTests.java | 57 --------------------------------------------------------- 13 files changed, 150 insertions(+), 130 deletions(-) create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/AiImageController.http create mode 100644 yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/image/OpenAiImageClientTests.java create mode 100644 yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/music/SunoTests.java delete mode 100644 yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/openai/OpenAiImageClientTests.java delete mode 100644 yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/suno/SunoTests.java diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/AiImageController.http b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/AiImageController.http new file mode 100644 index 0000000..b3d11ff --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/AiImageController.http @@ -0,0 +1,13 @@ +### 生成音乐:Suno + +POST {{baseUrl}}/ai/music/generate +Content-Type: application/json +Authorization: {{token}} + +{ + "platform": "Suno", + "generateMode": 1, + "prompt": "来一首快乐的歌曲", + "modelVersion": "chirp-v3.5", + "tags": ["Happy"], + "title": "Happy Song" +} \ No newline at end of file diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/AiMusicController.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/AiMusicController.java index b9eeed2..92887f1 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/AiMusicController.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/AiMusicController.java @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "管理后台 - AI 音乐") @RestController @@ -27,7 +28,7 @@ public class AiMusicController { @PostMapping("/generate") @Operation(summary = "音乐生成") public CommonResult> generateMusic(@RequestBody @Valid AiSunoGenerateReqVO reqVO) { - return success(musicService.generateMusic(reqVO)); + return success(musicService.generateMusic(getLoginUserId(), reqVO)); } } diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/vo/AiSunoGenerateReqVO.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/vo/AiSunoGenerateReqVO.java index bb9c966..d1069e9 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/vo/AiSunoGenerateReqVO.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/vo/AiSunoGenerateReqVO.java @@ -17,7 +17,7 @@ public class AiSunoGenerateReqVO { @Schema(description = "生成模式", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") @NotNull(message = "生成模式不能为空") - private Integer generateMode; // 参见 AiMusicGenerateEnum 枚举 + private Integer generateMode; // 参见 AiMusicGenerateModeEnum 枚举 @Schema(description = "用于生成音乐音频的提示", requiredMode = Schema.RequiredMode.REQUIRED, example = "创作一首带有轻松吉他旋律的流行歌曲,[verse] 描述夏日海滩的宁静,[chorus] 节奏加快,表达对自由的向往。") @@ -26,7 +26,7 @@ public class AiSunoGenerateReqVO { @Schema(description = "是否纯音乐", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "true") private Boolean makeInstrumental; - @Schema(description = "模型版本, 默认 chirp-v3.5", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "chirp-v3.5") + @Schema(description = "模型版本", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "chirp-v3.5") private String modelVersion; // 参见 AiModelEnum 枚举 @Schema(description = "音乐风格", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "[\"pop\",\"jazz\",\"punk\"]") diff --git a/yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/config/YudaoAiAutoConfiguration.java b/yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/config/YudaoAiAutoConfiguration.java index 9b41003..d628615 100644 --- a/yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/config/YudaoAiAutoConfiguration.java +++ b/yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/config/YudaoAiAutoConfiguration.java @@ -63,7 +63,7 @@ public class YudaoAiAutoConfiguration { YudaoAiProperties.QianWenProperties qianWenProperties = yudaoAiProperties.getQianwen(); // 转换配置 QianWenOptions qianWenOptions = new QianWenOptions(); - qianWenOptions.setModel(qianWenProperties.getModel().getModel()); +// qianWenOptions.setModel(qianWenProperties.getModel().getModel()); TODO @fan:这里报错了 qianWenOptions.setTemperature(qianWenProperties.getTemperature()); // qianWenOptions.setTopK(qianWenProperties.getTopK()); TODO 芋艿:后续弄 qianWenOptions.setTopP(qianWenProperties.getTopP()); diff --git a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/QianWenChatClientTests.java b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/QianWenChatClientTests.java index a003d1b..42bb0a4 100644 --- a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/QianWenChatClientTests.java +++ b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/QianWenChatClientTests.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Scanner; import java.util.function.Consumer; +// TODO 芋艿:整理单测 /** * author: fansili * time: 2024/3/13 21:37 diff --git a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoChatClientMainTests.java b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoChatClientMainTests.java index 524bd3e..22bb31a 100644 --- a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoChatClientMainTests.java +++ b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoChatClientMainTests.java @@ -18,6 +18,7 @@ import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.*; +// TODO 芋艿:整理单测 /** * author: fansili * time: 2024/3/13 20:47 diff --git a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoChatClientTests.java b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoChatClientTests.java index 8d9cb38..671af5e 100644 --- a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoChatClientTests.java +++ b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoChatClientTests.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Scanner; import java.util.function.Consumer; +// TODO 芋艿:整理单测 /** * 讯飞星火 tests *

diff --git a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoOkHttpTests.java b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoOkHttpTests.java index 5a08741..c0d4211 100644 --- a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoOkHttpTests.java +++ b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoOkHttpTests.java @@ -17,6 +17,7 @@ import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.*; +// TODO 芋艿:整理单测 /** * 讯飞星火 tests *

diff --git a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/YiYanChatTests.java b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/YiYanChatTests.java index 55d16ea..dc376c1 100644 --- a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/YiYanChatTests.java +++ b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/YiYanChatTests.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Scanner; +// TODO 芋艿:整理单测 /** * chat 文心一言 *

diff --git a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/image/OpenAiImageClientTests.java b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/image/OpenAiImageClientTests.java new file mode 100644 index 0000000..7d519c2 --- /dev/null +++ b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/image/OpenAiImageClientTests.java @@ -0,0 +1,70 @@ +package cn.iocoder.yudao.framework.ai.image; + +import org.springframework.ai.image.ImagePrompt; +import org.springframework.ai.image.ImageResponse; +import org.junit.Before; +import org.junit.Test; +import org.springframework.ai.openai.OpenAiImageClient; +import org.springframework.ai.openai.api.OpenAiImageApi; + +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Base64; +import java.util.Scanner; + +// TODO 芋艿:整理单测 +/** + * author: fansili + * time: 2024/3/17 10:40 + */ +public class OpenAiImageClientTests { + + + private OpenAiImageClient openAiImageClient; + + @Before + public void setup() { + // 初始化 openAiImageClient + this.openAiImageClient = new OpenAiImageClient( + new OpenAiImageApi("") +// new OpenAiImageOptions().setResponseFormat(OpenAiImageOptions.ResponseFormatEnum.URL.getValue()) TODO 芋艿:临时处理 + ); + } + + @Test + public void callTest() { + ImageResponse call = openAiImageClient.call(new ImagePrompt("中国长城!")); + System.err.println("url: " + call.getResult().getOutput().getUrl()); + System.err.println("base64: " + call.getResult().getOutput().getB64Json()); + + String base64String = call.getResult().getOutput().getB64Json(); + ImageIcon imageIcon = new ImageIcon(decodeBase64ToImage(base64String)); + JLabel label = new JLabel(imageIcon); + + JFrame frame = new JFrame("Base64 Image Display"); + frame.getContentPane().add(label); + frame.pack(); + frame.setVisible(true); + + // 阻止退出 + Scanner scanner = new Scanner(System.in); + scanner.nextLine(); + } + + + // 将Base64解码为BufferedImage + private static BufferedImage decodeBase64ToImage(String base64String) { + try { + byte[] decodedBytes = Base64.getDecoder().decode(base64String); + ByteArrayInputStream bis = new ByteArrayInputStream(decodedBytes); + return ImageIO.read(bis); + } catch (IOException e) { + System.out.println("Error decoding the base64 image: " + e.getMessage()); + return null; + } + } + +} diff --git a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/music/SunoTests.java b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/music/SunoTests.java new file mode 100644 index 0000000..ad43e37 --- /dev/null +++ b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/music/SunoTests.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.framework.ai.music; + +import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +// TODO 芋艿:整理单测 +/** + * @Author xiaoxin + * @Date 2024/5/27 + */ +public class SunoTests { + + private SunoApi sunoApi; + + @Before + public void setup() { + String url = "https://suno-om0w1cy6e-status2xxs-projects.vercel.app"; + this.sunoApi = new SunoApi(url); + } + + @Test + public void selectById() { + System.out.println(sunoApi.getMusicList(List.of("d460ddda-7c87-4f34-b751-419b08a590ca,ff90ea66-49cd-4fd2-b44c-44267dfd5551"))); + } + + @Test + public void generate() { + List generate = sunoApi.generate(new SunoApi.MusicGenerateRequest("创作一首带有轻松吉他旋律的流行歌曲,[verse] 描述夏日海滩的宁静,[chorus] 节奏加快,表达对自由的向往。")); + System.out.println(generate); + } + + + @Test + public void doChatCompletion() { + List generate = sunoApi.chatCompletion("创作一首带有轻松吉他旋律的流行歌曲,[verse] 描述夏日海滩的宁静,[chorus] 节奏加快,表达对自由的向往。"); + System.out.println(generate); + } + + + @Test + public void generateLyrics() { + SunoApi.LyricsData lyricsData = sunoApi.generateLyrics("A soothing lullaby"); + System.out.println(lyricsData); + } + + + @Test + public void selectLimit() { + SunoApi.LimitUsageData limitUsageData = sunoApi.getLimitUsage(); + System.out.println(limitUsageData); + } + + +} diff --git a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/openai/OpenAiImageClientTests.java b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/openai/OpenAiImageClientTests.java deleted file mode 100644 index 53a4595..0000000 --- a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/openai/OpenAiImageClientTests.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.iocoder.yudao.framework.ai.openai; - -import org.springframework.ai.image.ImagePrompt; -import org.springframework.ai.image.ImageResponse; -import org.junit.Before; -import org.junit.Test; -import org.springframework.ai.openai.OpenAiImageClient; -import org.springframework.ai.openai.api.OpenAiImageApi; - -import javax.imageio.ImageIO; -import javax.swing.*; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.util.Base64; -import java.util.Scanner; - -/** - * author: fansili - * time: 2024/3/17 10:40 - */ -public class OpenAiImageClientTests { - - - private OpenAiImageClient openAiImageClient; - - @Before - public void setup() { - // 初始化 openAiImageClient - this.openAiImageClient = new OpenAiImageClient( - new OpenAiImageApi("") -// new OpenAiImageOptions().setResponseFormat(OpenAiImageOptions.ResponseFormatEnum.URL.getValue()) TODO 芋艿:临时处理 - ); - } - - @Test - public void callTest() { - ImageResponse call = openAiImageClient.call(new ImagePrompt("中国长城!")); - System.err.println("url: " + call.getResult().getOutput().getUrl()); - System.err.println("base64: " + call.getResult().getOutput().getB64Json()); - - String base64String = call.getResult().getOutput().getB64Json(); - ImageIcon imageIcon = new ImageIcon(decodeBase64ToImage(base64String)); - JLabel label = new JLabel(imageIcon); - - JFrame frame = new JFrame("Base64 Image Display"); - frame.getContentPane().add(label); - frame.pack(); - frame.setVisible(true); - - // 阻止退出 - Scanner scanner = new Scanner(System.in); - scanner.nextLine(); - } - - - // 将Base64解码为BufferedImage - private static BufferedImage decodeBase64ToImage(String base64String) { - try { - byte[] decodedBytes = Base64.getDecoder().decode(base64String); - ByteArrayInputStream bis = new ByteArrayInputStream(decodedBytes); - return ImageIO.read(bis); - } catch (IOException e) { - System.out.println("Error decoding the base64 image: " + e.getMessage()); - return null; - } - } - -} diff --git a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/suno/SunoTests.java b/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/suno/SunoTests.java deleted file mode 100644 index 5b44668..0000000 --- a/yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/suno/SunoTests.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.iocoder.yudao.framework.ai.suno; - -import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi; -import org.junit.Before; -import org.junit.Test; - -import java.util.List; - -/** - * @Author xiaoxin - * @Date 2024/5/27 - */ -public class SunoTests { - - SunoApi sunoApi; - - @Before - public void setup() { - String url = "https://suno-imrqwwui8-status2xxs-projects.vercel.app"; - this.sunoApi = new SunoApi(url); - } - - @Test - public void selectById() { - System.out.println(sunoApi.getMusicList(List.of("d460ddda-7c87-4f34-b751-419b08a590ca,ff90ea66-49cd-4fd2-b44c-44267dfd5551"))); - - } - - @Test - public void generate() { - List generate = sunoApi.generate(new SunoApi.MusicGenerateRequest("创作一首带有轻松吉他旋律的流行歌曲,[verse] 描述夏日海滩的宁静,[chorus] 节奏加快,表达对自由的向往。")); - System.out.println(generate); - } - - - @Test - public void doChatCompletion() { - List generate = sunoApi.chatCompletion("创作一首带有轻松吉他旋律的流行歌曲,[verse] 描述夏日海滩的宁静,[chorus] 节奏加快,表达对自由的向往。"); - System.out.println(generate); - } - - - @Test - public void generateLyrics() { - SunoApi.LyricsData lyricsData = sunoApi.generateLyrics("A soothing lullaby"); - System.out.println(lyricsData); - } - - - @Test - public void selectLimit() { - SunoApi.LimitUsageData limitUsageData = sunoApi.getLimitUsage(); - System.out.println(limitUsageData); - } - - -} -- libgit2 0.21.4