benjamin5607 commited on
Commit
e38ca43
·
verified ·
1 Parent(s): 3827fce

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +10 -17
app.py CHANGED
@@ -4,7 +4,6 @@ import gradio as gr
4
  from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
5
  from groq import Groq
6
 
7
- # 싱글톤 모델 관리자: CPU 메모리 부족으로 인한 크래시 방지
8
  class ModelManager:
9
  _llm_pipeline = None
10
  _music_pipeline = None
@@ -29,7 +28,6 @@ class ModelManager:
29
  @classmethod
30
  def get_music(cls):
31
  if cls._music_pipeline is None:
32
- # CPU 환경에서 가장 안정적인 small 모델 사용
33
  cls._music_pipeline = pipeline("text-to-audio", "facebook/musicgen-small", device="cpu")
34
  return cls._music_pipeline
35
 
@@ -45,11 +43,10 @@ async def band_consulting(user_input, member_name, lang_code, g_inst, b_inst, d_
45
  voice_path = f"/tmp/v_{req_id}.mp3"
46
  music_path = f"/tmp/m_{req_id}.wav"
47
 
48
- # JAM 지시사항과 상담 언어 반영
49
  jam_context = f"Guitar: {g_inst}, Bass: {b_inst}, Drums: {d_inst}, Chords: {chords}"
50
- system_prompt = f"""당신은 락스타 {member_name}입니다. 반드시 {lang_code} 언어 답변하세요.
51
- 전문 뮤지션으로서 5~7문장의 깊이 있 성숙한 상담을 제공하세요.
52
- [TAB] 섹션에는 코드 진행이나 타블라악보를 상세히 적으세요.
53
  [MUSIC] 섹션에는 다음 JAM 요청을 반영한 영어 프롬프트를 작성하세요: {jam_context}"""
54
 
55
  ai_text_raw = ""
@@ -65,25 +62,21 @@ async def band_consulting(user_input, member_name, lang_code, g_inst, b_inst, d_
65
 
66
  if not ai_text_raw:
67
  qwen = ModelManager.get_qwen()
68
- input_text = f"<|im_start|>system\n{system_prompt}<|im_end|>\n<|im_start|>user\n{user_input}<|im_end|>\nassistant\n"
69
- out = qwen(input_text, max_new_tokens=1024, do_sample=True)
70
  ai_text_raw = out[0]['generated_text'].split("assistant\n")[-1]
71
 
72
- # 정규식 파싱
73
  tab_match = re.search(r'\[TAB\](.*?)(\[|$)', ai_text_raw, re.DOTALL | re.IGNORECASE)
74
  music_match = re.search(r'\[MUSIC:(.*?)\]', ai_text_raw, re.IGNORECASE)
75
- tab_display = tab_match.group(1).strip() if tab_match else "No Tab Data"
76
  clean_text = re.sub(r'\[TAB\].*?(\[|$)', '', ai_text_raw, flags=re.DOTALL | re.IGNORECASE)
77
  clean_text = re.sub(r'\[MUSIC:.*?\]', '', clean_text, flags=re.IGNORECASE).strip()
78
 
79
- # TTS 생성
80
  voice_name = MEMBERS_VOICE.get(member_name, "ko-KR-SunHiNeural")
81
  communicate = edge_tts.Communicate(re.sub(r'[\*\#\-\_\~\|]', '', clean_text), voice_name)
82
  await communicate.save(voice_path)
83
 
84
- # MusicGen 생성 (512토큰 = 약 12초)
85
  music_gen = ModelManager.get_music()
86
- music_p = music_match.group(1).strip() if music_match else "energetic rock guitar solo"
87
  music_output = music_gen(music_p, forward_params={"max_new_tokens": 512})
88
  audio_data = np.squeeze(music_output["audio"])
89
  audio_int16 = (audio_data * 32767).astype(np.int16)
@@ -92,10 +85,10 @@ async def band_consulting(user_input, member_name, lang_code, g_inst, b_inst, d_
92
  return clean_text, voice_path, music_path, tab_display
93
 
94
  with gr.Blocks() as demo:
95
- # 7개의 입력 (상담, 멤버, 상담언어, 기타, 베이스, 드럼, 코드)
96
- in_list = [gr.Textbox(visible=False) for _ in range(7)]
97
- out_list = [gr.Textbox(visible=False), gr.Audio(visible=False), gr.Audio(visible=False), gr.Textbox(visible=False)]
98
  btn = gr.Button("API", visible=False)
99
- btn.click(band_consulting, in_list, out_list, api_name="predict")
100
 
101
  demo.queue().launch()
 
4
  from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
5
  from groq import Groq
6
 
 
7
  class ModelManager:
8
  _llm_pipeline = None
9
  _music_pipeline = None
 
28
  @classmethod
29
  def get_music(cls):
30
  if cls._music_pipeline is None:
 
31
  cls._music_pipeline = pipeline("text-to-audio", "facebook/musicgen-small", device="cpu")
32
  return cls._music_pipeline
33
 
 
43
  voice_path = f"/tmp/v_{req_id}.mp3"
44
  music_path = f"/tmp/m_{req_id}.wav"
45
 
 
46
  jam_context = f"Guitar: {g_inst}, Bass: {b_inst}, Drums: {d_inst}, Chords: {chords}"
47
+ system_prompt = f"""당신은 락스타 {member_name}입니다. 반드시 {lang_code}로 답변하세요.
48
+ 전문로서 5~7문장의 깊이 있 상담을 제공하세요.
49
+ [TAB] 섹션에는 상세한 악보나 코드를 적으세요.
50
  [MUSIC] 섹션에는 다음 JAM 요청을 반영한 영어 프롬프트를 작성하세요: {jam_context}"""
51
 
52
  ai_text_raw = ""
 
62
 
63
  if not ai_text_raw:
64
  qwen = ModelManager.get_qwen()
65
+ out = qwen(f"<|im_start|>system\n{system_prompt}<|im_end|>\n<|im_start|>user\n{user_input}<|im_end|>\nassistant\n", max_new_tokens=1024)
 
66
  ai_text_raw = out[0]['generated_text'].split("assistant\n")[-1]
67
 
 
68
  tab_match = re.search(r'\[TAB\](.*?)(\[|$)', ai_text_raw, re.DOTALL | re.IGNORECASE)
69
  music_match = re.search(r'\[MUSIC:(.*?)\]', ai_text_raw, re.IGNORECASE)
70
+ tab_display = tab_match.group(1).strip() if tab_match else "No Data"
71
  clean_text = re.sub(r'\[TAB\].*?(\[|$)', '', ai_text_raw, flags=re.DOTALL | re.IGNORECASE)
72
  clean_text = re.sub(r'\[MUSIC:.*?\]', '', clean_text, flags=re.IGNORECASE).strip()
73
 
 
74
  voice_name = MEMBERS_VOICE.get(member_name, "ko-KR-SunHiNeural")
75
  communicate = edge_tts.Communicate(re.sub(r'[\*\#\-\_\~\|]', '', clean_text), voice_name)
76
  await communicate.save(voice_path)
77
 
 
78
  music_gen = ModelManager.get_music()
79
+ music_p = music_match.group(1).strip() if music_match else "rock"
80
  music_output = music_gen(music_p, forward_params={"max_new_tokens": 512})
81
  audio_data = np.squeeze(music_output["audio"])
82
  audio_int16 = (audio_data * 32767).astype(np.int16)
 
85
  return clean_text, voice_path, music_path, tab_display
86
 
87
  with gr.Blocks() as demo:
88
+ # 7개의 입력 (고민, 멤버, 상담언어, 기타, 베이스, 드럼, 코드)
89
+ inputs = [gr.Textbox(visible=False) for _ in range(7)]
90
+ outputs = [gr.Textbox(visible=False), gr.Audio(visible=False), gr.Audio(visible=False), gr.Textbox(visible=False)]
91
  btn = gr.Button("API", visible=False)
92
+ btn.click(band_consulting, inputs, outputs, api_name="predict")
93
 
94
  demo.queue().launch()