File size: 2,507 Bytes
acf8bfe
1fd0997
129257a
acf8bfe
129257a
fc58506
1fd0997
5dc46ff
 
 
fc58506
acf8bfe
 
 
 
1fd0997
 
 
 
 
 
 
 
 
 
 
 
acf8bfe
1fd0997
 
 
 
acf8bfe
1fd0997
acf8bfe
fc58506
129257a
 
 
 
1fd0997
129257a
 
 
 
fc58506
 
acf8bfe
 
 
129257a
 
 
1fd0997
129257a
 
 
1fd0997
 
 
 
 
acf8bfe
129257a
 
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
from fastapi import FastAPI, HTTPException
from transformers import pipeline
import langdetect
import logging
import os

# Atur direktori cache
os.environ["HF_HOME"] = "/app/cache"
os.environ["TRANSFORMERS_CACHE"] = "/app/cache"

app = FastAPI()

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Daftar model untuk bahasa yang didukung
MODEL_MAP = {
    "id": "Helsinki-NLP/opus-mt-id-en",  # Indonesia ke Inggris
    "th": "Helsinki-NLP/opus-mt-th-en",  # Thailand ke Inggris
    "fr": "Helsinki-NLP/opus-mt-fr-en",  # Prancis ke Inggris
    "es": "Helsinki-NLP/opus-mt-es-en",  # Spanyol ke Inggris
    "ja": "Helsinki-NLP/opus-mt-ja-en",  # Jepang ke Inggris
    "zh": "Helsinki-NLP/opus-mt-zh-en",  # Mandarin ke Inggris
}

# Inisialisasi pipeline untuk setiap model
translators = {}
try:
    for lang, model_name in MODEL_MAP.items():
        logger.info(f"Loading model for {lang}...")
        translators[lang] = pipeline("translation", model=model_name)
        logger.info(f"Model for {lang} loaded successfully")
except Exception as e:
    logger.error(f"Model initialization failed: {str(e)}")
    raise Exception(f"Model initialization failed: {str(e)}")

def detect_language(text: str) -> str:
    """Deteksi bahasa dari teks menggunakan langdetect."""
    try:
        lang = langdetect.detect(text)
        return lang if lang in MODEL_MAP else "en"  # Default ke Inggris jika tidak didukung
    except Exception as e:
        logger.warning(f"Language detection failed: {str(e)}, defaulting to English")
        return "en"

@app.post("/translate")
async def translate(text: str):
    if not text:
        raise HTTPException(status_code=400, detail="Text input is required")
    try:
        # Deteksi bahasa
        source_lang = detect_language(text)
        logger.info(f"Detected source language: {source_lang}")
        # Jika sudah Inggris atau bahasa tidak didukung, kembalikan teks asli
        if source_lang == "en":
            return {"translated_text": text}
        # Terjemahkan ke Inggris
        translator = translators.get(source_lang)
        if not translator:
            raise HTTPException(status_code=400, detail=f"Translation not supported for language: {source_lang}")
        result = translator(text)
        return {"translated_text": result[0]["translation_text"]}
    except Exception as e:
        logger.error(f"Processing failed: {str(e)}")
        raise HTTPException(status_code=500, detail=f"Processing failed: {str(e)}")