Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cpqdasr/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from .recognizer import (
SpeechRecognizer,
RecognitionException,
AbnormalWsCloseException,
LanguageModelList,
PartialRecognitionResult,
)
Expand Down
6 changes: 5 additions & 1 deletion cpqdasr/recognizer/__init__.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down
19 changes: 18 additions & 1 deletion cpqdasr/recognizer/speech_recognizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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",
Expand Down
33 changes: 25 additions & 8 deletions cpqdasr/recognizer_protocol/ws4py_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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":
Expand All @@ -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

Expand Down Expand Up @@ -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":
Expand Down