dengsixing 9 maanden geleden
bovenliggende
commit
45ee315428

+ 12 - 20
pom.xml

@@ -14,21 +14,6 @@
     <artifactId>4dkankan-center-scene</artifactId>
     <version>2.0.0-SNAPSHOT</version>
 
-    <repositories>
-        <repository>
-            <id>releases</id>
-            <url>http://192.168.0.115:8081/nexus-2.14.2-01/content/repositories/releases/</url>
-        </repository>
-        <repository>
-            <id>snapshots</id>
-            <url>http://192.168.0.115:8081/nexus-2.14.2-01/content/repositories/snapshots/</url>
-        </repository>
-        <repository>
-            <id>nexus-aliyun</id>
-            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
-        </repository>
-    </repositories>
-
     <properties>
         <java.version>1.8</java.version>
         <hutool-version>5.7.17</hutool-version>
@@ -292,16 +277,23 @@
         </plugins>
     </build>
 
-    <distributionManagement>
+    <repositories>
         <repository>
             <id>releases</id>
             <url>http://192.168.0.115:8081/nexus-2.14.2-01/content/repositories/releases/</url>
         </repository>
-
-        <snapshotRepository>
+        <repository>
             <id>snapshots</id>
             <url>http://192.168.0.115:8081/nexus-2.14.2-01/content/repositories/snapshots/</url>
-        </snapshotRepository>
-    </distributionManagement>
+        </repository>
+        <repository>
+            <id>nexus-aliyun</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
+        </repository>
+        <repository>
+            <id>central</id>
+            <url>https://repo.maven.apache.org/maven2</url>
+        </repository>
+    </repositories>
 
 </project>

+ 35 - 35
src/main/java/com/fdkankan/scene/config/InterceptorConfig.java

@@ -1,38 +1,38 @@
-package com.fdkankan.scene.config;
-
-import com.fdkankan.scene.Interceptor.TokenInterceptor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.CorsRegistry;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
-import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-
-@Configuration
-public class InterceptorConfig implements WebMvcConfigurer {
-
-	@Autowired
-	private TokenInterceptor tokenInterceptor;
-
+//package com.fdkankan.scene.config;
+//
+//import com.fdkankan.scene.Interceptor.TokenInterceptor;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.web.servlet.config.annotation.CorsRegistry;
+//import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+//import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+//
+//
+//@Configuration
+//public class InterceptorConfig implements WebMvcConfigurer {
+//
+//	@Autowired
+//	private TokenInterceptor tokenInterceptor;
+//
+////	@Override
+////	public void addCorsMappings(CorsRegistry registry) {
+////		registry.addMapping("/**").allowCredentials(true).allowedHeaders("*").allowedOrigins("*").allowedMethods("*");
+////
+////	}
+//
 //	@Override
-//	public void addCorsMappings(CorsRegistry registry) {
-//		registry.addMapping("/**").allowCredentials(true).allowedHeaders("*").allowedOrigins("*").allowedMethods("*");
+//	public void addInterceptors(InterceptorRegistry registry) {
+//		registry.addInterceptor(tokenInterceptor).addPathPatterns("/service/scene/edit/**");
+////				.excludePathPatterns("/**/sso/**","/app/**","/test/**","/**/inner/**")
 //
+//		WebMvcConfigurer.super.addInterceptors(registry);
 //	}
-
-	@Override
-	public void addInterceptors(InterceptorRegistry registry) {
-		registry.addInterceptor(tokenInterceptor).addPathPatterns("/service/scene/edit/**");
-//				.excludePathPatterns("/**/sso/**","/app/**","/test/**","/**/inner/**")
-
-		WebMvcConfigurer.super.addInterceptors(registry);
-	}
-
-	@Override
-	public void addResourceHandlers(ResourceHandlerRegistry registry) {
-		WebMvcConfigurer.super.addResourceHandlers(registry);
-	}
-
-}
-
+//
+//	@Override
+//	public void addResourceHandlers(ResourceHandlerRegistry registry) {
+//		WebMvcConfigurer.super.addResourceHandlers(registry);
+//	}
+//
+//}
+//

+ 2 - 0
src/main/java/com/fdkankan/scene/constant/FileYunPath.java

@@ -6,5 +6,7 @@ public class FileYunPath extends UploadFilePath {
 
     public final static String TEMP_PATH = "temp/%s/";
 
+    public final static String SCRB_EDIT_PATH = EDIT_PATH + "scrb/";
+
 
 }

+ 9 - 0
src/main/java/com/fdkankan/scene/controller/ScrbController.java

@@ -1,5 +1,6 @@
 package com.fdkankan.scene.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fdkankan.common.constant.CommonSuccessStatus;
 import com.fdkankan.scene.dto.AsrCallbackDTO;
@@ -11,12 +12,14 @@ import com.fdkankan.scene.service.ILeaveWordService;
 import com.fdkankan.scene.service.IScrbService;
 import com.fdkankan.web.controller.BaseController;
 import com.fdkankan.web.response.ResultData;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
 
+@Slf4j
 @RestController
 @RequestMapping("/service/scene/scrb")
 public class ScrbController extends BaseController {
@@ -32,6 +35,12 @@ public class ScrbController extends BaseController {
         return ResultData.ok();
     }
 
+    @PostMapping("ttsCallback")
+    public ResultData ttsCallback(String data){
+        scrbService.ttsCallback(data);
+        return ResultData.ok();
+    }
+
     @PostMapping("leaveWord/add")
     public ResultData addLeaveWord(@RequestBody @Valid LeaveWordDTO dto){
         leaveWordService.addLeaveWord(dto);

+ 20 - 4
src/main/java/com/fdkankan/scene/controller/ScrbEditController.java

@@ -28,6 +28,16 @@ public class ScrbEditController extends BaseController {
     @Autowired
     private ILeaveWordService leaveWordService;
 
+//
+//    {
+//        "Response": {
+//        "Data": {
+//            "TaskId": "gz-4e09cd87-65da-4f20-bed7-52d7bc974bbf"
+//        },
+//        "RequestId": "c9ac1d19-93bb-4d34-b9db-aca76bae8a4d"
+//    }
+//    }
+
     /**
      * 文字语音互转列表
      * @param num
@@ -62,15 +72,21 @@ public class ScrbEditController extends BaseController {
         return ResultData.ok(scrbService.ttsCompose(dto));
     }
 
+    @PostMapping("/tts/save")
+    public ResultData longTextToVoice(@RequestBody @Valid TextVoiceTransferDTO dto) throws Exception{
+        scrbService.ttsLongTextToVoice(dto);
+        return ResultData.ok();
+    }
+
     /**
      * 保存
      * @return
      */
 //    @CheckPermit
-    @PostMapping("/tts/save")
-    public ResultData ttsSave(@RequestBody @Valid TextVoiceTransferDTO dto) throws Exception {
-        return scrbService.ttsSave(dto);
-    }
+//    @PostMapping("/tts/save")
+//    public ResultData ttsSave(@RequestBody @Valid TextVoiceTransferDTO dto) throws Exception {
+//        return scrbService.ttsSave(dto);
+//    }
 
     /**
      * 保存

+ 4 - 0
src/main/java/com/fdkankan/scene/service/IScrbService.java

@@ -14,10 +14,14 @@ public interface IScrbService {
 
     void asrCallback(AsrCallbackDTO param);
 
+    void ttsCallback(String data);
+
     List<TextVoiceTransfer> listTextVoiceTransfer(String num);
 
     String ttsCompose(TextVoiceTransferDTO dto) throws Exception;
 
+    void ttsLongTextToVoice(TextVoiceTransferDTO dto) throws Exception;
+
     ResultData ttsSave(TextVoiceTransferDTO dto) throws Exception;
 
     ResultData asrSave(String num, Long id, MultipartFile file) throws Exception;

+ 60 - 4
src/main/java/com/fdkankan/scene/service/impl/ScrbServiceImpl.java

@@ -3,9 +3,12 @@ package com.fdkankan.scene.service.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.common.constant.CommonOperStatus;
 import com.fdkankan.common.constant.CommonSuccessStatus;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.exception.BusinessException;
@@ -21,6 +24,7 @@ import com.fdkankan.scene.service.*;
 import com.fdkankan.scene.util.AsrUtil;
 import com.fdkankan.scene.util.TtsUtil;
 import com.fdkankan.web.response.ResultData;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
@@ -32,6 +36,7 @@ import java.util.List;
 import java.util.Objects;
 import java.util.UUID;
 
+@Slf4j
 @Service
 public class ScrbServiceImpl implements IScrbService {
 
@@ -62,7 +67,7 @@ public class ScrbServiceImpl implements IScrbService {
             status = CommonSuccessStatus.FAIL.code();
         }else{
             status = CommonSuccessStatus.SUCCESS.code();
-            String text = param.getText();
+            String text = param.getText().replaceAll("\\[.*?\\]", "").replaceAll("\\n", "");
             task.setDocument(text);
         }
         task.setResCode(param.getCode());
@@ -73,6 +78,33 @@ public class ScrbServiceImpl implements IScrbService {
     }
 
     @Override
+    public void ttsCallback(String data) {
+        JSONObject jsonObject = JSON.parseObject(data);
+        Integer status = jsonObject.getInteger("Status");
+        String taskId = jsonObject.getString("TaskId");
+        TextVoiceTransfer textVoiceTransfer = textVoiceTransferService.getByTaskId(taskId);
+        if(status == 2){
+            String url = jsonObject.getString("ResultUrl");
+            String localVoicePath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, textVoiceTransfer.getNum()) + taskId + "." + "mp3";
+            FileUtil.mkParentDirs(localVoicePath);
+            HttpUtil.downloadFile(url, localVoicePath);
+            String obsPath = String.format(FileYunPath.SCRB_EDIT_PATH, textVoiceTransfer.getNum()) + FileUtil.getName(localVoicePath);
+            fYunFileService.uploadFile(localVoicePath, obsPath);
+            textVoiceTransfer.setVoicePath(obsPath);
+            textVoiceTransfer.setResCode(status);
+            textVoiceTransfer.setStatus(CommonOperStatus.SUCCESS.code());
+            textVoiceTransfer.setUpdateTime(new Date());
+            textVoiceTransferService.updateById(textVoiceTransfer);
+        }
+        if(status == 3){
+            textVoiceTransfer.setResCode(status);
+            textVoiceTransfer.setStatus(CommonOperStatus.FAILD.code());
+            textVoiceTransfer.setUpdateTime(new Date());
+            textVoiceTransferService.updateById(textVoiceTransfer);
+        }
+    }
+
+    @Override
     public List<TextVoiceTransfer> listTextVoiceTransfer(String num) {
         return textVoiceTransferService.list(new LambdaQueryWrapper<TextVoiceTransfer>().eq(TextVoiceTransfer::getNum, num));
     }
@@ -88,6 +120,30 @@ public class ScrbServiceImpl implements IScrbService {
     }
 
     @Override
+    public void ttsLongTextToVoice(TextVoiceTransferDTO dto) throws Exception {
+        TextVoiceTransfer textVoiceTransfer = null;
+        if(Objects.nonNull(dto.getId())){
+            textVoiceTransfer = textVoiceTransferService.getById(dto.getId());
+            if(Objects.isNull(textVoiceTransfer)){
+                throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
+            }
+            if(!dto.getDocument().equals(textVoiceTransfer.getDocument())){
+                String taskId = ttsUtil.logTextToVoice(dto.getDocument(), dto.getVoiceType().longValue(), dto.getSpeed(), dto.getVolume());
+                textVoiceTransfer.setTaskId(taskId);
+                textVoiceTransferService.updateById(textVoiceTransfer);
+            }
+        }else{
+            textVoiceTransfer = new TextVoiceTransfer();
+            textVoiceTransfer.setNum(dto.getNum());
+            textVoiceTransfer.setType("tts");
+            textVoiceTransfer.setDocument(dto.getDocument());
+            String taskId = ttsUtil.logTextToVoice(dto.getDocument(), dto.getVoiceType().longValue(), dto.getSpeed(), dto.getVolume());
+            textVoiceTransfer.setTaskId(taskId);
+            textVoiceTransferService.save(textVoiceTransfer);
+        }
+    }
+
+    @Override
     public ResultData ttsSave(TextVoiceTransferDTO dto) throws Exception {
 
         TextVoiceTransfer textVoiceTransfer = null;
@@ -124,16 +180,16 @@ public class ScrbServiceImpl implements IScrbService {
             textVoiceTransfer = new TextVoiceTransfer();
             textVoiceTransfer.setNum(num);
         }
-
         String filename = file.getOriginalFilename();
-        File localFile = FileUtil.file(String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + UUID.randomUUID() + "/." + FileUtil.extName(filename));
+        File localFile = FileUtil.createTempFile(UUID.randomUUID().toString(), "." + FileUtil.extName(filename), new File(String.format(ConstantFilePath.SCENE_USER_PATH_V4, num)), true);
         file.transferTo(localFile);
-        String ossPath = String.format(FileYunPath.TEMP_PATH, num) + localFile.getName();
+        String ossPath = String.format(FileYunPath.SCRB_EDIT_PATH, num) + localFile.getName();
         String url = fYunFileService.uploadFile(localFile.getAbsolutePath(), ossPath);
         String taskId = asrUtil.voiceToText(url);
         textVoiceTransfer.setTaskId(taskId);
         textVoiceTransfer.setVoiceName(filename);
         textVoiceTransfer.setType("asr");
+        textVoiceTransfer.setVoicePath(ossPath);
         textVoiceTransfer.setStatus(CommonSuccessStatus.WAITING.code());
         textVoiceTransferService.saveOrUpdate(textVoiceTransfer);
         return ResultData.ok();

File diff suppressed because it is too large
+ 32 - 33
src/main/java/com/fdkankan/scene/util/AsrUtil.java


+ 39 - 3
src/main/java/com/fdkankan/scene/util/TtsUtil.java

@@ -7,6 +7,13 @@ import com.tencent.core.ws.Credential;
 import com.tencent.core.ws.SpeechClient;
 import com.tencent.tts.utils.Ttsutils;
 import com.tencent.ttsv2.*;
+import com.tencentcloudapi.common.AbstractModel;
+import com.tencentcloudapi.common.exception.TencentCloudSDKException;
+import com.tencentcloudapi.common.profile.ClientProfile;
+import com.tencentcloudapi.common.profile.HttpProfile;
+import com.tencentcloudapi.tts.v20190823.TtsClient;
+import com.tencentcloudapi.tts.v20190823.models.CreateTtsTaskRequest;
+import com.tencentcloudapi.tts.v20190823.models.CreateTtsTaskResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
@@ -24,15 +31,18 @@ public class TtsUtil {
     //SpeechClient应用全局创建一个即可,生命周期可和整个应用保持一致
     static SpeechClient proxy = new SpeechClient(TtsConstant.DEFAULT_TTS_REQ_URL);
 
-    @Value("${tts.appId:#{null}}")
+    @Value("${tencentcloud.tts.appId:#{null}}")
     private String appId;
 
-    @Value("${tts.secretId:#{null}}}")
+    @Value("${tencentcloud.secretId:AKIDwjCZlmaHtVzOejbFhxzv42mJLyb2MXYL}")
     private String secretId;
 
-    @Value("${tts.secretKey:#{null}}}")
+    @Value("${tencentcloud.secretKey:lQ4WloiSzNuPp3A5pMsDMI1YuCOPExTo}")
     private String secretKey;
 
+    @Value("${main.url:#{null}}")
+    private String host;
+
     public void textToVoice(String text, String voiceFilePath, Integer voiceType, Float speed, Float volume) throws Exception{
         String codec = FileUtil.extName(voiceFilePath);
         Credential credential = new Credential(appId, secretId, secretKey);
@@ -115,6 +125,32 @@ public class TtsUtil {
 
     }
 
+    public String logTextToVoice(String text,Long voiceType, Float speed, Float volume) throws Exception{
+            // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
+            // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
+            // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
+            com.tencentcloudapi.common.Credential cred = new com.tencentcloudapi.common.Credential(secretId, secretKey);
+            // 实例化一个http选项,可选的,没有特殊需求可以跳过
+            HttpProfile httpProfile = new HttpProfile();
+            httpProfile.setEndpoint("tts.tencentcloudapi.com");
+            // 实例化一个client选项,可选的,没有特殊需求可以跳过
+            ClientProfile clientProfile = new ClientProfile();
+            clientProfile.setHttpProfile(httpProfile);
+            // 实例化要请求产品的client对象,clientProfile是可选的
+            TtsClient client = new TtsClient(cred, "", clientProfile);
+            // 实例化一个请求对象,每个接口都会对应一个request对象
+            CreateTtsTaskRequest req = new CreateTtsTaskRequest();
+            req.setText(text);
+            req.setVolume(volume);
+            req.setSpeed(this.speedTransfer(speed));
+            req.setVoiceType(voiceType);
+            req.setSampleRate(16000L);
+            req.setCallbackUrl(host + "/service/scene/scrb/ttsCallback");
+            // 返回的resp是一个CreateTtsTaskResponse的实例,与请求对象对应
+            CreateTtsTaskResponse resp = client.CreateTtsTask(req);
+            return resp.getData().getTaskId();
+    }
+
     private Float speedTransfer(Float speed){
 
         Float result = null;