File size: 3,143 Bytes
c9f9492
7fda6bb
c9f9492
b329ae9
f687683
04952fd
d1f4a59
c9f9492
b329ae9
04952fd
 
f687683
 
 
 
 
 
d1f4a59
f687683
04952fd
d1f4a59
 
f687683
 
 
 
 
c9f9492
abc6394
 
 
8ed001f
04952fd
f687683
 
 
b329ae9
04952fd
8ed001f
c9f9492
 
04952fd
c9f9492
 
 
 
b329ae9
04952fd
 
 
 
 
 
 
 
 
 
 
142394e
04952fd
 
 
 
 
 
 
 
974d749
c9f9492
 
f8b7d96
7fda6bb
fab2e99
 
c9f9492
 
95488d7
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
import display_gloss as dg
import synonyms_preprocess as sp
from NLP_Spacy_base_translator import NlpSpacyBaseTranslator 
from flask import Flask, render_template, Response, request
from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqGeneration
import torch
import os

app = Flask(__name__)
app.config['TITLE'] = 'ASL Translator'

# 캐시 디렉토리 설정
cache_dir = "/tmp/huggingface"
if not os.path.exists(cache_dir):
    os.makedirs(cache_dir, exist_ok=True)
os.environ['TRANSFORMERS_CACHE'] = cache_dir
os.environ['HF_HOME'] = cache_dir

# CPU 설정
device = torch.device('cpu')
os.environ['CUDA_VISIBLE_DEVICES'] = ''

# 번역 모델 초기화
model_name = "Helsinki-NLP/opus-mt-ko-en"
tokenizer = AutoTokenizer.from_pretrained(model_name, cache_dir=cache_dir)
model = AutoModelForSeq2SeqGeneration.from_pretrained(model_name, cache_dir=cache_dir)
model = model.to(device)

nlp, dict_docs_spacy = sp.load_spacy_values()
dataset, list_2000_tokens = dg.load_data()

def translate_korean_to_english(text):
    if any('\u3131' <= char <= '\u318F' or '\uAC00' <= char <= '\uD7A3' for char in text):
        inputs = tokenizer(text, return_tensors="pt", padding=True)
        outputs = model.generate(**inputs)
        translation = tokenizer.decode(outputs[0], skip_special_tokens=True)
        return translation
    return text

@app.route('/')
def index():
    return render_template('index.html', title=app.config['TITLE'])

@app.route('/translate/', methods=['POST'])
def result():
    if request.method == 'POST':
        input_text = request.form['inputSentence']
        try:
            english_text = translate_korean_to_english(input_text)
            eng_to_asl_translator = NlpSpacyBaseTranslator(sentence=english_text)
            generated_gloss = eng_to_asl_translator.translate_to_gloss()
            
            gloss_list_lower = [gloss.lower() for gloss in generated_gloss.split() if gloss.isalnum()]
            gloss_sentence_before_synonym = " ".join(gloss_list_lower)
            
            gloss_list = [sp.find_synonyms(gloss, nlp, dict_docs_spacy, list_2000_tokens) 
                         for gloss in gloss_list_lower]
            gloss_sentence_after_synonym = " ".join(gloss_list)
            
            return render_template('result.html',
                                title=app.config['TITLE'],
                                original_sentence=input_text,
                                english_translation=english_text,
                                gloss_sentence_before_synonym=gloss_sentence_before_synonym,
                                gloss_sentence_after_synonym=gloss_sentence_after_synonym)
        except Exception as e:
            return render_template('error.html', error=str(e))

@app.route('/video_feed')
def video_feed():
    sentence = request.args.get('gloss_sentence_to_display', '')
    gloss_list = sentence.split()
    return Response(dg.generate_video(gloss_list, dataset, list_2000_tokens), 
                   mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=7860, debug=True)