import gradio as gr import io import os from PIL import Image import base64 from scripts.process_utils import initialize, process_image_as_base64, image_to_base64 from scripts.anime import init_model from scripts.generate_prompt import load_wd14_tagger_model # import webbrowser from datetime import datetime from pytz import timezone # 初期化 initialize(_use_local=False, use_gpu=True, use_dotenv=True) init_model(use_local=False) load_wd14_tagger_model() def process_image(input_image, mode, weight1=None, weight2=None): tokyo_time = datetime.now(timezone('Asia/Tokyo')).strftime("%Y-%m-%d %H:%M:%S") # 日本時間のタイムスタンプ print(f"[{tokyo_time}] Processing image with mode={mode}, weight1={weight1}, weight2={weight2}") # 既存の画像処理ロジック if mode == "original": sotai_image, sketch_image = process_image_as_base64(input_image, mode, None, None) elif mode == "refine": sotai_image, sketch_image = process_image_as_base64(input_image, mode, weight1, weight2) return sotai_image, sketch_image, None def mix_images(sotai_image_data, sketch_image_data, opacity1, opacity2): sotai_image = Image.open(io.BytesIO(base64.b64decode(sotai_image_data))).convert('RGBA') sketch_image = Image.open(io.BytesIO(base64.b64decode(sketch_image_data))).convert('RGBA') if sotai_image.size != sketch_image.size: sketch_image = sketch_image.resize(sotai_image.size, Image.Resampling.LANCZOS) mixed_image = Image.new('RGBA', sotai_image.size, (255, 255, 255, 255)) sotai_alpha = sotai_image.getchannel('A').point(lambda x: int(x * opacity1)) sketch_alpha = sketch_image.getchannel('A').point(lambda x: int(x * opacity2)) mixed_image.paste(sketch_image, (0, 0), mask=sketch_alpha) mixed_image.paste(sotai_image, (0, 0), mask=sotai_alpha) return mixed_image # # X(Twitter)に投稿するリンクを生成 # def generate_twitter_link(image): # image_base64 = image_to_base64(image) # return f"https://twitter.com/intent/tweet?text=Image2Body&url={image_base64} #Image2Body" # def post_to_twitter(image): # link = generate_twitter_link(image) # webbrowser.open_new_tab(link) import gradio as gr # 初回訪問のメッセージ welcome_message = """
以下から選択してください。
""" from dotenv import load_dotenv load_dotenv() # Googleフォームの送信URL apps_script_url = os.environ["APPS_SCRIPT_URL"] # ローカライズ用辞書 translations = { "en": { "welcome_message": "Please select below.
", "visit_choices": ["First time", "Returning"], "returning_message": "Click the button below to proceed.
", "proceed_button": "Proceed", "survey_title": "Fill out the form below and submit.
", "form": { "source": "1. Where did you learn about this Space?", "country": "2. Which country or region do you live in?", "ai_usage": "3. Have you used AI to generate illustrations?", "ai_usage_choices": ["Select...", "Frequently", "Sometimes", "Never"], "drawing_experience": "4. Have you practiced traditional hand-drawn illustrations?", "drawing_experience_choices": ["Select...", "As a hobby", "For work", "Never"], "issues": "5. (Optional) Tell us about any challenges you've faced while practicing illustrations.", "interest": "6. (Optional) What interested you in this Space?", "contact_info": "7. (Optional) Provide your contact information (e.g., SNS, URL, email)", "contact_info_placeholder": "e.g., Twitter, portfolio URL, email", "submit_button": "Submit" } }, "ja": { "welcome_message": "以下から選択してください。
", "visit_choices": ["初めて利用する", "2回目以降"], "returning_message": "以下のボタンをクリックして進んでください。
", "proceed_button": "進む", "survey_title": "以下のフォームに入力して送信してください。
", "form": { "source": "1. このSpaceをどこで知りましたか?", "country": "2. お住まいの国や地域を教えてください。", "ai_usage": "3. 生成AIでイラスト生成をしたことがありますか?", "ai_usage_choices": ["選択してください...", "よくする", "ある", "ない"], "drawing_experience": "4. 生成AIではない従来の手描きイラストを練習した経験はありますか?", "drawing_experience_choices": ["選択してください...", "趣味で", "仕事で", "ない"], "issues": "5. (任意)イラストの練習中に困った経験があれば教えてください", "interest": "6. (任意)このSpaceに興味を持った理由を教えてください。", "contact_info": "7. (任意)連絡先(SNS、URL、メールアドレスなど)を教えてください", "contact_info_placeholder": "例: Twitterアカウント、ポートフォリオURL、メールアドレスなど", "submit_button": "送信" } }, "zh": { "welcome_message": "请从下面选择。
", "visit_choices": ["第一次", "再次访问"], "returning_message": "请点击下面的按钮继续。
", "proceed_button": "继续", "survey_title": "填写以下表格并提交。
", "form": { "source": "1. 您是从哪里得知此服务的?", "country": "2. 您居住的国家或地区是?", "ai_usage": "3. 您是否使用过AI生成插图?", "ai_usage_choices": ["请选择...", "经常", "偶尔", "从未"], "drawing_experience": "4. 您是否练习过传统手绘插图?", "drawing_experience_choices": ["请选择...", "作为爱好", "为了工作", "从未"], "issues": "5. (可选)在练习插图过程中遇到的挑战是什么?", "interest": "6. (可选)是什么让您对这个Space感兴趣?", "contact_info": "7. (可选)提供您的联系方式(如:SNS、网址、电子邮件等)", "contact_info_placeholder": "例如:Twitter、作品集网址、电子邮件", "submit_button": "提交" } } } # 言語選択に応じてローカライズ def localize(language): t = translations[language] return { "welcome_message": t["welcome_message"], "visit_choices": t["visit_choices"], "returning_message": t["returning_message"], "proceed_button": t["proceed_button"], "form_html": f"""Upload an image and select processing options to generate body and sketch images.
まだstandingタグのついた女性キャラクターの1000枚の画像しか学習していないため、他のポーズは上手くできないことをご了承ください。
さらなる情報は@Yeq6Xまでお問い合わせください。
Note: Currently, the model has been trained on only 1000 images of female characters with the 'standing' tag, so other poses may not be processed accurately.
For more information, please contact @Yeq6X.
注意:目前模型仅使用带有“standing”标签的1000张女性角色图像进行训练,因此其他姿势可能无法准确处理。
如需更多信息,请联系@Yeq6X。
""") # 訪問回数の選択 with gr.Column() as visit_section: # 言語選択セクション with gr.Row(): language_choice = gr.Radio( choices=["en", "ja", "zh"], label="Select Language / 言語を選択 / 选择语言", value="en" ) localized = localize("en") welcome_message = gr.HTML(localized["welcome_message"]) visit_choice = gr.Radio(choices=localized["visit_choices"], label="") # 初回訪問のアンケートセクション with gr.Column(visible=False) as survey_section: # フォームセクション form_section = gr.HTML(localize("en")["form_html"]) # 2回目以降の進むボタンセクション with gr.Column(visible=False) as proceed_section: # gr.HTML("