Go to the documentation of this file.00001
00002
00003
00004 import urllib2
00005 import json
00006 import base64
00007 import socket
00008 import traceback
00009 import ssl
00010
00011
00012 from rospeex_core.validators import accepts
00013 from rospeex_core.validators import check_wave_data
00014 from rospeex_core.validators import check_language
00015 from rospeex_core import exceptions as ext
00016 from rospeex_core.sr.base import IClient
00017
00018
00019 class SyncClient(IClient):
00020 """ SpeechRecognitionClient_NICT class """
00021
00022 AUDIO_LENGTH = 16000
00023 FRAMERATE = 16000
00024 CHANNELS = 1
00025 SAMPWIDTH = 2
00026 URL = 'http://rospeex.nict.go.jp/nauth_json/jsServices/VoiceTraSR'
00027 LANGUAGES = ['ja', 'en', 'zh', 'ko']
00028
00029 @accepts(data=str, language=str, timeout=int)
00030 def request(
00031 self,
00032 data,
00033 language='ja',
00034 timeout=socket._GLOBAL_DEFAULT_TIMEOUT
00035 ):
00036 """ send speech recognition request to server
00037
00038 @param data: speech binary data
00039 @type data: str
00040 @param language: speech data language
00041 @type language: str
00042 @param timeout: time out time[ms]
00043 @type timeout: int
00044 """
00045 check_wave_data(
00046 data,
00047 self.FRAMERATE,
00048 self.CHANNELS,
00049 self.SAMPWIDTH,
00050 self.AUDIO_LENGTH
00051 )
00052 check_language(language, self.LANGUAGES)
00053
00054
00055 voice_send = base64.b64encode(data)
00056
00057 data = {
00058 'method': 'recognize',
00059 'params': [
00060 '1.1',
00061 {
00062 'audio': voice_send,
00063 'audioType': 'audio/x-wav',
00064 'voiceType': '*',
00065 'language': language,
00066 'applicationType': 'rospeex'
00067 }
00068 ]
00069 }
00070
00071
00072 res_data = None
00073 try:
00074 req = urllib2.Request(self.URL)
00075 req.add_header('Content-Type', 'application/json')
00076 res = urllib2.urlopen(req, json.dumps(data), timeout=timeout)
00077 res_data = json.loads(res.read())
00078
00079 except urllib2.URLError as err:
00080 if isinstance(err.reason, socket.timeout):
00081 msg = 'request time out. Exception: {}'.format(str(err))
00082 raise ext.RequestTimeoutException(msg)
00083
00084 msg = 'request url error. Exception: {}'.format(str(err))
00085 raise ext.InvalidRequestException(msg)
00086
00087 except urllib2.HTTPError as err:
00088 msg = 'http error. {} Exception: {}'.format(err.code, err.msg)
00089 raise ext.InvalidResponseException(msg)
00090
00091 except (ssl.SSLError, socket.timeout) as err:
00092 raise ext.RequestTimeoutException(str(err))
00093
00094 except:
00095 msg = 'unknown exception. Traceback: {}'.format(
00096 traceback.format_exc()
00097 )
00098 raise ext.SpeechRecognitionException(msg)
00099
00100
00101 if res_data['error'] is not None:
00102 if 'faultCode' in res_data['error']:
00103 if res_data['error']['faultCode'] == 'Server.userException':
00104 raise ext.InvalidResponseException(
00105 'the audio format is not supported.'
00106 )
00107 msg = 'server response error. msg:{}'.format(res_data['error'])
00108 raise ext.InvalidResponseException(msg)
00109
00110 return res_data['result']
00111
00112 def support_streaming(self):
00113 """
00114 check support streaming
00115 @return: True for support streaming / False for NOT support streaming
00116 """
00117 return False
00118
00119 def add_streaming_packet(self, packet_type, packet_data):
00120 """ add streaming packet
00121 @param packet_type:
00122 @type packet_type: int
00123 @param packet_data:
00124 @param packet_data: str
00125 """
00126 pass
00127
00128 def register_streaming_cb(self, cb):
00129 """
00130 register streaming result callback
00131 @param cb:
00132 @type cb:
00133 """
00134 pass
00135
00136 def unregister_streaming_cb(self, cb):
00137 """
00138 unregister streaming result callback
00139 @param cb:
00140 @type cb:
00141 """
00142 pass
00143
00144 def set_streaming_config(self, language):
00145 """ set streaming config
00146 @param language:
00147 """
00148 pass
00149
00150 def join(self, timeout=None):
00151 """
00152 join streaming client
00153 @param timeout:
00154 @type timeout:
00155 """
00156 pass