头像视频合成后,上传,查看

This commit is contained in:
spllzh
2025-10-08 11:50:49 +08:00
parent 45d061bad7
commit e5cba62007
26 changed files with 266 additions and 5 deletions

View File

@@ -2,6 +2,9 @@ package com.rj.controller;
import com.rj.dto.SiliconFlowTtsRequest;
import com.rj.dto.SiliconFlowTtsResponse;
import com.rj.entity.TtsRequestLog;
import com.rj.service.ITtsRequestLogService;
import com.rj.service.MinIOService;
import com.rj.service.SiliconFlowTtsService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -13,10 +16,13 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDateTime;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* SiliconFlow TTS 控制器
@@ -32,6 +38,13 @@ public class SiliconFlowTtsController {
@Autowired
private SiliconFlowTtsService ttsService;
@Autowired
private MinIOService minIOService;
@Autowired
private ITtsRequestLogService ttsRequestLogService;
@PostMapping("/speech")
@Operation(summary = "文本转语音", description = "将文本转换为语音音频")
@@ -370,4 +383,118 @@ public class SiliconFlowTtsController {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
}
}
@PostMapping(value = "/upload-audio", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "音频文件上传", description = "上传音频文件到MinIO并生成临时访问链接")
public ResponseEntity<Map<String, Object>> uploadAudio(
@Parameter(description = "音频文件") @RequestParam("file") MultipartFile file,
@Parameter(description = "音频名称") @RequestParam("audioName") String audioName,
@Parameter(description = "创建人姓名") @RequestParam("creatorName") String creatorName,
@Parameter(description = "创建人电话") @RequestParam("creatorPhone") String creatorPhone) {
Map<String, Object> result = new HashMap<>();
try {
log.info("开始上传音频文件: {}, 创建人: {}, 电话: {}", audioName, creatorName, creatorPhone);
// 验证文件
if (file.isEmpty()) {
log.error("上传文件为空");
result.put("success", false);
result.put("message", "上传文件为空");
return ResponseEntity.badRequest().body(result);
}
// 验证文件类型
String contentType = file.getContentType();
if (contentType == null || !contentType.startsWith("audio/")) {
log.error("文件类型不是音频文件: {}", contentType);
result.put("success", false);
result.put("message", "文件类型不是音频文件,请上传音频文件");
return ResponseEntity.badRequest().body(result);
}
// 生成唯一文件名
String originalFilename = file.getOriginalFilename();
String fileExtension = originalFilename != null && originalFilename.contains(".")
? originalFilename.substring(originalFilename.lastIndexOf("."))
: ".mp3";
String uniqueFileName = "audio/" + UUID.randomUUID().toString() + fileExtension;
// 上传文件到MinIO
String minioUrl = minIOService.uploadFileWithName(file, uniqueFileName);
if (minioUrl == null) {
log.error("文件上传到MinIO失败");
result.put("success", false);
result.put("message", "文件上传到MinIO失败");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
}
log.info("文件上传成功MinIO URL: {}", minioUrl);
// 生成7天临时访问链接
int expiresInSeconds = 7 * 24 * 60 * 60; // 7天
String shortUrl = minIOService.getPresignedUrl(uniqueFileName, expiresInSeconds);
if (shortUrl == null) {
log.error("生成临时访问链接失败");
result.put("success", false);
result.put("message", "生成临时访问链接失败");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
}
LocalDateTime expireTime = LocalDateTime.now().plusSeconds(expiresInSeconds);
log.info("生成临时访问链接成功,过期时间: {}", expireTime);
// 创建TTS请求日志记录
TtsRequestLog ttsLog = new TtsRequestLog();
ttsLog.setId(UUID.randomUUID().toString());
ttsLog.setRequestTime(LocalDateTime.now());
ttsLog.setModel("AUDIO_UPLOAD");
ttsLog.setInputText("音频文件上传");
ttsLog.setInputLength(0);
ttsLog.setStatus("SUCCESS");
ttsLog.setAudioSizeBytes(file.getSize());
ttsLog.setMinioUrl(minioUrl);
ttsLog.setAudioName(audioName);
ttsLog.setShortUrl(shortUrl);
ttsLog.setShortUrlExpireTime(expireTime);
ttsLog.setCreatorName(creatorName);
ttsLog.setCreatorPhone(creatorPhone);
ttsLog.setCreateTime(LocalDateTime.now());
ttsLog.setUpdateTime(LocalDateTime.now());
// 保存到数据库
boolean saveResult = ttsRequestLogService.saveTtsRequestLog(ttsLog);
if (!saveResult) {
log.error("保存TTS请求日志失败");
result.put("success", false);
result.put("message", "保存TTS请求日志失败");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
}
// 构建成功响应
result.put("success", true);
result.put("message", "音频文件上传成功");
result.put("id", ttsLog.getId());
result.put("audioName", audioName);
result.put("minioUrl", minioUrl);
result.put("shortUrl", shortUrl);
result.put("shortUrlExpireTime", expireTime);
result.put("creatorName", creatorName);
result.put("creatorPhone", creatorPhone);
result.put("audioSizeBytes", file.getSize());
result.put("status", "SUCCESS");
result.put("createTime", LocalDateTime.now());
log.info("音频文件上传完成记录ID: {}, MinIO URL: {}, 临时URL: {}",
ttsLog.getId(), minioUrl, shortUrl);
return ResponseEntity.ok(result);
} catch (Exception e) {
log.error("音频文件上传异常: {}", e.getMessage(), e);
result.put("success", false);
result.put("message", "音频文件上传异常: " + e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
}
}
}

View File

@@ -361,6 +361,8 @@ public class MenuController {

View File

@@ -331,6 +331,8 @@ public class RoleController {

View File

@@ -337,6 +337,8 @@ public class UserRoleController {