yzx há 1 dia atrás
pai
commit
b0a85f46b0

+ 1 - 0
src/main/java/com/telerobot/fs/entity/pojo/TtsProvider.java

@@ -5,6 +5,7 @@ public class TtsProvider {
     public static final String DOUBAO = "doubao_vcl_tts";
     public static final String XFYUN = "xf_tts";
     public static final String TX_TTS1 = "tx_tts1";
+    public static final String VIITOR = "vt_tts";
     public static final String MICROSOFT = "microsoft_tts";
     public static final String CHINA_TELECOM = "chinatelecom_tts";
 

+ 2 - 1
src/main/java/com/telerobot/fs/ivr/IvrSession.java

@@ -241,7 +241,8 @@ public class IvrSession {
                 setWavPlaybackTimeout();
                 String args;
                 if (TtsProvider.XFYUN.equalsIgnoreCase(ttsProvider)
-                        || TtsProvider.TX_TTS1.equalsIgnoreCase(ttsProvider)) {
+                        || TtsProvider.TX_TTS1.equalsIgnoreCase(ttsProvider)
+                        || TtsProvider.VIITOR.equalsIgnoreCase(ttsProvider)) {
                     EslConnectionUtil.sendExecuteCommand("set", "cache_speech_handles=true", sessionId);
                     args = String.format("%s|%s|{channel-uuid=%s}%s", ttsProvider, voiceCode, sessionId, text);
                 } else {

+ 14 - 5
src/main/java/com/telerobot/fs/robot/AbstractChatRobot.java

@@ -108,6 +108,14 @@ public abstract class AbstractChatRobot implements IChatRobot {
         return TtsProvider.TX_TTS1.equalsIgnoreCase(ttsProvider);
     }
 
+    protected boolean isViiTorProvider() {
+        return TtsProvider.VIITOR.equalsIgnoreCase(ttsProvider);
+    }
+
+    protected boolean isResumeStreamingProvider() {
+        return isTxTts1Provider() || isViiTorProvider();
+    }
+
     protected boolean isTxTts1FlushBoundary(String input) {
         if (StringUtils.isEmpty(input)) {
             return false;
@@ -133,7 +141,7 @@ public abstract class AbstractChatRobot implements IChatRobot {
         if (isXfyunTtsProvider()) {
             return false;
         }
-        if (isTxTts1Provider()) {
+        if (isResumeStreamingProvider()) {
             return ttsTextLength >= 5 && isTxTts1FlushBoundary(speechContent);
         }
         return ttsTextLength >= 5 && checkPauseFlag(speechContent);
@@ -222,7 +230,7 @@ public abstract class AbstractChatRobot implements IChatRobot {
             flushTtsRequestQueue();
         }else  if(TtsChannelState.TRYING_OPEN.getCode().equals(ttsChannelState.getCode()))  {
             ttsRequestQueue.add(text);
-            if (isTxTts1Provider()) {
+            if (isResumeStreamingProvider()) {
                 flushTtsRequestQueue();
             }
         }
@@ -252,7 +260,8 @@ public abstract class AbstractChatRobot implements IChatRobot {
 
     private String buildSpeakCommand(String text) {
         if (!TtsProvider.XFYUN.equalsIgnoreCase(ttsProvider)
-                && !TtsProvider.TX_TTS1.equalsIgnoreCase(ttsProvider)) {
+                && !TtsProvider.TX_TTS1.equalsIgnoreCase(ttsProvider)
+                && !TtsProvider.VIITOR.equalsIgnoreCase(ttsProvider)) {
             return String.format("%s|%s|%s", ttsProvider, ttsVoiceName, text);
         }
 
@@ -283,7 +292,7 @@ public abstract class AbstractChatRobot implements IChatRobot {
             flushTtsRequestQueue();
         }else  if(TtsChannelState.TRYING_OPEN.getCode().equals(ttsChannelState.getCode()))  {
             ttsRequestQueue.add(cmd);
-            if (isTxTts1Provider()) {
+            if (isResumeStreamingProvider()) {
                 flushTtsRequestQueue();
             }
         }
@@ -294,7 +303,7 @@ public abstract class AbstractChatRobot implements IChatRobot {
         if (TtsChannelState.OPENED.getCode().equals(ttsChannelState.getCode())) {
             return true;
         }
-        return isTxTts1Provider() && TtsChannelState.TRYING_OPEN.getCode().equals(ttsChannelState.getCode());
+        return isResumeStreamingProvider() && TtsChannelState.TRYING_OPEN.getCode().equals(ttsChannelState.getCode());
     }
 
     private void sendTtsResumeCommand(String text) {

+ 8 - 0
src/main/java/com/telerobot/fs/robot/RobotChat.java

@@ -183,6 +183,14 @@ public class RobotChat extends RobotBase {
                     uuid
             );
         }
+        if(ttsProvider.equalsIgnoreCase(TtsProvider.VIITOR)) {
+            logger.info("{} Current tts provider is vt_tts, enable cache_speech_handles for vt_tts_resume.",
+                    getTraceId());
+            EslConnectionUtil.sendExecuteCommand("set",
+                    "cache_speech_handles=true",
+                    uuid
+            );
+        }
         if(ttsProvider.equalsIgnoreCase(TtsProvider.MICROSOFT)) {
             logger.info("{}  Current tts provider is microsoft!", getTraceId());
         }

+ 11 - 0
src/main/java/com/telerobot/fs/tts/TtsUtil.java

@@ -2,6 +2,7 @@ package com.telerobot.fs.tts;
 
 import com.telerobot.fs.tts.aliyun.AliyunTTSWebApi;
 import com.telerobot.fs.tts.tencent.TencentTTSWebApi;
+import com.telerobot.fs.tts.viitor.ViiTorTTSWebApi;
 import link.thingscloud.freeswitch.esl.CommonUtils;
 import link.thingscloud.freeswitch.esl.util.CurrentTimeMillisClock;
 import org.apache.commons.lang.StringUtils;
@@ -62,6 +63,16 @@ public class TtsUtil {
                         CommonUtils.getStackTraceString(e.getStackTrace())
                 );
             }
+        } else if("vt_tts".equals(voiceSource)) {
+            try {
+                result = ViiTorTTSWebApi.shortTextTTSWebAPI(voiceCode, text, wavSavePath);
+            } catch (Throwable e) {
+                logger.error(" ViiTorTTSWebApi.shortTextTTSWebAPI error! voiceCode={}, wavSavePath={}, text={}, {} {}",
+                        voiceCode, wavSavePath, text,
+                        e.toString(),
+                        CommonUtils.getStackTraceString(e.getStackTrace())
+                );
+            }
         } else if("azure".equals(voiceSource)) {
 
         }else{