Spaces:
Runtime error
Runtime error
File size: 4,625 Bytes
acf8bfe 1fd0997 129257a acf8bfe 129257a fc58506 e8b7c49 5dc46ff fc58506 acf8bfe e8b7c49 acf8bfe e8b7c49 1fd0997 a371d81 e8b7c49 a371d81 1fd0997 acf8bfe e8b7c49 1fd0997 e8b7c49 1fd0997 e8b7c49 acf8bfe e8b7c49 1fd0997 e8b7c49 acf8bfe fc58506 e8b7c49 129257a e8b7c49 129257a e8b7c49 129257a e8b7c49 fc58506 e8b7c49 acf8bfe e8b7c49 acf8bfe e8b7c49 129257a e8b7c49 129257a e8b7c49 129257a e8b7c49 1fd0997 e8b7c49 1fd0997 e8b7c49 a371d81 e8b7c49 acf8bfe e8b7c49 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 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 |
from fastapi import FastAPI, HTTPException
from transformers import pipeline
import langdetect
import logging
import os
# Set environment variables for Hugging Face cache
# Ini penting agar model di-cache di lokasi yang benar di dalam container Hugging Face Space
os.environ["HF_HOME"] = "/app/cache"
os.environ["TRANSFORMERS_CACHE"] = "/app/cache"
app = FastAPI()
# Konfigurasi logging untuk melihat pesan debug di log Space kamu
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Peta model untuk setiap bahasa yang didukung
MODEL_MAP = {
"id": "Helsinki-NLP/opus-mt-id-en",
"th": "Helsinki-NLP/opus-mt-th-en",
"fr": "Helsinki-NLP/opus-mt-fr-en",
"es": "Helsinki-NLP/opus-mt-es-en",
"ja": "Helsinki-NLP/opus-mt-ja-en",
# Entri tunggal untuk Mandarin, kita akan normalisasi deteksi bahasanya
"zh": "Helsinki-NLP/opus-mt-zh-en",
"vi": "Helsinki-NLP/opus-mt-vi-en",
}
translators = {}
try:
# Inisialisasi semua model saat aplikasi dimulai
for lang, model_name in MODEL_MAP.items():
logger.info(f"Loading model for {lang} from {model_name}...")
# Pastikan kita menggunakan device="cpu" atau "cuda" jika GPU tersedia
# Untuk Hugging Face Space gratis biasanya CPU, jadi lebih aman tidak specify device
translators[lang] = pipeline("translation", model=model_name)
logger.info(f"Model for {lang} loaded successfully.")
except Exception as e:
# Tangani kegagalan inisialisasi model
logger.error(f"Model initialization failed: {str(e)}")
# Hentikan aplikasi jika model gagal dimuat, karena aplikasi tidak akan berfungsi
raise Exception(f"Model initialization failed: {str(e)}")
---
## Fungsi Deteksi Bahasa yang Ditingkatkan
Ini adalah bagian kunci perbaikannya. Kita akan **normalisasi kode bahasa Mandarin** yang mungkin dideteksi oleh `langdetect`.
```python
def detect_language(text: str) -> str:
try:
detected_lang = langdetect.detect(text)
logger.info(f"langdetect detected: '{detected_lang}' for text: '{text[:50]}...'") # Log deteksi awal
# Normalisasi untuk bahasa Mandarin:
# Jika langdetect mengembalikan 'zh-cn', 'zh-tw', 'zh-hk', dll.,
# kita paksa menjadi 'zh' agar sesuai dengan kunci di MODEL_MAP.
if detected_lang.startswith('zh'):
return 'zh'
# Jika bahasa terdeteksi ada di MODEL_MAP, gunakan itu.
# Jika tidak, default ke 'en' (bahasa Inggris).
return detected_lang if detected_lang in MODEL_MAP else "en"
except Exception as e:
logger.warning(f"Language detection failed for text: '{text[:50]}...' Error: {str(e)}. Defaulting to English.")
return "en"
---
## Endpoint API untuk Terjemahan
```python
@app.post("/translate")
async def translate(text: str):
"""
Menerima teks dan mengembalikannya dalam bahasa Inggris.
Secara otomatis mendeteksi bahasa sumber.
"""
if not text:
raise HTTPException(status_code=400, detail="Text input is required.")
try:
# Deteksi bahasa sumber dari teks
source_lang = detect_language(text)
logger.info(f"Determined source language: '{source_lang}' for translation.")
# Jika bahasa sumber sudah Bahasa Inggris, kembalikan teks aslinya
if source_lang == "en":
logger.info("Source language is English, returning original text.")
return {"translated_text": text}
# Dapatkan translator yang sesuai dari kamus translators
translator = translators.get(source_lang)
# Jika tidak ada translator yang mendukung bahasa yang terdeteksi
if not translator:
logger.error(f"No translator found for language: '{source_lang}'.")
raise HTTPException(
status_code=400,
detail=f"Translation not supported for language: {source_lang}."
)
# Lakukan terjemahan
logger.info(f"Translating from {source_lang}...")
result = translator(text)
translated_text = result[0]["translation_text"]
logger.info(f"Translation successful. Original: '{text[:50]}...', Translated: '{translated_text[:50]}...'")
return {"translated_text": translated_text}
except HTTPException as e:
# Tangani HTTPExceptions yang sudah kita definisikan sebelumnya
raise e
except Exception as e:
# Tangani error tak terduga lainnya
logger.error(f"An unexpected error occurred during processing: {str(e)}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Processing failed: {str(e)}") |