EJP / app.py
shukdevdattaEX's picture
Update app.py
de5a023 verified
import openai
import os
import gradio as gr
from gtts import gTTS
import tempfile
import re # regular expression
# import requests
### Translation function
def translate_to_japanese(api_key, text): #openai api key
if not api_key:
return "Error: API key is missing.", None
if not text:
return "Error: Input text is empty.", None
openai.api_key = api_key
#### translation
messages_translation = [
{"role": "system", "content": "You are a helpful translator."},
{"role": "user", "content": f"Translate the following English text to Japanese:\n\n{text}"} #prompt template
]
try:
response_translation = openai.ChatCompletion.create(
model="gpt-4o",
messages=messages_translation,
max_tokens=300,
temperature=0.5
)
translated_text=response_translation.choices[0].message['content'].strip()
messages_pronunciation = [
{"role": "system", "content": "You are a helpful assistant who provides only the phonetic pronunciation (Romaji) of Japanese text, in square brackets."},
{"role": "user", "content": f"Provide only the Romaji pronunciation (phonetic) for this Japanese text:\n\n{translated_text}"} #prompt template
]
### pronounciation
response_pronunciation = openai.ChatCompletion.create(
model="gpt-4o",
messages=messages_pronunciation,
max_tokens=150,
temperature=0.5
)
pronunciation=response_pronunciation.choices[0].message['content'].strip() ### the pron of ___ is konichuwa
return translated_text, pronunciation
except openai.error.OpenAIError as e:
return f"OpenAI API error: {str(e)}", None
except Exception as e:
return f"Unexpected error: {str(e)}", None
#### clean pronounciation
def clean_pronunciation(pronunciation_text):
pronunciation_cleaned=re.sub(r"(?i)(the pronunciation.*?is[::]*|\n|\"|\')", "", pronunciation_text).strip()
# Keep only the text inside [ ] if present
match = re.search(r"\[.*?\]", pronunciation_cleaned)
if match:
pronunciation_cleaned = match.group(0)
return pronunciation_cleaned ### the balah blah ignore [dsadasdasd] response: [dsadasdasd]
#### audio generation function
def generate_audio_from_text(text):
tts=gTTS(text, lang="ja")
temp_audio_file=tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") #.wav
tts.save(temp_audio_file.name)
return temp_audio_file.name
# ---------------------- MAIN FUNCTION ----------------------
def process_translation(api_key, english_text):
if not api_key:
return "Missing API Key", "", "", None, None
if not english_text:
return "Please enter English text.", "", "", None, None
translated_text, pronunciation = translate_to_japanese(api_key, english_text)
if not pronunciation:
return translated_text, "", "", None, None
cleaned_pronunciation = clean_pronunciation(pronunciation) ### konichuwa
# Create result text file
result_text = f"English Text: {english_text}\n\nJapanese Translation: {translated_text}\nPronunciation: {cleaned_pronunciation}" ## hello ___ konichuwa
result_file = tempfile.NamedTemporaryFile(delete=False, suffix=".txt")
with open(result_file.name, "w", encoding="utf-8") as f:
f.write(result_text)
# Generate pronunciation audio
audio_path = generate_audio_from_text(cleaned_pronunciation)
return "", translated_text, cleaned_pronunciation, result_file.name, audio_path
### UI design
with gr.Blocks(theme=gr.themes.Ocean()) as app:
gr.Markdown("# πŸ‡―πŸ‡΅ English β†’ Japanese Translator with Pronunciation")
gr.Markdown("Translate English text into **Japanese**, get **Romaji pronunciation**, and listen to it!")
api_key = gr.Textbox(label="πŸ”‘ OpenAI API Key", type="password", placeholder="Enter your OpenAI API key")
english_text = gr.Textbox(label="πŸ“ Enter English Text", lines=4, placeholder="Type something in English...")
translate_button = gr.Button("Translate to Japanese πŸš€")
translation_output = gr.Textbox(label="πŸ“˜ Japanese Translation")
pronunciation_output = gr.Textbox(label="πŸ”€ Pronunciation (Romaji)")
audio_output=gr.Audio(label="πŸ”Š Listen to Pronunciation", type="filepath")
file_output = gr.File(label="⬇️ Download Translation Result")
translate_button.click(
fn=process_translation,
inputs=[api_key, english_text],
outputs=[gr.Label(), translation_output, pronunciation_output, file_output, audio_output]
)
app.launch()