5
File size: 6,626 Bytes
1c1c536
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_community.chat_models.friendli import ChatFriendli
from korean_process import generate_korean_lyrics
import os

global selected_line_value
selected_line_value = 0

llm = ChatFriendli(
    friendli_token = os.getenv("FRIENDLI_API_KEY"),
    model = "meta-llama-3-70b-instruct",
    streaming = False,
    # temperature=0.5,
    # max_tokens=100,
    # top_p=0.9,
    # frequency_penalty=0.0,
    # stop=["\n"],
)

def process_english(title, lyric):
    return switch_interface(title, lyric)

def process_korean(title, lyric):
    lyric = generate_korean_lyrics(title, lyric)
    return switch_interface(title, lyric)

def switch_interface(title, lyric):
    numbered_lyric = ""
    count = 0
    lines = lyric.split('\n')
    numbered_lines = []
    for line in lines:
        if len(line) > 0:
            count += 1
            numbered_lyric += f"{count}. {line}\n"
            numbered_lines.append(line)

    global stored_lyrics
    stored_lyrics = numbered_lines

    return (gr.update(visible=False), # audio_input1
            gr.update(visible=False), # audio_input2
            gr.update(visible=False), # title_input
            gr.update(visible=False), # lyrics_input
            gr.update(visible=False), # submit_english_btn
            gr.update(visible=False), # submit_korean_btn
            gr.update(visible=True, value=f"<p style='font-size:160%;'>{title}</p>"), # hidden_title
            gr.update(visible=True, value=f"<p style='white-space: pre-wrap;'>{numbered_lyric}</p>"), # hidden_lyric
            gr.update(visible=True, value=0, maximum=count, minimum=0, step=1), # selected_line
            gr.update(visible=True, value="Choice a line you want to revise"), # selected_lyric
            gr.update(visible=True), # feedback_text
            gr.update(visible=True), # feedback_btn
            gr.update(visible=True)) # new_btn


def update_selected_lyric(selected_line):
    selected_line_value = selected_line
    if selected_line != 0:
        return gr.update(value=f"Selected line ({selected_line}): {stored_lyrics[selected_line-1]}")
    else:
        return gr.update(value="Choose a line you want to revise using the slider!")

def reset_interface():
    return (gr.update(visible=True), # audio_input1
            gr.update(visible=True), # audio_input2
            gr.update(value="", visible=True), # title_input
            gr.update(value="", visible=True), # lyrics_input
            gr.update(visible=True), # submit_english_btn
            gr.update(visible=True), # submit_korean_btn
            gr.update(visible=False), # hidden_title
            gr.update(visible=False), # hidden_lyric
            gr.update(value=0, visible=False), # selected_line
            gr.update(value="", visible=False), # selected_lyric
            gr.update(visible=False), # feedback_text
            gr.update(visible=False), # feedback_btn
            gr.update(visible=False)) # new_btn

def feedback(lyrics, line, feedback):
    prompt = PromptTemplate.from_template("""Modify the target lyric to include the following feedback.
                                          The sentence length must remain the same with the target line.
                                          Answer with a single line of lyrics you created, and nothing else.
                                          Whole Lyrics: {lyrics},
                                          Target Lyric: {line},
                                          Feedback: {feedback},
                                          Your new lyric that modified the target line:""")
    formatted_prompt = prompt.format(lyrics=lyrics, line=line, feedback=feedback)

    feedback_chain = (
        llm
        | StrOutputParser()
    )

    result = feedback_chain.invoke(formatted_prompt)
    return result

def apply_feedback(lyrics_input, selected_lyric, feedback_text):
    if (selected_line_value == 0):
        return (gr.update(), gr.update(), gr.update(value="Choose a line you want to revise using the slider!"))
    modified_lyric = feedback(lyrics_input, selected_lyric, feedback_text)
    stored_lyrics[selected_line_value-1] = modified_lyric
    numbered_lyric = ""
    for lyric in stored_lyrics:
        numbered_lyric += f"{lyric}\n"

    return (gr.update(value=f"<p style='white-space: pre-wrap;'>{numbered_lyric}</p>"), 
                gr.update(value=0),
                gr.update(value=f"Feedback applied! Selected line ({selected_line}): {modified_lyric}"))

with gr.Blocks() as demo:
    with gr.Row():
        audio_input1 = gr.Audio(label="Original Audio", visible=True)
        audio_input2 = gr.Audio(label="Voice Sample (Optional)", visible=True)
    with gr.Row():
        title_input = gr.Textbox(label="Song Title", visible=True)
        lyrics_input = gr.Textbox(label="Song Lyrics", visible=True)

    submit_english_btn = gr.Button("Make English Lyrics")
    submit_korean_btn = gr.Button("Make Korean Lyrics")

    hidden_title= gr.HTML(visible=False)
    hidden_lyric= gr.HTML(visible=False)
    selected_line= gr.Slider(visible=False, interactive=True)
    selected_lyric= gr.HTML(visible=False)
    feedback_text = gr.Textbox(label="Feedback", visible=False, interactive=True)
    feedback_btn = gr.Button("Feedback", visible=False, interactive=True)
    new_btn = gr.Button("Make New", visible=False)

    submit_english_btn.click(
        process_english, 
        [title_input, lyrics_input], 
        [audio_input1, audio_input2, title_input, lyrics_input, submit_english_btn, submit_korean_btn, hidden_title, hidden_lyric, selected_line, selected_lyric, feedback_text, feedback_btn, new_btn]
    )

    submit_korean_btn.click(
        process_korean, 
        [title_input, lyrics_input], 
        [audio_input1, audio_input2, title_input, lyrics_input, submit_english_btn, submit_korean_btn, hidden_title, hidden_lyric, selected_line, selected_lyric, feedback_text, feedback_btn, new_btn]
    )

    selected_line.change(
        update_selected_lyric, 
        [selected_line], 
        [selected_lyric]
    )

    feedback_btn.click(
        apply_feedback, 
        [lyrics_input, selected_lyric, feedback_text], 
        [hidden_lyric, selected_line, selected_lyric]
    )

    new_btn.click(
        reset_interface, 
        [], 
        [audio_input1, audio_input2, title_input, lyrics_input, submit_english_btn, submit_korean_btn, hidden_title, hidden_lyric, selected_line, selected_lyric, feedback_text, feedback_btn, new_btn]
    )

demo.launch()