Go to the documentation of this file.00001 
00002 
00003 import urllib2
00004 import json
00005 import base64
00006 import socket
00007 import logging
00008 import traceback
00009 import ssl
00010 
00011 
00012 from rospeex_core.validators import accepts, check_wave_data, check_language
00013 from rospeex_core.exceptions import InvalidRequestException
00014 from rospeex_core.exceptions import InvalidResponseException
00015 from rospeex_core.exceptions import SpeechRecognitionException
00016 from rospeex_core.exceptions import RequestTimeoutException
00017 from rospeex_core.sr.client_base import SpeechRecognitionClient
00018 
00019 
00020 logging.basicConfig(level=logging.INFO)
00021 logger = logging.getLogger(__name__)
00022 
00023 
00024 class SpeechRecognitionClient_NICT(SpeechRecognitionClient):
00025     """ SpeechRecognitionClient_NICT class """
00026 
00027     AUDIO_LENGTH = 16000
00028     FRAMERATE = 16000
00029     CHANNELS = 1
00030     SAMPWIDTH = 2
00031     URL = 'http://rospeex.ucri.jgn-x.jp/nauth_json/jsServices/VoiceTraSR'
00032     LANGUAGES = ['ja', 'en', 'zh', 'ko']
00033 
00034 
00035     @accepts(data=str, language=str, timeout=int)
00036     def request(self, data, language='ja', timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
00037         """
00038         send speech recognition request to server
00039         @param data: speech binary data
00040         @type  data: str
00041         @param language: speech data language
00042         @type  language: str
00043         @param timeout: time out time[ms]
00044         @type  timeout: int
00045         """
00046         check_wave_data(data, self.FRAMERATE, self.CHANNELS, self.SAMPWIDTH, self.AUDIO_LENGTH)
00047         check_language(language, self.LANGUAGES)
00048 
00049         
00050         voice_send = base64.b64encode(data)
00051 
00052         data = {
00053             'method':'recognize',
00054             'params':[
00055                 '1.1',
00056                 {'audio': voice_send,
00057                  'audioType':'audio/x-wav',
00058                  'voiceType': '*',
00059                  'language':language,
00060                  'applicationType':'rospeex'
00061                 }
00062             ]
00063         }
00064 
00065         
00066         res_data = None
00067         try:
00068             req = urllib2.Request(self.URL)
00069             req.add_header('Content-Type', 'application/json')
00070             res = urllib2.urlopen(req, json.dumps(data), timeout=timeout)
00071             res_data = json.loads(res.read())
00072 
00073         except urllib2.URLError as err:
00074             if isinstance(err.reason, socket.timeout):
00075                 raise RequestTimeoutException('request time out. Exception: %s' % str(err))
00076             raise InvalidRequestException('request url error. Exception: %s' % str(err))
00077 
00078         except urllib2.HTTPError as err:
00079             raise InvalidResponseException('http error. %s Exception:%s' % (err.code, err.msg))
00080 
00081         except (ssl.SSLError, socket.timeout) as err:
00082             raise RequestTimeoutException(str(err))
00083 
00084         except:
00085             raise SpeechRecognitionException('unknown exception. Traceback: %s' % traceback.format_exc())
00086 
00087         
00088         if res_data['error'] is not None:
00089             if res_data['error'].has_key('faultCode'):
00090                 if res_data['error']['faultCode'] == 'Server.userException':
00091                     raise InvalidResponseException('the format is not supported.')
00092             raise InvalidResponseException('server response error. msg:%s'%res_data['error'])
00093 
00094         return res_data['result']