class ServerConnection(object): def __init__(self, host, port, key, app, service, topic, lang, format, uuid, inter_utt_silence, cmn_latency, logger=None, punctuation=True, ipv4=False, capitalize=False, expected_num_count=0): self.host = host self.port = port self.key = key self.app = app self.topic = topic self.service = service self.lang = lang self.format = format self.uuid = uuid self.logger = logger self.punctuation = punctuation self.inter_utt_silence = inter_utt_silence self.cmn_latency = cmn_latency self.ipv4 = ipv4 self.capitalize = capitalize self.expected_num_count = expected_num_count self.log("uuid={0}".format(self.uuid)) self.session_id = "not-set" self.connect() def log(self, message): if self.logger is not None: self.logger.info(message) def connect(self): self.t = Transport(self.host, self.port, timeout=None, verbose=False, enable_ssl=(self.port == 443), ipv4=self.ipv4) if not self.upgrade_connection(): raise ServerError('Unable to upgrade connection') self.log("Connected to {0}:{1}.".format(self.host, self.port)) response = self.send_init_request() if response.responseCode != 200: error_text = 'Wrong response from server, status_code={0}'.format( response.responseCode) if response.HasField("message"): error_text += ', message is "{0}"'.format(response.message) raise ServerError(error_text) self.session_id = response.sessionId self.log("session_id={0}".format(self.session_id)) return self.session_id def send_init_request(self): request = ConnectionRequest( speechkitVersion='', serviceName=self.service, uuid=self.uuid, apiKey=self.key, applicationName=self.app, device='desktop', coords='0, 0', topic=self.topic, lang=self.lang, format=self.format, punctuation=self.punctuation, advancedASROptions=AdvancedASROptions( utterance_silence=int(self.inter_utt_silence), cmn_latency=self.cmn_latency, capitalize=self.capitalize, expected_num_count=self.expected_num_count, biometry="children", )) self.t.sendProtobuf(request) return self.t.recvProtobuf(ConnectionResponse) def upgrade_connection(self): logger = logging.getLogger('arslib') request = ('GET /asr_partial_checked HTTP/1.1\r\n' 'User-Agent: {user_agent}\r\n' 'Host: {host}:{port}\r\n' 'Upgrade: {service}\r\n\r\n').format(user_agent=self.app, host=self.host, port=self.port, service=self.service) self.t.send(request) check = 'HTTP/1.1 101 Switching Protocols' buffer = '' # possible infinite loop here? while True: buffer += self.t.recv(1) if buffer.startswith(check) and buffer.endswith('\r\n\r\n'): return True if len(buffer) > 300: logger.warning(buffer) return False def close(self): self.session_id = "" self.t.close() def reconnect(self, delay=None): self.log('Reconnecting!') self.close() if delay is not None: self.log('Going to sleep for {0} seconds'.format(delay)) time.sleep(delay) self.connect() def add_data(self, chunk): if chunk is None: self.t.sendProtobuf(AddData(lastChunk=True)) else: self.t.sendProtobuf(AddData(lastChunk=False, audioData=chunk)) def get_response_if_ready(self): response = self.t.recvProtobufIfAny(AddDataResponse) if response is not None: if response.responseCode != 200: error_text = 'Wrong response from server, status_code={0}'.format( response.responseCode) if response.HasField("message"): error_text += ', message is "{0}"'.format(response.message) raise ServerError(error_text) return response
class ServerConnection(object): def __init__(self, host, port, key, app, service, topic, lang, format, uuid, inter_utt_silence, cmn_latency, logger=None, punctuation=True, ipv4=False, capitalize=False, expected_num_count=0): self.host = host self.port = port self.key = key self.app = app self.topic = topic self.service = service self.lang = lang self.format = format self.uuid = uuid self.logger = logger self.punctuation = punctuation self.inter_utt_silence = inter_utt_silence self.cmn_latency = cmn_latency self.ipv4 = ipv4 self.capitalize = capitalize self.expected_num_count = expected_num_count self.log("uuid={0}".format(self.uuid)) self.session_id = "not-set" self.connect() def log(self, message): if self.logger is not None: self.logger.info(message) def connect(self): self.t = Transport(self.host, self.port, timeout=None, verbose=False, enable_ssl=(self.port==443), ipv4=self.ipv4) if not self.upgrade_connection(): raise ServerError('Unable to upgrade connection') self.log("Connected to {0}:{1}.".format(self.host, self.port)) response = self.send_init_request() if response.responseCode != 200: error_text = 'Wrong response from server, status_code={0}'.format( response.responseCode) if response.HasField("message"): error_text += ', message is "{0}"'.format(response.message) raise ServerError(error_text) self.session_id = response.sessionId self.log("session_id={0}".format(self.session_id)) return self.session_id def send_init_request(self): request = ConnectionRequest( speechkitVersion='', serviceName=self.service, uuid=self.uuid, apiKey=self.key, applicationName=self.app, device='desktop', coords='0, 0', topic=self.topic, lang=self.lang, format=self.format, punctuation=self.punctuation, advancedASROptions=AdvancedASROptions( utterance_silence=int(self.inter_utt_silence), cmn_latency=self.cmn_latency, capitalize=self.capitalize, expected_num_count=self.expected_num_count, biometry="children", ) ) self.t.sendProtobuf(request) return self.t.recvProtobuf(ConnectionResponse) def upgrade_connection(self): logger = logging.getLogger('arslib') request = ('GET /asr_partial_checked HTTP/1.1\r\n' 'User-Agent: {user_agent}\r\n' 'Host: {host}:{port}\r\n' 'Upgrade: {service}\r\n\r\n').format( user_agent=self.app, host=self.host, port=self.port, service=self.service) self.t.send(request) check = 'HTTP/1.1 101 Switching Protocols' buffer = '' # possible infinite loop here? while True: buffer += self.t.recv(1) if buffer.startswith(check) and buffer.endswith('\r\n\r\n'): return True if len(buffer) > 300: logger.warning(buffer) return False def close(self): self.session_id = "" self.t.close() def reconnect(self, delay=None): self.log('Reconnecting!') self.close() if delay is not None: self.log('Going to sleep for {0} seconds'.format(delay)) time.sleep(delay) self.connect() def add_data(self, chunk): if chunk is None: self.t.sendProtobuf(AddData(lastChunk=True)) else: self.t.sendProtobuf(AddData(lastChunk=False, audioData=chunk)) def get_response_if_ready(self): response = self.t.recvProtobufIfAny(AddDataResponse) if response is not None: if response.responseCode != 200: error_text = 'Wrong response from server, status_code={0}'.format( response.responseCode) if response.HasField("message"): error_text += ', message is "{0}"'.format(response.message) raise ServerError(error_text) return response
class ServerConnection(object): def __init__(self, host, port, key, app, service, topic, lang, format, logger=None, punctuation=True): self.host = host self.port = port self.key = key self.app = app self.topic = topic self.service = service self.lang = lang self.format = format self.uuid = randomUuid().hex self.logger = logger self.punctuation = punctuation self.log("uuid={0}".format(self.uuid)) self.session_id = "" self.connect() def log(self, message): if self.logger is not None: self.logger.info(message) def connect(self): self.t = Transport(self.host, self.port, timeout=None, verbose=False) if not self.upgrade_connection(): raise ServerError('Unable to upgrade connection') self.log("Connected to {0}:{1}.".format(self.host, self.port)) response = self.send_init_request() if response.responseCode != 200: error_text = 'Wrong response from server, status_code={0}'.format( response.responseCode) if response.HasField("message"): error_text += ', message is "{0}"'.format(response.message) raise ServerError(error_text) self.session_id = response.sessionId self.log("session_id={0}".format(self.session_id)) return self.session_id def send_init_request(self): request = ConnectionRequest( speechkitVersion='Not Speechkit', serviceName=self.service, uuid=self.uuid, apiKey=self.key, applicationName=self.app, device='desktop', coords='0, 0', topic=self.topic, lang=self.lang, format=self.format, punctuation=self.punctuation) self.t.sendProtobuf(request) return self.t.recvProtobuf(ConnectionResponse) def upgrade_connection(self): logger = logging.getLogger('arslib') request = ('GET /asr_partial_checked HTTP/1.1\r\n' 'User-Agent: {user_agent}\r\n' 'Host: {host}:{port}\r\n' 'Upgrade: {service}\r\n\r\n').format( user_agent=self.app, host=self.host, port=self.port, service=self.service) self.t.send(request) check = 'HTTP/1.1 101 Switching Protocols' buffer = '' # possible infinite loop here? while True: buffer += self.t.recv(1) if buffer.startswith(check) and buffer.endswith('\r\n\r\n'): return True if len(buffer) > 300: logger.warning(buffer) return False def close(self): self.session_id = "" self.t.close() def reconnect(self, delay=None): self.log('Reconnecting!') self.close() if delay is not None: self.log('Going to sleep for {0} seconds'.format(delay)) time.sleep(delay) self.connect() def add_data(self, chunk): if chunk is None: self.t.sendProtobuf(AddData(lastChunk=True)) else: self.t.sendProtobuf(AddData(lastChunk=False, audioData=chunk)) def get_utterance_if_ready(self): response = self.t.recvProtobufIfAny(AddDataResponse) if response is not None: if response.responseCode != 200: error_text = 'Wrong response from server, status_code={0}'.format( response.responseCode) if response.HasField("message"): error_text += ', message is "{0}"'.format(response.message) raise ServerError(error_text) self.log("got response: endOfUtt={0}; len(recognition)={1}".format(response.endOfUtt, len(response.recognition))) if len(response.recognition) == 0: return "", response.messagesCount text = response.recognition[0].normalized.encode('utf-8') merged = response.messagesCount self.log("partial result: {0}; merged={1}".format(text, merged)) if response.endOfUtt: return text, merged else: return "", response.messagesCount return None, 0
class ServerConnection(object): def __init__(self, host, port, key, app, service, topic, lang, format, logger=None): self.host = host self.port = port self.key = key self.app = app self.topic = topic self.service = service self.lang = lang self.format = format self.uuid = randomUuid().hex self.logger = logger self.log("uuid={0}".format(self.uuid)) self.session_id = "" self.connect() def log(self, message): if self.logger is not None: self.logger.info(message) def connect(self): self.t = Transport(self.host, self.port, timeout=None, verbose=False) if not self.upgrade_connection(): raise ServerError('Unable to upgrade connection') self.log("Connected to {0}:{1}.".format(self.host, self.port)) response = self.send_init_request() if response.responseCode != 200: error_text = 'Wrong response from server, status_code={0}'.format( response.responseCode) if response.HasField("message"): error_text += ', message is "{0}"'.format(response.message) raise ServerError(error_text) self.session_id = response.sessionId self.log("session_id={0}".format(self.session_id)) return self.session_id def send_init_request(self): request = ConnectionRequest( speechkitVersion='Not Speechkit', serviceName=self.service, uuid=self.uuid, apiKey=self.key, applicationName=self.app, device='desktop', coords='0, 0', topic=self.topic, lang=self.lang, format=self.format) self.t.sendProtobuf(request) return self.t.recvProtobuf(ConnectionResponse) def upgrade_connection(self): logger = logging.getLogger('arslib') request = ('GET /asr_partial_checked HTTP/1.1\r\n' 'User-Agent: {user_agent}\r\n' 'Host: {host}:{port}\r\n' 'Upgrade: {service}\r\n\r\n').format( user_agent=self.app, host=self.host, port=self.port, service=self.service) self.t.send(request) check = 'HTTP/1.1 101 Switching Protocols' buffer = '' # possible infinite loop here? while True: buffer += self.t.recv(1) if buffer.startswith(check) and buffer.endswith('\r\n\r\n'): return True if len(buffer) > 300: logger.warning(buffer) return False def close(self): self.session_id = "" self.t.close() def reconnect(self, delay=None): self.log('Reconnecting!') self.close() if delay is not None: self.log('Going to sleep for {0} seconds'.format(delay)) time.sleep(delay) self.connect() def add_data(self, chunk): if chunk is None: self.t.sendProtobuf(AddData(lastChunk=True)) else: self.t.sendProtobuf(AddData(lastChunk=False, audioData=chunk)) def get_utterance_if_ready(self): response = self.t.recvProtobufIfAny(AddDataResponse) if response is not None: if response.responseCode != 200: error_text = 'Wrong response from server, status_code={0}'.format( response.responseCode) if response.HasField("message"): error_text += ', message is "{0}"'.format(response.message) raise ServerError(error_text) self.log("got response: endOfUtt={0}; len(recognition)={1}".format(response.endOfUtt, len(response.recognition))) if len(response.recognition) == 0: return "", response.messagesCount text = response.recognition[0].normalized.encode('utf-8') merged = response.messagesCount self.log("partial result: {0}; merged={1}".format(text, merged)) if response.endOfUtt: return text, merged else: return "", response.messagesCount return None, 0