# Import FastAPI Libs from pydantic import BaseModel # Import Other Common Libs import json import base64 import os import requests # ------------------------------------------------ # Define constants # ------------------------------------------------ c_ret_code_success = 0 c_ret_code_error = 1 credential_file = '/home/oracle/python/apex/credential/credential.json' # env = 'aliyun_ecs' env = 'ctyun_ecs' # ------------------------------------------------ # Define OCR Request Service Request and Response # ------------------------------------------------ class asr_req_basemodel(BaseModel): asr_tool: str # W: Whisper model: str audio_b64_string: str initial_prompt: str class asr_res_basemodel(BaseModel): result: int result_message: str detected_text: str # ------------------------------------------------ # Get credentials # ------------------------------------------------ def get_credentials(file: str, env: str) -> tuple: try: # Open and read the JSON file with open(file, "r") as credential_file: data = json.load(credential_file) # Access data from the JSON base_url = data['whisper'][env]['base_url'] client_id = data['whisper'][env]['client_id'] client_secret = data['whisper'][env]['client_secret'] return base_url, client_id, client_secret except Exception as e: print(e) return None, None, None # ------------------------------------------------ # Function of ASR request to Whisper ASR # ------------------------------------------------ def get_detected_text(asr_req: asr_req_basemodel) -> tuple: # print(asr_req) ret_code = c_ret_code_success err_msg = "" # ------------------------------------------------ # Get URL and credential # ------------------------------------------------ base_url, client_id, client_secret = get_credentials(credential_file, env); if base_url == None or client_id == None or client_secret == None: ret_code = c_ret_code_error err_msg = "Failed to get credential from file [" + credential_file + "] and env [" + env + "]" asr_res = asr_res_basemodel( result = ret_code, result_message = err_msg, detected_text = "" ) return asr_res # ------------------------------------------------ # Get Token # ------------------------------------------------ url = base_url + "/token" access_token = "" headers = { "Authorization": "Bearer " + access_token, "Content-type": "application/x-www-form-urlencoded" } req_body = "grant_type=&username={0}&password={1}".format(client_id, client_secret) try: response = requests.post( url = url, headers = headers, data = req_body, verify = False) response.raise_for_status response_dict = response.json() # print(response.text) access_token = response_dict["access_token"] # print(access_token) except requests.exceptions.HTTPError as httpError: print("httpError") print(httpError) ret_code = c_ret_code_error err_msg = "HTTP Error: Failed to get access token: " + str(httpError) asr_res = asr_res_basemodel( result = ret_code, result_message = err_msg, detected_text = "" ) return asr_res except Exception as err: print("err") print(err) ret_code = c_ret_code_error err_msg = "Unexpected Error: Failed to get access token: " + str(err) asr_res = asr_res_basemodel( result = ret_code, result_message = err_msg, detected_text = "" ) return asr_res # ------------------------------------------------ # Get Detected Text # ------------------------------------------------ url = base_url + "/whisper/read-audio" headers = { "accept": "application/json", "Authorization": "Bearer " + access_token, "Content-Type": "application/json" } data = { "model": asr_req.model, "audio_b64_string": asr_req.audio_b64_string, "initial_prompt": asr_req.initial_prompt } json_data = json.dumps(data) try: response = requests.post( url = url, headers = headers, data = json_data, verify = False) response.raise_for_status response_dict = response.json() asr_res = asr_res_basemodel( result = ret_code, result_message = err_msg, detected_text = response_dict["text"] ) return asr_res except requests.exceptions.HTTPError as httpError: ret_code = c_ret_code_error err_msg = "HTTP Error: Failed to get detected text: " + str(httpError) asr_res = asr_res_basemodel( result = ret_code, result_message = err_msg, detected_text = "" ) return asr_res except Exception as err: ret_code = c_ret_code_error if (response.text): err_msg = "Unexpected Error: Failed to get detected text: " + str(err) + ", " + response.text else: err_msg = "Unexpected Error: Failed to get detected text: " + str(err) asr_res = asr_res_basemodel( result = ret_code, result_message = err_msg, detected_text = "" ) return asr_res