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()