3v324v23's picture
lfs
1e3b872
raw
history blame
4.46 kB
import os
import requests
import json
from server import PromptServer
from aiohttp import web
from googletrans import Translator, LANGUAGES
### ===== GoogleTranslate Nodes [googletrans module] ===== ###
translator = Translator()
google_translation_key = os.environ.get("GOOGLE_TRANSLATION_API_KEY")
# Manual tranlsate prompts
@PromptServer.instance.routes.post("/alekpet/translate_manual")
async def translate_manual(request):
json_data = await request.json()
prompt = json_data.get("prompt", "")
if "prompt" in json_data and "srcTrans" in json_data and "toTrans" in json_data:
prompt = json_data.get("prompt")
srcTrans = json_data.get("srcTrans")
toTrans = json_data.get("toTrans")
translate_text_prompt = translate(prompt, srcTrans, toTrans)
return web.json_response({"translate_prompt": translate_text_prompt})
return web.json_response({"translate_prompt": prompt})
# Translate used Google API_KEY
class TranslationResult:
def __init__(self, text=""):
self.text = text
def translate_by_key(text, src, dest):
url = f"https://translation.googleapis.com/language/translate/v2?key={google_translation_key}"
data = {"q": text, "target": dest}
resp = requests.post(url, data=data)
resp_data = json.loads(resp.text)
if "translations" in resp_data.get("data", {}):
translations = resp_data["data"]["translations"]
if translations:
translated_text = translations[0]["translatedText"]
return TranslationResult(translated_text)
return TranslationResult("")
def translate(prompt, srcTrans=None, toTrans=None):
if not srcTrans:
srcTrans = "auto"
if not toTrans:
toTrans = "en"
translate_text_prompt = ""
if prompt and prompt.strip() != "":
if not google_translation_key:
translate_text_prompt = translator.translate(
prompt, src=srcTrans, dest=toTrans
)
else:
translate_text_prompt = TranslationResult.translate_by_key(
prompt, src=srcTrans, dest=toTrans
)
return translate_text_prompt.text if hasattr(translate_text_prompt, "text") else ""
class GoogleTranslateCLIPTextEncodeNode:
@classmethod
def INPUT_TYPES(self):
return {
"required": {
"from_translate": (
["auto"] + list(LANGUAGES.keys()),
{"default": "auto"},
),
"to_translate": (list(LANGUAGES.keys()), {"default": "en"}),
"manual_translate": ([True, False],),
"text": ("STRING", {"multiline": True, "placeholder": "Input prompt"}),
"clip": ("CLIP",),
}
}
RETURN_TYPES = (
"CONDITIONING",
"STRING",
)
FUNCTION = "translate_text"
CATEGORY = "AlekPet Nodes/conditioning"
def translate_text(self, **kwargs):
from_translate = kwargs.get("from_translate")
to_translate = kwargs.get("to_translate")
manual_translate = kwargs.get("manual_translate", False)
text = kwargs.get("text")
clip = kwargs.get("clip")
text_tranlsated = (
translate(text, from_translate, to_translate)
if not manual_translate
else text
)
tokens = clip.tokenize(text_tranlsated)
cond, pooled = clip.encode_from_tokens(tokens, return_pooled=True)
return ([[cond, {"pooled_output": pooled}]], text_tranlsated)
class GoogleTranslateTextNode(GoogleTranslateCLIPTextEncodeNode):
@classmethod
def INPUT_TYPES(self):
return_types = super().INPUT_TYPES()
del return_types["required"]["clip"]
return return_types
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("text",)
FUNCTION = "translate_text"
CATEGORY = "AlekPet Nodes/text"
def translate_text(self, **kwargs):
from_translate = kwargs.get("from_translate")
to_translate = kwargs.get("to_translate")
manual_translate = kwargs.get("manual_translate", False)
text = kwargs.get("text")
text_tranlsated = (
translate(text, from_translate, to_translate)
if not manual_translate
else text
)
return (text_tranlsated,)
### ===== GoogleTranslate Nodes [googletrans module] -> end ===== ###