File size: 8,723 Bytes
5d607a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
import fal_client
import pandas as pd
from prompt_gen import prompt_gen
import requests
import os
from openai import OpenAI
import random
import shutil
from pathlib import Path
from PIL import Image

nv_prompt_file = pd.read_excel('汉服-女词库.xlsx')
na_prompt_file = pd.read_excel('汉服-男词库.xlsx')
nv_prompt = nv_prompt_file.to_string(index=False)
na_prompt = na_prompt_file.to_string(index=False)
save_directory = "downloads"


def prompt_nan(prompt):
    client = OpenAI()
    completion = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system",
             "content": "You are a helpful assistant.", },
            {"role": "user",
             "content": "Please showcase the overall appearance of this Hanfu robe against a contrasting white  "
                        "background. Highlight its intricate details and unique design elements, including" + prompt,
             }
        ]

    )
    print("change prompt: ")
    print(completion.choices[0].message.content)
    return completion.choices[0].message.content


def pro_gen(advice, gender, index):
    prompt = prompt_gen(advice, gender)
    start_index = prompt.find("Begin")
    if start_index == -1:
        start_index = prompt.find("begin")
    prompt__gen = ""
    if start_index != -1:
        start_index += len("Begin\n")
        end_index = prompt.find("End")
        if end_index != -1:
            prompt__gen = prompt[start_index:end_index]
            # if gender == "男":
            #     prompt__gen = prompt_nan(prompt__gen)
            filename = os.path.join(save_directory, f"prompt_{index}.txt")
            with open(filename, "w") as file:
                file.write(prompt__gen)
            # print(prompt__gen)
        else:
            print("No 'promptEnd' found after 'prompt'.")
    else:
        print("No 'prompt' found in the text.")
    return prompt__gen


def generate(lora_path, prompt__gen, index):
    # print(prompt__gen)
    handler = fal_client.submit(
        "fal-ai/fast-sdxl",
        arguments={
            "prompt": prompt__gen,
            "negative_prompt": "human, people, person, man, woman, child, model, face, head, eyes, hands, arms, legs, "
                               "feet, hair, portrait, worst quality, low quality, normal quality, lowres, signature, "
                               "watermark, jpeg artifacts, logo, monochrome, grayscale, ugly",
            "image_size": "portrait_4_3",
            "num_inference_steps": 28,
            "guidance_scale": 7.5,
            "num_images": 1,
            "loras": [{"path": lora_path, "scale": 0.7}],
            "embeddings": [],
            "safety_checker_version": "v1",
            "format": "jpeg"
        },
    )

    request_id = handler.request_id
    result = fal_client.result("fal-ai/fast-sdxl", request_id)
    image_index = index * 2 - 1
    for image in result['images']:
        response = requests.get(image['url'])
        if response.status_code == 200:
            filename = os.path.join(save_directory, f"cloth_{image_index}.jpeg")
            with open(filename, 'wb') as f:
                f.write(response.content)
            image_index += 1
        else:
            print(f"Failed to download image from {image['url']}")

    client = OpenAI()
    completion = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system",
             "content": "You are a helpful assistant.", },
            {"role": "user",
             "content": prompt__gen + "以上是一段对于一套汉服的描述,请根据描述内容对该套汉服进行介绍。要求以介绍的口吻输出内容",
             }
        ]

    )
    cloth_intro = ("汉服,是汉民族的传统服饰。又称衣冠、衣裳、汉装。汉服是中国“衣冠上国”“礼仪之邦”“锦绣中华”的体现,承载了中国的染织绣等杰出"
                   "工艺和美学,传承了30多项中国非物质文化遗产以及受保护的中国工艺美术。\n") + completion.choices[
                      0].message.content
    filename = os.path.join(save_directory, f"cloth_intro_{index * 2 - 1}.txt")
    with open(filename, "w") as file:
        file.write(cloth_intro)


def convert_image_to_jpeg(input_path, output_path):
    try:
        image = Image.open(input_path)
        if image.mode in ('RGBA', 'LA'):
            image = image.convert('RGB')
        image.save(output_path, 'JPEG')
    except Exception as e:
        print(f"转换图像时出错: {e}")


def pic_match(prompt__gen, cates, folder_path, intro_path, index):
    client = OpenAI()
    completion = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system",
             "content": "You are a helpful assistant.", },
            {"role": "user",
             "content": prompt__gen + "以上是关于一套汉族服饰的描述,请根据描述内容从以下几种颜色中选择最符合描述的一种,可选颜色包括:" + cates
                        + ". 仅需输出一种颜色名称,不要带任何符号",
             }
        ]

    )
    print(f"Selected color: {completion.choices[0].message.content}")

    folder_path = os.path.join(folder_path, completion.choices[0].message.content)
    files = os.listdir(folder_path)
    random_file = random.choice(files)
    source_file_path = os.path.join(folder_path, random_file)
    file_prefix, file_ext = os.path.splitext(random_file)
    target_file_path = os.path.join(save_directory, f"cloth_{index * 2}.jpeg")
    convert_image_to_jpeg(source_file_path, target_file_path)

    file_extension = ".txt"
    search_path = Path(intro_path)
    for file in search_path.glob(f"{file_prefix}*{file_extension}"):
        if file.is_file():
            with open(file, "r") as f:
                content = f.read()
                client = OpenAI()
                completion = client.chat.completions.create(
                    model="gpt-4o",
                    messages=[
                        {"role": "system",
                         "content": "You are a helpful assistant.", },
                        {"role": "user",
                         "content": content + "以上是一段对于一套汉服的描述,请根据描述内容对该套汉服进行介绍。要求以介绍的口吻输出内容",
                         }
                    ]

                )
                cloth_intro = ("汉服,是汉民族的传统服饰。又称衣冠、衣裳、汉装。汉服是中国“衣冠上国”“礼仪之邦”“锦绣中华”的体现,承载了中国的染织绣等杰出"
                               "工艺和美学,传承了30多项中国非物质文化遗产以及受保护的中国工艺美术。\n") + \
                              completion.choices[0].message.content
                filename = os.path.join(save_directory, f"cloth_intro_{index * 2}.txt")
                with open(filename, "w") as file:
                    file.write(cloth_intro)

    return target_file_path


def cloth_gen(gender):
    cates = "Black, Blue, Green, Orange, Pink, Red, Violet, White, Yellow"
    lora_path = "https://huggingface.co/PPSharks/PPSharksModels/resolve/main/NV.safetensors"
    folder_path = "database/female"
    intro_path = "database/female_intro"
    if gender == "男":
        lora_path = "https://huggingface.co/PPSharks/PPSharksModels/resolve/main/NA.safetensors"
        cates = "Black, Blue, Green, Brown, Red, Violet"
        folder_path = "database/male"
        intro_path = "database/male_intro"
    elif gender == "女":
        lora_path = "https://huggingface.co/PPSharks/PPSharksModels/resolve/main/NV.safetensors"
        cates = "Black, Blue, Green, Orange, Pink, Red, Violet, White, Yellow"
        folder_path = "database/female"
        intro_path = "database/female_intro"

    cloth_image = []
    for i in range(1, 4):
        with open(os.path.join(save_directory, f"prompt_{i}.txt"), "r") as file:
            prompt__gen = file.read()
        generate(lora_path, prompt__gen, i)
        cloth_image.append(os.path.join(save_directory, f"cloth_{i*2-1}.jpeg"))
        pic_path = pic_match(prompt__gen, cates, folder_path, intro_path, i)
        cloth_image.append(pic_path)

    with open(os.path.join(save_directory, f"cloth_intro_1.txt"), "r") as file:
        cloth_intro = file.read()
    return cloth_image, cloth_image[0], cloth_intro