diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..ba5b93f Binary files /dev/null and b/.DS_Store differ diff --git a/app/__pycache__/main.cpython-311.pyc b/app/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000..91ec934 Binary files /dev/null and b/app/__pycache__/main.cpython-311.pyc differ diff --git a/app/main.py b/app/main.py index 23b820f..fdce1c9 100644 --- a/app/main.py +++ b/app/main.py @@ -1,31 +1,48 @@ from fastapi import FastAPI, Request, HTTPException from fastapi.responses import HTMLResponse import requests +from pydantic import BaseModel from sklearn.feature_extraction.text import TfidfVectorizer from nltk.tokenize import WordPunctTokenizer # Google Cloud Translation 라이브러리를 가져옵니다. from google.cloud import translate_v2 as translate -app = FastAPI() +import logging # Python의 기본 로깅 모듈을 가져옵니다. -# 구글 클라우드 키 경로 설정하기 -translate_client = translate.Client.from_service_account_json("my-key.json") +# 사용자 정의 로거를 생성합니다. +logger = logging.getLogger(__name__) -@app.post("/generate-images", response_class=HTMLResponse) -async def generate_image(request: Request): - form_data = await request.form() +app = FastAPI() - text = form_data.get("text") +# 구글 클라우드 키 경로 설정하기 +translate_client = translate.Client.from_service_account_json("../my-key.json") - # Translate the input text to English using Google Cloud Translation API. - result = translate_client.translate(text, target_language="en") +class ImageInput(BaseModel): + keyword1: str = None # 사용자가 제공하는 키워드1 (선택사항) + keyword2: str = None # 사용자가 제공하는 키워드2 (선택사항) + keyword3: str = None # 사용자가 제공하는 키워드3 (선택사항) + keyword4: str = None # 사용자가 제공하는 키워드4 (선택사항) + keyword5: str = None # 사용자가 제공하는 키워드5 (선택사항) + text: str # 이미지 생성에 필요한 입력 텍스트 - # Get the translated text. - translated_text = result["input"] +@app.get("/", response_class=HTMLResponse) +def read_root(): + return """ + + +

Click here to go to the Swagger UI and test the generate_image endpoint.

+ + + """ +@app.post("/generate-image") +async def generate_image(input_data: ImageInput): + + # 사용자가 입력한 키워드를 리스트로 만듭니다. + user_keywords_list=[input_data.keyword1,input_data.keyword2,input_data.keyword3,input_data.keyword4,input_data.keyword5] + tokenizer = WordPunctTokenizer() - stop_words = [ ".", ",", @@ -213,48 +230,69 @@ async def generate_image(request: Request): vectorizer = TfidfVectorizer(tokenizer=tokenizer.tokenize, stop_words=stop_words) - tfidf_matrix = vectorizer.fit_transform([translated_text]) + # 입력된 텍스트에 대해 TF-IDF 벡터라이저를 적용합니다. + tfidf_matrix = vectorizer.fit_transform([input_data.text]) + # TF-IDF 벡터라이저에서 feature 이름들을 가져옵니다. feature_names = vectorizer.get_feature_names_out() - # Sort by tf-idf score and get top 5 keywords + # TF-IDF 점수 기준으로 정렬하고 상위 5개의 키워드를 가져옵니다. sorted_keywords_indices = tfidf_matrix.toarray().argsort()[0][::-1][:5] - keywords_prompt = " ".join( - [feature_names[index] for index in sorted_keywords_indices] - ) + top_5_tfidf_keywords=[feature_names[index] for index in sorted_keywords_indices] + + # 사용자가 제공한 키워드와 TF-IDF로 추출된 키워드들을 합칩니다. + final_user_and_tfidf_keywrods=user_keywords_list+top_5_tfidf_keywords[:max(0, 5-len(user_keywords_list))] + + translated_final_keywords=[] + for keyword in final_user_and_tfidf_keywrods: + if keyword is not None: + # Google Cloud Translation API를 사용하여 각 키워드를 영어로 번역합니다. + result_keyword_translate=translate_client.translate(keyword,target_language='en') + translated_final_keywords.append(result_keyword_translate['input']) + + final_translated_user_and_tfidf_keywrods = translated_final_keywords + + keywords_prompt=" ".join(final_translated_user_and_tfidf_keywrods) REST_API_KEY = "9ea943bc1dce2cd5fe7a41bdba661924" - try: + image_urls = [] + for i in range(8): r = requests.post( - "https://api.kakaobrain.com/v2/inference/karlo/t2i", + 'https://api.kakaobrain.com/v2/inference/karlo/t2i', json={ - "prompt": keywords_prompt, + 'prompt': keywords_prompt, }, headers={ - "Authorization": f"KakaoAK {REST_API_KEY}", - "Content-Type": "application/json", - }, + 'Authorization': f'KakaoAK {REST_API_KEY}', + 'Content-Type':'application/json' + } ) - if r.status_code != 200: - raise HTTPException() + if r.status_code == 200: + response_json = r.json() + + image_url = response_json["images"][0]["image"] + + image_urls.append(image_url) - response_json = r.json() - - image_url = response_json["images"][0]["image"] + logger.info(f"Image generation successful for request {i+1}") # 이미지 생성 요청이 성공적으로 완료되었음을 로그로 남깁니다. + else: + logger.warning(f"Image generation failed for request {i+1}") # 이미지 생성 요청이 실패했음을 로그로 남깁니다. + if len(image_urls) == 0: return { - 'isSuccess': True, - 'code': 200, - 'message': '요청에 성공하였습니다.', - 'data': image_url, - } + 'isSuccess': False, + 'code': 400, + 'message': "이미지 생성에 실패하였습니다." + } + + logger.info("Image generation requests completed successfully") # 모든 이미지 생성 요청이 성공적으로 완료되었음을 로그로 남깁니다. - except HTTPException as e: - return { - 'isSuccess': False, - 'code': 400, - 'message': '이미지 생성에 실패하였습니다.' - } \ No newline at end of file + return { + 'isSuccess': True, + 'code': 200, + 'message': "요청에 성공하였습니다.", + 'data': image_urls + } \ No newline at end of file