Spaces:
Runtime error
Runtime error
Upgrade the UI-UX
Browse files- app.py +121 -89
- asset/css/style.css +39 -2
- asset/fonts/Montserrat-Bold.ttf +0 -0
- asset/fonts/Montserrat-Regular.ttf +0 -0
- asset/fonts/PT_Serif/OFL.txt +0 -94
- asset/fonts/PT_Serif/PTSerif-Bold.ttf +0 -0
- asset/fonts/PT_Serif/PTSerif-BoldItalic.ttf +0 -0
- asset/fonts/PT_Serif/PTSerif-Italic.ttf +0 -0
- asset/fonts/PT_Serif/PTSerif-Regular.ttf +0 -0
- asset/fonts/Poppins-Bold.ttf +0 -0
- asset/fonts/Poppins-Medium.ttf +0 -0
- asset/images/frames/1.jpg +0 -0
- asset/images/frames/10.jpg +0 -0
- asset/images/frames/2.jpg +0 -0
- asset/images/frames/3.jpg +0 -0
- asset/images/frames/4.jpg +0 -0
- asset/images/frames/5.jpg +0 -0
- asset/images/frames/6.jpg +0 -0
- asset/images/frames/7.jpg +0 -0
- asset/images/frames/8.jpg +0 -0
- asset/images/frames/9.jpg +0 -0
- meta.py +38 -7
app.py
CHANGED
@@ -10,7 +10,11 @@ from PIL import (
|
|
10 |
ImageDraw
|
11 |
)
|
12 |
|
|
|
|
|
|
|
13 |
import re
|
|
|
14 |
import textwrap
|
15 |
from examples import EXAMPLES
|
16 |
import meta
|
@@ -21,6 +25,8 @@ from utils import (
|
|
21 |
pure_comma_separation
|
22 |
)
|
23 |
|
|
|
|
|
24 |
|
25 |
class TextGeneration:
|
26 |
def __init__(self):
|
@@ -39,8 +45,8 @@ class TextGeneration:
|
|
39 |
],
|
40 |
'ingredients': [
|
41 |
'1 potato',
|
42 |
-
'1 slice cheese',
|
43 |
-
'1 potato',
|
44 |
'1 slice cheese'
|
45 |
'1 potato',
|
46 |
'1 slice cheese',
|
@@ -56,11 +62,16 @@ class TextGeneration:
|
|
56 |
self.generator = None
|
57 |
self.task = "text2text-generation"
|
58 |
self.model_name_or_path = "flax-community/t5-recipe-generation"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
59 |
self.list_division = 5
|
60 |
self.point = "-"
|
61 |
-
self.h1_font = ImageFont.truetype("asset/fonts/PT_Serif/PTSerif-Bold.ttf", 75)
|
62 |
-
self.h2_font = ImageFont.truetype("asset/fonts/PT_Serif/PTSerif-Bold.ttf", 50)
|
63 |
-
self.p_font = ImageFont.truetype("asset/fonts/PT_Serif/PTSerif-Regular.ttf", 30)
|
64 |
set_seed(42)
|
65 |
|
66 |
def _skip_special_tokens_and_prettify(self, text):
|
@@ -96,59 +107,67 @@ class TextGeneration:
|
|
96 |
|
97 |
def prepare_frame(self, recipe, frame):
|
98 |
im_editable = ImageDraw.Draw(frame)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
# Title
|
100 |
-
ws, hs = 120, 500
|
101 |
im_editable.text(
|
102 |
-
(
|
103 |
-
textwrap.fill(recipe["title"],
|
104 |
(61, 61, 70),
|
105 |
-
font=self.
|
106 |
)
|
107 |
# Ingredients
|
108 |
-
hs = hs + 270
|
109 |
im_editable.text(
|
110 |
-
(
|
111 |
"Ingredients",
|
112 |
(61, 61, 70),
|
113 |
-
font=self.
|
114 |
)
|
115 |
-
hs = hs + 80
|
116 |
ingredients = recipe["ingredients"]
|
117 |
-
|
118 |
-
ingredients_col2 = [textwrap.fill(item, 30) for item in ingredients[self.list_division:]]
|
119 |
|
120 |
im_editable.text(
|
121 |
-
(
|
122 |
-
"\n".join([f"
|
123 |
(61, 61, 70),
|
124 |
-
font=self.
|
125 |
)
|
|
|
126 |
im_editable.text(
|
127 |
-
(
|
128 |
-
"
|
129 |
(61, 61, 70),
|
130 |
-
font=self.
|
131 |
)
|
132 |
-
|
133 |
-
|
|
|
134 |
im_editable.text(
|
135 |
-
(
|
136 |
-
"
|
137 |
(61, 61, 70),
|
138 |
-
font=self.
|
139 |
)
|
140 |
-
hs = hs + 80
|
141 |
-
directions = [textwrap.fill(item, 70).replace("\n", "\n ") for item in recipe["directions"]]
|
142 |
im_editable.text(
|
143 |
-
(
|
144 |
-
"\n".join([f"{self.
|
145 |
(61, 61, 70),
|
146 |
-
font=self.
|
147 |
)
|
148 |
return frame
|
149 |
|
150 |
def generate(self, items, generation_kwargs):
|
151 |
-
print(generation_kwargs)
|
152 |
if not self.debug:
|
153 |
generation_kwargs["num_return_sequences"] = 1
|
154 |
# generation_kwargs["return_full_text"] = False
|
@@ -165,8 +184,8 @@ class TextGeneration:
|
|
165 |
|
166 |
return self.dummy_output
|
167 |
|
168 |
-
def generate_frame(self, recipe):
|
169 |
-
frame = load_image(
|
170 |
return self.prepare_frame(recipe, frame)
|
171 |
|
172 |
|
@@ -205,54 +224,87 @@ def main():
|
|
205 |
initial_sidebar_state="expanded"
|
206 |
)
|
207 |
generator = load_text_generator()
|
|
|
|
|
|
|
208 |
local_css("asset/css/style.css")
|
209 |
|
210 |
-
st.
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
|
224 |
-
|
225 |
-
|
226 |
-
|
|
|
|
|
|
|
|
|
227 |
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
|
241 |
-
|
|
|
|
|
|
|
|
|
|
|
242 |
entered_items.markdown("**Generate recipe for:** " + items)
|
243 |
with st.spinner("Generating recipe..."):
|
244 |
|
245 |
-
if isinstance(items, str)
|
|
|
|
|
|
|
|
|
|
|
246 |
gen_kw = chef_top if chef == "Chef Scheherazade" else chef_beam
|
247 |
generated_recipe = generator.generate(items, gen_kw)
|
248 |
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
254 |
st.markdown(
|
255 |
" ".join([
|
|
|
256 |
f"<h2>{title}</h2>",
|
257 |
"<h3>Ingredient</h3>",
|
258 |
"<ul class='ingredients-list'>",
|
@@ -262,31 +314,11 @@ def main():
|
|
262 |
"<ul class='ingredients-list'>",
|
263 |
" ".join([f'<li>{item}</li>' for item in directions]),
|
264 |
"</ul>",
|
|
|
265 |
]),
|
266 |
unsafe_allow_html=True
|
267 |
)
|
268 |
|
269 |
-
if is_frame:
|
270 |
-
recipe_post = generator.generate_frame(generated_recipe)
|
271 |
-
|
272 |
-
col1, col2, col3 = st.beta_columns([1, 6, 1])
|
273 |
-
with col1:
|
274 |
-
st.write("")
|
275 |
-
|
276 |
-
with col2:
|
277 |
-
st.image(
|
278 |
-
recipe_post,
|
279 |
-
# width=500,
|
280 |
-
caption="Your recipe",
|
281 |
-
use_column_width="auto",
|
282 |
-
output_format="PNG"
|
283 |
-
)
|
284 |
-
|
285 |
-
with col3:
|
286 |
-
st.write("")
|
287 |
-
else:
|
288 |
-
entered_items.markdown("Enter your items...")
|
289 |
-
|
290 |
|
291 |
if __name__ == '__main__':
|
292 |
main()
|
|
|
10 |
ImageDraw
|
11 |
)
|
12 |
|
13 |
+
import numpy as np
|
14 |
+
from datetime import datetime
|
15 |
+
import glob
|
16 |
import re
|
17 |
+
import random
|
18 |
import textwrap
|
19 |
from examples import EXAMPLES
|
20 |
import meta
|
|
|
25 |
pure_comma_separation
|
26 |
)
|
27 |
|
28 |
+
np.random.seed(42)
|
29 |
+
|
30 |
|
31 |
class TextGeneration:
|
32 |
def __init__(self):
|
|
|
45 |
],
|
46 |
'ingredients': [
|
47 |
'1 potato',
|
48 |
+
'1 slice cheese 1 slice cheese',
|
49 |
+
'1 potato 1 slice cheese 1 slice cheese',
|
50 |
'1 slice cheese'
|
51 |
'1 potato',
|
52 |
'1 slice cheese',
|
|
|
62 |
self.generator = None
|
63 |
self.task = "text2text-generation"
|
64 |
self.model_name_or_path = "flax-community/t5-recipe-generation"
|
65 |
+
self.frames = list(glob.glob("asset/images/frames/*.jpg"))
|
66 |
+
self.fonts = {
|
67 |
+
"title": ImageFont.truetype("asset/fonts/Poppins-Bold.ttf", 90),
|
68 |
+
"sub_title": ImageFont.truetype("asset/fonts/Poppins-Medium.ttf", 30),
|
69 |
+
"body_bold": ImageFont.truetype("asset/fonts/Montserrat-Bold.ttf", 50),
|
70 |
+
"body": ImageFont.truetype("asset/fonts/Montserrat-Regular.ttf", 30),
|
71 |
+
|
72 |
+
}
|
73 |
self.list_division = 5
|
74 |
self.point = "-"
|
|
|
|
|
|
|
75 |
set_seed(42)
|
76 |
|
77 |
def _skip_special_tokens_and_prettify(self, text):
|
|
|
107 |
|
108 |
def prepare_frame(self, recipe, frame):
|
109 |
im_editable = ImageDraw.Draw(frame)
|
110 |
+
# Info
|
111 |
+
im_editable.text(
|
112 |
+
(1570, 180),
|
113 |
+
datetime.now().strftime("%Y-%m-%d %H:%M"),
|
114 |
+
(61, 61, 70),
|
115 |
+
font=self.fonts["sub_title"],
|
116 |
+
)
|
117 |
+
im_editable.text(
|
118 |
+
(1570, 170 + 70),
|
119 |
+
"By " + recipe["by"],
|
120 |
+
(61, 61, 70),
|
121 |
+
font=self.fonts["sub_title"],
|
122 |
+
)
|
123 |
# Title
|
|
|
124 |
im_editable.text(
|
125 |
+
(400, 650),
|
126 |
+
textwrap.fill(recipe["title"], 30),
|
127 |
(61, 61, 70),
|
128 |
+
font=self.fonts["title"],
|
129 |
)
|
130 |
# Ingredients
|
|
|
131 |
im_editable.text(
|
132 |
+
(100, 1050),
|
133 |
"Ingredients",
|
134 |
(61, 61, 70),
|
135 |
+
font=self.fonts["body_bold"],
|
136 |
)
|
|
|
137 |
ingredients = recipe["ingredients"]
|
138 |
+
ingredients = [textwrap.fill(item, 30).replace("\n", "\n ") for item in ingredients]
|
|
|
139 |
|
140 |
im_editable.text(
|
141 |
+
(100, 1130),
|
142 |
+
"\n".join([f"{self.point} {item}" for item in ingredients]),
|
143 |
(61, 61, 70),
|
144 |
+
font=self.fonts["body"],
|
145 |
)
|
146 |
+
# Directions
|
147 |
im_editable.text(
|
148 |
+
(700, 1050),
|
149 |
+
"Directions",
|
150 |
(61, 61, 70),
|
151 |
+
font=self.fonts["body_bold"],
|
152 |
)
|
153 |
+
directions = recipe["directions"]
|
154 |
+
directions_col1 = [textwrap.fill(item, 30).replace("\n", "\n ") for item in directions[:self.list_division]]
|
155 |
+
directions_col2 = [textwrap.fill(item, 30).replace("\n", "\n ") for item in directions[self.list_division:]]
|
156 |
im_editable.text(
|
157 |
+
(700, 1130),
|
158 |
+
"\n".join([f"{i + 1}. {item}" for i, item in enumerate(directions_col1)]).strip(),
|
159 |
(61, 61, 70),
|
160 |
+
font=self.fonts["body"],
|
161 |
)
|
|
|
|
|
162 |
im_editable.text(
|
163 |
+
(1300, 1130),
|
164 |
+
"\n".join([f"{i + 1 + self.list_division}. {item}" for i, item in enumerate(directions_col2)]).strip(),
|
165 |
(61, 61, 70),
|
166 |
+
font=self.fonts["body"],
|
167 |
)
|
168 |
return frame
|
169 |
|
170 |
def generate(self, items, generation_kwargs):
|
|
|
171 |
if not self.debug:
|
172 |
generation_kwargs["num_return_sequences"] = 1
|
173 |
# generation_kwargs["return_full_text"] = False
|
|
|
184 |
|
185 |
return self.dummy_output
|
186 |
|
187 |
+
def generate_frame(self, recipe, frame_path):
|
188 |
+
frame = load_image(frame_path)
|
189 |
return self.prepare_frame(recipe, frame)
|
190 |
|
191 |
|
|
|
224 |
initial_sidebar_state="expanded"
|
225 |
)
|
226 |
generator = load_text_generator()
|
227 |
+
if 'get_random_frame' not in st.session_state:
|
228 |
+
st.session_state.get_random_frame = generator.frames[0]
|
229 |
+
|
230 |
local_css("asset/css/style.css")
|
231 |
|
232 |
+
col1, col2 = st.beta_columns([5, 3])
|
233 |
+
with col2:
|
234 |
+
st.image(load_image("asset/images/chef-transformer-transparent.png"), width=300)
|
235 |
+
st.markdown(meta.SIDEBAR_INFO, unsafe_allow_html=True)
|
236 |
+
|
237 |
+
with st.beta_expander("Where did this story start?"):
|
238 |
+
st.markdown(meta.STORY, unsafe_allow_html=True)
|
239 |
+
|
240 |
+
with col1:
|
241 |
+
st.markdown(meta.HEADER_INFO, unsafe_allow_html=True)
|
242 |
+
|
243 |
+
st.markdown(meta.CHEF_INFO, unsafe_allow_html=True)
|
244 |
+
chef = st.selectbox("Choose your chef", index=0, options=["Chef Scheherazade", "Chef Giovanni"])
|
245 |
|
246 |
+
prompts = list(EXAMPLES.keys()) + ["Custom"]
|
247 |
+
prompt = st.selectbox(
|
248 |
+
'Examples (select from this list)',
|
249 |
+
prompts,
|
250 |
+
# index=len(prompts) - 1,
|
251 |
+
index=0
|
252 |
+
)
|
253 |
|
254 |
+
if prompt == "Custom":
|
255 |
+
prompt_box = ""
|
256 |
+
else:
|
257 |
+
prompt_box = EXAMPLES[prompt]
|
258 |
|
259 |
+
items = st.text_area(
|
260 |
+
'Insert your ingredients here (separated by `,`): ',
|
261 |
+
pure_comma_separation(prompt_box, return_list=False),
|
262 |
+
)
|
263 |
+
items = pure_comma_separation(items, return_list=False)
|
264 |
+
entered_items = st.empty()
|
265 |
+
recipe_button = st.button('Get Recipe!')
|
266 |
|
267 |
+
st.markdown(
|
268 |
+
"<hr />",
|
269 |
+
unsafe_allow_html=True
|
270 |
+
)
|
271 |
+
if recipe_button:
|
272 |
+
st.session_state.get_random_frame = generator.frames[random.randint(0, len(generator.frames)) - 1]
|
273 |
entered_items.markdown("**Generate recipe for:** " + items)
|
274 |
with st.spinner("Generating recipe..."):
|
275 |
|
276 |
+
if not isinstance(items, str) or not len(items) > 1:
|
277 |
+
entered_items.markdown(
|
278 |
+
f"**{chef}** would like to know what ingredients do you like to use in "
|
279 |
+
f"your food? "
|
280 |
+
)
|
281 |
+
else:
|
282 |
gen_kw = chef_top if chef == "Chef Scheherazade" else chef_beam
|
283 |
generated_recipe = generator.generate(items, gen_kw)
|
284 |
|
285 |
+
title = generated_recipe["title"]
|
286 |
+
ingredients = generated_recipe["ingredients"]
|
287 |
+
directions = [textwrap.fill(item, 70).replace("\n", "\n ") for item in
|
288 |
+
generated_recipe["directions"]]
|
289 |
+
generated_recipe["by"] = chef
|
290 |
+
|
291 |
+
r1, r2 = st.beta_columns([3, 5])
|
292 |
+
|
293 |
+
with r1:
|
294 |
+
# st.write(st.session_state.get_random_frame)
|
295 |
+
recipe_post = generator.generate_frame(generated_recipe, st.session_state.get_random_frame)
|
296 |
+
st.image(
|
297 |
+
recipe_post,
|
298 |
+
# width=500,
|
299 |
+
caption="Click 🔎 to enlarge",
|
300 |
+
use_column_width="auto",
|
301 |
+
output_format="PNG"
|
302 |
+
)
|
303 |
+
|
304 |
+
with r2:
|
305 |
st.markdown(
|
306 |
" ".join([
|
307 |
+
"<div class='r-text-recipe'>",
|
308 |
f"<h2>{title}</h2>",
|
309 |
"<h3>Ingredient</h3>",
|
310 |
"<ul class='ingredients-list'>",
|
|
|
314 |
"<ul class='ingredients-list'>",
|
315 |
" ".join([f'<li>{item}</li>' for item in directions]),
|
316 |
"</ul>",
|
317 |
+
"</div>"
|
318 |
]),
|
319 |
unsafe_allow_html=True
|
320 |
)
|
321 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
322 |
|
323 |
if __name__ == '__main__':
|
324 |
main()
|
asset/css/style.css
CHANGED
@@ -1,14 +1,51 @@
|
|
1 |
body {
|
2 |
-
background-color: #
|
3 |
}
|
4 |
|
|
|
5 |
.fullScreenFrame > div {
|
6 |
display: flex;
|
7 |
justify-content: center;
|
8 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
.ingredients-list {
|
11 |
columns: 2;
|
12 |
-webkit-columns: 2;
|
13 |
-moz-columns: 2;
|
14 |
-
}
|
|
|
1 |
body {
|
2 |
+
background-color: #fff;
|
3 |
}
|
4 |
|
5 |
+
|
6 |
.fullScreenFrame > div {
|
7 |
display: flex;
|
8 |
justify-content: center;
|
9 |
}
|
10 |
+
.comma:not(:empty) ~ .comma:not(:empty):before {
|
11 |
+
content: " , ";
|
12 |
+
}
|
13 |
+
.strong {
|
14 |
+
font-weight: bold;
|
15 |
+
}
|
16 |
+
.d-block {
|
17 |
+
display: block;
|
18 |
+
}
|
19 |
+
.extra-info {
|
20 |
+
font-weight: normal;
|
21 |
+
font-style: italic;
|
22 |
+
font-size: small;
|
23 |
+
}
|
24 |
+
|
25 |
+
.contributors {
|
26 |
+
margin-bottom: 10px;
|
27 |
+
border-bottom: 1px solid #f3f3f3;
|
28 |
+
padding-bottom: 10px;
|
29 |
+
}
|
30 |
+
.contributors a.contributor {
|
31 |
+
text-decoration: none;
|
32 |
+
color: #9b9dad;
|
33 |
+
}
|
34 |
+
.contributors a.contributor:hover {
|
35 |
+
text-decoration: underline;
|
36 |
+
}
|
37 |
|
38 |
+
.r-text-recipe {
|
39 |
+
padding-left: 30px;
|
40 |
+
margin-left: 10px;
|
41 |
+
border-left: 1px dashed #eee;
|
42 |
+
}
|
43 |
+
.r-text-recipe > h2 {
|
44 |
+
margin-top: 0;
|
45 |
+
padding-top: 0;
|
46 |
+
}
|
47 |
.ingredients-list {
|
48 |
columns: 2;
|
49 |
-webkit-columns: 2;
|
50 |
-moz-columns: 2;
|
51 |
+
}
|
asset/fonts/Montserrat-Bold.ttf
ADDED
Binary file (244 kB). View file
|
|
asset/fonts/Montserrat-Regular.ttf
ADDED
Binary file (246 kB). View file
|
|
asset/fonts/PT_Serif/OFL.txt
DELETED
@@ -1,94 +0,0 @@
|
|
1 |
-
Copyright (c) 2010, ParaType Ltd. (http://www.paratype.com/public),
|
2 |
-
with Reserved Font Names "PT Sans", "PT Serif" and "ParaType".
|
3 |
-
|
4 |
-
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
5 |
-
This license is copied below, and is also available with a FAQ at:
|
6 |
-
http://scripts.sil.org/OFL
|
7 |
-
|
8 |
-
|
9 |
-
-----------------------------------------------------------
|
10 |
-
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
11 |
-
-----------------------------------------------------------
|
12 |
-
|
13 |
-
PREAMBLE
|
14 |
-
The goals of the Open Font License (OFL) are to stimulate worldwide
|
15 |
-
development of collaborative font projects, to support the font creation
|
16 |
-
efforts of academic and linguistic communities, and to provide a free and
|
17 |
-
open framework in which fonts may be shared and improved in partnership
|
18 |
-
with others.
|
19 |
-
|
20 |
-
The OFL allows the licensed fonts to be used, studied, modified and
|
21 |
-
redistributed freely as long as they are not sold by themselves. The
|
22 |
-
fonts, including any derivative works, can be bundled, embedded,
|
23 |
-
redistributed and/or sold with any software provided that any reserved
|
24 |
-
names are not used by derivative works. The fonts and derivatives,
|
25 |
-
however, cannot be released under any other type of license. The
|
26 |
-
requirement for fonts to remain under this license does not apply
|
27 |
-
to any document created using the fonts or their derivatives.
|
28 |
-
|
29 |
-
DEFINITIONS
|
30 |
-
"Font Software" refers to the set of files released by the Copyright
|
31 |
-
Holder(s) under this license and clearly marked as such. This may
|
32 |
-
include source files, build scripts and documentation.
|
33 |
-
|
34 |
-
"Reserved Font Name" refers to any names specified as such after the
|
35 |
-
copyright statement(s).
|
36 |
-
|
37 |
-
"Original Version" refers to the collection of Font Software components as
|
38 |
-
distributed by the Copyright Holder(s).
|
39 |
-
|
40 |
-
"Modified Version" refers to any derivative made by adding to, deleting,
|
41 |
-
or substituting -- in part or in whole -- any of the components of the
|
42 |
-
Original Version, by changing formats or by porting the Font Software to a
|
43 |
-
new environment.
|
44 |
-
|
45 |
-
"Author" refers to any designer, engineer, programmer, technical
|
46 |
-
writer or other person who contributed to the Font Software.
|
47 |
-
|
48 |
-
PERMISSION & CONDITIONS
|
49 |
-
Permission is hereby granted, free of charge, to any person obtaining
|
50 |
-
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
51 |
-
redistribute, and sell modified and unmodified copies of the Font
|
52 |
-
Software, subject to the following conditions:
|
53 |
-
|
54 |
-
1) Neither the Font Software nor any of its individual components,
|
55 |
-
in Original or Modified Versions, may be sold by itself.
|
56 |
-
|
57 |
-
2) Original or Modified Versions of the Font Software may be bundled,
|
58 |
-
redistributed and/or sold with any software, provided that each copy
|
59 |
-
contains the above copyright notice and this license. These can be
|
60 |
-
included either as stand-alone text files, human-readable headers or
|
61 |
-
in the appropriate machine-readable metadata fields within text or
|
62 |
-
binary files as long as those fields can be easily viewed by the user.
|
63 |
-
|
64 |
-
3) No Modified Version of the Font Software may use the Reserved Font
|
65 |
-
Name(s) unless explicit written permission is granted by the corresponding
|
66 |
-
Copyright Holder. This restriction only applies to the primary font name as
|
67 |
-
presented to the users.
|
68 |
-
|
69 |
-
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
70 |
-
Software shall not be used to promote, endorse or advertise any
|
71 |
-
Modified Version, except to acknowledge the contribution(s) of the
|
72 |
-
Copyright Holder(s) and the Author(s) or with their explicit written
|
73 |
-
permission.
|
74 |
-
|
75 |
-
5) The Font Software, modified or unmodified, in part or in whole,
|
76 |
-
must be distributed entirely under this license, and must not be
|
77 |
-
distributed under any other license. The requirement for fonts to
|
78 |
-
remain under this license does not apply to any document created
|
79 |
-
using the Font Software.
|
80 |
-
|
81 |
-
TERMINATION
|
82 |
-
This license becomes null and void if any of the above conditions are
|
83 |
-
not met.
|
84 |
-
|
85 |
-
DISCLAIMER
|
86 |
-
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
87 |
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
88 |
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
89 |
-
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
90 |
-
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
91 |
-
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
92 |
-
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
93 |
-
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
94 |
-
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
asset/fonts/PT_Serif/PTSerif-Bold.ttf
DELETED
Binary file (196 kB)
|
|
asset/fonts/PT_Serif/PTSerif-BoldItalic.ttf
DELETED
Binary file (193 kB)
|
|
asset/fonts/PT_Serif/PTSerif-Italic.ttf
DELETED
Binary file (232 kB)
|
|
asset/fonts/PT_Serif/PTSerif-Regular.ttf
DELETED
Binary file (215 kB)
|
|
asset/fonts/Poppins-Bold.ttf
ADDED
Binary file (154 kB). View file
|
|
asset/fonts/Poppins-Medium.ttf
ADDED
Binary file (156 kB). View file
|
|
asset/images/frames/1.jpg
ADDED
asset/images/frames/10.jpg
ADDED
asset/images/frames/2.jpg
ADDED
asset/images/frames/3.jpg
ADDED
asset/images/frames/4.jpg
ADDED
asset/images/frames/5.jpg
ADDED
asset/images/frames/6.jpg
ADDED
asset/images/frames/7.jpg
ADDED
asset/images/frames/8.jpg
ADDED
asset/images/frames/9.jpg
ADDED
meta.py
CHANGED
@@ -1,10 +1,41 @@
|
|
1 |
-
HEADER_INFO = """
|
2 |
-
# Chef Transformer 🍲
|
3 |
-
|
4 |
-
This demo uses [T5 trained on RecipeNLG](https://huggingface.co/flax-community/t5-recipe-generation)
|
5 |
-
to generate recipe from a given set of ingredients
|
6 |
-
""".strip()
|
7 |
SIDEBAR_INFO = """
|
8 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
""".strip()
|
10 |
PROMPT_BOX = "Add custom ingredients here (separated by `,`): "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
HEADER_INFO = """""".strip()
|
|
|
|
|
|
|
|
|
|
|
2 |
SIDEBAR_INFO = """
|
3 |
+
<div class="contributors">
|
4 |
+
<a class="contributor comma" href="https://huggingface.co/m3hrdadfi">Mehrdad Farahani</a>
|
5 |
+
<a class="contributor comma" href="https://huggingface.co/dk-crazydiv">Kartik Godawat</a>
|
6 |
+
<a class="contributor comma" href="https://huggingface.co/hassiahk">Haswanth Aekula</a>
|
7 |
+
<a class="contributor comma" href="https://huggingface.co/rays2pix">Deepak Pandian</a>
|
8 |
+
<a class="contributor comma" href="https://huggingface.co/nbroad">Nicholas Broad</a>
|
9 |
+
</div>
|
10 |
+
"""
|
11 |
+
CHEF_INFO = """
|
12 |
+
<p class="strong">Welcome to our lovely restaurant!
|
13 |
+
<span class="d-block extra-info">(We are at your service with two of our best chefs in the world, Chef Scheherazade,
|
14 |
+
Chef Giovanni.)</span></p>
|
15 |
""".strip()
|
16 |
PROMPT_BOX = "Add custom ingredients here (separated by `,`): "
|
17 |
+
STORY = """
|
18 |
+
Hello everyone, I am **Chef Transformer**, the owner of this restaurant and headmaster of two other chefs **Scheherazade**, and **Giovanni**.
|
19 |
+
In fact, to be more precise, I was made by a group of [NLP Engineers](
|
20 |
+
https://huggingface.co/flax-community/t5-recipe-generation#team-members) so that to get your raw
|
21 |
+
materials and with the help of my other associates (Scheherazade, and Giovanni) which participated in [T5 fine-tuning program (chef program)](https://huggingface.co/flax-community/t5-recipe-generation) be able to prepare food recipes for you.
|
22 |
+
Before going any further, highly important to mention both cooks are capable, except that Scheherazade is *creative*
|
23 |
+
while Giovanni is *meticulous*.
|
24 |
+
|
25 |
+
At first, it was hard, and we had to read cookbooks to learn, whereas the books somehow consist of trivial recipes, but engineers helped us focus on essential parts of recipes for specific food items.
|
26 |
+
Also, they taught us to consider the food items (known as NER), ingredients, directions, and, more importantly, food names and then map them in the following form in our skills and histories.
|
27 |
+
|
28 |
+
```text
|
29 |
+
[Input]
|
30 |
+
{NER: separated by comma}
|
31 |
+
|
32 |
+
[Targets]
|
33 |
+
title: {TITLE} <section>
|
34 |
+
ingredients: {INGREDIENTS: separated by <sep>} <section>
|
35 |
+
directions: {DIRECTIONS: separated by <sep>}.
|
36 |
+
```
|
37 |
+
|
38 |
+
It was a challenging week, but we learned a lot, to be honest. Finally, we graduated with [high scores](
|
39 |
+
https://huggingface.co/flax-community/t5-recipe-generation#evaluation) in our
|
40 |
+
classroom and established this restaurant. Do not forget to introduce us to others.
|
41 |
+
""".strip()
|