File size: 3,620 Bytes
667ab99
 
 
eaf66ef
667ab99
 
 
 
 
 
 
eaf66ef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
667ab99
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6d8843e
 
667ab99
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6d8843e
667ab99
 
 
 
 
 
 
 
86e64e9
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
from typing import Optional
import streamlit as st
from generate import ttf_to_image
from threading import Thread
from PIL import Image
import os

LOADED_TTF_KEY = "loaded_ttf"
SET_IMG_KEY = "set_img"
OUTPUT_IMG_KEY = "output_img"

# For multithreading toggle (prevent function from running too many time)
process_runnning = False
process_thread = None

def toggle_process(process_running, process_thread, run_process):
    if process_runnning:
        # Toggle off
        process_running = False
        st.write("Cancled")
        if process_thread: # Kill Thread
            process_thread.join()
    else:
        # Toggle on
        process_running = True
        process_thread = Thread(target=run_process)
        process_thread.start()

def get_ttf(key: str) -> Optional[any]:
    if key in st.session_state:
        return st.session_state[key]
    return None

def get_img(key: str) -> Optional[Image.Image]:
    if key in st.session_state:
        return st.session_state[key]
    return None

def set_img(key: str, img: Image.Image):
    st.session_state[key] = img

def ttf_uploader(prefix):
    file = st.file_uploader("TTF, OTF", ["ttf", "otf"], key=f"{prefix}-uploader")
    if file:    
        return file
        
    return get_ttf(LOADED_TTF_KEY)

def generate_button(prefix, file_input, version, **kwargs):

    col1, col2 = st.columns(2)
    with col1:
        n_samples = st.slider(
            "Number of inference sample",
            min_value=1,
            max_value=200,
            value=20,
            key=f"{prefix}-inference-sample",
        )
    with col2:
        ref_char_ids = st.text_area(
        "ref_char_ids",
        value="1,2,3,4,5,6,7,8",
        key=f"{prefix}-ref_char_ids",
        )

    if st.button("Generate image", key=f"{prefix}-btn"):
        with st.spinner(f"⏳ Generating image (5 minutes per n_sample estimated time)"):
            image = toggle_process( ttf_to_image(file_input, OUTPUT_IMG_KEY, n_samples, ref_char_ids, version) )
            set_img(OUTPUT_IMG_KEY, image.copy())
        st.image(image)

    test_font = st.text_area(
        "test font",
        value="กขคง",
        key=f"{prefix}-prompt",
    )

def generate_tab():
    prefix = "ttf2img"
    col1, col2 = st.columns(2)

    with col1:
        sample_choose = st.selectbox(
                "Choose Sample", ["Custom"] + [i for i in os.listdir("font_sample/")], key=f"{prefix}-sample_choose"
            )
        if sample_choose == "Custom":
            uploaded_file = ttf_uploader(prefix)
            if uploaded_file:
                st.write("filename:", uploaded_file.name)
                uploaded_file = uploaded_file.getbuffer() # Send file as Buffer

        else:
            st.write("filename:", sample_choose)
            uploaded_file = os.path.join("font_sample", sample_choose)

    with col2:
        if uploaded_file:
            version = st.selectbox(
                "Model version", ["TH2TH", "ENG2TH"], key=f"{prefix}-version"
            )
            generate_button(
                prefix, file_input=uploaded_file, version=version
            )

def main():
    st.set_page_config(layout="wide")
    st.title("ThaiVecFont Playground")

    generate_tab()

    with st.sidebar:
        st.header("Latest Output")
        output_image = get_img(OUTPUT_IMG_KEY)
        if output_image:
            st.image(output_image)
        else:
            st.markdown("No output generated yet")


if __name__ == "__main__":
    main()