Commit c0de6cc508a0be28ede39bb9ac627246897e3844

Authored by xiaoxin
1 parent a858eb84

【解决todo】SunoResp、SunoReq改为record简化

yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/vo/MusicDataVO.java
1 1 package cn.iocoder.yudao.module.ai.controller.admin.music.vo;
2 2  
  3 +import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi;
3 4 import com.fasterxml.jackson.annotation.JsonProperty;
4 5 import lombok.Data;
5 6  
  7 +import java.util.List;
  8 +import java.util.stream.Collectors;
  9 +
6 10 /**
7 11 * 表示单个音乐数据的类
8 12 */
9 13 @Data
10   -public class MusicDataVO {
  14 +public class MusicDataVO {
11 15 /**
12 16 * 音乐数据的 ID
13 17 */
... ... @@ -61,4 +65,21 @@ public class MusicDataVO {
61 65 * 音乐音频的风格
62 66 */
63 67 private String style;
  68 +
  69 + public static List<MusicDataVO> convertFrom(List<SunoApi.SunoResp.MusicData> musicDataList) {
  70 + return musicDataList.stream().map(musicData -> {
  71 + MusicDataVO musicDataVO = new MusicDataVO();
  72 + musicDataVO.setId(musicData.id());
  73 + musicDataVO.setTitle(musicData.title());
  74 + musicDataVO.setImageUrl(musicData.imageUrl());
  75 + musicDataVO.setLyric(musicData.lyric());
  76 + musicDataVO.setAudioUrl(musicData.audioUrl());
  77 + musicDataVO.setVideoUrl(musicData.videoUrl());
  78 + musicDataVO.setCreatedAt(musicData.createdAt());
  79 + musicDataVO.setModel(musicData.model());
  80 + musicDataVO.setPrompt(musicData.prompt());
  81 + musicDataVO.setStyle(musicData.style());
  82 + return musicDataVO;
  83 + }).collect(Collectors.toList());
  84 + }
64 85 }
65 86 \ No newline at end of file
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/music/vo/SunoRespVO.java
1 1 package cn.iocoder.yudao.module.ai.controller.admin.music.vo;
2 2  
  3 +import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi;
3 4 import com.fasterxml.jackson.annotation.JsonProperty;
4 5 import lombok.Data;
5 6  
... ... @@ -26,4 +27,14 @@ public class SunoRespVO {
26 27 */
27 28 private List<MusicDataVO> data;
28 29  
  30 +
  31 + //把 SunoResp转为本vo类
  32 + public static SunoRespVO convertFrom(SunoApi.SunoResp sunoResp) {
  33 + SunoRespVO sunoRespVO = new SunoRespVO();
  34 + sunoRespVO.setSuccess(sunoResp.success());
  35 + sunoRespVO.setTaskId(sunoResp.taskId());
  36 + sunoRespVO.setData(MusicDataVO.convertFrom(sunoResp.data()));
  37 + return sunoRespVO;
  38 + }
  39 +
29 40 }
30 41 \ No newline at end of file
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/music/MusicServiceImpl.java
1 1 package cn.iocoder.yudao.module.ai.service.music;
2 2  
3 3 import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi;
4   -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 4 import cn.iocoder.yudao.module.ai.controller.admin.music.vo.SunoReqVO;
6 5 import cn.iocoder.yudao.module.ai.controller.admin.music.vo.SunoRespVO;
7 6 import lombok.RequiredArgsConstructor;
... ... @@ -19,7 +18,14 @@ public class MusicServiceImpl implements MusicService {
19 18  
20 19 @Override
21 20 public SunoRespVO musicGen(SunoReqVO sunoReqVO) {
22   - SunoApi.SunoReq req = BeanUtils.toBean(sunoReqVO, SunoApi.SunoReq.class);
23   - return BeanUtils.toBean(sunoApi.musicGen(req), SunoRespVO.class);
  21 + SunoApi.SunoResp sunoResp = sunoApi.musicGen(new SunoApi.SunoReq(
  22 + sunoReqVO.getPrompt(),
  23 + sunoReqVO.getLyric(),
  24 + sunoReqVO.isCustom(),
  25 + sunoReqVO.getTitle(),
  26 + sunoReqVO.getStyle(),
  27 + sunoReqVO.getCallbackUrl()
  28 + ));
  29 + return SunoRespVO.convertFrom(sunoResp);
24 30 }
25 31 }
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/model/suno/api/SunoApi.java
... ... @@ -3,7 +3,6 @@ package cn.iocoder.yudao.framework.ai.core.model.suno.api;
3 3 import cn.iocoder.yudao.framework.ai.core.model.suno.SunoConfig;
4 4 import com.fasterxml.jackson.annotation.JsonInclude;
5 5 import com.fasterxml.jackson.annotation.JsonProperty;
6   -import lombok.Data;
7 6 import lombok.extern.slf4j.Slf4j;
8 7 import org.springframework.ai.openai.api.ApiUtils;
9 8 import org.springframework.web.reactive.function.client.WebClient;
... ... @@ -48,128 +47,69 @@ public class SunoApi {
48 47 .block();
49 48 }
50 49  
51   - // TODO @xiaoxin:看看是不是使用 record 特性,简化下;
52   -
53 50 /**
54   - * 请求数据对象,用于生成音乐音频
  51 + * 请求数据对象,用于生成音乐音频。
  52 + *
  53 + * @param prompt 用于生成音乐音频的提示
  54 + * @param lyric 用于生成音乐音频的歌词
  55 + * @param custom 指示音乐音频是否为定制,如果为 true,则从歌词生成,否则从提示生成
  56 + * @param title 音乐音频的标题
  57 + * @param style 音乐音频的风格
  58 + * @param callbackUrl 音乐音频生成后回调的 URL
55 59 */
56   - @Data
57 60 @JsonInclude(value = JsonInclude.Include.NON_NULL)
58   - public static class SunoReq {
59   - /**
60   - * 用于生成音乐音频的提示
61   - */
62   - private String prompt;
63   -
64   - /**
65   - * 用于生成音乐音频的歌词
66   - */
67   - private String lyric;
68   -
69   - /**
70   - * 指示音乐音频是否为定制,如果为 true,则从歌词生成,否则从提示生成
71   - */
72   - private boolean custom;
73   -
74   - /**
75   - * 音乐音频的标题
76   - */
77   - private String title;
78   -
79   - /**
80   - * 音乐音频的风格
81   - */
82   - private String style;
  61 + public record SunoReq(
  62 + String prompt,
  63 + String lyric,
  64 + boolean custom,
  65 + String title,
  66 + String style,
  67 + String callbackUrl
  68 + ) {
  69 + public SunoReq(String prompt) {
  70 + this(prompt, null, false, null, null, null);
  71 + }
83 72  
84   - /**
85   - * 音乐音频生成后回调的 URL
86   - */
87   - private String callbackUrl;
88 73 }
89 74  
90   - // TODO @xiaoxin:看看是不是使用 record 特性,简化下;
91   -
92 75 /**
93   - * SunoAPI 响应的数据
  76 + * SunoAPI 响应的数据。
  77 + *
  78 + * @param success 表示请求是否成功
  79 + * @param taskId 任务 ID
  80 + * @param data 音乐数据列表
94 81 */
95   - @Data
96   - public static class SunoResp {
  82 + public record SunoResp(
  83 + boolean success,
  84 + @JsonProperty("task_id") String taskId,
  85 + List<MusicData> data
  86 + ) {
97 87 /**
98   - * 表示请求是否成功
  88 + * 单个音乐数据。
  89 + *
  90 + * @param id 音乐数据的 ID
  91 + * @param title 音乐音频的标题
  92 + * @param imageUrl 音乐音频的图片 URL
  93 + * @param lyric 音乐音频的歌词
  94 + * @param audioUrl 音乐音频的 URL
  95 + * @param videoUrl 音乐视频的 URL
  96 + * @param createdAt 音乐音频的创建时间
  97 + * @param model 使用的模型名称
  98 + * @param prompt 生成音乐音频的提示
  99 + * @param style 音乐音频的风格
99 100 */
100   - private boolean success;
101   -
102   - /**
103   - * 任务 ID
104   - */
105   - @JsonProperty("task_id")
106   - private String taskId;
107   -
108   - /**
109   - * 音乐数据列表
110   - */
111   - private List<MusicData> data;
112   -
113   - /**
114   - * 表示单个音乐数据的类
115   - */
116   - @Data
117   - static class MusicData {
118   - /**
119   - * 音乐数据的 ID
120   - */
121   - private String id;
122   -
123   - /**
124   - * 音乐音频的标题
125   - */
126   - private String title;
127   -
128   - /**
129   - * 音乐音频的图片 URL
130   - */
131   - @JsonProperty("image_url")
132   - private String imageUrl;
133   -
134   - /**
135   - * 音乐音频的歌词
136   - */
137   - private String lyric;
138   -
139   - /**
140   - * 音乐音频的 URL
141   - */
142   - @JsonProperty("audio_url")
143   - private String audioUrl;
144   -
145   - /**
146   - * 音乐视频的 URL
147   - */
148   - @JsonProperty("video_url")
149   - private String videoUrl;
150   -
151   - /**
152   - * 音乐音频的创建时间
153   - */
154   - @JsonProperty("created_at")
155   - private String createdAt;
156   -
157   - /**
158   - * 使用的模型名称
159   - */
160   - private String model;
161   -
162   - /**
163   - * 生成音乐音频的提示
164   - */
165   - private String prompt;
166   -
167   - /**
168   - * 音乐音频的风格
169   - */
170   - private String style;
  101 + public record MusicData(
  102 + String id,
  103 + String title,
  104 + @JsonProperty("image_url") String imageUrl,
  105 + String lyric,
  106 + @JsonProperty("audio_url") String audioUrl,
  107 + @JsonProperty("video_url") String videoUrl,
  108 + @JsonProperty("created_at") String createdAt,
  109 + String model,
  110 + String prompt,
  111 + String style
  112 + ) {
171 113 }
172 114 }
173   -
174   -
175 115 }
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/suno/SunoTests.java
... ... @@ -22,8 +22,8 @@ public class SunoTests {
22 22 @Test
23 23 public void generateMusic() {
24 24 SunoApi sunoApi = new SunoApi(sunoConfig);
25   - SunoApi.SunoReq sunoReq = new SunoApi.SunoReq()
26   - .setPrompt("创作一首带有轻松吉他旋律的流行歌曲,[verse] 描述夏日海滩的宁静,[chorus] 节奏加快,表达对自由的向往。");
  25 + SunoApi.SunoReq sunoReq = new SunoApi.SunoReq("创作一首带有轻松吉他旋律的流行歌曲,[verse] 描述夏日海滩的宁静,[chorus] 节奏加快,表达对自由的向往。");
  26 +
27 27 SunoApi.SunoResp sunoResp = sunoApi.musicGen(sunoReq);
28 28 System.out.println(sunoResp);
29 29 }
... ...
yudao-server/src/main/resources/application.yaml
... ... @@ -201,7 +201,7 @@ yudao.ai:
201 201 channel-id: 1237948819677904960
202 202 suno:
203 203 enable: true
204   - token: 13f13540dd3f4ae9885f63ac9f5d0b9f
  204 + token: 16b4356581984d538652354b60d69ff0
205 205  
206 206 --- #################### 芋道相关配置 ####################
207 207  
... ...