فهرست منبع

根据声纹 自动转换成语音

三七 1 روز پیش
والد
کامیت
0a6c5185e7

+ 20 - 2
fs-admin/src/main/java/com/fs/qw/qwTask/qwTask.java

@@ -2,6 +2,7 @@ package com.fs.qw.qwTask;
 
 import com.fs.aiSoundReplication.param.TtsRequest;
 import com.fs.aiSoundReplication.service.impl.TtsServiceImpl;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.company.param.VcCompanyUser;
 import com.fs.company.service.ICompanyUserService;
@@ -33,6 +34,7 @@ import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 @Component("qwTask")
@@ -108,6 +110,9 @@ public class qwTask {
     @Autowired
     private TtsServiceImpl ttsServiceImpl;
 
+    @Autowired
+    private RedisCache redisCache;
+
 
     //正在使用
     public void qwExternalContact()
@@ -443,6 +448,10 @@ public class qwTask {
                     .collect(Collectors.toMap(VcCompanyUser::getCompanyUserId, v -> v, (a, b) -> a));
             List<QwSopTempVoice> filteredVoices = qwSopTempVoices.stream()
                     .filter(v -> v.getCompanyUserId() != null && vcUserMap.containsKey(v.getCompanyUserId()))
+                    .filter(v -> {
+                        String redisKey = "sop:voice:processing:" + v.getId();
+                        return redisCache.setIfAbsent(redisKey, "1",12, TimeUnit.HOURS);
+                    })
                     .collect(Collectors.toList());
 
             filteredVoices.forEach(item -> {
@@ -450,13 +459,22 @@ public class qwTask {
                 AudioVO audioVO = ttsServiceImpl.textToSpeech(new TtsRequest(null, null, vcCompanyUser.getSpeakerId(), item.getVoiceTxt()));
                 item.setVoiceUrl(audioVO.getUrl());
                 item.setDuration(audioVO.getDuration());
-
+                item.setUserVoiceUrl(audioVO.getWavUrl());
                 QwUser user = qwUserMapper.selectQwUserconvertSopVoice(item.getCompanyUserId());
                 ttsServiceImpl.ttsChargeByCount(vcCompanyUser,audioVO,user);
 
             });
             // 批量更新
-            iQwSopTempVoiceService.saveOrUpdateBatch(filteredVoices);
+            int batchSize = 200;
+            for (int i = 0; i < filteredVoices.size(); i += batchSize) {
+                List<QwSopTempVoice> batch = filteredVoices.subList(i, Math.min(i + batchSize, filteredVoices.size()));
+                iQwSopTempVoiceService.updateBatchWithDataSource(batch);
+            }
+            // 更新完成后清除Redis标记
+            filteredVoices.forEach(item -> {
+                String redisKey = "sop:voice:processing:" + item.getId();
+                redisCache.deleteObject(redisKey);
+            });
         }catch (Exception e){
 
         }

+ 15 - 1
fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java

@@ -65,6 +65,7 @@ import com.fs.app.task.qwTask;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 @Api("公共接口")
@@ -226,6 +227,10 @@ public class CommonController {
                     .collect(Collectors.toMap(VcCompanyUser::getCompanyUserId, v -> v, (a, b) -> a));
             List<QwSopTempVoice> filteredVoices = qwSopTempVoices.stream()
                     .filter(v -> v.getCompanyUserId() != null && vcUserMap.containsKey(v.getCompanyUserId()))
+                    .filter(v -> {
+                        String redisKey = "sop:voice:processing:" + v.getId();
+                        return redisCache.setIfAbsent(redisKey, "1",12, TimeUnit.HOURS);
+                    })
                     .collect(Collectors.toList());
 
             filteredVoices.forEach(item -> {
@@ -239,7 +244,16 @@ public class CommonController {
 
             });
             // 批量更新
-            iQwSopTempVoiceService.saveOrUpdateBatch(filteredVoices);
+            int batchSize = 200;
+            for (int i = 0; i < filteredVoices.size(); i += batchSize) {
+                List<QwSopTempVoice> batch = filteredVoices.subList(i, Math.min(i + batchSize, filteredVoices.size()));
+                iQwSopTempVoiceService.updateBatchWithDataSource(batch);
+            }
+            // 更新完成后清除Redis标记
+            filteredVoices.forEach(item -> {
+                String redisKey = "sop:voice:processing:" + item.getId();
+                redisCache.deleteObject(redisKey);
+            });
         }catch (Exception e){
 
         }

+ 3 - 0
fs-service/src/main/java/com/fs/sop/mapper/QwSopTempVoiceMapper.java

@@ -93,5 +93,8 @@ public interface QwSopTempVoiceMapper extends BaseMapper<QwSopTempVoice>{
     @DataSource(DataSourceType.SOP)
     List<QwSopTempVoice> convertSopVoiceEveryDay();
 
+    @DataSource(DataSourceType.SOP)
+    int updateBatchWithDataSource(@Param("list") List<QwSopTempVoice> list);
+
 
 }

+ 2 - 0
fs-service/src/main/java/com/fs/sop/service/IQwSopTempVoiceService.java

@@ -91,4 +91,6 @@ public interface IQwSopTempVoiceService extends IService<QwSopTempVoice>{
     List<QwSopTempVoice> selectQwSopTempVoiceNewList(QwSopTempVoice sopTempVoice);
 
     List<QwSopTempVoice> convertSopVoiceEveryDay();
+
+    int updateBatchWithDataSource(List<QwSopTempVoice> list);
 }

+ 6 - 0
fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempVoiceServiceImpl.java

@@ -335,4 +335,10 @@ public class QwSopTempVoiceServiceImpl extends ServiceImpl<QwSopTempVoiceMapper,
     public List<QwSopTempVoice> convertSopVoiceEveryDay() {
         return qwSopTempVoiceMapper.convertSopVoiceEveryDay();
     }
+
+    @Override
+    @DataSource(DataSourceType.SOP)
+    public int updateBatchWithDataSource(List<QwSopTempVoice> list) {
+      return  qwSopTempVoiceMapper.updateBatchWithDataSource(list);
+    }
 }

+ 24 - 0
fs-service/src/main/resources/mapper/sop/QwSopTempVoiceMapper.xml

@@ -178,5 +178,29 @@
           AND DATE(create_time) >= CURDATE() - INTERVAL 1 DAY
     </select>
 
+    <update id="updateBatchWithDataSource">
+        update qw_sop_temp_voice
+        <trim prefix="SET" suffixOverrides=",">
+            <trim prefix="voice_url = CASE id" suffix="END,">
+                <foreach collection="list" item="item">
+                    WHEN #{item.id} THEN #{item.voiceUrl}
+                </foreach>
+            </trim>
+            <trim prefix="duration = CASE id" suffix="END,">
+                <foreach collection="list" item="item">
+                    WHEN #{item.id} THEN #{item.duration}
+                </foreach>
+            </trim>
+            <trim prefix="user_voice_url = CASE id" suffix="END,">
+                <foreach collection="list" item="item">
+                    WHEN #{item.id} THEN #{item.userVoiceUrl}
+                </foreach>
+            </trim>
+        </trim>
+        where id in
+        <foreach collection="list" item="item" open="(" separator="," close=")">
+            #{item.id}
+        </foreach>
+    </update>
 
 </mapper>