|  | @@ -0,0 +1,156 @@
 | 
	
		
			
				|  |  | +import base64
 | 
	
		
			
				|  |  | +import hashlib
 | 
	
		
			
				|  |  | +import hmac
 | 
	
		
			
				|  |  | +import time
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import requests
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class Credential:
 | 
	
		
			
				|  |  | +    def __init__(self, secret_id, secret_key):
 | 
	
		
			
				|  |  | +        self.secret_id = secret_id
 | 
	
		
			
				|  |  | +        self.secret_key = secret_key
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class FlashRecognitionRequest:
 | 
	
		
			
				|  |  | +    def __init__(self, voice_format="mp3", engine_type="16k_zh"):
 | 
	
		
			
				|  |  | +        self.engine_type = engine_type
 | 
	
		
			
				|  |  | +        self.speaker_diarization = 0
 | 
	
		
			
				|  |  | +        self.hotword_id = ""
 | 
	
		
			
				|  |  | +        self.customization_id = ""
 | 
	
		
			
				|  |  | +        self.filter_dirty = 0
 | 
	
		
			
				|  |  | +        self.filter_modal = 0
 | 
	
		
			
				|  |  | +        self.filter_punc = 0
 | 
	
		
			
				|  |  | +        self.convert_num_mode = 1
 | 
	
		
			
				|  |  | +        self.word_info = 0
 | 
	
		
			
				|  |  | +        self.voice_format = voice_format
 | 
	
		
			
				|  |  | +        self.first_channel_only = 1
 | 
	
		
			
				|  |  | +        self.reinforce_hotword = 0
 | 
	
		
			
				|  |  | +        self.sentence_max_length = 0
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def set_first_channel_only(self, first_channel_only):
 | 
	
		
			
				|  |  | +        self.first_channel_only = first_channel_only
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def set_speaker_diarization(self, speaker_diarization):
 | 
	
		
			
				|  |  | +        self.speaker_diarization = speaker_diarization
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def set_filter_dirty(self, filter_dirty):
 | 
	
		
			
				|  |  | +        self.filter_dirty = filter_dirty
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def set_filter_modal(self, filter_modal):
 | 
	
		
			
				|  |  | +        self.filter_modal = filter_modal
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def set_filter_punc(self, filter_punc):
 | 
	
		
			
				|  |  | +        self.filter_punc = filter_punc
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def set_convert_num_mode(self, convert_num_mode):
 | 
	
		
			
				|  |  | +        self.convert_num_mode = convert_num_mode
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def set_word_info(self, word_info):
 | 
	
		
			
				|  |  | +        self.word_info = word_info
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def set_hotword_id(self, hotword_id):
 | 
	
		
			
				|  |  | +        self.hotword_id = hotword_id
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def set_customization_id(self, customization_id):
 | 
	
		
			
				|  |  | +        self.customization_id = customization_id
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def set_voice_format(self, voice_format):
 | 
	
		
			
				|  |  | +        self.voice_format = voice_format
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def set_sentence_max_length(self, sentence_max_length):
 | 
	
		
			
				|  |  | +        self.sentence_max_length = sentence_max_length
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def set_reinforce_hotword(self, reinforce_hotword):
 | 
	
		
			
				|  |  | +        self.reinforce_hotword = reinforce_hotword
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class FlashRecognizer:
 | 
	
		
			
				|  |  | +    """
 | 
	
		
			
				|  |  | +    reponse:
 | 
	
		
			
				|  |  | +    request_id        string
 | 
	
		
			
				|  |  | +    status            Integer    
 | 
	
		
			
				|  |  | +    message           String    
 | 
	
		
			
				|  |  | +    audio_duration    Integer
 | 
	
		
			
				|  |  | +    flash_result      Result Array
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    Result:
 | 
	
		
			
				|  |  | +    text              String
 | 
	
		
			
				|  |  | +    channel_id        Integer
 | 
	
		
			
				|  |  | +    sentence_list     Sentence Array
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    Sentence:
 | 
	
		
			
				|  |  | +    text              String
 | 
	
		
			
				|  |  | +    start_time        Integer    
 | 
	
		
			
				|  |  | +    end_time          Integer    
 | 
	
		
			
				|  |  | +    speaker_id        Integer    
 | 
	
		
			
				|  |  | +    word_list         Word Array
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    Word:
 | 
	
		
			
				|  |  | +    word              String 
 | 
	
		
			
				|  |  | +    start_time        Integer 
 | 
	
		
			
				|  |  | +    end_time          Integer 
 | 
	
		
			
				|  |  | +    stable_flag:     Integer 
 | 
	
		
			
				|  |  | +    """
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def __init__(self, appid, credential):
 | 
	
		
			
				|  |  | +        self.credential = credential
 | 
	
		
			
				|  |  | +        self.appid = appid
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def _format_sign_string(self, param):
 | 
	
		
			
				|  |  | +        signstr = "POSTasr.cloud.tencent.com/asr/flash/v1/"
 | 
	
		
			
				|  |  | +        for t in param:
 | 
	
		
			
				|  |  | +            if 'appid' in t:
 | 
	
		
			
				|  |  | +                signstr += str(t[1])
 | 
	
		
			
				|  |  | +                break
 | 
	
		
			
				|  |  | +        signstr += "?"
 | 
	
		
			
				|  |  | +        for x in param:
 | 
	
		
			
				|  |  | +            tmp = x
 | 
	
		
			
				|  |  | +            if 'appid' in x:
 | 
	
		
			
				|  |  | +                continue
 | 
	
		
			
				|  |  | +            for t in tmp:
 | 
	
		
			
				|  |  | +                signstr += str(t)
 | 
	
		
			
				|  |  | +                signstr += "="
 | 
	
		
			
				|  |  | +            signstr = signstr[:-1]
 | 
	
		
			
				|  |  | +            signstr += "&"
 | 
	
		
			
				|  |  | +        signstr = signstr[:-1]
 | 
	
		
			
				|  |  | +        return signstr
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def _build_header(self):
 | 
	
		
			
				|  |  | +        header = {"Host": "asr.cloud.tencent.com"}
 | 
	
		
			
				|  |  | +        return header
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def _sign(self, signstr, secret_key):
 | 
	
		
			
				|  |  | +        hmacstr = hmac.new(secret_key.encode('utf-8'),
 | 
	
		
			
				|  |  | +                           signstr.encode('utf-8'), hashlib.sha1).digest()
 | 
	
		
			
				|  |  | +        s = base64.b64encode(hmacstr)
 | 
	
		
			
				|  |  | +        s = s.decode('utf-8')
 | 
	
		
			
				|  |  | +        return s
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def _build_req_with_signature(self, secret_key, params, header):
 | 
	
		
			
				|  |  | +        query = sorted(params.items(), key=lambda d: d[0])
 | 
	
		
			
				|  |  | +        signstr = self._format_sign_string(query)
 | 
	
		
			
				|  |  | +        signature = self._sign(signstr, secret_key)
 | 
	
		
			
				|  |  | +        header["Authorization"] = signature
 | 
	
		
			
				|  |  | +        requrl = "https://"
 | 
	
		
			
				|  |  | +        requrl += signstr[4::]
 | 
	
		
			
				|  |  | +        return requrl
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def _create_query_arr(self, req):
 | 
	
		
			
				|  |  | +        return {
 | 
	
		
			
				|  |  | +            'appid': self.appid, 'secretid': self.credential.secret_id, 'timestamp': str(int(time.time())),
 | 
	
		
			
				|  |  | +             'engine_type': req.engine_type, 'voice_format': req.voice_format,
 | 
	
		
			
				|  |  | +             'speaker_diarization': req.speaker_diarization, 'hotword_id': req.hotword_id,
 | 
	
		
			
				|  |  | +             'customization_id': req.customization_id, 'filter_dirty': req.filter_dirty,
 | 
	
		
			
				|  |  | +             'filter_modal': req.filter_modal, 'filter_punc': req.filter_punc,
 | 
	
		
			
				|  |  | +             'convert_num_mode': req.convert_num_mode, 'word_info': req.word_info,
 | 
	
		
			
				|  |  | +             'first_channel_only': req.first_channel_only, 'reinforce_hotword': req.reinforce_hotword,
 | 
	
		
			
				|  |  | +             'sentence_max_length': req.sentence_max_length
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def recognize(self, req, data):
 | 
	
		
			
				|  |  | +        header = self._build_header()
 | 
	
		
			
				|  |  | +        query_arr = self._create_query_arr(req)
 | 
	
		
			
				|  |  | +        req_url = self._build_req_with_signature(self.credential.secret_key, query_arr, header)
 | 
	
		
			
				|  |  | +        r = requests.post(req_url, headers=header, data=data)
 | 
	
		
			
				|  |  | +        return r.text
 |