File size: 4,774 Bytes
65fbe62
 
 
 
 
 
 
 
310df2e
65fbe62
310df2e
65fbe62
 
 
 
 
 
 
 
310df2e
65fbe62
 
310df2e
65fbe62
 
 
 
 
 
 
 
 
 
 
 
 
310df2e
 
65fbe62
 
 
 
 
310df2e
65fbe62
 
 
 
 
 
 
 
 
 
 
 
310df2e
65fbe62
310df2e
 
 
 
 
 
65fbe62
 
 
 
310df2e
 
65fbe62
 
 
 
 
310df2e
 
65fbe62
 
 
310df2e
65fbe62
310df2e
65fbe62
 
 
 
 
 
310df2e
 
65fbe62
 
 
 
310df2e
 
65fbe62
 
 
 
310df2e
7977f22
310df2e
 
65fbe62
 
 
 
310df2e
65fbe62
310df2e
 
65fbe62
 
 
 
 
310df2e
 
65fbe62
 
310df2e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import openai
import os
import gradio as gr
from gtts import gTTS
import tempfile
import re

# ---------------------- TRANSLATION FUNCTION ----------------------
def translate_to_japanese(api_key, text):
    """
    Translates English text to Japanese and provides phonetic pronunciation.
    """
    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}"}
    ]

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

        # --- Pronunciation ---
        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}"}
        ]

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

        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 PRONUNCIATION ----------------------
def clean_pronunciation(pronunciation_text):
    # Remove any extra explanation or surrounding sentences
    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


# ---------------------- AUDIO GENERATION ----------------------
def generate_audio_from_text(text):
    tts = gTTS(text, lang="ja")
    temp_audio_file = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3")
    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)

    # Create result text file
    result_text = f"English Text: {english_text}\n\nJapanese Translation: {translated_text}\nPronunciation: {cleaned_pronunciation}"
    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


# ---------------------- GRADIO APP ----------------------
with gr.Blocks(theme=gr.themes.Soft()) 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()