DiffRhythm / app.py
hkchen
fix bug in best practice guide
f0f1b62
raw
history blame
29.9 kB
import gradio as gr
from openai import OpenAI
import requests
import json
# from volcenginesdkarkruntime import Ark
import torch
import torchaudio
from einops import rearrange
import argparse
import json
import os
import spaces
from tqdm import tqdm
import random
import numpy as np
import sys
import base64
from diffrhythm.infer.infer_utils import (
get_reference_latent,
get_lrc_token,
get_audio_style_prompt,
get_text_style_prompt,
prepare_model,
get_negative_style_prompt
)
from diffrhythm.infer.infer import inference
MAX_SEED = np.iinfo(np.int32).max
device='cuda'
cfm, tokenizer, muq, vae, eval_model, eval_muq = prepare_model(max_frames=6144, device=device)
cfm = torch.compile(cfm)
@spaces.GPU
def infer_music(lrc, ref_audio_path, text_prompt, current_prompt_type, seed=42,
randomize_seed=False, steps=32, cfg_strength=4.0, file_type='wav',
odeint_method='euler', preference_infer="quality first", Music_Duration=285, edit=False,
edit_segments=None, device='cuda'):
max_frames = 2048 if Music_Duration == 95 else 6144
sway_sampling_coef = -1 if steps < 32 else None
if randomize_seed:
seed = random.randint(0, MAX_SEED)
torch.manual_seed(seed)
vocal_flag = False
try:
lrc_prompt, start_time, end_frame, song_duration = get_lrc_token(max_frames, lrc, tokenizer, Music_Duration, device)
if current_prompt_type == 'audio':
style_prompt, vocal_flag = get_audio_style_prompt(muq, ref_audio_path)
else:
style_prompt = get_text_style_prompt(muq, text_prompt)
except Exception as e:
raise gr.Error(f"Error: {str(e)}")
negative_style_prompt = get_negative_style_prompt(device)
latent_prompt, pred_frames = get_reference_latent(device, max_frames, edit, edit_segments, ref_audio_path, vae)
if preference_infer == "quality first":
batch_infer_num = 5
else:
batch_infer_num = 1
generated_song = inference(cfm_model=cfm,
vae_model=vae,
eval_model=eval_model,
eval_muq=eval_muq,
cond=latent_prompt,
text=lrc_prompt,
duration=end_frame,
style_prompt=style_prompt,
negative_style_prompt=negative_style_prompt,
steps=steps,
cfg_strength=cfg_strength,
sway_sampling_coef=sway_sampling_coef,
start_time=start_time,
file_type=file_type,
vocal_flag=vocal_flag,
odeint_method=odeint_method,
pred_frames=pred_frames,
batch_infer_num=batch_infer_num,
song_duration=song_duration
)
return generated_song
def R1_infer1(theme, tags_gen, language):
try:
client = OpenAI(api_key=os.getenv('HS_DP_API'), base_url = "https://ark.cn-beijing.volces.com/api/v3")
llm_prompt = """
请围绕"{theme}"主题生成一首符合"{tags}"风格的语言为{language}的完整歌词。严格遵循以下要求:
### **强制格式规则**
1. **仅输出时间戳和歌词**,禁止任何括号、旁白、段落标记(如副歌、间奏、尾奏等注释)。
2. 每行格式必须为 `[mm:ss.xx]歌词内容`,时间戳与歌词间无空格,歌词内容需完整连贯。
3. 时间戳需自然分布,**第一句歌词起始时间不得为 [00:00.00]**,需考虑前奏空白。
### **内容与结构要求**
1. 歌词应富有变化,使情绪递进,整体连贯有层次感。**每行歌词长度应自然变化**,切勿长度一致,导致很格式化。
2. **时间戳分配应根据歌曲的标签、歌词的情感、节奏来合理推测**,而非机械地按照歌词长度分配。
3. 间奏/尾奏仅通过时间空白体现(如从 [02:30.00] 直接跳至 [02:50.00]),**无需文字描述**。
### **负面示例(禁止出现)**
- 错误:[01:30.00](钢琴间奏)
- 错误:[02:00.00][副歌]
- 错误:空行、换行符、注释
"""
response = client.chat.completions.create(
model="ep-20250304144033-nr9wl",
messages=[
{"role": "system", "content": "You are a professional musician who has been invited to make music-related comments."},
{"role": "user", "content": llm_prompt.format(theme=theme, tags=tags_gen, language=language)},
],
stream=False
)
info = response.choices[0].message.content
return info
except requests.exceptions.RequestException as e:
print(f'请求出错: {e}')
return {}
def R1_infer2(tags_lyrics, lyrics_input):
client = OpenAI(api_key=os.getenv('HS_DP_API'), base_url = "https://ark.cn-beijing.volces.com/api/v3")
llm_prompt = """
{lyrics_input}这是一首歌的歌词,每一行是一句歌词,{tags_lyrics}是我希望这首歌的风格,我现在想要给这首歌的每一句歌词打时间戳得到LRC,我希望时间戳分配应根据歌曲的标签、歌词的情感、节奏来合理推测,而非机械地按照歌词长度分配。第一句歌词的时间戳应考虑前奏长度,避免歌词从 `[00:00.00]` 直接开始。严格按照 LRC 格式输出歌词,每行格式为 `[mm:ss.xx]歌词内容`。最后的结果只输出LRC,不需要其他的解释。
"""
response = client.chat.completions.create(
model="ep-20250304144033-nr9wl",
messages=[
{"role": "system", "content": "You are a professional musician who has been invited to make music-related comments."},
{"role": "user", "content": llm_prompt.format(lyrics_input=lyrics_input, tags_lyrics=tags_lyrics)},
],
stream=False
)
info = response.choices[0].message.content
return info
css = """
/* 固定文本域高度并强制滚动条 */
.lyrics-scroll-box textarea {
height: 405px !important; /* 固定高度 */
max-height: 500px !important; /* 最大高度 */
overflow-y: auto !important; /* 垂直滚动 */
white-space: pre-wrap; /* 保留换行 */
line-height: 1.5; /* 行高优化 */
}
.gr-examples {
background: transparent !important;
border: 1px solid #e0e0e0 !important;
border-radius: 8px;
margin: 1rem 0 !important;
padding: 1rem !important;
}
"""
with gr.Blocks(css=css) as demo:
gr.HTML(f"""
<div style="display: flex; align-items: center;">
<img src='https://raw.githubusercontent.com/ASLP-lab/DiffRhythm/refs/heads/main/src/DiffRhythm_logo.jpg'
style='width: 200px; height: 40%; display: block; margin: 0 auto 20px;'>
</div>
<div style="flex: 1; text-align: center;">
<div style="font-size: 2em; font-weight: bold; text-align: center; margin-bottom: 5px">
Di♪♪Rhythm (谛韵)
</div>
<div style="display:flex; justify-content: center; column-gap:4px;">
<a href="https://arxiv.org/abs/2503.01183">
<img src='https://img.shields.io/badge/Arxiv-Paper-blue'>
</a>
<a href="https://github.com/ASLP-lab/DiffRhythm">
<img src='https://img.shields.io/badge/GitHub-Repo-green'>
</a>
<a href="https://aslp-lab.github.io/DiffRhythm.github.io/">
<img src='https://img.shields.io/badge/Project-Page-brown'>
</a>
</div>
</div>
""")
with gr.Tabs() as tabs:
# page 1
with gr.Tab("Music Generate", id=0):
with gr.Row():
with gr.Column():
lrc = gr.Textbox(
label="Lyrics",
placeholder="Input the full lyrics",
lines=12,
max_lines=50,
elem_classes="lyrics-scroll-box",
value="""[00:04.074] Tell me that I'm special\n[00:06.226] Tell me I look pretty\n[00:08.175] Tell me I'm a little angel\n[00:10.175] Sweetheart of your city\n[00:13.307] Say what I'm dying to hear\n[00:17.058] 'Cause I'm dying to hear you\n[00:20.523] Tell me I'm that new thing\n[00:22.571] Tell me that I'm relevant\n[00:24.723] Tell me that I got a big heart\n[00:26.723] Then back it up with evidence\n[00:29.408] I need it and I don't know why\n[00:33.907] This late at night\n[00:36.139] Isn't it lonely\n[00:38.991] I'd do anything to make you want me\n[00:43.222] I'd give it all up if you told me\n[00:47.339] That I'd be\n[00:49.157] The number one girl in your eyes\n[00:52.506] Your one and only\n[00:55.437] So what's it gon' take for you to want me\n[00:59.589] I'd give it all up if you told me\n[01:03.674] That I'd be\n[01:05.823] The number one girl in your eyes\n[01:10.841] Tell me I'm going real big places\n[01:14.055] Down to earth, so friendly\n[01:16.105] And even through all the phases\n[01:18.256] Tell me you accept me\n[01:21.155] Well, that's all I'm dying to hear\n[01:24.937] Yeah, I'm dying to hear you\n[01:28.521] Tell me that you need me\n[01:30.437] Tell me that I'm loved\n[01:32.740] Tell me that I'm worth it\n[01:34.605] And that I'm enough\n[01:37.571] I need it and I don't know why\n[01:41.889] This late at night\n[01:43.805] Isn't it lonely\n[01:46.871] I'd do anything to make you want me\n[01:51.004] I'd give it all up if you told me\n[01:55.237] That I'd be\n[01:57.089] The number one girl in your eyes\n[02:00.325] Your one and only\n[02:03.305] So what's it gon' take for you to want me\n[02:07.355] I'd give it all up if you told me\n[02:11.589] That I'd be\n[02:13.623] The number one girl in your eyes\n[02:16.804] The girl in your eyes\n[02:20.823] The girl in your eyes\n[02:26.055] Tell me I'm the number one girl\n[02:28.355] I'm the number one girl in your eyes\n[02:33.172] The girl in your eyes\n[02:37.321] The girl in your eyes\n[02:42.472] Tell me I'm the number one girl\n[02:44.539] I'm the number one girl in your eyes\n[02:49.605] Well isn't it lonely\n[02:52.488] I'd do anything to make you want me\n[02:56.637] I'd give it all up if you told me\n[03:00.888] That I'd be\n[03:03.172] The number one girl in your eyes\n[03:06.272] Your one and only\n[03:09.160] So what's it gon' take for you to want me\n[03:13.056] I'd give it all up if you told me\n[03:17.305] That I'd be\n[03:19.488] The number one girl in your eyes\n[03:25.420] The number one girl in your eyes\n"""
)
current_prompt_type = gr.State(value="audio")
with gr.Tabs() as inside_tabs:
with gr.Tab("Audio Prompt"):
audio_prompt = gr.Audio(label="Audio Prompt", type="filepath", value="./src/prompt/default.wav")
with gr.Tab("Text Prompt"):
text_prompt = gr.Textbox(
label="Text Prompt",
placeholder="Enter the Text Prompt, eg: emotional piano pop",
)
def update_prompt_type(evt: gr.SelectData):
return "audio" if evt.index == 0 else "text"
inside_tabs.select(
fn=update_prompt_type,
outputs=current_prompt_type
)
with gr.Column():
with gr.Accordion("Best Practices Guide", open=True):
gr.Markdown("""
1. **Lyrics Format Requirements**
- Each line must follow: `[mm:ss.xx]Lyric content`
- Example of valid format:
```
[00:10.00]Moonlight spills through broken blinds
[00:13.20]Your shadow dances on the dashboard shrine
```
2. **Generation Duration Limits**
- The generated music must be between **95 seconds (1:35)** and **285 seconds (4:45)** in length
- The latest valid lyric timestamp cannot exceed **04:45.00 (285s)**
3. **Audio Prompt Requirements**
- Reference audio should be ≥ 1 second, Audio >10 seconds will be randomly clipped into 10 seconds
- For optimal results, the 10-second clips should be carefully selected
- Shorter clips may lead to incoherent generation
4. **Supported Languages**
- Chinese and English
- More languages comming soon
5. **Others**
- If loading audio result is slow, you can select Output Format as mp3 in Advanced Settings.
""")
# Music_Duration = gr.Radio(["95s", "285s"], label="Music Duration", value="95s")
Music_Duration = gr.Slider(
minimum=95,
maximum=285,
step=1,
value=95,
label="Music Duration (s)",
interactive=True
)
preference_infer = gr.Radio(["quality first", "speed first"], label="Preference", value="quality first")
lyrics_btn = gr.Button("Generate", variant="primary")
audio_output = gr.Audio(label="Audio Result", type="filepath", elem_id="audio_output")
with gr.Accordion("Advanced Settings", open=False):
seed = gr.Slider(
label="Seed",
minimum=0,
maximum=MAX_SEED,
step=1,
value=0,
)
randomize_seed = gr.Checkbox(label="Randomize seed", value=True)
steps = gr.Slider(
minimum=10,
maximum=100,
value=32,
step=1,
label="Diffusion Steps",
interactive=True,
elem_id="step_slider"
)
cfg_strength = gr.Slider(
minimum=1,
maximum=10,
value=4.0,
step=0.5,
label="CFG Strength",
interactive=True,
elem_id="step_slider"
)
# edit = gr.Checkbox(label="edit", value=False)
# edit = False
# preference_infer = gr.Radio(["quality first", "speed first"], label="Preference", value="quality first")
# edit_segments = gr.Textbox(
# label="Edit Segments",
# placeholder="Time segments to edit (in seconds). Format: `[[start1,end1],...]",
# )
odeint_method = gr.Radio(["euler", "midpoint", "rk4","implicit_adams"], label="ODE Solver", value="euler")
file_type = gr.Dropdown(["wav", "mp3", "ogg"], label="Output Format", value="mp3")
gr.Examples(
examples=[
["./src/prompt/pop_cn.wav"],
["./src/prompt/pop_en.wav"],
["./src/prompt/rock_cn.wav"],
["./src/prompt/rock_en.wav"],
["./src/prompt/country_cn.wav"],
["./src/prompt/country_en.wav"],
["./src/prompt/classic_cn.wav"],
["./src/prompt/classic_en.wav"],
["./src/prompt/jazz_cn.wav"],
["./src/prompt/jazz_en.wav"],
["./src/prompt/rap_cn.wav"],
["./src/prompt/rap_en.wav"],
["./src/prompt/default.wav"]
],
inputs=[audio_prompt],
label="Audio Examples",
examples_per_page=13,
elem_id="audio-examples-container"
)
gr.Examples(
examples=[
["Pop Emotional Piano"],
["流行 情感 钢琴"],
["Indie folk ballad, coming-of-age themes, acoustic guitar picking with harmonica interludes"],
["独立民谣, 成长主题, 原声吉他弹奏与口琴间奏"]
],
inputs=[text_prompt],
label="Text Examples",
examples_per_page=4,
elem_id="text-examples-container"
)
gr.Examples(
examples=[
["""[00:04.074] Tell me that I'm special\n[00:06.226] Tell me I look pretty\n[00:08.175] Tell me I'm a little angel\n[00:10.175] Sweetheart of your city\n[00:13.307] Say what I'm dying to hear\n[00:17.058] 'Cause I'm dying to hear you\n[00:20.523] Tell me I'm that new thing\n[00:22.571] Tell me that I'm relevant\n[00:24.723] Tell me that I got a big heart\n[00:26.723] Then back it up with evidence\n[00:29.408] I need it and I don't know why\n[00:33.907] This late at night\n[00:36.139] Isn't it lonely\n[00:38.991] I'd do anything to make you want me\n[00:43.222] I'd give it all up if you told me\n[00:47.339] That I'd be\n[00:49.157] The number one girl in your eyes\n[00:52.506] Your one and only\n[00:55.437] So what's it gon' take for you to want me\n[00:59.589] I'd give it all up if you told me\n[01:03.674] That I'd be\n[01:05.823] The number one girl in your eyes\n[01:10.841] Tell me I'm going real big places\n[01:14.055] Down to earth, so friendly\n[01:16.105] And even through all the phases\n[01:18.256] Tell me you accept me\n[01:21.155] Well, that's all I'm dying to hear\n[01:24.937] Yeah, I'm dying to hear you\n[01:28.521] Tell me that you need me\n[01:30.437] Tell me that I'm loved\n[01:32.740] Tell me that I'm worth it\n[01:34.605] And that I'm enough\n[01:37.571] I need it and I don't know why\n[01:41.889] This late at night\n[01:43.805] Isn't it lonely\n[01:46.871] I'd do anything to make you want me\n[01:51.004] I'd give it all up if you told me\n[01:55.237] That I'd be\n[01:57.089] The number one girl in your eyes\n[02:00.325] Your one and only\n[02:03.305] So what's it gon' take for you to want me\n[02:07.355] I'd give it all up if you told me\n[02:11.589] That I'd be\n[02:13.623] The number one girl in your eyes\n[02:16.804] The girl in your eyes\n[02:20.823] The girl in your eyes\n[02:26.055] Tell me I'm the number one girl\n[02:28.355] I'm the number one girl in your eyes\n[02:33.172] The girl in your eyes\n[02:37.321] The girl in your eyes\n[02:42.472] Tell me I'm the number one girl\n[02:44.539] I'm the number one girl in your eyes\n[02:49.605] Well isn't it lonely\n[02:52.488] I'd do anything to make you want me\n[02:56.637] I'd give it all up if you told me\n[03:00.888] That I'd be\n[03:03.172] The number one girl in your eyes\n[03:06.272] Your one and only\n[03:09.160] So what's it gon' take for you to want me\n[03:13.056] I'd give it all up if you told me\n[03:17.305] That I'd be\n[03:19.488] The number one girl in your eyes\n[03:25.420] The number one girl in your eyes\n"""],
["""[00:00.133]Abracadabra, abracadabra\n[00:03.985]Abracadabra, abracadabra\n[00:15.358]Pay the toll to the angels\n[00:18.694]Drawin' circles in the clouds\n[00:22.966]Keep your mind on the distance\n[00:26.321]When the devil turns around\n[00:30.540]Hold me in your heart tonight\n[00:33.751]In the magic of the dark moonlight\n[00:38.189]Save me from this empty fight\n[00:43.521]In the game of life\n[00:45.409]Like a poem said by a lady in red\n[00:49.088]You hear the last few words of your life\n[00:53.013]With a haunting dance, now you're both in a trance\n[00:56.687]It's time to cast your spell on the night\n[01:01.131]Abracadabra amor-oo-na-na\n[01:04.394]Abracadabra morta-oo-gaga\n[01:08.778]Abracadabra, abra-ooh-na-na\n[01:12.063]In her tongue, she's sayin'\n[01:14.367]Death or love tonight\n[01:18.249]Abracadabra, abracadabra\n[01:22.136]Abracadabra, abracadabra\n[01:25.859]Feel the beat under your feet\n[01:27.554]The floor's on fire\n[01:29.714]Abracadabra, abracadabra\n[01:33.464]Choose the road on the west side\n[01:36.818]As the dust flies, watch it burn\n[01:41.057]Don't waste time on feeling\n[01:44.419]Use your passion no return\n[01:48.724]Hold me in your heart tonight\n[01:51.886]In the magic of the dark moonlight\n[01:56.270]Save me from this empty fight\n[02:01.599]In the game of life\n[02:03.524]Like a poem said by a lady in red\n[02:07.192]You hear the last few words of your life\n[02:11.055]With a haunting dance, now you're both in a trance\n[02:14.786]It's time to cast your spell on the night\n[02:19.225]Abracadabra amor-oo-na-na\n[02:22.553]Abracadabra morta-oo-gaga\n[02:26.852]Abracadabra, abra-ooh-na-na\n[02:30.110]In her tongue, she's sayin'\n[02:32.494]Death or love tonight\n[02:36.244]Abracadabra, abracadabra\n[02:40.161]Abracadabra, abracadabra\n[02:43.966]Feel the beat under your feet\n[02:45.630]The floor's on fire\n[02:47.812]Abracadabra, abracadabra\n[02:50.537]Phantom of the dancefloor, come to me\n[02:58.169]Sing for me a sinful melody\n[03:05.833]Ah-ah-ah-ah-ah, ah-ah, ah-ah\n[03:13.453]Ah-ah-ah-ah-ah, ah-ah, ah-ah\n[03:22.025]Abracadabra amor-oo-na-na\n[03:25.423]Abracadabra morta-oo-gaga\n[03:29.674]Abracadabra, abra-ooh-na-na\n[03:33.013]In her tongue, she's sayin'\n[03:35.401]Death or love tonight\n"""],
["""[00:00.27]只因你太美 baby 只因你太美 baby\n[00:08.95]只因你实在是太美 baby\n[00:13.99]只因你太美 baby\n[00:18.89]迎面走来的你让我如此蠢蠢欲动\n[00:20.88]这种感觉我从未有\n[00:21.79]Cause I got a crush on you who you\n[00:25.74]你是我的我是你的谁\n[00:28.09]再多一眼看一眼就会爆炸\n[00:30.31]再近一点靠近点快被融化\n[00:32.49]想要把你占为己有 baby bae\n[00:34.60]不管走到哪里\n[00:35.44]都会想起的人是你 you you\n[00:38.12]我应该拿你怎样\n[00:39.61]Uh 所有人都在看着你\n[00:42.36]我的心总是不安\n[00:44.18]Oh 我现在已病入膏肓\n[00:46.63]Eh oh\n[00:47.84]难道真的因你而疯狂吗\n[00:51.57]我本来不是这种人\n[00:53.59]因你变成奇怪的人\n[00:55.77]第一次呀变成这样的我\n[01:01.23]不管我怎么去否认\n[01:03.21]只因你太美 baby 只因你太美 baby\n[01:11.46]只因你实在是太美 baby\n[01:16.75]只因你太美 baby\n[01:21.09]Oh eh oh\n[01:22.82]现在确认地告诉我\n[01:25.26]Oh eh oh\n[01:27.31]你到底属于谁\n[01:29.98]Oh eh oh\n[01:31.70]现在确认地告诉我\n[01:34.45]Oh eh oh\n"""],
["""[00:19.50]也想不到要怎么问你别来无恙\n[00:25.71]世界乱的一塌糊涂可是能怎样\n[00:31.85]偶尔抬起头来还好有颗月亮可赏\n[00:38.96]太多回忆要我怎么摆进行李箱\n[00:45.22]一直没哭一直走路走灰多少太阳\n[00:51.70]因为往事没有办法悬赏 隐形在那大街小巷\n[01:00.22]剪断了它还嚣张\n[01:03.85]我的嘴在说谎 说的那么漂亮\n[01:10.07]说我早就忘了你像月一样的俏脸庞\n[01:16.51]最怕一边忙呀忙一边回想那旧时光\n[01:22.87]剪不掉的是你 带泪的脸 还真是烦\n[01:43.32]多少原因将我绑在半夜屋顶上\n[01:49.23]一直没再爱一个人如今就是这样\n[01:55.75]因为故事跟你说了一半 于是搁在所谓云端\n[02:04.21]谁忘不了谁孤单\n[02:07.79]我的心在说谎 说下去会疯狂\n[02:14.02]如果没有月亮那些日子都无妨\n[02:20.43]最怕一边忙呀忙一边想那旧时光\n[02:26.91]剪不掉的是你 带笑的苦 还真烦\n[02:33.81]我的嘴又说了谎 说的那么漂亮\n[02:39.68]以为已经忘了你的那些美像月光它剪不断\n[02:47.15]因为爱早就钻进心脏 心一跳泪就会烫\n[02:52.22]那些带泪的脸 带笑的苦 还真烦\n[02:59.28]月亮是个凶手 想你的我 是通缉犯\n[03:08.03]我有时候真的很怕望见那月光中的你\n"""]
],
inputs=[lrc],
label="Lrc Examples",
examples_per_page=4,
elem_id="lrc-examples-container",
)
# page 2
with gr.Tab("Lyrics Generate", id=1):
with gr.Row():
with gr.Column():
with gr.Accordion("Notice", open=False):
gr.Markdown("**Two Generation Modes:**\n1. Generate from theme & tags\n2. Add timestamps to existing lyrics")
with gr.Group():
gr.Markdown("### Method 1: Generate from Theme")
theme = gr.Textbox(label="theme", placeholder="Enter song theme, e.g: Love and Heartbreak")
tags_gen = gr.Textbox(label="tags", placeholder="Enter song tags, e.g: pop confidence healing")
language = gr.Radio(["cn", "en"], label="Language", value="en")
gen_from_theme_btn = gr.Button("Generate LRC (From Theme)", variant="primary")
gr.Examples(
examples=[
[
"Love and Heartbreak",
"vocal emotional piano pop",
"en"
],
[
"Heroic Epic",
"choir orchestral powerful",
"cn"
]
],
inputs=[theme, tags_gen, language],
label="Examples: Generate from Theme"
)
with gr.Group(visible=True):
gr.Markdown("### Method 2: Add Timestamps to Lyrics")
tags_lyrics = gr.Textbox(label="tags", placeholder="Enter song tags, e.g: ballad piano slow")
lyrics_input = gr.Textbox(
label="Raw Lyrics (without timestamps)",
placeholder="Enter plain lyrics (without timestamps), e.g:\nYesterday\nAll my troubles...",
lines=10,
max_lines=50,
elem_classes="lyrics-scroll-box"
)
gen_from_lyrics_btn = gr.Button("Generate LRC (From Lyrics)", variant="primary")
gr.Examples(
examples=[
[
"acoustic folk happy",
"""I'm sitting here in the boring room\nIt's just another rainy Sunday afternoon"""
],
[
"electronic dance energetic",
"""We're living in a material world\nAnd I am a material girl"""
]
],
inputs=[tags_lyrics, lyrics_input],
label="Examples: Generate from Lyrics"
)
with gr.Column():
lrc_output = gr.Textbox(
label="Generated LRC",
placeholder="Timed lyrics will appear here",
lines=57,
elem_classes="lrc-output",
show_copy_button=True
)
# Bind functions
gen_from_theme_btn.click(
fn=R1_infer1,
inputs=[theme, tags_gen, language],
outputs=lrc_output
)
gen_from_lyrics_btn.click(
fn=R1_infer2,
inputs=[tags_lyrics, lyrics_input],
outputs=lrc_output
)
tabs.select(
lambda s: None,
None,
None
)
lyrics_btn.click(
fn=infer_music,
inputs=[lrc, audio_prompt, text_prompt, current_prompt_type, seed, randomize_seed, steps, cfg_strength, file_type, odeint_method, preference_infer, Music_Duration],
outputs=audio_output
)
if __name__ == "__main__":
demo.launch()