Jelajahi Sumber

优化TX_TTS

yzx 2 minggu lalu
induk
melakukan
c4ac3f9fbc

+ 15 - 7
src/main/java/com/telerobot/fs/ivr/IvrSession.java

@@ -240,6 +240,7 @@ public class IvrSession {
             if (text != null && !text.trim().isEmpty()) {
                 setWavPlaybackTimeout();
                 String args;
+                boolean useResumeForTxTts1 = TtsProvider.TX_TTS1.equalsIgnoreCase(ttsProvider) && streamTtsChannelOpened;
                 if (TtsProvider.XFYUN.equalsIgnoreCase(ttsProvider)
                         || TtsProvider.TX_TTS1.equalsIgnoreCase(ttsProvider)
                         || TtsProvider.VIITOR.equalsIgnoreCase(ttsProvider)) {
@@ -249,12 +250,15 @@ public class IvrSession {
                     args = String.format("%s|%s|%s", ttsProvider, voiceCode, text);
                 }
                 logger.info("Play TTS: SessionID={}, Text={}", sessionId, args);
-                EslConnectionUtil.sendExecuteCommand("speak",
-                        args,
-                        sessionId
-                );
-
-                waitForTtsChannelOpen();
+                if (useResumeForTxTts1) {
+                    EslConnectionUtil.sendExecuteCommand(ttsProvider + "_resume", text, sessionId);
+                } else {
+                    EslConnectionUtil.sendExecuteCommand("speak",
+                            args,
+                            sessionId
+                    );
+                    waitForTtsChannelOpen();
+                }
 
                 if(streamTtsChannelOpened) {
                     if (TtsProvider.TX_TTS1.equalsIgnoreCase(ttsProvider)) {
@@ -434,9 +438,13 @@ public class IvrSession {
                     "TtsEvent".equalsIgnoreCase(eventSubClass)
             )) {
                 String eventDetail = headers.get("Tts-Event-Detail");
+                String errorDetails = headers.get("Error-Details");
                 if("Speech-Closed".equalsIgnoreCase(eventDetail)){
                     logger.info("{} stream tts channel closed = true.", getTraceId());
-                    streamTtsChannelOpened = false;
+                    if (!TtsProvider.TX_TTS1.equalsIgnoreCase(ttsProvider)
+                            || !"round-complete-keep-ws".equalsIgnoreCase(errorDetails)) {
+                        streamTtsChannelOpened = false;
+                    }
                     ttsChannelCloseSignal.release();
                 }
             }

+ 9 - 3
src/main/java/com/telerobot/fs/robot/RobotChat.java

@@ -252,6 +252,7 @@ public class RobotChat extends RobotBase {
         String eventSubClass = headers.get("Event-Subclass");
         String playbackFilePath = headers.get("Playback-File-Path");
         String detail = headers.get("Ecc365-Event-Detail");
+        boolean txTts1Provider = TtsProvider.TX_TTS1.equalsIgnoreCase(chatRobot.getAccount().voiceSource);
         logger.info("{}  Event-Name:{} ", getTraceId(), eventName);
         if(EventNames.PLAYBACK_START.equalsIgnoreCase(eventName)){
 
@@ -295,7 +296,9 @@ public class RobotChat extends RobotBase {
 
             if(EventNames.PLAYBACK_STOP.equalsIgnoreCase(detail)) {
                 logger.info("{} ************ streaming tts playback finished.", getTraceId());
-                chatRobot.setTtsChannelState(TtsChannelState.CLOSED);
+                if (!txTts1Provider) {
+                    chatRobot.setTtsChannelState(TtsChannelState.CLOSED);
+                }
                 recvPlayBackEndEvent = true;
                 playbackEndTime = System.currentTimeMillis();
                 releasePlayBackFinishedSignal();
@@ -401,18 +404,21 @@ public class RobotChat extends RobotBase {
                 "TtsEvent".equalsIgnoreCase(eventSubClass)
         )) {
            String event = headers.get("Tts-Event-Detail");
+           String errorDetails = headers.get("Error-Details");
            // #region debug-point vt-tts-custom-event-detail
            logger.info("{} dbg_vt_tts_custom eventSubClass={}, event={}, errorDetails={}, recvPlayBackEndEvent={}, ttsChannelClosed={}, inSpeaking={}",
                    getTraceId(),
                    eventSubClass,
                    event,
-                   headers.get("Error-Details"),
+                   errorDetails,
                    recvPlayBackEndEvent,
                    ttsChannelClosed,
                    interactiveParam.checkInSpeaking());
            // #endregion
            if("Speech-Closed".equalsIgnoreCase(event)){
-               chatRobot.setTtsChannelState(TtsChannelState.CLOSED);
+               if (!txTts1Provider || !"round-complete-keep-ws".equalsIgnoreCase(errorDetails)) {
+                   chatRobot.setTtsChannelState(TtsChannelState.CLOSED);
+               }
                logger.info("{}  TtsChannelClosed = true.", getTraceId());
                ttsChannelClosed = true;
                recvPlayBackEndEvent = true;