From 3012c6a156216459c6da43d2d95644628c1ed701 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mauricio=20Rodrigues=20Mendon=C3=A7a?= Date: Wed, 29 Jul 2026 19:43:03 -0300 Subject: [PATCH 1/2] [TRD-777] Armazena mensagem de erro do websocket --- cpqdasr/recognizer/speech_recognizer.py | 2 +- cpqdasr/recognizer_protocol/ws4py_api.py | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/cpqdasr/recognizer/speech_recognizer.py b/cpqdasr/recognizer/speech_recognizer.py index bd0ff69..bb14e2b 100644 --- a/cpqdasr/recognizer/speech_recognizer.py +++ b/cpqdasr/recognizer/speech_recognizer.py @@ -181,7 +181,7 @@ def wait_recognition_result(self): self._cv_wait_recog.wait(self._max_wait_seconds) if self._ws.status == "ABORTED": self._ws.recognition_list = [] - return [] + raise RecognitionException("ABORTED", self._ws._error_msg) elif self._ws.status not in [ "RECOGNIZED", "NO_MATCH", diff --git a/cpqdasr/recognizer_protocol/ws4py_api.py b/cpqdasr/recognizer_protocol/ws4py_api.py index 833fb1f..a5522f2 100644 --- a/cpqdasr/recognizer_protocol/ws4py_api.py +++ b/cpqdasr/recognizer_protocol/ws4py_api.py @@ -74,6 +74,7 @@ def __init__( self._config = config self._logger = logging.getLogger("cpqdasr") self._status = "DISCONNECTED" + self._error_msg = "" self._cv_define_grammar = cv_define_grammar self._time_define_grammar = 0 self._cv_create_session = cv_create_session @@ -133,7 +134,8 @@ def opened(self): def closed(self, code, reason=None): self._status = "DISCONNECTED" - self._logger.info("ASR WS closed down {}, {}".format(code, reason)) + self._error_msg = "ASR WS closed down {}, {}".format(code, reason) + self._logger.info(self._error_msg) self._abort() def received_message(self, msg): @@ -169,9 +171,8 @@ def received_message(self, msg): with self._cv_define_grammar: self._cv_define_grammar.notify_all() else: - self._logger.warning( - "Error on defining grammar: " "{}".format(msg.data) - ) + self._error_msg = "Error on defining grammar: " "{}".format(msg.data) + self._logger.warning(self._error_msg) self._abort() return if h["Method"] == "START_RECOGNITION": @@ -181,9 +182,10 @@ def received_message(self, msg): with self._cv_send_audio: self._cv_send_audio.notify_all() else: - self._logger.warning( - "Error on start recognition: " "{}".format(msg.data.decode()) + self._error_msg = "Error on start recognition: " "{}".format( + msg.data.decode() ) + self._logger.warning(self._error_msg) self._abort() return @@ -227,9 +229,12 @@ def received_message(self, msg): # If an error occurs, do not halt the client. Instead, log # the error elif "Error-Code" in h: - self._logger.warning( - "Non-fatal error in API call: Code " "{}".format(h["Error-Code"]) + self._error_msg = ( + "Non-fatal error in API call: Code {}. Response: {}".format( + h["Error-Code"], msg.data + ) ) + self._logger.warning(self._error_msg) self._abort() elif h["Method"] == "CANCEL_RECOGNITION": From 3fecc448a263ff3549b24aca2a499b295715677d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mauricio=20Rodrigues=20Mendon=C3=A7a?= Date: Fri, 31 Jul 2026 13:29:44 -0300 Subject: [PATCH 2/2] =?UTF-8?q?[TRD-777]=20adiciona=20exce=C3=A7=C3=A3o=20?= =?UTF-8?q?para=20fechamento=20anormal=20do=20WebSocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cpqdasr/__init__.py | 1 + cpqdasr/recognizer/__init__.py | 6 +++++- cpqdasr/recognizer/speech_recognizer.py | 17 +++++++++++++++++ cpqdasr/recognizer_protocol/ws4py_api.py | 12 ++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/cpqdasr/__init__.py b/cpqdasr/__init__.py index 7164373..78eb63f 100644 --- a/cpqdasr/__init__.py +++ b/cpqdasr/__init__.py @@ -2,6 +2,7 @@ from .recognizer import ( SpeechRecognizer, RecognitionException, + AbnormalWsCloseException, LanguageModelList, PartialRecognitionResult, ) diff --git a/cpqdasr/recognizer/__init__.py b/cpqdasr/recognizer/__init__.py index 5b08c21..3d70d05 100644 --- a/cpqdasr/recognizer/__init__.py +++ b/cpqdasr/recognizer/__init__.py @@ -1,5 +1,9 @@ # -*- coding: utf-8 -*- -from .speech_recognizer import SpeechRecognizer, RecognitionException +from .speech_recognizer import ( + SpeechRecognizer, + RecognitionException, + AbnormalWsCloseException, +) from .language_model_list import LanguageModelList from .listener import RecognitionListener from .result import RecognitionResult, PartialRecognitionResult diff --git a/cpqdasr/recognizer/speech_recognizer.py b/cpqdasr/recognizer/speech_recognizer.py index bb14e2b..017be01 100644 --- a/cpqdasr/recognizer/speech_recognizer.py +++ b/cpqdasr/recognizer/speech_recognizer.py @@ -45,6 +45,17 @@ def __init__(self, c, m): self.code = c +class AbnormalWsCloseException(RecognitionException): + retryable = True + + def __init__(self, close_code, close_reason, message=None): + if message is None: + message = "ASR WS closed down {}, {}".format(close_code, close_reason) + super(AbnormalWsCloseException, self).__init__("ABORTED", message) + self.close_code = close_code + self.close_reason = close_reason + + class SpeechRecognizer: """ Class which recognizes speech and returns structured results. @@ -181,6 +192,12 @@ def wait_recognition_result(self): self._cv_wait_recog.wait(self._max_wait_seconds) if self._ws.status == "ABORTED": self._ws.recognition_list = [] + close_code = getattr(self._ws, "close_code", None) + close_reason = getattr(self._ws, "close_reason", None) + if str(close_code) == "1006": + raise AbnormalWsCloseException( + close_code, close_reason, self._ws._error_msg + ) raise RecognitionException("ABORTED", self._ws._error_msg) elif self._ws.status not in [ "RECOGNIZED", diff --git a/cpqdasr/recognizer_protocol/ws4py_api.py b/cpqdasr/recognizer_protocol/ws4py_api.py index a5522f2..7f8f472 100644 --- a/cpqdasr/recognizer_protocol/ws4py_api.py +++ b/cpqdasr/recognizer_protocol/ws4py_api.py @@ -75,6 +75,8 @@ def __init__( self._logger = logging.getLogger("cpqdasr") self._status = "DISCONNECTED" self._error_msg = "" + self._close_code = None + self._close_reason = None self._cv_define_grammar = cv_define_grammar self._time_define_grammar = 0 self._cv_create_session = cv_create_session @@ -132,8 +134,18 @@ def opened(self): self.send(msg, binary=True) self._logger.debug(b"SEND: " + msg) + @property + def close_code(self): + return self._close_code + + @property + def close_reason(self): + return self._close_reason + def closed(self, code, reason=None): self._status = "DISCONNECTED" + self._close_code = code + self._close_reason = reason self._error_msg = "ASR WS closed down {}, {}".format(code, reason) self._logger.info(self._error_msg) self._abort()