ginipick commited on
Commit
2ce181a
ยท
verified ยท
1 Parent(s): 8f7c6b0

Update ui/components.py

Browse files
Files changed (1) hide show
  1. ui/components.py +68 -21
ui/components.py CHANGED
@@ -18,9 +18,16 @@ from openai import OpenAI
18
 
19
  # OpenAI ํด๋ผ์ด์–ธํŠธ ์ดˆ๊ธฐํ™”
20
  try:
21
- client = OpenAI(api_key=os.getenv("LLM_API"))
22
- except:
 
 
 
 
 
 
23
  client = None
 
24
 
25
  TAG_DEFAULT = "funk, pop, soul, rock, melodic, guitar, drums, bass, keyboard, percussion, 105 BPM, energetic, upbeat, groovy, vibrant, dynamic, duet, male and female vocals"
26
  LYRIC_DEFAULT = """[verse - male]
@@ -62,7 +69,7 @@ In this moment we take flight
62
 
63
  # ํ™•์žฅ๋œ ์žฅ๋ฅด ํ”„๋ฆฌ์…‹ (๊ธฐ์กด + ๊ฐœ์„ ๋œ ํƒœ๊ทธ)
64
  GENRE_PRESETS = {
65
- "Modern Pop": "pop, synth, drums, guitar, 120 bpm, upbeat, catchy, vibrant, duet vocals, polished vocals, radio-ready, commercial, layered vocals",
66
  "Rock": "rock, electric guitar, drums, bass, 130 bpm, energetic, rebellious, gritty, powerful vocals, raw vocals, power chords, driving rhythm",
67
  "Hip Hop": "hip hop, 808 bass, hi-hats, synth, 90 bpm, bold, urban, intense, rhythmic vocals, trap beats, punchy drums",
68
  "Country": "country, acoustic guitar, steel guitar, fiddle, 100 bpm, heartfelt, rustic, warm, twangy vocals, storytelling, americana",
@@ -109,22 +116,29 @@ LYRIC_SYSTEM_PROMPT = """๋„ˆ๋Š” ๋…ธ๋ž˜ ๊ฐ€์‚ฌ๋ฅผ ์ž‘์‚ฌํ•˜๋Š” ์ „๋ฌธ๊ฐ€ ์—ญํ• 
109
  ...
110
  """
111
 
112
- def generate_lyrics_with_ai(prompt: str, genre: str, song_style: str, language: str = "auto") -> str:
113
  """AI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์‚ฌ ์ƒ์„ฑ"""
114
  if not client:
 
 
 
 
 
115
  return LYRIC_DEFAULT
116
 
117
  try:
118
  # ์–ธ์–ด ๊ฐ์ง€ ๋ฐ ์Šคํƒ€์ผ ์ •๋ณด ์ถ”๊ฐ€
119
  style_info = ""
120
  if "๋“€์—ฃ" in song_style:
121
- style_info = "๋‚จ๋…€ ๋“€์—ฃ ํ˜•์‹์œผ๋กœ ํŒŒํŠธ๋ฅผ ๋‚˜๋ˆ„์–ด ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”."
122
  elif "์†”๋กœ (๋‚จ์„ฑ)" in song_style:
123
  style_info = "๋‚จ์„ฑ ์†”๋กœ ๊ฐ€์ˆ˜๋ฅผ ์œ„ํ•œ ๊ฐ€์‚ฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”."
124
  elif "์†”๋กœ (์—ฌ์„ฑ)" in song_style:
125
  style_info = "์—ฌ์„ฑ ์†”๋กœ ๊ฐ€์ˆ˜๋ฅผ ์œ„ํ•œ ๊ฐ€์‚ฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”."
126
  elif "๊ทธ๋ฃน" in song_style:
127
  style_info = "๊ทธ๋ฃน์ด ๋ถ€๋ฅด๋Š” ํ˜•์‹์œผ๋กœ ํŒŒํŠธ๋ฅผ ๋‚˜๋ˆ„์–ด ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”."
 
 
128
 
129
  user_prompt = f"""
130
  ์ฃผ์ œ: {prompt}
@@ -134,8 +148,10 @@ def generate_lyrics_with_ai(prompt: str, genre: str, song_style: str, language:
134
  ์œ„ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋…ธ๋ž˜ ๊ฐ€์‚ฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ž…๋ ฅ๋œ ์–ธ์–ด์™€ ๋™์ผํ•œ ์–ธ์–ด๋กœ ์ž‘์„ฑํ•˜๊ณ , ๊ตฌ์กฐ ํƒœ๊ทธ๋ฅผ ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•ด์ฃผ์„ธ์š”.
135
  """
136
 
 
 
137
  response = client.chat.completions.create(
138
- model="gpt-4-mini",
139
  messages=[
140
  {"role": "system", "content": LYRIC_SYSTEM_PROMPT},
141
  {"role": "user", "content": user_prompt}
@@ -144,7 +160,10 @@ def generate_lyrics_with_ai(prompt: str, genre: str, song_style: str, language:
144
  max_tokens=1000
145
  )
146
 
147
- return response.choices[0].message.content
 
 
 
148
  except Exception as e:
149
  print(f"AI ๊ฐ€์‚ฌ ์ƒ์„ฑ ์˜ค๋ฅ˜: {e}")
150
  return LYRIC_DEFAULT
@@ -226,9 +245,9 @@ generation_cache = MusicGenerationCache()
226
 
227
  def enhance_prompt_with_genre(base_prompt: str, genre: str, song_style: str) -> str:
228
  """์žฅ๋ฅด์™€ ์Šคํƒ€์ผ์— ๋”ฐ๋ฅธ ์Šค๋งˆํŠธ ํ”„๋กฌํ”„ํŠธ ํ™•์žฅ"""
229
- if genre == "Custom" or not genre:
230
- enhanced_prompt = base_prompt
231
- else:
232
  # ์žฅ๋ฅด๋ณ„ ์ถ”๊ฐ€ ๊ฐœ์„  ํƒœ๊ทธ
233
  genre_enhancements = {
234
  "Modern Pop": ["polished production", "mainstream appeal", "hook-driven"],
@@ -248,8 +267,6 @@ def enhance_prompt_with_genre(base_prompt: str, genre: str, song_style: str) ->
248
  if genre in genre_enhancements:
249
  additional_tags = ", ".join(genre_enhancements[genre])
250
  enhanced_prompt = f"{base_prompt}, {additional_tags}"
251
- else:
252
- enhanced_prompt = base_prompt
253
 
254
  # ์Šคํƒ€์ผ ํƒœ๊ทธ ์ถ”๊ฐ€
255
  if song_style in SONG_STYLES:
@@ -278,10 +295,19 @@ def calculate_quality_score(audio_path: str) -> float:
278
  except:
279
  return 50.0 # ๊ธฐ๋ณธ๊ฐ’
280
 
281
- def update_tags_from_preset(preset_name):
 
282
  if preset_name == "Custom":
283
- return ""
284
- return GENRE_PRESETS.get(preset_name, "")
 
 
 
 
 
 
 
 
285
 
286
  def update_quality_preset(preset_name):
287
  """ํ’ˆ์งˆ ํ”„๋ฆฌ์…‹ ์ ์šฉ"""
@@ -690,9 +716,12 @@ def create_text2music_ui(
690
 
691
  # AI ์ž‘์‚ฌ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ
692
  def generate_ai_lyrics(lyric_prompt, genre_preset, song_style):
693
- if not lyric_prompt:
694
- return "์ž‘์‚ฌ ์ฃผ์ œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
695
- return generate_lyrics_with_ai(lyric_prompt, genre_preset, song_style)
 
 
 
696
 
697
  generate_lyrics_btn.click(
698
  fn=generate_ai_lyrics,
@@ -752,10 +781,20 @@ def create_text2music_ui(
752
  None, # ref_audio_input
753
  )
754
 
755
- # ๋ชจ๋“  UI ์š”์†Œ๊ฐ€ ์ •์˜๋œ ํ›„ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์„ค์ •
 
 
 
756
  genre_preset.change(
757
- fn=update_tags_from_preset,
758
- inputs=[genre_preset],
 
 
 
 
 
 
 
759
  outputs=[prompt]
760
  )
761
 
@@ -1570,6 +1609,14 @@ def create_main_demo_ui(
1570
  - **์žฅ๋ฅด ํŠนํ™”**: ์žฅ๋ฅด ํ”„๋ฆฌ์…‹ ์„ ํƒ ํ›„ "์Šค๋งˆํŠธ ํ–ฅ์ƒ" ์ฒดํฌ
1571
  - **๊ฐ€์‚ฌ ๊ตฌ์กฐ**: [verse], [chorus], [bridge] ํƒœ๊ทธ ์ ๊ทน ํ™œ์šฉ
1572
  - **๋‹ค๊ตญ์–ด ์ง€์›**: ํ•œ๊ตญ์–ด๋กœ ์ฃผ์ œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ•œ๊ตญ์–ด ๊ฐ€์‚ฌ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค
 
 
 
 
 
 
 
 
1573
  """)
1574
 
1575
  with gr.Tab("๐ŸŽต Enhanced Text2Music", elem_classes="gr-tab"):
 
18
 
19
  # OpenAI ํด๋ผ์ด์–ธํŠธ ์ดˆ๊ธฐํ™”
20
  try:
21
+ api_key = os.getenv("LLM_API") or os.getenv("OPENAI_API_KEY")
22
+ if api_key:
23
+ client = OpenAI(api_key=api_key)
24
+ print("OpenAI API client initialized successfully")
25
+ else:
26
+ client = None
27
+ print("Warning: No OpenAI API key found. AI lyrics generation will be disabled.")
28
+ except Exception as e:
29
  client = None
30
+ print(f"Warning: Failed to initialize OpenAI client: {e}")
31
 
32
  TAG_DEFAULT = "funk, pop, soul, rock, melodic, guitar, drums, bass, keyboard, percussion, 105 BPM, energetic, upbeat, groovy, vibrant, dynamic, duet, male and female vocals"
33
  LYRIC_DEFAULT = """[verse - male]
 
69
 
70
  # ํ™•์žฅ๋œ ์žฅ๋ฅด ํ”„๋ฆฌ์…‹ (๊ธฐ์กด + ๊ฐœ์„ ๋œ ํƒœ๊ทธ)
71
  GENRE_PRESETS = {
72
+ "Modern Pop": "pop, synth, drums, guitar, 120 bpm, upbeat, catchy, vibrant, polished vocals, radio-ready, commercial, layered vocals",
73
  "Rock": "rock, electric guitar, drums, bass, 130 bpm, energetic, rebellious, gritty, powerful vocals, raw vocals, power chords, driving rhythm",
74
  "Hip Hop": "hip hop, 808 bass, hi-hats, synth, 90 bpm, bold, urban, intense, rhythmic vocals, trap beats, punchy drums",
75
  "Country": "country, acoustic guitar, steel guitar, fiddle, 100 bpm, heartfelt, rustic, warm, twangy vocals, storytelling, americana",
 
116
  ...
117
  """
118
 
119
+ def generate_lyrics_with_ai(prompt: str, genre: str, song_style: str) -> str:
120
  """AI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์‚ฌ ์ƒ์„ฑ"""
121
  if not client:
122
+ print("OpenAI client not available, returning default lyrics")
123
+ return LYRIC_DEFAULT
124
+
125
+ if not prompt or prompt.strip() == "":
126
+ print("Empty prompt, returning default lyrics")
127
  return LYRIC_DEFAULT
128
 
129
  try:
130
  # ์–ธ์–ด ๊ฐ์ง€ ๋ฐ ์Šคํƒ€์ผ ์ •๋ณด ์ถ”๊ฐ€
131
  style_info = ""
132
  if "๋“€์—ฃ" in song_style:
133
+ style_info = "๋‚จ๋…€ ๋“€์—ฃ ํ˜•์‹์œผ๋กœ ํŒŒํŠธ๋ฅผ ๋‚˜๋ˆ„์–ด ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. [verse - male], [verse - female], [chorus - duet] ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์„ธ์š”."
134
  elif "์†”๋กœ (๋‚จ์„ฑ)" in song_style:
135
  style_info = "๋‚จ์„ฑ ์†”๋กœ ๊ฐ€์ˆ˜๋ฅผ ์œ„ํ•œ ๊ฐ€์‚ฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”."
136
  elif "์†”๋กœ (์—ฌ์„ฑ)" in song_style:
137
  style_info = "์—ฌ์„ฑ ์†”๋กœ ๊ฐ€์ˆ˜๋ฅผ ์œ„ํ•œ ๊ฐ€์‚ฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”."
138
  elif "๊ทธ๋ฃน" in song_style:
139
  style_info = "๊ทธ๋ฃน์ด ๋ถ€๋ฅด๋Š” ํ˜•์‹์œผ๋กœ ํŒŒํŠธ๋ฅผ ๋‚˜๋ˆ„์–ด ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”."
140
+ elif "์ธ์ŠคํŠธ๋ฃจ๋ฉ˜ํƒˆ" in song_style:
141
+ return "[instrumental]\n\n[inst]\n\n[instrumental break]\n\n[inst]"
142
 
143
  user_prompt = f"""
144
  ์ฃผ์ œ: {prompt}
 
148
  ์œ„ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋…ธ๋ž˜ ๊ฐ€์‚ฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ž…๋ ฅ๋œ ์–ธ์–ด์™€ ๋™์ผํ•œ ์–ธ์–ด๋กœ ์ž‘์„ฑํ•˜๊ณ , ๊ตฌ์กฐ ํƒœ๊ทธ๋ฅผ ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•ด์ฃผ์„ธ์š”.
149
  """
150
 
151
+ print(f"Generating lyrics with prompt: {prompt}")
152
+
153
  response = client.chat.completions.create(
154
+ model="gpt-4o-mini", # ๋ชจ๋ธ๋ช… ์ˆ˜์ •
155
  messages=[
156
  {"role": "system", "content": LYRIC_SYSTEM_PROMPT},
157
  {"role": "user", "content": user_prompt}
 
160
  max_tokens=1000
161
  )
162
 
163
+ generated_lyrics = response.choices[0].message.content
164
+ print(f"Generated lyrics successfully")
165
+ return generated_lyrics
166
+
167
  except Exception as e:
168
  print(f"AI ๊ฐ€์‚ฌ ์ƒ์„ฑ ์˜ค๋ฅ˜: {e}")
169
  return LYRIC_DEFAULT
 
245
 
246
  def enhance_prompt_with_genre(base_prompt: str, genre: str, song_style: str) -> str:
247
  """์žฅ๋ฅด์™€ ์Šคํƒ€์ผ์— ๋”ฐ๋ฅธ ์Šค๋งˆํŠธ ํ”„๋กฌํ”„ํŠธ ํ™•์žฅ"""
248
+ enhanced_prompt = base_prompt
249
+
250
+ if genre != "Custom" and genre:
251
  # ์žฅ๋ฅด๋ณ„ ์ถ”๊ฐ€ ๊ฐœ์„  ํƒœ๊ทธ
252
  genre_enhancements = {
253
  "Modern Pop": ["polished production", "mainstream appeal", "hook-driven"],
 
267
  if genre in genre_enhancements:
268
  additional_tags = ", ".join(genre_enhancements[genre])
269
  enhanced_prompt = f"{base_prompt}, {additional_tags}"
 
 
270
 
271
  # ์Šคํƒ€์ผ ํƒœ๊ทธ ์ถ”๊ฐ€
272
  if song_style in SONG_STYLES:
 
295
  except:
296
  return 50.0 # ๊ธฐ๋ณธ๊ฐ’
297
 
298
+ def update_tags_from_preset(preset_name, current_tags, song_style):
299
+ """์žฅ๋ฅด ํ”„๋ฆฌ์…‹ ์„ ํƒ์‹œ ํƒœ๊ทธ ์—…๋ฐ์ดํŠธ"""
300
  if preset_name == "Custom":
301
+ return current_tags
302
+
303
+ base_tags = GENRE_PRESETS.get(preset_name, "")
304
+
305
+ # ์Šคํƒ€์ผ ํƒœ๊ทธ ์ถ”๊ฐ€
306
+ if song_style in SONG_STYLES:
307
+ style_tags = SONG_STYLES[song_style]
308
+ return f"{base_tags}, {style_tags}"
309
+
310
+ return base_tags
311
 
312
  def update_quality_preset(preset_name):
313
  """ํ’ˆ์งˆ ํ”„๋ฆฌ์…‹ ์ ์šฉ"""
 
716
 
717
  # AI ์ž‘์‚ฌ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ
718
  def generate_ai_lyrics(lyric_prompt, genre_preset, song_style):
719
+ if not lyric_prompt or lyric_prompt.strip() == "":
720
+ return lyrics.value # ํ˜„์žฌ ๊ฐ€์‚ฌ ์œ ์ง€
721
+
722
+ print(f"Generating lyrics with: prompt={lyric_prompt}, genre={genre_preset}, style={song_style}")
723
+ generated = generate_lyrics_with_ai(lyric_prompt, genre_preset, song_style)
724
+ return generated
725
 
726
  generate_lyrics_btn.click(
727
  fn=generate_ai_lyrics,
 
781
  None, # ref_audio_input
782
  )
783
 
784
+ # ์žฅ๋ฅด ํ”„๋ฆฌ์…‹ ๋ณ€๊ฒฝ ์‹œ ํƒœ๊ทธ ์—…๋ฐ์ดํŠธ
785
+ def on_genre_change(genre_preset, current_tags, song_style):
786
+ return update_tags_from_preset(genre_preset, current_tags, song_style)
787
+
788
  genre_preset.change(
789
+ fn=on_genre_change,
790
+ inputs=[genre_preset, prompt, song_style],
791
+ outputs=[prompt]
792
+ )
793
+
794
+ # ๊ณก ์Šคํƒ€์ผ ๋ณ€๊ฒฝ ์‹œ ํƒœ๊ทธ ์—…๋ฐ์ดํŠธ
795
+ song_style.change(
796
+ fn=on_genre_change,
797
+ inputs=[genre_preset, prompt, song_style],
798
  outputs=[prompt]
799
  )
800
 
 
1609
  - **์žฅ๋ฅด ํŠนํ™”**: ์žฅ๋ฅด ํ”„๋ฆฌ์…‹ ์„ ํƒ ํ›„ "์Šค๋งˆํŠธ ํ–ฅ์ƒ" ์ฒดํฌ
1610
  - **๊ฐ€์‚ฌ ๊ตฌ์กฐ**: [verse], [chorus], [bridge] ํƒœ๊ทธ ์ ๊ทน ํ™œ์šฉ
1611
  - **๋‹ค๊ตญ์–ด ์ง€์›**: ํ•œ๊ตญ์–ด๋กœ ์ฃผ์ œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ•œ๊ตญ์–ด ๊ฐ€์‚ฌ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค
1612
+
1613
+ ### โš ๏ธ OpenAI API ์„ค์ •
1614
+ AI ์ž‘์‚ฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ™˜๊ฒฝ๋ณ€์ˆ˜์— OpenAI API ํ‚ค๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
1615
+ ```bash
1616
+ export LLM_API="your-openai-api-key"
1617
+ # ๋˜๋Š”
1618
+ export OPENAI_API_KEY="your-openai-api-key"
1619
+ ```
1620
  """)
1621
 
1622
  with gr.Tab("๐ŸŽต Enhanced Text2Music", elem_classes="gr-tab"):