调整 音频合成

This commit is contained in:
spllzh
2025-10-06 12:17:34 +08:00
parent 725a5294d0
commit 20378e8115
43 changed files with 508 additions and 60 deletions

View File

@@ -1,6 +1,8 @@
package com.rj.controller;
import com.rj.service.IFaceDetectLogService;
import com.rj.service.MinIOService;
import com.rj.utils.MinIOUrlGenerator;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -8,6 +10,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.Map;
@@ -24,6 +27,12 @@ public class FaceDetectController {
@Autowired
private IFaceDetectLogService faceDetectLogService;
@Autowired
private MinIOService minioService;
@Autowired
private MinIOUrlGenerator urlGenerator;
/**
* 人脸检测接口
*/
@@ -31,7 +40,13 @@ public class FaceDetectController {
@Operation(summary = "人脸检测", description = "检测图片中的人脸信息")
public ResponseEntity<Map<String, Object>> detectFace(
@Parameter(description = "图片URL", required = true)
@RequestParam String imageUrl) {
@RequestParam String imageUrl,
@Parameter(description = "所属人姓名", required = false)
@RequestParam(value = "ownerName", required = false) String ownerName,
@Parameter(description = "所属人电话", required = false)
@RequestParam(value = "ownerPhone", required = false) String ownerPhone,
@Parameter(description = "头像名称", required = false)
@RequestParam(value = "avatarName", required = false) String avatarName) {
Map<String, Object> result = new HashMap<>();
@@ -39,7 +54,7 @@ public class FaceDetectController {
log.info("开始人脸检测图片URL: {}", imageUrl);
// 执行人脸检测
com.rj.entity.FaceDetectLog detectLog = faceDetectLogService.detectFaceAndSave(imageUrl);
com.rj.entity.FaceDetectLog detectLog = faceDetectLogService.detectFaceAndSave(imageUrl, ownerName, ownerPhone, avatarName);
result.put("success", detectLog.getSuccess());
result.put("message", detectLog.getSuccess() ? "人脸检测成功" : "人脸检测失败");
@@ -47,6 +62,9 @@ public class FaceDetectController {
result.put("requestId", detectLog.getRequestId());
result.put("faceCount", detectLog.getFaceCount());
result.put("processingTimeMs", detectLog.getProcessingTimeMs());
result.put("ownerName", detectLog.getOwnerName());
result.put("ownerPhone", detectLog.getOwnerPhone());
result.put("avatarName", detectLog.getAvatarName());
if (!detectLog.getSuccess()) {
result.put("errorMessage", detectLog.getErrorMessage());
@@ -63,6 +81,135 @@ public class FaceDetectController {
}
}
/**
* 头衔上传接口
* 实现:文件上传 -> 生成短链接 -> 人脸检测
*/
@PostMapping("/avatar/upload")
@Operation(summary = "头衔上传", description = "上传头像文件,生成短链接并进行人脸检测")
public ResponseEntity<Map<String, Object>> uploadAvatar(
@Parameter(description = "头像文件", required = true)
@RequestParam("file") MultipartFile file,
@Parameter(description = "用户ID", required = false)
@RequestParam(value = "userId", required = false) String userId,
@Parameter(description = "所属人姓名", required = false)
@RequestParam(value = "ownerName", required = false) String ownerName,
@Parameter(description = "所属人电话", required = false)
@RequestParam(value = "ownerPhone", required = false) String ownerPhone,
@Parameter(description = "头像名称", required = false)
@RequestParam(value = "avatarName", required = false) String avatarName,
@Parameter(description = "短链接有效期默认1小时", required = false)
@RequestParam(value = "expiresInSeconds", defaultValue = "3600") int expiresInSeconds) {
Map<String, Object> result = new HashMap<>();
try {
log.info("开始处理头衔上传,文件名: {}, 大小: {} bytes, 用户ID: {}",
file.getOriginalFilename(), file.getSize(), userId);
expiresInSeconds = 30*24*3600; // 默认30天
// 1. 验证文件
if (file.isEmpty()) {
result.put("success", false);
result.put("message", "文件不能为空");
return ResponseEntity.badRequest().body(result);
}
// 验证文件类型
String contentType = file.getContentType();
if (contentType == null || (!contentType.startsWith("image/"))) {
result.put("success", false);
result.put("message", "只支持图片文件格式");
return ResponseEntity.badRequest().body(result);
}
// 验证文件大小限制为10MB与Spring配置保持一致
if (file.getSize() > 10 * 1024 * 1024) {
result.put("success", false);
result.put("message", "文件大小不能超过10MB");
return ResponseEntity.badRequest().body(result);
}
// 2. 上传文件到MinIO
log.info("开始上传文件到MinIO...");
String fileUrl = minioService.uploadFile(file);
log.info("文件上传成功URL: {}", fileUrl);
// 3. 生成短链接临时访问URL
log.info("开始生成短链接,有效期: {}秒", expiresInSeconds);
String fileName = extractFileNameFromUrl(fileUrl);
MinIOUrlGenerator.UrlInfo urlInfo = urlGenerator.generateTempUrl(fileName, expiresInSeconds);
if (!urlInfo.isSuccess()) {
result.put("success", false);
result.put("message", "生成短链接失败: " + urlInfo.getErrorMessage());
return ResponseEntity.internalServerError().body(result);
}
String shortUrl = urlInfo.getUrl();
log.info("短链接生成成功: {}", shortUrl);
// 4. 进行人脸检测
log.info("开始进行人脸检测...");
com.rj.entity.FaceDetectLog detectLog = faceDetectLogService.detectFaceAndSave(shortUrl, ownerName, ownerPhone, avatarName);
// 5. 构建响应结果
result.put("success", true);
result.put("message", "头衔上传处理完成");
result.put("originalFileName", file.getOriginalFilename());
result.put("fileSize", file.getSize());
result.put("fileUrl", fileUrl);
result.put("shortUrl", shortUrl);
result.put("shortUrlExpiresAt", urlInfo.getFormattedExpiresAt());
result.put("shortUrlExpiresInSeconds", expiresInSeconds);
result.put("userId", userId);
result.put("ownerName", ownerName);
result.put("ownerPhone", ownerPhone);
result.put("avatarName", avatarName);
// 人脸检测结果
result.put("faceDetection", Map.of(
"success", detectLog.getSuccess(),
"faceCount", detectLog.getFaceCount(),
"processingTimeMs", detectLog.getProcessingTimeMs(),
"requestId", detectLog.getRequestId()
));
if (!detectLog.getSuccess()) {
result.put("faceDetectionError", detectLog.getErrorMessage());
log.warn("人脸检测失败: {}", detectLog.getErrorMessage());
} else {
log.info("人脸检测成功,检测到 {} 张人脸", detectLog.getFaceCount());
}
log.info("头衔上传处理完成文件URL: {}, 短链接: {}", fileUrl, shortUrl);
return ResponseEntity.ok(result);
} catch (Exception e) {
log.error("头衔上传处理失败: {}", e.getMessage(), e);
result.put("success", false);
result.put("message", "头衔上传处理失败: " + e.getMessage());
return ResponseEntity.internalServerError().body(result);
}
}
/**
* 从URL中提取文件名
*/
private String extractFileNameFromUrl(String fileUrl) {
if (fileUrl == null || fileUrl.isEmpty()) {
return null;
}
// 从URL中提取文件名部分
// 例如: http://101.35.52.237:19005/car/filename.jpg -> filename.jpg
int lastSlashIndex = fileUrl.lastIndexOf('/');
if (lastSlashIndex != -1 && lastSlashIndex < fileUrl.length() - 1) {
return fileUrl.substring(lastSlashIndex + 1);
}
return fileUrl;
}
/**
* 分页查询人脸检测日志
*/