From ceb3267821246928a526148f0ff70bf2386a2d86 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Thu, 11 Apr 2024 23:36:04 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=8D=EF=B8=8F[Update]=20Model=20:=20Ove?= =?UTF-8?q?rlay=E3=81=AEUI=E3=81=ABsakura=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 12 ++ img/overlay_br_sakura.png | Bin 0 -> 9079 bytes img/overlay_tl_sakura.png | Bin 0 -> 9658 bytes model.py | 3 +- models/overlay/overlay.py | 2 +- models/overlay/overlay_image.py | 294 +++++++++++++++++++------------- requirements.txt | 1 + 7 files changed, 190 insertions(+), 122 deletions(-) create mode 100644 img/overlay_br_sakura.png create mode 100644 img/overlay_tl_sakura.png diff --git a/config.py b/config.py index 931c4df6..e15ef9f0 100644 --- a/config.py +++ b/config.py @@ -727,6 +727,17 @@ class Config: self._ENABLE_NOTICE_OVERLAY = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + @property + @json_serializable('OVERLAY_UI_TYPE') + def OVERLAY_UI_TYPE(self): + return self._OVERLAY_UI_TYPE + + @OVERLAY_UI_TYPE.setter + def OVERLAY_UI_TYPE(self, value): + if isinstance(value, str): + self._OVERLAY_UI_TYPE = value + saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + @property @json_serializable('ENABLE_SEND_MESSAGE_TO_VRC') def ENABLE_SEND_MESSAGE_TO_VRC(self): @@ -991,6 +1002,7 @@ class Config: self._SEND_MESSAGE_BUTTON_TYPE = "show" self._ENABLE_NOTICE_XSOVERLAY = False self._ENABLE_NOTICE_OVERLAY = False + self._OVERLAY_UI_TYPE = "default" self._ENABLE_SEND_MESSAGE_TO_VRC = True self._ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = False # Speaker2Chatbox self._ENABLE_SPEAKER2CHATBOX_PASS = "000000000" diff --git a/img/overlay_br_sakura.png b/img/overlay_br_sakura.png new file mode 100644 index 0000000000000000000000000000000000000000..61e8ccd79c5453816defc5b67081a6cde174ddaf GIT binary patch literal 9079 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 literal 0 HcmV?d00001 diff --git a/img/overlay_tl_sakura.png b/img/overlay_tl_sakura.png new file mode 100644 index 0000000000000000000000000000000000000000..d6211f419c4fb5aacae81966e1810d67b7a290bd GIT binary patch literal 9658 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 character_line_num: + # text = "\n".join([text[i:i+character_line_num] for i in range(0, len(text), character_line_num)]) + + # n_num = len(text.split("\n")) - 1 + # text_height = int(font_size*(n_num+2)) + + # img = Image.new("RGBA", (self.WIDTH, text_height), (0, 0, 0, 0)) + # draw = ImageDraw.Draw(img) + + # text_y = text_height // 2 + + # draw.multiline_text((text_x, text_y), text, text_color, anchor=anchor, stroke_width=0, font=font, align=align) + # return img + + # def create_textimage_message_type(self, message_type): + # anchor = "lm" if message_type == "receive" else "rm" + # text = "Receive" if message_type == "receive" else "Send" + # text_color = self.TEXT_COLOR_RECEIVE if message_type == "receive" else self.TEXT_COLOR_SEND + # text_color_time = self.TEXT_COLOR_TIME + + # now = datetime.now() + # formatted_time = now.strftime("%H:%M") + # font_size = self.FONT_SIZE_SMALL + # img = Image.new("RGBA", (0, 0), (0, 0, 0, 0)) + # draw = ImageDraw.Draw(img) + # font = ImageFont.truetype(os_path.join(os_path.dirname(__file__), "fonts", "NotoSansJP-Regular.ttf"), font_size) + # # font = ImageFont.truetype(os_path.join("./fonts", "NotoSansJP-Regular.ttf"), font_size) + # text_height = font_size*2 + # text_width = draw.textlength(formatted_time, font) + # character_width = text_width // len(formatted_time) + # img = Image.new("RGBA", (self.WIDTH, text_height), (0, 0, 0, 0)) + # draw = ImageDraw.Draw(img) + # text_y = text_height // 2 + # text_time_x = 0 if message_type == "receive" else self.WIDTH - (text_width + character_width) + # text_x = (text_width + character_width) if message_type == "receive" else self.WIDTH + + # draw.text((text_time_x, text_y), formatted_time, text_color_time, anchor=anchor, stroke_width=0, font=font) + # draw.text((text_x, text_y), text, text_color, anchor=anchor, stroke_width=0, font=font) + # return img + + # def create_textbox(self, message_type, message, your_language, translation, target_language): + # message_type_img = self.create_textimage_message_type(message_type) + # if len(translation) > 0 and target_language is not None: + # img = self.create_textimage(message_type, "small", message, your_language) + # translation_img = self.create_textimage(message_type, "large",translation, target_language) + # img = self.concatenate_images_vertically(img, translation_img) + # else: + # img = self.create_textimage(message_type, "large", message, your_language) + # return self.concatenate_images_vertically(message_type_img, img) + + # def create_overlay_image_long(self, message_type, message, your_language, translation="", target_language=None): + # if len(self.log_data) > 10: + # self.log_data.pop(0) + + # self.log_data.append( + # { + # "message_type":message_type, + # "message":message, + # "your_language":your_language, + # "translation":translation, + # "target_language":target_language, + # } + # ) + + # imgs = [] + # for log in self.log_data: + # message_type = log["message_type"] + # message = log["message"] + # your_language = log["your_language"] + # translation = log["translation"] + # target_language = log["target_language"] + # img = self.create_textbox(message_type, message, your_language, translation, target_language) + # imgs.append(img) + + # img = imgs[0] + # for i in imgs[1:]: + # img = self.concatenate_images_vertically(img, i) + # img = self.add_image_margin(img, 0, 20, 0, 20, (0, 0, 0, 0)) + + # width, height = img.size + # background = Image.new("RGBA", (width, height), (0, 0, 0, 0)) + # draw = ImageDraw.Draw(background) + # draw.rounded_rectangle([(0, 0), (width, height)], radius=15, fill=self.BACKGROUND_COLOR, outline=self.BACKGROUND_OUTLINE_COLOR, width=5) + # img = Image.alpha_composite(background, img) + # return img + + def get_ui_size(self): + return { + "width": 960, + "height": 23, + "font_size": 23, + } + + def get_ui_colors(self, ui_type): + match ui_type: + case "default": + background_color = (41, 42, 45, 127) + background_outline_color = (41, 42, 45, 127) + text_color = (223, 223, 223) + case "sakura": + background_color = (225, 40, 30, 20) + background_outline_color = (255, 255, 255, 50) + text_color = (223, 223, 223) + return { + "background_color": background_color, + "background_outline_color": background_outline_color, + "text_color": text_color + } + + def create_decoration_image(self, ui_type, image_size): + decoration_image = Image.new("RGBA", image_size, (0, 0, 0, 0)) + match ui_type: + case "default": + pass + case "sakura": + overlay_tl = Image.open(os_path.join(os_path.dirname(__file__), "img", "overlay_tl_sakura.png")) + overlay_br = Image.open(os_path.join(os_path.dirname(__file__), "img", "overlay_br_sakura.png")) + alpha = overlay_tl.getchannel("A") + alpha = alpha.point(lambda x: x * 0.1) + overlay_tl.putalpha(alpha) + alpha = overlay_br.getchannel("A") + alpha = alpha.point(lambda x: x * 0.1) + overlay_br.putalpha(alpha) + decoration_image.paste(overlay_tl, (7, 7)) + decoration_image.paste(overlay_br, (image_size[0]-overlay_br.size[0]-7, image_size[1]-overlay_br.size[1]-7)) + return decoration_image + + def create_textbox_short(self, text, language, text_color, base_width, base_height, font_size): font_family = self.LANGUAGES.get(language, "NotoSansJP-Regular") - img = Image.new("RGBA", (0, 0), (0, 0, 0, 0)) + img = Image.new("RGBA", (base_width, base_height), (0, 0, 0, 0)) draw = ImageDraw.Draw(img) font = ImageFont.truetype(os_path.join(os_path.dirname(__file__), "fonts", f"{font_family}.ttf"), font_size) - # font = ImageFont.truetype(os_path.join("./fonts", f"{font_family}.ttf"), font_size) text_width = draw.textlength(text, font) character_width = text_width // len(text) - character_line_num = int(self.WIDTH // character_width) + character_line_num = int((base_width) // character_width) - 12 if len(text) > character_line_num: text = "\n".join([text[i:i+character_line_num] for i in range(0, len(text), character_line_num)]) - - n_num = len(text.split("\n")) - 1 - text_height = int(font_size*(n_num+2)) - - img = Image.new("RGBA", (self.WIDTH, text_height), (0, 0, 0, 0)) + text_height = font_size * (len(text.split("\n")) + 1) + 20 + img = Image.new("RGBA", (base_width, text_height), (0, 0, 0, 0)) draw = ImageDraw.Draw(img) + text_x = base_width // 2 text_y = text_height // 2 - - draw.multiline_text((text_x, text_y), text, text_color, anchor=anchor, stroke_width=0, font=font, align=align) + draw.text((text_x, text_y), text, text_color, anchor="mm", stroke_width=0, font=font, align="center") return img - def create_textimage_message_type(self, message_type): - anchor = "lm" if message_type == "receive" else "rm" - text = "Receive" if message_type == "receive" else "Send" - text_color = self.TEXT_COLOR_RECEIVE if message_type == "receive" else self.TEXT_COLOR_SEND - text_color_time = self.TEXT_COLOR_TIME + def create_overlay_image_short(self, message, your_language, translation="", target_language=None, ui_type="default"): + ui_size = self.get_ui_size() + height = ui_size["height"] + width = ui_size["width"] + font_size = ui_size["font_size"] - now = datetime.now() - formatted_time = now.strftime("%H:%M") - font_size = self.FONT_SIZE_SMALL - img = Image.new("RGBA", (0, 0), (0, 0, 0, 0)) - draw = ImageDraw.Draw(img) - font = ImageFont.truetype(os_path.join(os_path.dirname(__file__), "fonts", "NotoSansJP-Regular.ttf"), font_size) - # font = ImageFont.truetype(os_path.join("./fonts", "NotoSansJP-Regular.ttf"), font_size) - text_height = font_size*2 - text_width = draw.textlength(formatted_time, font) - character_width = text_width // len(formatted_time) - img = Image.new("RGBA", (self.WIDTH, text_height), (0, 0, 0, 0)) - draw = ImageDraw.Draw(img) - text_y = text_height // 2 - text_time_x = 0 if message_type == "receive" else self.WIDTH - (text_width + character_width) - text_x = (text_width + character_width) if message_type == "receive" else self.WIDTH + ui_colors = self.get_ui_colors(ui_type) + text_color = ui_colors["text_color"] + background_color = ui_colors["background_color"] + background_outline_color = ui_colors["background_outline_color"] - draw.text((text_time_x, text_y), formatted_time, text_color_time, anchor=anchor, stroke_width=0, font=font) - draw.text((text_x, text_y), text, text_color, anchor=anchor, stroke_width=0, font=font) - return img - - def create_textbox(self, message_type, message, your_language, translation, target_language): - message_type_img = self.create_textimage_message_type(message_type) + img = self.create_textbox_short(message, your_language, text_color, width, height, font_size) if len(translation) > 0 and target_language is not None: - img = self.create_textimage(message_type, "small", message, your_language) - translation_img = self.create_textimage(message_type, "large",translation, target_language) - img = self.concatenate_images_vertically(img, translation_img) - else: - img = self.create_textimage(message_type, "large", message, your_language) - return self.concatenate_images_vertically(message_type_img, img) - - def create_overlay_image_long(self, message_type, message, your_language, translation="", target_language=None): - if len(self.log_data) > 10: - self.log_data.pop(0) - - self.log_data.append( - { - "message_type":message_type, - "message":message, - "your_language":your_language, - "translation":translation, - "target_language":target_language, - } - ) - - imgs = [] - for log in self.log_data: - message_type = log["message_type"] - message = log["message"] - your_language = log["your_language"] - translation = log["translation"] - target_language = log["target_language"] - img = self.create_textbox(message_type, message, your_language, translation, target_language) - imgs.append(img) - - img = imgs[0] - for i in imgs[1:]: - img = self.concatenate_images_vertically(img, i) - img = self.add_image_margin(img, 0, 20, 0, 20, (0, 0, 0, 0)) - - width, height = img.size - background = Image.new("RGBA", (width, height), (0, 0, 0, 0)) - draw = ImageDraw.Draw(background) - draw.rounded_rectangle([(0, 0), (width, height)], radius=15, fill=self.BACKGROUND_COLOR, outline=self.BACKGROUND_COLOR, width=5) - img = Image.alpha_composite(background, img) - return img - - def create_overlay_image_short(self, message, your_language, translation="", target_language=None): - def create_textbox(text, language): - font_family = self.LANGUAGES.get(language, "NotoSansJP-Regular") - img = Image.new("RGBA", (self.WIDTH, self.HEIGHT), (0, 0, 0, 0)) - draw = ImageDraw.Draw(img) - font = ImageFont.truetype(os_path.join(os_path.dirname(__file__), "fonts", f"{font_family}.ttf"), self.FONT_SIZE_LARGE) - text_width = draw.textlength(text, font) - character_width = text_width // len(text) - character_line_num = int((self.WIDTH - 40) // character_width) - if len(text) > character_line_num: - text = "\n".join([text[i:i+character_line_num] for i in range(0, len(text), character_line_num)]) - text_height = self.FONT_SIZE_LARGE * (len(text.split("\n")) + 1) + 20 - img = Image.new("RGBA", (self.WIDTH, text_height), (0, 0, 0, 0)) - draw = ImageDraw.Draw(img) - - text_x = self.WIDTH // 2 - text_y = text_height // 2 - draw.text((text_x, text_y), text, self.TEXT_COLOR_LARGE, anchor="mm", stroke_width=0, font=font, align="center") - return img - - img = create_textbox(message, your_language) - if len(translation) > 0 and target_language is not None: - translation_img = create_textbox(translation, target_language) + translation_img = self.create_textbox_short(translation, target_language, text_color, width, height, font_size) img = self.concatenate_images_vertically(img, translation_img) - width, height = img.size - background = Image.new("RGBA", (width, height), (0, 0, 0, 0)) + background = Image.new("RGBA", img.size, (0, 0, 0, 0)) draw = ImageDraw.Draw(background) - draw.rounded_rectangle([(0, 0), (width, height)], radius=30, fill=self.BACKGROUND_COLOR, outline=self.BACKGROUND_COLOR, width=5) + draw.rounded_rectangle([(0, 0), img.size], radius=30, fill=background_color, outline=background_outline_color, width=5) + + decoration_image = self.create_decoration_image(ui_type, img.size) + background = Image.alpha_composite(background, decoration_image) img = Image.alpha_composite(background, img) return img \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 350a73fb..e246f1dd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,6 +12,7 @@ transformers[torch]==4.37.2 sentencepiece==0.1.99 ctranslate2==3.24.0 faster-whisper==0.10.0 +openvr==1.26.701 translators @ git+https://github.com/misyaguziya/translators@5.8.9 SpeechRecognition @ git+https://github.com/misyaguziya/custom_speech_recognition@3.10.2 tinyoscquery @ git+https://github.com/cyberkitsune/tinyoscquery@0.1.2 \ No newline at end of file