mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-30 01:38:43 +08:00 
			
		
		
		
	【解决todo】SunoResp、SunoReq改为record简化
This commit is contained in:
		| @@ -1,8 +1,12 @@ | |||||||
| package cn.iocoder.yudao.module.ai.controller.admin.music.vo; | package cn.iocoder.yudao.module.ai.controller.admin.music.vo; | ||||||
|  |  | ||||||
|  | import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi; | ||||||
| import com.fasterxml.jackson.annotation.JsonProperty; | import com.fasterxml.jackson.annotation.JsonProperty; | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 表示单个音乐数据的类 |  * 表示单个音乐数据的类 | ||||||
|  */ |  */ | ||||||
| @@ -61,4 +65,21 @@ public  class MusicDataVO { | |||||||
|      * 音乐音频的风格 |      * 音乐音频的风格 | ||||||
|      */ |      */ | ||||||
|     private String style; |     private String style; | ||||||
|  |  | ||||||
|  |     public static List<MusicDataVO> convertFrom(List<SunoApi.SunoResp.MusicData> musicDataList) { | ||||||
|  |         return musicDataList.stream().map(musicData -> { | ||||||
|  |             MusicDataVO musicDataVO = new MusicDataVO(); | ||||||
|  |             musicDataVO.setId(musicData.id()); | ||||||
|  |             musicDataVO.setTitle(musicData.title()); | ||||||
|  |             musicDataVO.setImageUrl(musicData.imageUrl()); | ||||||
|  |             musicDataVO.setLyric(musicData.lyric()); | ||||||
|  |             musicDataVO.setAudioUrl(musicData.audioUrl()); | ||||||
|  |             musicDataVO.setVideoUrl(musicData.videoUrl()); | ||||||
|  |             musicDataVO.setCreatedAt(musicData.createdAt()); | ||||||
|  |             musicDataVO.setModel(musicData.model()); | ||||||
|  |             musicDataVO.setPrompt(musicData.prompt()); | ||||||
|  |             musicDataVO.setStyle(musicData.style()); | ||||||
|  |             return musicDataVO; | ||||||
|  |         }).collect(Collectors.toList()); | ||||||
|  |     } | ||||||
| } | } | ||||||
| @@ -1,5 +1,6 @@ | |||||||
| package cn.iocoder.yudao.module.ai.controller.admin.music.vo; | package cn.iocoder.yudao.module.ai.controller.admin.music.vo; | ||||||
|  |  | ||||||
|  | import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi; | ||||||
| import com.fasterxml.jackson.annotation.JsonProperty; | import com.fasterxml.jackson.annotation.JsonProperty; | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
|  |  | ||||||
| @@ -26,4 +27,14 @@ public class SunoRespVO { | |||||||
|      */ |      */ | ||||||
|     private List<MusicDataVO> data; |     private List<MusicDataVO> data; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     //把 SunoResp转为本vo类 | ||||||
|  |     public static SunoRespVO convertFrom(SunoApi.SunoResp sunoResp) { | ||||||
|  |         SunoRespVO sunoRespVO = new SunoRespVO(); | ||||||
|  |         sunoRespVO.setSuccess(sunoResp.success()); | ||||||
|  |         sunoRespVO.setTaskId(sunoResp.taskId()); | ||||||
|  |         sunoRespVO.setData(MusicDataVO.convertFrom(sunoResp.data())); | ||||||
|  |         return sunoRespVO; | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
| @@ -1,7 +1,6 @@ | |||||||
| package cn.iocoder.yudao.module.ai.service.music; | package cn.iocoder.yudao.module.ai.service.music; | ||||||
|  |  | ||||||
| import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi; | import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi; | ||||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |  | ||||||
| import cn.iocoder.yudao.module.ai.controller.admin.music.vo.SunoReqVO; | import cn.iocoder.yudao.module.ai.controller.admin.music.vo.SunoReqVO; | ||||||
| import cn.iocoder.yudao.module.ai.controller.admin.music.vo.SunoRespVO; | import cn.iocoder.yudao.module.ai.controller.admin.music.vo.SunoRespVO; | ||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
| @@ -19,7 +18,14 @@ public class MusicServiceImpl implements MusicService { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public SunoRespVO musicGen(SunoReqVO sunoReqVO) { |     public SunoRespVO musicGen(SunoReqVO sunoReqVO) { | ||||||
|         SunoApi.SunoReq req = BeanUtils.toBean(sunoReqVO, SunoApi.SunoReq.class); |         SunoApi.SunoResp sunoResp = sunoApi.musicGen(new SunoApi.SunoReq( | ||||||
|         return BeanUtils.toBean(sunoApi.musicGen(req), SunoRespVO.class); |                 sunoReqVO.getPrompt(), | ||||||
|  |                 sunoReqVO.getLyric(), | ||||||
|  |                 sunoReqVO.isCustom(), | ||||||
|  |                 sunoReqVO.getTitle(), | ||||||
|  |                 sunoReqVO.getStyle(), | ||||||
|  |                 sunoReqVO.getCallbackUrl() | ||||||
|  |         )); | ||||||
|  |         return SunoRespVO.convertFrom(sunoResp); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,7 +3,6 @@ package cn.iocoder.yudao.framework.ai.core.model.suno.api; | |||||||
| import cn.iocoder.yudao.framework.ai.core.model.suno.SunoConfig; | import cn.iocoder.yudao.framework.ai.core.model.suno.SunoConfig; | ||||||
| import com.fasterxml.jackson.annotation.JsonInclude; | import com.fasterxml.jackson.annotation.JsonInclude; | ||||||
| import com.fasterxml.jackson.annotation.JsonProperty; | import com.fasterxml.jackson.annotation.JsonProperty; | ||||||
| import lombok.Data; |  | ||||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||||
| import org.springframework.ai.openai.api.ApiUtils; | import org.springframework.ai.openai.api.ApiUtils; | ||||||
| import org.springframework.web.reactive.function.client.WebClient; | import org.springframework.web.reactive.function.client.WebClient; | ||||||
| @@ -48,128 +47,69 @@ public class SunoApi { | |||||||
|                 .block(); |                 .block(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // TODO @xiaoxin:看看是不是使用 record 特性,简化下; |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 请求数据对象,用于生成音乐音频 |      * 请求数据对象,用于生成音乐音频。 | ||||||
|  |      * | ||||||
|  |      * @param prompt      用于生成音乐音频的提示 | ||||||
|  |      * @param lyric       用于生成音乐音频的歌词 | ||||||
|  |      * @param custom      指示音乐音频是否为定制,如果为 true,则从歌词生成,否则从提示生成 | ||||||
|  |      * @param title       音乐音频的标题 | ||||||
|  |      * @param style       音乐音频的风格 | ||||||
|  |      * @param callbackUrl 音乐音频生成后回调的 URL | ||||||
|      */ |      */ | ||||||
|     @Data |  | ||||||
|     @JsonInclude(value = JsonInclude.Include.NON_NULL) |     @JsonInclude(value = JsonInclude.Include.NON_NULL) | ||||||
|     public static class SunoReq { |     public record SunoReq( | ||||||
|         /** |             String prompt, | ||||||
|          * 用于生成音乐音频的提示 |             String lyric, | ||||||
|          */ |             boolean custom, | ||||||
|         private String prompt; |             String title, | ||||||
|  |             String style, | ||||||
|         /** |             String callbackUrl | ||||||
|          * 用于生成音乐音频的歌词 |     ) { | ||||||
|          */ |         public SunoReq(String prompt) { | ||||||
|         private String lyric; |             this(prompt, null, false, null, null, null); | ||||||
|  |  | ||||||
|         /** |  | ||||||
|          * 指示音乐音频是否为定制,如果为 true,则从歌词生成,否则从提示生成 |  | ||||||
|          */ |  | ||||||
|         private boolean custom; |  | ||||||
|  |  | ||||||
|         /** |  | ||||||
|          * 音乐音频的标题 |  | ||||||
|          */ |  | ||||||
|         private String title; |  | ||||||
|  |  | ||||||
|         /** |  | ||||||
|          * 音乐音频的风格 |  | ||||||
|          */ |  | ||||||
|         private String style; |  | ||||||
|  |  | ||||||
|         /** |  | ||||||
|          * 音乐音频生成后回调的 URL |  | ||||||
|          */ |  | ||||||
|         private String callbackUrl; |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     // TODO @xiaoxin:看看是不是使用 record 特性,简化下; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * SunoAPI 响应的数据 |  | ||||||
|      */ |  | ||||||
|     @Data |  | ||||||
|     public static class SunoResp { |  | ||||||
|         /** |  | ||||||
|          * 表示请求是否成功 |  | ||||||
|          */ |  | ||||||
|         private boolean success; |  | ||||||
|  |  | ||||||
|         /** |  | ||||||
|          * 任务 ID |  | ||||||
|          */ |  | ||||||
|         @JsonProperty("task_id") |  | ||||||
|         private String taskId; |  | ||||||
|  |  | ||||||
|         /** |  | ||||||
|          * 音乐数据列表 |  | ||||||
|          */ |  | ||||||
|         private List<MusicData> data; |  | ||||||
|  |  | ||||||
|         /** |  | ||||||
|          * 表示单个音乐数据的类 |  | ||||||
|          */ |  | ||||||
|         @Data |  | ||||||
|         static class MusicData { |  | ||||||
|             /** |  | ||||||
|              * 音乐数据的 ID |  | ||||||
|              */ |  | ||||||
|             private String id; |  | ||||||
|  |  | ||||||
|             /** |  | ||||||
|              * 音乐音频的标题 |  | ||||||
|              */ |  | ||||||
|             private String title; |  | ||||||
|  |  | ||||||
|             /** |  | ||||||
|              * 音乐音频的图片 URL |  | ||||||
|              */ |  | ||||||
|             @JsonProperty("image_url") |  | ||||||
|             private String imageUrl; |  | ||||||
|  |  | ||||||
|             /** |  | ||||||
|              * 音乐音频的歌词 |  | ||||||
|              */ |  | ||||||
|             private String lyric; |  | ||||||
|  |  | ||||||
|             /** |  | ||||||
|              * 音乐音频的 URL |  | ||||||
|              */ |  | ||||||
|             @JsonProperty("audio_url") |  | ||||||
|             private String audioUrl; |  | ||||||
|  |  | ||||||
|             /** |  | ||||||
|              * 音乐视频的 URL |  | ||||||
|              */ |  | ||||||
|             @JsonProperty("video_url") |  | ||||||
|             private String videoUrl; |  | ||||||
|  |  | ||||||
|             /** |  | ||||||
|              * 音乐音频的创建时间 |  | ||||||
|              */ |  | ||||||
|             @JsonProperty("created_at") |  | ||||||
|             private String createdAt; |  | ||||||
|  |  | ||||||
|             /** |  | ||||||
|              * 使用的模型名称 |  | ||||||
|              */ |  | ||||||
|             private String model; |  | ||||||
|  |  | ||||||
|             /** |  | ||||||
|              * 生成音乐音频的提示 |  | ||||||
|              */ |  | ||||||
|             private String prompt; |  | ||||||
|  |  | ||||||
|             /** |  | ||||||
|              * 音乐音频的风格 |  | ||||||
|              */ |  | ||||||
|             private String style; |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * SunoAPI 响应的数据。 | ||||||
|  |      * | ||||||
|  |      * @param success 表示请求是否成功 | ||||||
|  |      * @param taskId  任务 ID | ||||||
|  |      * @param data    音乐数据列表 | ||||||
|  |      */ | ||||||
|  |     public record SunoResp( | ||||||
|  |             boolean success, | ||||||
|  |             @JsonProperty("task_id") String taskId, | ||||||
|  |             List<MusicData> data | ||||||
|  |     ) { | ||||||
|  |         /** | ||||||
|  |          * 单个音乐数据。 | ||||||
|  |          * | ||||||
|  |          * @param id        音乐数据的 ID | ||||||
|  |          * @param title     音乐音频的标题 | ||||||
|  |          * @param imageUrl  音乐音频的图片 URL | ||||||
|  |          * @param lyric     音乐音频的歌词 | ||||||
|  |          * @param audioUrl  音乐音频的 URL | ||||||
|  |          * @param videoUrl  音乐视频的 URL | ||||||
|  |          * @param createdAt 音乐音频的创建时间 | ||||||
|  |          * @param model     使用的模型名称 | ||||||
|  |          * @param prompt    生成音乐音频的提示 | ||||||
|  |          * @param style     音乐音频的风格 | ||||||
|  |          */ | ||||||
|  |         public record MusicData( | ||||||
|  |                 String id, | ||||||
|  |                 String title, | ||||||
|  |                 @JsonProperty("image_url") String imageUrl, | ||||||
|  |                 String lyric, | ||||||
|  |                 @JsonProperty("audio_url") String audioUrl, | ||||||
|  |                 @JsonProperty("video_url") String videoUrl, | ||||||
|  |                 @JsonProperty("created_at") String createdAt, | ||||||
|  |                 String model, | ||||||
|  |                 String prompt, | ||||||
|  |                 String style | ||||||
|  |         ) { | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -22,8 +22,8 @@ public class SunoTests { | |||||||
|     @Test |     @Test | ||||||
|     public void generateMusic() { |     public void generateMusic() { | ||||||
|         SunoApi sunoApi = new SunoApi(sunoConfig); |         SunoApi sunoApi = new SunoApi(sunoConfig); | ||||||
|         SunoApi.SunoReq sunoReq = new SunoApi.SunoReq() |         SunoApi.SunoReq sunoReq = new SunoApi.SunoReq("创作一首带有轻松吉他旋律的流行歌曲,[verse] 描述夏日海滩的宁静,[chorus] 节奏加快,表达对自由的向往。"); | ||||||
|                 .setPrompt("创作一首带有轻松吉他旋律的流行歌曲,[verse] 描述夏日海滩的宁静,[chorus] 节奏加快,表达对自由的向往。"); |  | ||||||
|         SunoApi.SunoResp sunoResp = sunoApi.musicGen(sunoReq); |         SunoApi.SunoResp sunoResp = sunoApi.musicGen(sunoReq); | ||||||
|         System.out.println(sunoResp); |         System.out.println(sunoResp); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -201,7 +201,7 @@ yudao.ai: | |||||||
|     channel-id: 1237948819677904960 |     channel-id: 1237948819677904960 | ||||||
|   suno: |   suno: | ||||||
|     enable: true |     enable: true | ||||||
|     token: 13f13540dd3f4ae9885f63ac9f5d0b9f |     token: 16b4356581984d538652354b60d69ff0 | ||||||
|  |  | ||||||
| --- #################### 芋道相关配置 #################### | --- #################### 芋道相关配置 #################### | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 xiaoxin
					xiaoxin