Spaces:
Running
on
L40S
Running
on
L40S
import os | |
import gradio as gr | |
import json | |
import numpy as np | |
from datetime import datetime | |
import os | |
import sys | |
import librosa | |
EXAMPLE_DESC = """female, dark, pop, sad, piano and drums, the bpm is 125.""" | |
EXAMPLE_LYRICS = """ | |
[intro-short] | |
[verse] | |
夜晚的街灯闪烁. | |
我漫步在熟悉的角落. | |
回忆像潮水般涌来. | |
你的笑容如此清晰. | |
在心头无法抹去. | |
那些曾经的甜蜜. | |
如今只剩我独自回忆. | |
[bridge] | |
手机屏幕亮起. | |
是你发来的消息. | |
简单的几个字. | |
却让我泪流满面. | |
曾经的拥抱温暖. | |
如今却变得遥远. | |
我多想回到从前. | |
重新拥有你的陪伴. | |
[chorus] | |
回忆的温度还在. | |
你却已不在. | |
我的心被爱填满. | |
却又被思念刺痛. | |
R&B的节奏奏响. | |
我的心却在流浪. | |
没有你的日子. | |
我该如何继续向前. | |
[outro-short] | |
""".strip() | |
# 模拟歌曲生成函数 | |
def generate_song(description, lyric, prompt_audio=None): | |
# 这里模拟生成过程 - 实际应用中替换为你的模型调用 | |
print(f"Generating song with description: {description}") | |
print(f"Lyrics provided: {lyric}") | |
if prompt_audio is not None: | |
print("Using prompt audio for generation") | |
# 从文件中加载示例音频 | |
audio_path = os.path.join(os.path.dirname(__file__), "sample/example.mp3") | |
audio_data, sample_rate = librosa.load(audio_path, sr=None) # 保持原始采样率 | |
# 创建输入配置的JSON | |
input_config = { | |
"description": description, | |
"lyric": lyric, | |
"has_prompt_audio": prompt_audio is not None, | |
"timestamp": datetime.now().isoformat(), | |
} | |
return (sample_rate, audio_data), json.dumps(input_config, indent=2) | |
# 创建Gradio界面 | |
with gr.Blocks(title="LeVo Demo Space") as demo: | |
gr.Markdown("# 🎵 LeVo Demo Space") | |
gr.Markdown("Demo interface for the LeVo song generation model. Provide a description, lyrics, and optionally an audio prompt to generate a custom song.") | |
with gr.Row(): | |
with gr.Column(): | |
description = gr.Textbox( | |
label="Song Description", | |
placeholder="Describe the style, mood, and characteristics of the song...", | |
lines=1, | |
max_lines=2, | |
value=EXAMPLE_DESC, | |
) | |
lyric = gr.Textbox( | |
label="Lyrics", | |
placeholder="Enter the lyrics for the song...", | |
lines=5, | |
max_lines=8, | |
value=EXAMPLE_LYRICS, | |
) | |
with gr.Tabs(elem_id="extra-tabs"): | |
with gr.Tab("Audio Prompt"): | |
prompt_audio = gr.Audio( | |
label="Prompt Audio (Optional)", | |
type="filepath", | |
elem_id="audio-prompt" | |
) | |
with gr.Tab("Advanced Config"): | |
text_prompt = gr.Textbox( | |
label="Text Prompt", | |
placeholder="Enter the Text Prompt, eg: emotional piano pop", | |
) | |
generate_btn = gr.Button("Generate Song", variant="primary") | |
with gr.Column(): | |
output_audio = gr.Audio(label="Generated Song", type="numpy") | |
output_json = gr.JSON(label="Input Configuration") | |
# 示例按钮 | |
examples = gr.Examples( | |
examples=[ | |
["An uplifting pop song with catchy melodies"], | |
["Melancholic piano ballad"], | |
], | |
inputs=[description], | |
label="Description examples" | |
) | |
examples = gr.Examples( | |
examples=[ | |
["Shine bright like the stars above\nYou're the one that I'm dreaming of"], | |
["The rain keeps falling on my window pane\nReminding me of love that's gone away"], | |
], | |
inputs=[lyric], | |
label="Lyrics examples" | |
) | |
# 生成按钮点击事件 | |
generate_btn.click( | |
fn=generate_song, | |
inputs=[description, lyric, prompt_audio], | |
outputs=[output_audio, output_json] | |
) | |
# 启动应用 | |
if __name__ == "__main__": | |
demo.launch(server_name="0.0.0.0", server_port=7860) |