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 bd0ff69..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,7 +192,13 @@ def wait_recognition_result(self): self._cv_wait_recog.wait(self._max_wait_seconds) if self._ws.status == "ABORTED": self._ws.recognition_list = [] - return [] + 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", "NO_MATCH", diff --git a/cpqdasr/recognizer_protocol/ws4py_api.py b/cpqdasr/recognizer_protocol/ws4py_api.py index 833fb1f..7f8f472 100644 --- a/cpqdasr/recognizer_protocol/ws4py_api.py +++ b/cpqdasr/recognizer_protocol/ws4py_api.py @@ -74,6 +74,9 @@ def __init__( self._config = config 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 @@ -131,9 +134,20 @@ 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._logger.info("ASR WS closed down {}, {}".format(code, reason)) + 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() def received_message(self, msg): @@ -169,9 +183,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 +194,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 +241,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":