PSNbst commited on
Commit
64322bd
·
verified ·
1 Parent(s): cc24caf

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +279 -0
app.py ADDED
@@ -0,0 +1,279 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gradio as gr
3
+ import openai
4
+
5
+ ##############################################################################
6
+ # 1. GPT 或 DeepSeek 调用示例函数
7
+ ##############################################################################
8
+ def generate_natural_language_description_gpt(tags, api_key, base_url=None, model="gpt-4"):
9
+ """
10
+ 使用 OpenAI GPT 生成自然语言描述的示例函数。
11
+ """
12
+ if not api_key:
13
+ return "Error: GPT API Key not provided."
14
+
15
+ # 设置 API
16
+ openai.api_key = api_key
17
+ if base_url:
18
+ openai.api_base = base_url
19
+
20
+ # 将 dict 转成可读字符串
21
+ tag_descriptions = "\n".join([
22
+ f"{key}: {', '.join(value) if isinstance(value, list) else value}"
23
+ for key, value in tags.items() if value
24
+ ])
25
+
26
+ try:
27
+ response = openai.ChatCompletion.create(
28
+ model=model,
29
+ messages=[
30
+ {
31
+ "role": "system",
32
+ "content": (
33
+ "You are a creative assistant that generates detailed and imaginative scene descriptions "
34
+ "for AI generation prompts. Focus on the details provided and incorporate them into a "
35
+ "cohesive narrative. Use at least three sentences but no more than five sentences."
36
+ ),
37
+ },
38
+ {
39
+ "role": "user",
40
+ "content": f"Here are the tags and details:\n{tag_descriptions}\nPlease generate a vivid, imaginative scene description.",
41
+ },
42
+ ]
43
+ )
44
+ return response.choices[0].message.content.strip()
45
+ except Exception as e:
46
+ return f"GPT generation failed. Error: {e}"
47
+
48
+
49
+ def generate_natural_language_description_deepseek(tags, api_key, base_url=None):
50
+ """
51
+ 使用 DeepSeek API 生成自然语言描述的示例函数。
52
+ 这里演示伪代码,你需要根据实际 DeepSeek 的文档进行实现。
53
+ """
54
+ if not api_key:
55
+ return "Error: DeepSeek API Key not provided."
56
+
57
+ # 伪代码示例
58
+ # ----------------------------------
59
+ # import requests
60
+ # ...
61
+ # response = requests.post(
62
+ # url=base_url or "https://api.deepseek.com/xxx",
63
+ # headers={"Authorization": f"Bearer {api_key}"},
64
+ # json={"tags": tags}
65
+ # )
66
+ # return response.json()["description"]
67
+ # ----------------------------------
68
+ # 这里为了演示,就直接返回简单的字符串
69
+ return "DeepSeek 生成的描述(此处为示例伪代码)"
70
+
71
+
72
+ ##############################################################################
73
+ # 2. 翻译示例函数(使用 GPT 或 DeepSeek)
74
+ ##############################################################################
75
+ def translate_text_with_gpt(text, target_language, api_key, base_url=None, model="gpt-4"):
76
+ """
77
+ 使用 GPT 来进行翻译的简单示例。
78
+ """
79
+ if not api_key:
80
+ return "Error: GPT Translation Key not provided."
81
+
82
+ openai.api_key = api_key
83
+ if base_url:
84
+ openai.api_base = base_url
85
+
86
+ try:
87
+ # 通过系统提示,让 GPT 做翻译
88
+ system_prompt = f"You are a professional translator. Translate the following text to {target_language}:"
89
+ response = openai.ChatCompletion.create(
90
+ model=model,
91
+ messages=[
92
+ {"role": "system", "content": system_prompt},
93
+ {"role": "user", "content": text},
94
+ ]
95
+ )
96
+ return response.choices[0].message.content.strip()
97
+ except Exception as e:
98
+ return f"GPT translation failed. Error: {e}"
99
+
100
+
101
+ def translate_text_with_deepseek(text, target_language, api_key, base_url=None):
102
+ """
103
+ 使用 DeepSeek 来进行翻译的简单示例(伪代码)。
104
+ """
105
+ if not api_key:
106
+ return "Error: DeepSeek Translation Key not provided."
107
+ # 类似上面的伪代码方式。
108
+ return f"DeepSeek翻译后的文本(示例)。目标语言:{target_language}"
109
+
110
+
111
+ ##############################################################################
112
+ # 3. 根据用户选择进行提示词转换并调用 GPT/DeepSeek 生成描述
113
+ ##############################################################################
114
+ def transform_prompt(prompt, gender_option, furry_species, api_mode, api_key):
115
+ """
116
+ 性别/物种转换的简单示例逻辑,然后调用相应 API。
117
+ """
118
+ tags = {}
119
+
120
+ # 根据选择设置性别或物种标签
121
+ if gender_option == "强制转换为男性":
122
+ tags["gender"] = "male"
123
+ elif gender_option == "强制转换为女性":
124
+ tags["gender"] = "female"
125
+ elif gender_option == "无性别":
126
+ tags["gender"] = "genderless"
127
+ elif gender_option == "双性别":
128
+ tags["gender"] = "bigender"
129
+ elif gender_option == "Furry":
130
+ tags["gender"] = "furry"
131
+ tags["furry_species"] = furry_species or "unknown"
132
+
133
+ # 原始提示词
134
+ tags["base_prompt"] = prompt
135
+
136
+ # 根据选择的 API 调用对应的函数
137
+ if api_mode == "GPT":
138
+ scene_description = generate_natural_language_description_gpt(tags, api_key)
139
+ else: # DeepSeek
140
+ scene_description = generate_natural_language_description_deepseek(tags, api_key)
141
+
142
+ return scene_description
143
+
144
+
145
+ ##############################################################################
146
+ # 4. 调用翻译函数
147
+ ##############################################################################
148
+ def do_translation(scene_desc, translate_language, api_mode, api_key):
149
+ """
150
+ 根据选择的 API(GPT/DeepSeek)进行翻译。
151
+ """
152
+ if not scene_desc.strip():
153
+ return ""
154
+
155
+ if api_mode == "GPT":
156
+ return translate_text_with_gpt(scene_desc, translate_language, api_key)
157
+ else:
158
+ return translate_text_with_deepseek(scene_desc, translate_language, api_key)
159
+
160
+
161
+ ##############################################################################
162
+ # 5. 搭建 Gradio 界面
163
+ ##############################################################################
164
+ def build_interface():
165
+ with gr.Blocks() as demo:
166
+
167
+ gr.Markdown("## 提示词一键性别物种转换器")
168
+
169
+ with gr.Row():
170
+ with gr.Column():
171
+ # 选择调用哪个 API
172
+ api_mode = gr.Radio(
173
+ label="选择 API 服务 (Choose API Service)",
174
+ choices=["GPT", "DeepSeek"],
175
+ value="GPT"
176
+ )
177
+
178
+ # 输入 API Key
179
+ api_key = gr.Textbox(
180
+ label="API 密钥 (API Key)",
181
+ type="password",
182
+ placeholder="请输入你的 GPT 或 DeepSeek API 密钥"
183
+ )
184
+
185
+ # 性别 / Furry 选择
186
+ gender_option = gr.Radio(
187
+ label="性别 / Furry 选项 (Gender / Furry)",
188
+ choices=[
189
+ "强制转换为男性",
190
+ "强制转换为女性",
191
+ "无性别",
192
+ "双性别",
193
+ "Furry"
194
+ ],
195
+ value="强制转换为男性",
196
+ )
197
+
198
+ # 选择 Furry 物种
199
+ furry_species = gr.Dropdown(
200
+ label="Furry 物种 (Furry Species)",
201
+ choices=["Wolf", "Fox", "Tiger", "Lion"], # 这里只是示例
202
+ value=None,
203
+ visible=False # 初始不可见
204
+ )
205
+
206
+ # 当性别选项切换时,如果选择 Furry,就显示物种下拉,否则隐藏
207
+ def show_furry_species(gender):
208
+ return gr.update(visible=(gender == "Furry"))
209
+
210
+ gender_option.change(
211
+ show_furry_species,
212
+ inputs=[gender_option],
213
+ outputs=[furry_species]
214
+ )
215
+
216
+ with gr.Column():
217
+ # 输入 prompt
218
+ user_prompt = gr.Textbox(
219
+ label="提示词 (Prompt)",
220
+ lines=5,
221
+ placeholder="在此输入你的提示词,例如:一位穿着红色连衣裙的少女,坐在落日余晖下的草地上..."
222
+ )
223
+
224
+ # 输出场景描述
225
+ generated_output = gr.Textbox(
226
+ label="生成的场景描述 (Generated Scene Description)",
227
+ lines=7
228
+ )
229
+
230
+ # 翻译区域
231
+ with gr.Row():
232
+ translate_language = gr.Dropdown(
233
+ label="翻译语言 (Translation Language)",
234
+ choices=["en", "zh-CN", "ja", "fr", "es"],
235
+ value="en",
236
+ )
237
+ translated_text = gr.Textbox(
238
+ label="翻译结果 (Translated Result)",
239
+ lines=7
240
+ )
241
+
242
+ ######################################################################
243
+ # 事件绑定
244
+ ######################################################################
245
+ def on_generate(prompt, gender, furry, mode, key):
246
+ return transform_prompt(prompt, gender, furry, mode, key)
247
+
248
+ # 用户在 prompt 输入后按回车或失去焦点时,触发生成场景描述
249
+ user_prompt.submit(
250
+ fn=on_generate,
251
+ inputs=[user_prompt, gender_option, furry_species, api_mode, api_key],
252
+ outputs=[generated_output],
253
+ )
254
+
255
+ # 也可以加个按钮
256
+ generate_button = gr.Button("生成 / Generate")
257
+ generate_button.click(
258
+ fn=on_generate,
259
+ inputs=[user_prompt, gender_option, furry_species, api_mode, api_key],
260
+ outputs=[generated_output],
261
+ )
262
+
263
+ # 当用户切换翻译语言时,自动翻译当前生成文本
264
+ def on_translate(scene_desc, lang, mode, key):
265
+ return do_translation(scene_desc, lang, mode, key)
266
+
267
+ translate_language.change(
268
+ fn=on_translate,
269
+ inputs=[generated_output, translate_language, api_mode, api_key],
270
+ outputs=[translated_text]
271
+ )
272
+
273
+ return demo
274
+
275
+
276
+ # 在 Spaces 启动
277
+ if __name__ == "__main__":
278
+ demo = build_interface()
279
+ demo.launch()