Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
전문
|
| 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 |
-
|
| 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
|
| 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 "
|
| 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 |
-
|
| 97 |
-
|
| 98 |
btn = gr.Button("API", visible=False)
|
| 99 |
-
btn.click(band_consulting,
|
| 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()
|