import os import re import json import time import requests import anthropic import google.auth import gradio as gr from uuid import uuid4 from dotenv import load_dotenv from google.auth.transport.requests import Request # Gemini def get_google_token(): credentials, project = google.auth.load_credentials_from_dict( json.loads(os.environ.get('GCP_FINETUNE_KEY')), scopes=[ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/generative-language.tuning", ], ) request = Request() credentials.refresh(request) access_token = credentials.token return access_token def dubpro_english_to_hindi(text): API_URL = os.environ.get("GEMINI_FINETUNED_ENG_HINDI_API") BEARER_TOKEN = get_google_token() headers = { "Authorization": f"Bearer {BEARER_TOKEN}", "Content-Type": "application/json", } payload = { "contents": [ { "parts": [{"text": f"text: {text}"}], "role": "user", } ], "generationConfig": { "maxOutputTokens": 8192, "temperature": 0.85, }, "safetySettings": [ {"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE"}, {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"}, {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"}, {"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE"}, ], } result = requests.post( url=API_URL, headers=headers, json=payload ) response = result.json() response_content = response['candidates'][0]['content']['parts'][0]['text'].replace("translated:", "").strip() return response_content def gemini_english_to_hindi(text): API_URL = os.environ.get("GEMINI_FINETUNED_ENG_HINDI_API") BEARER_TOKEN = get_google_token() headers = { "Authorization": f"Bearer {BEARER_TOKEN}", "Content-Type": "application/json", } payload = { "contents": [ { "parts": [{"text": f"Translate the following text to Hindi: `{text}` Output: "}], "role": "user", } ], "generationConfig": { "maxOutputTokens": 8192, "temperature": 0.85, }, "safetySettings": [ {"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE"}, {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"}, {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"}, {"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE"}, ], } result = requests.post( url=API_URL, headers=headers, json=payload ) response = result.json() response_content = response['candidates'][0]['content']['parts'][0]['text'].replace("translated:", "").replace("`", "").strip() return response_content # GPT models def clean(result): text = result["choices"][0]['message']["content"] text = re.sub(r"\(.*?\)|\[.*?\]","", text) text = text.strip("'").replace('"', "") if "\n" in text.strip("\n"): text = text.split("\n")[-1] return text def openai_english_to_hindi(text, model): prompt = f"Translate the following English text into Hindi such that the meaning in unchanged. Return only the translated text: `{text}`. Output: " headers = { "Content-Type": "application/json", "Authorization": f"Bearer {os.environ.get('OPENAI_API_KEY')}" } messages = [ {"role": "system", "content": f"You are a language translation assistant."}, {"role": "user", "content": prompt} ] resp = None while resp is None: resp = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json={ "model": model, "messages": messages }) if resp.status_code != 200: print(resp.text) time.sleep(0.5) response_json = resp.json() result_text = clean(response_json) return result_text # Azure translate def azure_english_to_hindi(text): headers = { "Ocp-Apim-Subscription-Key": os.environ.get("AZURE_TRANSLATE_KEY"), "Ocp-Apim-Subscription-Region": os.environ.get("AZURE_TRANSLATE_REGION"), "Content-type": "application/json", "X-ClientTraceId": str(uuid4()), } ENDPOINT = "https://api.cognitive.microsofttranslator.com/translate" params = { "api-version": "3.0", "from": "en-US", "to": "hi-IN", } texts = [{"text": text}] request = requests.post(ENDPOINT, headers=headers, params=params, json=texts) response = request.json() return response[0]["translations"][0]["text"] # Anthopic Claude 3 Haiku def claude_english_to_hindi(text): client = anthropic.Anthropic() message = client.messages.create( model="claude-3-haiku-20240307", max_tokens=1000, temperature=0.8, system="You are an expert language translator.", messages=[ { "role": "user", "content": [ { "type": "text", "text": f"Translate the following English text into Hindi such that the meaning in unchanged. Return only the translated text: `{text}`. Output: " } ] } ] ) return message.content[0].text def render_translations(text): dubpro = dubpro_english_to_hindi(text) azure = azure_english_to_hindi(text) # gemini = gemini_english_to_hindi(text) gpt_4 = openai_english_to_hindi(text, model="gpt-4") # claude_haiku = claude_english_to_hindi(text) return gr.update(value=gpt_4), gr.update(value=dubpro), gr.update(value=azure) with gr.Blocks(title="English to Hindi Translation Tools", theme="gradio/monochrome") as demo: gr.Markdown("# English to Hindi Translation for Dubbing") input_textbox = gr.Textbox(label="Input Text", info="Text to translate", value="When you did it, you must have attended your classes well or you must have done your daily revision. Now you feel scared.") submit = gr.Button(label="Submit") with gr.Row(): gr.Label(value="Dubpro's Model", scale=1) dubpro_model_textbox = gr.Textbox(label="Translated Text", scale=2, interactive=False) with gr.Row(): gr.Label(value="GPT 4", scale=1) gpt_4_textbox = gr.Textbox(label="Translated Text", scale=2, interactive=False) # with gr.Row(): # gr.Label(value="Google Gemini", scale=1) # google_textbox = gr.Textbox(label="Translated Text", scale=2, interactive=False) # with gr.Row(): # gr.Label(value="Anthropic Claude 3", scale=1) # claude_textbox = gr.Textbox(label="Translated Text", scale=2, interactive=False) with gr.Row(): gr.Label(value="Azure Translate", scale=1) azure_textbox = gr.Textbox(label="Translated Text", scale=2, interactive=False) submit.click(render_translations, input_textbox, [gpt_4_textbox, dubpro_model_textbox, azure_textbox]) if __name__=="__main__": demo.launch(auth=(os.environ["USERNAME"], os.environ["PASSWORD"]))