Yongkang ZOU commited on
Commit
6706ed2
·
0 Parent(s):

🧹 Clean initial commit without binary files

Browse files
Files changed (3) hide show
  1. .gitattributes +36 -0
  2. README.md +14 -0
  3. app.py +111 -0
.gitattributes ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ hum.wav filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Agent Chatbot Demo
3
+ emoji: 🔥
4
+ colorFrom: blue
5
+ colorTo: blue
6
+ sdk: gradio
7
+ sdk_version: 5.32.1
8
+ app_file: app.py
9
+ pinned: false
10
+ license: apache-2.0
11
+ short_description: Demo Template for Agentic Chatbot
12
+ ---
13
+
14
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from gradio import ChatMessage
3
+ import requests
4
+ import os
5
+ import time
6
+
7
+ # === MCP服务地址 ===
8
+ MCP_BASE = "https://agents-mcp-hackathon-vibe-jamming-mcp.hf.space/mcp"
9
+
10
+ # === 文件保存路径 ===
11
+ GENERATED_MUSIC_PATH = "output/music.wav"
12
+ GENERATED_XML_PATH = "output/music.musicxml"
13
+
14
+ # === MCP工具调用 ===
15
+ def mcp_generate_music_from_hum(filepath, prompt):
16
+ upload_url = "https://huggingface.co/spaces/YongkangZOU/MusicAgent-Chatbot/blob/main/hum.wav" # TODO: 替换为真实上传后的地址
17
+
18
+ # 临时替代方案:上传前,先使用本地路径模拟
19
+ with open(filepath, "rb") as f:
20
+ files = {"melody": ("hum.wav", f, "audio/wav")}
21
+ data = {"prompt": prompt}
22
+ r = requests.post(f"{MCP_BASE}/Vibe_Jamming_MCP_generate_music_from_hum", files=files, data=data)
23
+
24
+ if r.status_code != 200:
25
+ return None, f"❌ MusicGen failed: {r.text}"
26
+
27
+ wav_url = r.text.strip('"') if r.text.startswith('"') else r.text
28
+ r2 = requests.get(wav_url)
29
+ with open(GENERATED_MUSIC_PATH, "wb") as out:
30
+ out.write(r2.content)
31
+ return GENERATED_MUSIC_PATH, None
32
+
33
+
34
+ def mcp_generate_score_from_audio(filepath):
35
+ with open(filepath, "rb") as f:
36
+ files = {"wav_file": ("music.wav", f, "audio/wav")}
37
+ r = requests.post(f"{MCP_BASE}/Vibe_Jamming_MCP_generate_score_from_audio", files=files)
38
+ if r.status_code != 200:
39
+ return None, f"❌ ScoreGen failed: {r.text}"
40
+ with open(GENERATED_XML_PATH, "wb") as out:
41
+ out.write(r.content)
42
+ return GENERATED_XML_PATH, None
43
+
44
+
45
+ def mcp_render_musicxml(filepath):
46
+ with open(filepath, "rb") as f:
47
+ files = {"musicxml_path": ("score.musicxml", f, "application/xml")}
48
+ r = requests.post(f"{MCP_BASE}/Vibe_Jamming_MCP_render_musicxml_via_verovio_api", files=files)
49
+ if r.status_code != 200:
50
+ return None, f"❌ Verovio failed: {r.text}"
51
+ return r.json().get("data"), None
52
+
53
+
54
+ # === 主调用流程 ===
55
+ def generate_music_pipeline(hum_file, prompt, history):
56
+ history.append(ChatMessage(role="user", content=f"🎙️上传了哼唱音频,并输入风格描述:{prompt}"))
57
+ yield history
58
+ time.sleep(0.5)
59
+
60
+ history.append(ChatMessage(role="assistant", content="🎧 正在生成音乐..."))
61
+ yield history
62
+
63
+ music_path, err = mcp_generate_music_from_hum(hum_file, prompt)
64
+ if err:
65
+ history.append(ChatMessage(role="assistant", content=err))
66
+ yield history
67
+ return
68
+ history.append(ChatMessage(role="assistant", content="✅ 音乐生成成功 🎶"))
69
+ yield history
70
+
71
+ history.append(ChatMessage(role="assistant", content="📄 正在提取音乐乐谱..."))
72
+ yield history
73
+
74
+ xml_path, err = mcp_generate_score_from_audio(music_path)
75
+ if err:
76
+ history.append(ChatMessage(role="assistant", content=err))
77
+ yield history
78
+ return
79
+ history.append(ChatMessage(role="assistant", content="✅ 乐谱提取成功 🧾"))
80
+ yield history
81
+
82
+ history.append(ChatMessage(role="assistant", content="🖼️ 正在渲染乐谱..."))
83
+ yield history
84
+
85
+ svg_html, err = mcp_render_musicxml(xml_path)
86
+ if err:
87
+ history.append(ChatMessage(role="assistant", content=err))
88
+ yield history
89
+ return
90
+ history.append(ChatMessage(role="assistant", content=svg_html, metadata={"title": "🎼 乐谱预览"}))
91
+ yield history
92
+
93
+ history.append(ChatMessage(role="assistant", content="🎉 音乐与乐谱展示完成!快来试听吧~"))
94
+ yield history
95
+
96
+
97
+ # === Gradio App ===
98
+ with gr.Blocks() as demo:
99
+ gr.Markdown("## 🎵 Vibe Jamming ChatBot - AI音乐+乐谱生成伴侣")
100
+
101
+ chatbot = gr.Chatbot(type="messages", height=500, show_copy_button=True)
102
+
103
+ with gr.Row():
104
+ hum_audio = gr.Audio(type="filepath", label="🎤 上传哼唱")
105
+ prompt_text = gr.Textbox(label="🎶 描述你想要的音乐风格")
106
+
107
+ submit_btn = gr.Button("🚀 开始生成")
108
+ submit_btn.click(fn=generate_music_pipeline, inputs=[hum_audio, prompt_text, chatbot], outputs=chatbot)
109
+
110
+ if __name__ == "__main__":
111
+ demo.launch()