Spaces:
Build error
Build error
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() |