Sahana31's picture
translated resume
54062db
import gradio as gr
import logging
import dwani
import os
# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Configure dwani API settings from environment variables
dwani.api_key = os.getenv("DWANI_API_KEY")
dwani.api_base = os.getenv("DWANI_API_BASE_URL")
def translate_to_kannada(text):
"""Translate English text to Kannada using dwani.Translate.run_translate."""
if not text or text.strip() == "":
return ""
try:
resp = dwani.Translate.run_translate(
sentences=text,
src_lang="english",
tgt_lang="kannada"
)
if isinstance(resp, dict):
translated = resp.get("translated_text")
if translated:
return translated.strip()
if "translations" in resp and isinstance(resp["translations"], list):
return " ".join(t.strip() for t in resp["translations"] if isinstance(t, str))
return str(resp).strip()
elif isinstance(resp, str):
return resp.strip()
else:
return str(resp).strip()
except Exception as e:
logger.error(f"Translation error: {e}")
return f"Translation error: {e}"
def process_pdf(pdf_file):
logger.debug("Received inputs - PDF: %s", pdf_file)
if not pdf_file:
logger.error("No PDF file provided")
return None
file_path = pdf_file.name if hasattr(pdf_file, 'name') else pdf_file
pages = {1, 2}
src_lang_code = "eng_Latn"
tgt_lang_code = "kan_Knda"
results = {}
for page_number in pages:
try:
result = dwani.Documents.run_extract(
file_path=file_path,
page_number=page_number,
src_lang=src_lang_code,
tgt_lang=tgt_lang_code
)
page_data = None
for p in result.get('pages', []):
if p.get('processed_page') == page_number:
page_data = p
break
if page_data is None:
results[f"Page {page_number}"] = {"error": "No data returned for this page"}
continue
results[f"Page {page_number}"] = {
"Original Text": page_data.get("page_content", "N/A"),
"Response": ""
}
except dwani.exceptions.DwaniAPIError as e:
logger.error(f"Dhwani API error on page {page_number}: {str(e)}")
results[f"Page {page_number}"] = {"error": f"API error: {str(e)}"}
except Exception as e:
logger.error(f"Unexpected error on page {page_number}: {str(e)}")
results[f"Page {page_number}"] = {"error": f"Unexpected error: {str(e)}"}
contact_en = extract_contact_details(results)
objective_en = extract_objective(results)
education_en = extract_education_details(results)
work_experience_en = extract_workexperience_details(results)
skills_en = extract_skill(results)
certifications_en = extract_certifications(results)
contact_kan = translate_to_kannada(contact_en)
objective_kan = translate_to_kannada(objective_en)
education_kan = translate_to_kannada(education_en)
work_experience_kan = translate_to_kannada(work_experience_en)
skills_kan = translate_to_kannada(skills_en)
certifications_kan = translate_to_kannada(certifications_en)
formatted_resume = format_resume(contact_kan, objective_kan, education_kan, work_experience_kan, skills_kan, certifications_kan)
text_filename = "resume.txt"
with open(text_filename, "w", encoding="utf-8") as f:
f.write(formatted_resume)
return text_filename
def extract_text_from_response(chat_response):
if isinstance(chat_response, dict):
for key in ("text", "response", "content"):
if key in chat_response and isinstance(chat_response[key], str):
return chat_response[key]
return str(chat_response)
elif isinstance(chat_response, str):
return chat_response
else:
return str(chat_response)
def extract_contact_details(extracted_resume):
resume_str = str(extracted_resume)
prompt = resume_str + " return only contact details from the resume "
response = dwani.Chat.direct(prompt=prompt, model="gemma3")
return extract_text_from_response(response)
def extract_objective(extracted_resume):
resume_str = str(extracted_resume)
prompt = resume_str + " return only objective or professional summary from the resume "
response = dwani.Chat.direct(prompt=prompt, model="gemma3")
return extract_text_from_response(response)
def extract_education_details(extracted_resume):
resume_str = str(extracted_resume)
prompt = resume_str + " return only education details from the resume "
response = dwani.Chat.direct(prompt=prompt, model="gemma3")
return extract_text_from_response(response)
def extract_workexperience_details(extracted_resume):
resume_str = str(extracted_resume)
prompt = resume_str + " return only work experience from the resume "
response = dwani.Chat.direct(prompt=prompt, model="gemma3")
return extract_text_from_response(response)
def extract_skill(extracted_resume):
resume_str = str(extracted_resume)
prompt = resume_str + " return only skills from the resume "
response = dwani.Chat.direct(prompt=prompt, model="gemma3")
return extract_text_from_response(response)
def extract_certifications(extracted_resume):
resume_str = str(extracted_resume)
prompt = resume_str + " return only certifications from the resume "
response = dwani.Chat.direct(prompt=prompt, model="gemma3")
return extract_text_from_response(response)
def safe_strip(value):
if isinstance(value, dict):
value = extract_text_from_response(value)
return str(value).strip()
def format_resume(contact, objective, education, work_experience, skills, certifications):
return f"""# Resume (Kannada)
## ಸಂಪರ್ಕ ವಿವರಗಳು (Contact Details)
{safe_strip(contact)}
## ಉದ್ದೇಶ (Objective)
{safe_strip(objective)}
## ಶಿಕ್ಷಣ (Education)
{safe_strip(education)}
## ಕೆಲಸದ ಅನುಭವ (Work Experience)
{safe_strip(work_experience)}
## ಕೌಶಲ್ಯಗಳು (Skills)
{safe_strip(skills)}
## ಪ್ರಮಾಣಪತ್ರಗಳು (Certifications)
{safe_strip(certifications)}
"""
with gr.Blocks(title="Resume Translator with Kannada Translation") as resume_translator:
gr.Markdown("# Resume Upload")
gr.Markdown("Upload a Resume PDF to extract, translate to Kannada, and download.")
with gr.Row():
with gr.Column():
pdf_input = gr.File(label="Upload Resume", file_types=[".pdf"])
submit_btn = gr.Button("Process")
with gr.Column():
text_output = gr.File(label="Download Formatted Resume (.txt)")
submit_btn.click(
fn=process_pdf,
inputs=[pdf_input],
outputs=text_output
)
if __name__ == "__main__":
resume_translator.launch()