diff --git a/README.md b/README.md index 9360244..d4e3ed9 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,14 @@ # ComfyUI_SongGeneration [SongGeneration](https://github.com/tencent-ailab/SongGeneration):High-Quality Song Generation with Multi-Preference Alignment (SOTA),you can try VRAM>12G + + + # Update +* 支持v2模型,加入transformer2的层卸载以方便12G Vram用户,需要使用新的工作流 +* support v2 model + +# Previous * 11/22 修复入参顺序颠倒的错误,修复一个找很久没找到的print,并修复其模块导入问题 * 10/23 同步官方代码,删除fairseq库,已无安装难度; * 10/21同步官方代码,精简模型加载,删除hubert模型,优化lm模型加载顺序,避免转移到显存时峰值OOM; @@ -27,6 +34,7 @@ pip install -r requirements.txt ``` # 3.Model +* 3.1.0 v2 version ckpt from [SongGeneration-v2-large](https://huggingface.co/lglg666/SongGeneration-v2-large/tree/main) # v2 模型地址,[new_auto_prompt.pt](https://github.com/tencent-ailab/SongGeneration/blob/main/tools/new_auto_prompt.pt) * 3.1.1 download ckpt from [tencent/SongGeneration](https://huggingface.co/tencent/SongGeneration/tree/main) 国内建议魔搭[AI-ModelScope/SongGeneration](https://www.modelscope.cn/models/AI-ModelScope/SongGeneration/files) * 3.1.2 [new base](https://huggingface.co/lglg666/SongGeneration-base-new),[large ](https://huggingface.co/lglg666/SongGeneration-large),[full](https://huggingface.co/lglg666/SongGeneration-base-full) * 3.1.3 new prompt,[emb](https://github.com/tencent-ailab/SongGeneration/tree/main/tools) @@ -37,10 +45,12 @@ pip install -r requirements.txt |-- htdemucs.pth #150M |--prompt.pt # 3M |--new_prompt.pt # 3M + |--new_auto_prompt.pt # v2 version V2版本 |--model_2.safetensors |--model_2_fixed.safetensors |--new_model.pt # rename from model.pt #可选 |--large_model.pt # rename from model.pt #可选 + |--large_model_v2.pt # must to rename from model.pt #必须重命名才能识别 v2版本 |-- ckpt/ |--encode-s12k.pt # 3.68G -- ComfyUI/models/vae/ diff --git a/SongGeneration/codeclm/models/builders.py b/SongGeneration/codeclm/models/builders.py index 25075a3..dcc1ccc 100644 --- a/SongGeneration/codeclm/models/builders.py +++ b/SongGeneration/codeclm/models/builders.py @@ -35,7 +35,22 @@ def get_audio_tokenizer_model(checkpoint_path: str, vae_config,vae_model,mode): name = checkpoint_path return AudioTokenizer.get_pretrained(name, vae_config,vae_model,'cpu', mode=mode) -def get_lm_model(cfg: omegaconf.DictConfig): #-> LMModel: +def get_audio_tokenizer_model_cpu(checkpoint_path: str, cfg: omegaconf.DictConfig): + from codeclm.tokenizer.audio_tokenizer import AudioTokenizer + """Instantiate a compression model.""" + if checkpoint_path is None: + return None + if checkpoint_path.startswith('//pretrained/'): + name = checkpoint_path.split('/', 3)[-1] + return AudioTokenizer.get_pretrained(name, cfg.vae_config, cfg.vae_model, 'cpu', mode=cfg.mode, tango_device='cpu') + elif checkpoint_path == "": + return None + else: + name = checkpoint_path + return AudioTokenizer.get_pretrained(name, cfg.vae_config, cfg.vae_model, 'cpu', mode=cfg.mode, tango_device='cpu') + + +def get_lm_model(cfg: omegaconf.DictConfig,version: str = 'v1'): #-> LMModel: """Instantiate a LM.""" lm_kwargs = dict_from_config(getattr(cfg, 'lm')) @@ -44,7 +59,7 @@ def get_lm_model(cfg: omegaconf.DictConfig): #-> LMModel: q_modeling = lm_kwargs.pop('q_modeling', None) # conditioner - condition_provider = get_conditioner_provider(lm_kwargs["dim"], cfg) + condition_provider = get_conditioner_provider(lm_kwargs["dim"], cfg,version=version) # codebook pattern: delay codebooks_pattern_cfg = getattr(cfg, 'codebooks_pattern') @@ -60,7 +75,7 @@ def get_lm_model(cfg: omegaconf.DictConfig): #-> LMModel: attribute_dropout = dict_from_config(getattr(cfg, 'attribute_dropout')) cls_free_guidance = dict_from_config(getattr(cfg, 'classifier_free_guidance')) cfg_prob, cfg_coef = cls_free_guidance['training_dropout'], cls_free_guidance['inference_coef'] - + stage_offload=True # if Vram < 12G,make it True # condition fuser fuser = get_condition_fuser(cfg) lm_type = lm_kwargs['lm_type'] # YCY: For consistency, choose different lm.py based on lm_type @@ -74,13 +89,14 @@ def get_lm_model(cfg: omegaconf.DictConfig): #-> LMModel: cfg_coef=cfg_coef, attribute_dropout=attribute_dropout, cfg=cfg, + stage_offload=stage_offload, **lm_kwargs ).to('cpu') else: raise KeyError(f"Unexpected LM model {lm_type}") -def get_conditioner_provider(output_dim: int, cfg: omegaconf.DictConfig) -> ConditionerProvider: +def get_conditioner_provider(output_dim: int, cfg: omegaconf.DictConfig,version: str = 'v1') -> ConditionerProvider: """Instantiate a conditioning model.""" cfg = getattr(cfg, 'conditioners') dict_cfg = {} if cfg is None else dict_from_config(cfg) @@ -93,16 +109,19 @@ def get_conditioner_provider(output_dim: int, cfg: omegaconf.DictConfig) -> Cond if model_type == 'QwTokenizer': conditioners[str(cond)] = QwTokenizerConditioner( output_dim=output_dim, + version=version, **model_args ) elif model_type == "QwTextTokenizer": conditioners[str(cond)] = QwTextConditioner( output_dim=output_dim, + version=version, **model_args ) elif model_type == "qt_embedding": conditioners[str(cond)] = QuantizedEmbeddingConditioner( dim=output_dim, + **model_args ) else: diff --git a/SongGeneration/codeclm/models/levo.py b/SongGeneration/codeclm/models/levo.py index 51bfd71..2851039 100644 --- a/SongGeneration/codeclm/models/levo.py +++ b/SongGeneration/codeclm/models/levo.py @@ -11,6 +11,49 @@ import transformers """ Wrap the original Llama model for potential customized changes. """ +class BlockGPUManager: + def __init__(self, device="cuda",): + self.device = device + self.managed_modules = [] + self.embedder_modules = [] + + def setup_for_inference(self, transformer_model,): + self._collect_managed_modules(transformer_model) + self._initialize_embedder_modules() + return self + + + def _collect_managed_modules(self, transformer_model): + self.managed_modules = [] + self.embedder_modules = [] + + for i, layers in enumerate(transformer_model.model.layers): + self.managed_modules.append(layers) + + if hasattr(transformer_model.model, 'norm'):# + self.embedder_modules.append(transformer_model.model.norm) + + + def _initialize_embedder_modules(self): + for module in self.embedder_modules: + if hasattr(module, 'to'): + module.to(self.device,) + return self + + + def unload_all_blocks_to_cpu(self): + for module in self.managed_modules: + if hasattr(module, 'to'): + module.to('cpu') + + for module in self.embedder_modules: + if hasattr(module, 'to'): + module.to('cpu') + + if torch.cuda.is_available(): + torch.cuda.empty_cache() + + """main class""" class CausalLM(LlamaForCausalLM_base): @@ -32,7 +75,11 @@ class CausalLM(LlamaForCausalLM_base): output_attentions: Optional[bool] = None, output_hidden_states: Optional[bool] = None, return_dict: Optional[bool] = None, + gpu_manager=None, ) -> Union[Tuple, CausalLMOutputWithPast]: + if gpu_manager is not None: + if next(self.lm_head.parameters()).device != gpu_manager.device: + self.lm_head=self.lm_head.to(gpu_manager.device) output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions output_hidden_states = ( @@ -51,6 +98,7 @@ class CausalLM(LlamaForCausalLM_base): output_attentions=output_attentions, output_hidden_states=output_hidden_states, return_dict=return_dict, + gpu_manager=gpu_manager, ) hidden_states = outputs[0] @@ -117,6 +165,7 @@ class LmModel(LlamaModel_base): output_attentions: Optional[bool] = None, output_hidden_states: Optional[bool] = None, return_dict: Optional[bool] = None, + gpu_manager=None, ) -> Union[Tuple, BaseModelOutputWithPast]: output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions output_hidden_states = ( @@ -173,6 +222,15 @@ class LmModel(LlamaModel_base): next_decoder_cache = () if use_cache else None for idx, decoder_layer in enumerate(self.layers): + if gpu_manager is not None: + if idx < len(self.layers): + module = gpu_manager.managed_modules[idx] + if hasattr(module, 'to'): + module.to(gpu_manager.device) + if idx > 0 and (idx - 1) < len(self.layers): + prev_module = gpu_manager.managed_modules[idx - 1] + if hasattr(prev_module, 'to'): + prev_module.to('cpu') if output_hidden_states: all_hidden_states += (hidden_states,) diff --git a/SongGeneration/codeclm/models/llama/tokenization_llama.py b/SongGeneration/codeclm/models/llama/tokenization_llama.py index bf105b7..1e28113 100644 --- a/SongGeneration/codeclm/models/llama/tokenization_llama.py +++ b/SongGeneration/codeclm/models/llama/tokenization_llama.py @@ -1,4 +1,4 @@ -# coding=utf-8 +os# coding=utf-8 # Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved. # # This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX diff --git a/SongGeneration/codeclm/models/lm_levo.py b/SongGeneration/codeclm/models/lm_levo.py index d39f878..3007f48 100644 --- a/SongGeneration/codeclm/models/lm_levo.py +++ b/SongGeneration/codeclm/models/lm_levo.py @@ -7,7 +7,7 @@ import typing as tp import torch.nn.functional as F from tqdm import tqdm from dataclasses import dataclass -from ..models.levo import CausalLM, LlamaConfig +from ..models.levo import CausalLM, LlamaConfig,BlockGPUManager from ..modules.streaming import StreamingModule from ..modules.conditioners import ( ConditioningAttributes, @@ -77,9 +77,9 @@ class LmModel(StreamingModule): num_layers_sub: int = 12, cfg = None, use_flash_attn_2: bool = True, + stage_offload=False, **kwargs): super().__init__() - self.cfg_coef = cfg_coef self.cfg_dropout = ClassifierFreeGuidanceDropout(p=cfg_dropout,seed=random.randint(0, 9999)) @@ -93,6 +93,7 @@ class LmModel(StreamingModule): self.cfg = cfg self.pattern_provider = pattern_provider self.emb = nn.ModuleList([nn.Embedding(input_emb_dim, dim)]) + self.stage_offload=stage_offload model_cfg = LlamaConfig( hidden_size=dim, @@ -135,6 +136,7 @@ class LmModel(StreamingModule): if norm_first: self.out_norm = create_norm_fn(norm, dim) # enable EOS prediction + if code_depth > 1: self.linears = nn.ModuleList([nn.Linear(dim, self.code_size, bias=False) for _ in range(code_depth - 1)]) @@ -145,6 +147,22 @@ class LmModel(StreamingModule): self.reset_streaming() + def to_cuda(self,device): + if not self.stage_offload: + self.to(torch.device(device)) + else: + self.mlp.to(torch.device(device)) + self.condition_provider.to(torch.device(device)) + self.emb.to(torch.device(device)) + self.layer2_emb.to(torch.device(device)) + self.transformer.to(torch.device(device)) + # self.transformer2.to(torch.device(device)) + if self.out_norm is not None: + self.out_norm.to(torch.device(device)) + if self.code_depth > 1: + self.linears.to(torch.device(device)) + + def _init_weights(self, weight_init: tp.Optional[str], depthwise_init: tp.Optional[str], zero_bias_init: bool): """Initialization of the transformer module weights. @@ -245,7 +263,9 @@ class LmModel(StreamingModule): def forward(self, sequence: torch.Tensor, - condition_tensors: ConditionTensors) -> torch.Tensor: + condition_tensors: ConditionTensors, + gpu_manager= None, + ) -> torch.Tensor: """Apply language model on sequence and conditions. Given a tensor of sequence of shape [B, K, S] with K the number of codebooks and S the sequence steps, return the logits with shape [B, card, K, S]. @@ -257,19 +277,38 @@ class LmModel(StreamingModule): Returns: torch.Tensor: Logits. """ + # import pdb; pdb.set_trace() B, K, S = sequence.shape assert K == self.code_depth, "Sequence shape must match the specified number of codebooks" + # target_device = next(self.transformer.parameters()).device + # if next(self.emb[0].parameters()).device != target_device: + # self.emb[0].to(target_device) input_1 = self.emb[0](sequence[:, 0]) + # if self.stage_offload: + # self.emb[0].to(torch.device('cpu')) + #layer2_emb_moved = False + # for layer_emb in self.layer2_emb: + # if next(layer_emb.parameters()).device != target_device: + # layer_emb.to(target_device) + # layer2_emb_moved = True input_2 = sum([self.layer2_emb[k](sequence[:, k]) for k in range(1, K)]) + # if self.stage_offload and layer2_emb_moved: + # for layer_emb in self.layer2_emb: + # layer_emb.to(torch.device('cpu')) fused_input1, fused_input2 = self.fuser(input_1, input_2, condition_tensors) + # if self.stage_offload: + # self.transformer.cuda() output = self.transformer(inputs_embeds=fused_input1, use_cache=self._is_streaming, - past_key_values=self._streaming_state.get('past_key_values_1', None)) + past_key_values=self._streaming_state.get('past_key_values_1', None),gpu_manager=None) if self._is_streaming: + # past_key_values_cpu = [pkv.to('cpu') for pkv in output.past_key_values] + # self._streaming_state['past_key_values_1'] = past_key_values_cpu self._streaming_state['past_key_values_1'] = output.past_key_values - logits = output.logits # [B, S, card] + output.past_key_values=None + logits = output.logits logits = logits.unsqueeze(1) # [B, 1, S, card] # if self.out_norm: @@ -277,13 +316,27 @@ class LmModel(StreamingModule): if K > 1: fused_input2 = torch.cat([fused_input2, output.hidden_states], dim=-1) fused_input2 = self.mlp(fused_input2) + # if self.stage_offload: + # self.transformer2.cuda() + # self.transformer.cpu() + output2 = self.transformer2(inputs_embeds=fused_input2, use_cache=self._is_streaming, - past_key_values=self._streaming_state.get('past_key_values_2', None)) + past_key_values=self._streaming_state.get('past_key_values_2', None),gpu_manager=gpu_manager) + # if self.stage_offload: + # self.transformer2.cpu() if self._is_streaming: + # past_key_values_cpu = [pkv.to('cpu') for pkv in output2.past_key_values] + # self._streaming_state['past_key_values_2'] = past_key_values_cpu self._streaming_state['past_key_values_2'] = output2.past_key_values - + output2.past_key_values=None + # if next(self.linears[0].parameters()).device != target_device: + # for linear in self.linears: + # linear.to(target_device) res_logits = torch.stack([self.linears[k](output2.hidden_states) for k in range(K - 1)], dim=1) # [B, K, S, card] # [B, K, S, card] + # if self.stage_offload: + # for linear in self.linears: + # linear.to(torch.device('cpu')) logits = torch.cat([logits, res_logits], dim=1) # [B, K, S, card] # remove the prefix from the model outputs @@ -370,6 +423,11 @@ class LmModel(StreamingModule): Returns: torch.Tensor: Generated tokens. """ + if self.stage_offload: + gpu_manager=BlockGPUManager() + gpu_manager.setup_for_inference(self.transformer2) + else: + gpu_manager=None assert not self.training, "generation shouldn't be used in training mode." first_param = next(iter(self.parameters())) device = first_param.device @@ -387,6 +445,9 @@ class LmModel(StreamingModule): assert [x == possible_num_samples[0] for x in possible_num_samples], "Inconsistent inputs shapes" num_samples = possible_num_samples[0] condition_tensors = self.prepare_condition_tensors(batch_size=1, text=texts, descriptions=descriptions, audio_qt_emb=audio_qt_embs, prepare_null_condition=True) + if self.stage_offload: + self.condition_provider.to(torch.device('cpu')) + torch.cuda.empty_cache() # 3) Prepare token pool record_token_pool = None if record_tokens: @@ -430,7 +491,8 @@ class LmModel(StreamingModule): curr_sequence, condition_tensors, use_sampling, temp, top_k, top_p, cfg_coef=cfg_coef, sampled_token_pool=record_token_pool[-record_window:] if record_tokens else None, - ignore_tokens = ignore_tokens + ignore_tokens = ignore_tokens, + gpu_manager=gpu_manager, ) # ensure the tokens that should be masked are properly set to special_token_id # as the model never output special_token_id @@ -480,7 +542,8 @@ class LmModel(StreamingModule): top_p: float = 0.0, cfg_coef: tp.Optional[float] = None, sampled_token_pool: tp.Optional[list] = None, - ignore_tokens: tp.Optional[torch.tensor] = torch.tensor([])) -> torch.Tensor: + ignore_tokens: tp.Optional[torch.tensor] = torch.tensor([]), + gpu_manager= None,) -> torch.Tensor: """Sample next token from the model given a sequence and a set of conditions. The model supports multiple sampling strategies (greedy sampling, softmax, top-k, top-p...). @@ -505,7 +568,8 @@ class LmModel(StreamingModule): # Preparing for CFG, predicting both conditional and unconditional logits. sequence = torch.cat([sequence, sequence], dim=0) - all_logits = model(sequence, condition_tensors=condition_tensors) + + all_logits = model(sequence, condition_tensors=condition_tensors,gpu_manager=gpu_manager) # [2B, K, T, card] cond_logits, uncond_logits = all_logits.split(B, dim=0) # [B, K, T, card] logits = uncond_logits + (cond_logits - uncond_logits) * cfg_coef diff --git a/SongGeneration/codeclm/modules/conditioners.py b/SongGeneration/codeclm/modules/conditioners.py index b837dcc..1f6916d 100644 --- a/SongGeneration/codeclm/modules/conditioners.py +++ b/SongGeneration/codeclm/modules/conditioners.py @@ -113,9 +113,13 @@ class QwTokenizerConditioner(TextConditioner): def __init__(self, output_dim: int, token_path = "", max_len = 300, - add_token_list=[]): #"" + add_token_list=[], + version: str = 'v1'): #"" from transformers import Qwen2Tokenizer + if version != 'v1': + add_token_list.append('.') # add . token_path = os.path.join(folder_paths.base_path,"custom_nodes/ComfyUI_SongGeneration/SongGeneration/third_party/Qwen2-7B") #绝对引用 + self.text_tokenizer = Qwen2Tokenizer.from_pretrained(token_path) if add_token_list != []: self.text_tokenizer.add_tokens(add_token_list, special_tokens=True) @@ -191,11 +195,14 @@ class QwTokenizerConditioner(TextConditioner): class QwTextConditioner(TextConditioner): def __init__(self, output_dim: int, - token_path = "", - max_len = 300): #"" + token_path = "", + max_len = 300, + version: str = 'v1'): #"" from transformers import Qwen2Tokenizer - self.text_tokenizer = Qwen2Tokenizer.from_pretrained(token_path) + self.text_tokenizer = Qwen2Tokenizer.from_pretrained(token_path) + if version != 'v1': + self.text_tokenizer.add_tokens(['[Musicality-very-high]', '[Musicality-high]', '[Musicality-medium]', '[Musicality-low]', '[Musicality-very-low]', '[Pure-Music]', '.'], special_tokens=True) voc_size = len(self.text_tokenizer.get_vocab()) # here initialize a output_proj (nn.Embedding) layer super().__init__(voc_size, output_dim, input_token=True, padding_idx=151643) @@ -577,7 +584,7 @@ class ClassifierFreeGuidanceDropout(DropoutModule): if condition_type == 'audio': audio_cond = sample.audio[condition] - depth = audio_cond.wav.shape[1] + #depth = audio_cond.wav.shape[1] sample.audio[condition] = self.get_null_wav(audio_cond.wav, sr=audio_cond.sample_rate[0]) else: sample.text[condition] = None @@ -640,7 +647,14 @@ class ClassifierFreeGuidanceDropoutInference(ClassifierFreeGuidanceDropout): sample.audio[condition] = self.get_null_wav(audio_cond.wav, sr=audio_cond.sample_rate[0]) else: if customized is None: - sample.text[condition] = None + if condition in ['type_info'] and sample.text[condition] is not None: + if "[Musicality-very-high]" in sample.text[condition]: + sample.text[condition] = "[Musicality-very-low], ." + print(f"cfg unconditioning: change sample.text[condition] to [Musicality-very-low]") + else: + sample.text[condition] = None + else: + sample.text[condition] = None else: text_cond = deepcopy(sample.text[condition]) if "structure" in customized: diff --git a/SongGeneration/codeclm/tokenizer/Flow1dVAE/tools/__pycache__/__init__.cpython-311.pyc b/SongGeneration/codeclm/tokenizer/Flow1dVAE/tools/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 1aeec5a..0000000 Binary files a/SongGeneration/codeclm/tokenizer/Flow1dVAE/tools/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/SongGeneration/codeclm/tokenizer/Flow1dVAE/tools/__pycache__/get_1dvae_large.cpython-311.pyc b/SongGeneration/codeclm/tokenizer/Flow1dVAE/tools/__pycache__/get_1dvae_large.cpython-311.pyc deleted file mode 100644 index 0a2c549..0000000 Binary files a/SongGeneration/codeclm/tokenizer/Flow1dVAE/tools/__pycache__/get_1dvae_large.cpython-311.pyc and /dev/null differ diff --git a/SongGeneration/codeclm/tokenizer/Flow1dVAE/tools/__pycache__/mix.cpython-311.pyc b/SongGeneration/codeclm/tokenizer/Flow1dVAE/tools/__pycache__/mix.cpython-311.pyc deleted file mode 100644 index 9fcfe31..0000000 Binary files a/SongGeneration/codeclm/tokenizer/Flow1dVAE/tools/__pycache__/mix.cpython-311.pyc and /dev/null differ diff --git a/SongGeneration/codeclm/tokenizer/Flow1dVAE/tools/__pycache__/torch_tools.cpython-311.pyc b/SongGeneration/codeclm/tokenizer/Flow1dVAE/tools/__pycache__/torch_tools.cpython-311.pyc deleted file mode 100644 index 3394ee9..0000000 Binary files a/SongGeneration/codeclm/tokenizer/Flow1dVAE/tools/__pycache__/torch_tools.cpython-311.pyc and /dev/null differ diff --git a/SongGeneration/codeclm/tokenizer/audio_tokenizer.py b/SongGeneration/codeclm/tokenizer/audio_tokenizer.py index 00d010c..1a0e58c 100644 --- a/SongGeneration/codeclm/tokenizer/audio_tokenizer.py +++ b/SongGeneration/codeclm/tokenizer/audio_tokenizer.py @@ -136,7 +136,7 @@ class Flow1dVAE1rvq(AudioTokenizer): @torch.no_grad() def decode(self, codes: torch.Tensor, prompt = None, scale: tp.Optional[torch.Tensor] = None, ncodes=9): wav = self.model.code2sound(codes, prompt=prompt, guidance_scale=1.5, - num_steps=50, disable_progress=False) # [B,N,T] -> [B,T] + num_steps=10, disable_progress=False) # [B,N,T] -> [B,T] return wav[None] @@ -214,7 +214,7 @@ class Flow1dVAESeparate(AudioTokenizer): @torch.no_grad() def decode(self, codes: torch.Tensor, prompt_vocal = None, prompt_bgm = None,chunked=False,chunk_size=128): wav = self.model.code2sound(codes, prompt_vocal=prompt_vocal, prompt_bgm=prompt_bgm, guidance_scale=1.5, - num_steps=50, disable_progress=False,chunked=chunked,chunk_size=chunk_size) # [B,N,T] -> [B,T] + num_steps=10, disable_progress=False,chunked=chunked,chunk_size=chunk_size) # [B,N,T] -> [B,T] return wav[None] diff --git a/SongGeneration/codeclm/trainer/codec_song_pl.py b/SongGeneration/codeclm/trainer/codec_song_pl.py index d330dd3..c20eecc 100644 --- a/SongGeneration/codeclm/trainer/codec_song_pl.py +++ b/SongGeneration/codeclm/trainer/codec_song_pl.py @@ -26,7 +26,7 @@ os.environ['TOKENIZERS_PARALLELISM'] = "false" class CodecLM_PL(pl.LightningModule): - def __init__(self, cfg, ckpt_path): + def __init__(self, cfg, ckpt_path,version="v1"): super().__init__() self.cfg = cfg @@ -44,7 +44,7 @@ class CodecLM_PL(pl.LightningModule): self.seperate_tokenizer = None # 2) Build LM - self.audiolm = builders.get_lm_model(self.cfg) + self.audiolm = builders.get_lm_model(self.cfg,version=version) #print(self.audiolm) # 3) Load pretrained checkpoint (if any) checkpoint = torch.load(ckpt_path, map_location='cpu') diff --git a/SongGeneration/codeclm/utils/offload_profiler.py b/SongGeneration/codeclm/utils/offload_profiler.py new file mode 100644 index 0000000..2a66461 --- /dev/null +++ b/SongGeneration/codeclm/utils/offload_profiler.py @@ -0,0 +1,505 @@ +import torch +from torch.func import functional_call +import queue +import threading +from typing import Dict, List, Any +import omegaconf +from pydantic import BaseModel, validator +from typing import Optional +from functools import wraps + +def _callable_once(func): + @wraps(func) + def wrapper(self, *args, **kwargs): + method_called_flag = f"_called_once_{func.__name__}" + if getattr(self, method_called_flag, False): + raise RuntimeError(f"{func.__name__} can only be called once.") + setattr(self, method_called_flag, True) + return func(self, *args, **kwargs) + return wrapper + +class OffloadCleanCacheWrapperParam(BaseModel): + module: Any + method_name: str + diff_mem_gb_thre: float + +class OffloadParam(BaseModel): + offload_module: Any + cpu_mem_gb: float + pre_copy_step: Optional[int] = None + clean_cache_after_forward: Optional[bool] = None + dtype: Optional[str] = None + offload_layer_dict: Dict[str, int] = {} + ignore_layer_list: List[str] = [] + clean_cache_wrapper: Optional[OffloadCleanCacheWrapperParam] = None + debug: Optional[bool] = None + + @validator('dtype') + def parse_dtype(cls, value): + if value is None: + return None + dtype_map = { + 'torch.float16': torch.float16, + 'torch.float32': torch.float32, + 'torch.float64': torch.float64, + 'torch.int64': torch.int64, + } + if value not in dtype_map: + raise ValueError(f"Unsupported dtype: {value}") + return dtype_map[value] + + def init_param_dict(self): + param_dict = {} + param_dict['cpu_mem_gb'] = self.cpu_mem_gb + if self.pre_copy_step is not None: + param_dict['pre_copy_step'] = self.pre_copy_step + if self.clean_cache_after_forward is not None: + param_dict['clean_cache_after_forward'] = self.clean_cache_after_forward + if self.debug is not None: + param_dict['debug'] = self.debug + + return param_dict + + def offload_layer_param_dict(self): + param_dict = {} + param_dict['module'] = self.offload_module + param_dict['offload_layer_dict'] = self.offload_layer_dict + param_dict['ignore_layer_list'] = self.ignore_layer_list + param_dict['dtype'] = self.dtype + + return param_dict + + def clean_cache_param_dict(self): + param_dict = {} + if self.clean_cache_wrapper is not None: + param_dict['module'] = self.clean_cache_wrapper.module + param_dict['method_name'] = self.clean_cache_wrapper.method_name + param_dict['diff_mem_gb_thre'] = self.clean_cache_wrapper.diff_mem_gb_thre + + return param_dict + + @staticmethod + def recursive_print(model, indent=0): + for field_name, field_info in model.__fields__.items(): + field_value = getattr(model, field_name) + print(" " * indent + f"{field_name}:") + + if issubclass(type(field_value), BaseModel): + print(" " * (indent + 2) + f"--- Nested model: {field_value.__class__.__name__}") + OffloadParam.recursive_print(field_value, indent + 4) + else: + print(" " * (indent + 2) + f"class: {field_value.__class__.__name__}") + if isinstance(field_value, torch.nn.Module): + pass + else: + print(" " * (indent + 2) + f"value: {field_value}") + + def show(self): + print("-"*20 + "[OffloadParam]" + "-"*20) + OffloadParam.recursive_print(self) + print("-"*40) + + +class OffloadParamParse: + def __init__(self): + pass + + @staticmethod + def _get_model(root_model: torch.nn.Module, model_dir: str): + assert(model_dir.startswith("self")), f"model_dir {model_dir} must startswith `self`" + model = root_model + for layer in model_dir.split('.'): + if layer == "self": + continue + assert(hasattr(model, layer)), f"model not has layer [{layer}]!" + model = getattr(model, layer) + return model + + @staticmethod + def parse_config(root_model: torch.nn.Module, cfg: omegaconf.DictConfig)->OffloadParam: + assert(hasattr(cfg, "offload_module") and hasattr(cfg, "cpu_mem_gb") and hasattr(cfg, "dtype")) + + offload_module = OffloadParamParse._get_model(root_model, cfg.offload_module) + cpu_mem_gb = cfg.cpu_mem_gb + dtype = cfg.dtype + + pre_copy_step = cfg.pre_copy_step \ + if hasattr(cfg, "pre_copy_step") else None + + clean_cache_after_forward = cfg.clean_cache_after_forward \ + if hasattr(cfg, "clean_cache_after_forward") else None + + offload_layer_dict = {k: v for k, v in cfg.offload_layer_dict.items()} \ + if hasattr(cfg, "offload_layer_dict") else {} + + ignore_layer_list = cfg.ignore_layer_list \ + if hasattr(cfg, "ignore_layer_list") else [] + + debug = cfg.debug if hasattr(cfg, "debug") else None + + clean_cache_wrapper = None + if hasattr(cfg, "clean_cache_wrapper"): + clean_cache_cfg = cfg.clean_cache_wrapper + cc_module = OffloadParamParse._get_model(root_model, clean_cache_cfg.module) + cc_method_name = clean_cache_cfg.method_name + diff_mem_gb_thre = clean_cache_cfg.diff_mem_gb_thre + clean_cache_wrapper = OffloadCleanCacheWrapperParam( + module=cc_module, + method_name=cc_method_name, + diff_mem_gb_thre=diff_mem_gb_thre) + + return OffloadParam( + offload_module=offload_module, + cpu_mem_gb=cpu_mem_gb, + pre_copy_step=pre_copy_step, + clean_cache_after_forward=clean_cache_after_forward, + dtype=dtype, + offload_layer_dict=offload_layer_dict, + ignore_layer_list=ignore_layer_list, + clean_cache_wrapper=clean_cache_wrapper, + debug=debug + ) + + +class LayerParamStruct: + def __init__(self): + self.count = 0 + self.device_state = None + + +class OffloadProfiler: + def __init__(self, device_index=0, cpu_mem_gb=-1, pre_copy_step=1, clean_cache_after_forward=False, debug=False): + self.clean_cache_after_forward = clean_cache_after_forward + self.cpu_mem_gb = cpu_mem_gb + self.cpu_mem_b_count = 0 + self.device_index = device_index + self.execution_order = [] + self.execution_order_idx = {} + self.pin_memory = False + test_data = torch.rand(1,1, device='cpu') + pin_data = test_data.pin_memory() + self.pin_memory = pin_data.is_pinned() + print(f"pin:{self.pin_memory}") + self.copy_stream = torch.cuda.Stream() + self.copy_queue = queue.Queue() + self.layer_param:Dict[str, LayerParamStruct] = {} + self.model_map = {} + self.stop_flag = False + self.copy_condition = threading.Condition() + self.queue_condition = threading.Condition() + self.mem_line_b = 0 + + self.copy_thread = threading.Thread(target=self._copy_thread_fun) + self.copy_thread.daemon = True + self.copy_thread.start() + + self.cur_copy_idx = 0 + self.execute_over = False + self.pre_copy_step = pre_copy_step + + self.tmp_state_list = [] + self.tmp_state_idx = 0 + for i in range(pre_copy_step + 2): + self.tmp_state_list.append(None) + + self.debug = debug + + def stop(self): + self.stop_flag = True + with self.queue_condition: + self.queue_condition.notify() + self.copy_thread.join() + + del self.layer_param + del self.model_map + del self.copy_stream + + def _copy_thread_fun(self): + while self.stop_flag == False: + layer_name = "--" + with self.queue_condition: + while self.copy_queue.qsize() == 0 and self.stop_flag == False: + self.queue_condition.wait() + if self.stop_flag == True: + break + layer_name = self.copy_queue.get() + with torch.cuda.stream(self.copy_stream): + if layer_name in self.model_map: + model = self.model_map[layer_name] + self.tmp_state_list[self.tmp_state_idx] = { + k: v.to(torch.device(f"cuda:{self.device_index}"), non_blocking=False) + for k, v in model.state_dict().items() + } + self.copy_stream.synchronize() + + device_state = self.tmp_state_list[self.tmp_state_idx] + self.tmp_state_idx = (self.tmp_state_idx + 1) % len(self.tmp_state_list) + + with self.copy_condition: + if layer_name in self.layer_param: + self.layer_param[layer_name].count += 1 + else: + self.layer_param[layer_name] = LayerParamStruct() + self.layer_param[layer_name].count = 1 + self.layer_param[layer_name].device_state = device_state + self.copy_condition.notify() + else: + print(f"get model error! {layer_name}") + print("copy thread stop..") + + def _get_new_step_copy_begin_end(self, tag_name): + + pre_copy_step = self.pre_copy_step + pre_copy_step = min(pre_copy_step, len(self.execution_order) // 2) + + cur_exe_idx = self.execution_order_idx[tag_name] + copy_begin = self.cur_copy_idx + copy_end = cur_exe_idx + pre_copy_step + 1 + if copy_end - copy_begin > len(self.execution_order): + copy_end %= len(self.execution_order) + if copy_end - copy_begin > pre_copy_step + 1 or copy_end - copy_begin < 0: + # jump + self.cur_copy_idx = cur_exe_idx + copy_begin, copy_end = self._get_new_step_copy_begin_end(tag_name=tag_name) + return copy_begin, copy_end + + def make_forward_wrapper(self, module, tag_name, ignore_layer_list=[]): + original_forward = module.forward + layer_param_size = 0 + for name, param in module.named_parameters(): + layer_param_size += param.data.numel() * param.data.element_size() / 1024 / 1024 #MB + + taget_cpu_mem_b = self.cpu_mem_gb * 1024 * 1024 * 1024 + offload = False + for name, param in module.named_parameters(): + p_name = f"{tag_name}.{name}" if tag_name else name + for i_layer in ignore_layer_list: + if p_name.startswith(i_layer): + if self.debug: + print(f"ignore layer param: {p_name}") + continue + + if taget_cpu_mem_b >= 0 and self.cpu_mem_b_count >= taget_cpu_mem_b: + break + cpu_data = torch.empty_strided(size=param.data.size(), + stride=param.data.stride(), + dtype=param.data.dtype, + layout=param.data.layout, + device='cpu', + pin_memory=self.pin_memory) + cpu_data.copy_(param.data) + param.data = cpu_data + + param_size = param.data.numel() * param.data.element_size() + self.cpu_mem_b_count += param_size + offload = True + if self.debug: + print(f"layer: {tag_name}, type: {module.__class__.__name__}, size(MB): {layer_param_size}, offload: {offload}, sum_offload_size(MB): {self.cpu_mem_b_count/1024/1024}") + + if offload: + copy_condition = self.copy_condition + queue_condition = self.queue_condition + copy_queue = self.copy_queue + layer_param = self.layer_param + def forward_wrapper(*args, **kwargs): + module.forward = original_forward + + execute_over = False if tag_name not in self.execution_order_idx else True + if execute_over == False: + self.model_map[tag_name] = module + self.execution_order.append(tag_name) + self.execution_order_idx[tag_name] = len(self.execution_order) - 1 + copy_queue.put(tag_name) + with queue_condition: + queue_condition.notify() + else: + + copy_begin, copy_end = self._get_new_step_copy_begin_end(tag_name=tag_name) + if copy_end > copy_begin: + for idx in range(copy_begin, copy_end): + idx = idx % len(self.execution_order) + copy_tag_name = self.execution_order[idx] + copy_queue.put(copy_tag_name) + with queue_condition: + queue_condition.notify() + + self.cur_copy_idx = copy_end % len(self.execution_order) + + run_state = None + with self.copy_condition: + while tag_name not in self.layer_param: + copy_condition.wait() + run_state = self.layer_param[tag_name].device_state + self.layer_param[tag_name].count -= 1 + + module.eval() + with torch.no_grad(): + output = functional_call(module, run_state, args=args, kwargs=kwargs) + with self.copy_condition: + if self.layer_param[tag_name].count == 0: + del self.layer_param[tag_name] + diff_mem_b_thre = 1 * (1024 ** 3) + if self.clean_cache_after_forward: + reserved = torch.cuda.memory_reserved() + if reserved > self.mem_line_b: + torch.cuda.empty_cache() + cur_reserved = torch.cuda.memory_reserved() + diff_mem = reserved - cur_reserved + if diff_mem > diff_mem_b_thre: + self.mem_line_b = cur_reserved + (reserved - cur_reserved) / 2 + 10 + else: + self.mem_line_b = reserved + 10 + if self.debug: + print(f"child mem line update, clean cache:{reserved/1024/1024}, cur mem: {cur_reserved/1024/1024} new limit: {self.mem_line_b / 1024 / 1024}, child name: {tag_name}") + + module.forward = forward_wrapper + return output + module.forward = forward_wrapper + + torch.cuda.empty_cache() + return module + + def reset_empty_cache_mem_line(self): + self.mem_line_b = 0 + torch.cuda.empty_cache() + + def clean_cache_wrapper(self, module, method_name='', diff_mem_gb_thre=1): + if not hasattr(module, method_name) or not callable(getattr(module, method_name)): + print(f"no this method {method_name}") + return module + + original_fun = getattr(module, method_name) + diff_mem_b_thre = diff_mem_gb_thre * (1024 ** 3) + self.reset_empty_cache_mem_line() + + def clean_wrapper(*args, **kwargs): + setattr(module, method_name, original_fun) + output = original_fun(*args, **kwargs) + reserved = torch.cuda.memory_reserved() + if reserved > self.mem_line_b: + torch.cuda.empty_cache() + cur_reserved = torch.cuda.memory_reserved() + diff_mem = reserved - cur_reserved + if diff_mem > diff_mem_b_thre: + self.mem_line_b = cur_reserved + (reserved - cur_reserved) / 2 + 10 + else: + self.mem_line_b = reserved + 10 + + if self.debug: + print(f"mem line update, clean cache:{reserved/1024/1024}, cur mem: {cur_reserved/1024/1024} new limit: {self.mem_line_b / 1024 / 1024}") + setattr(module, method_name, clean_wrapper) + return output + + setattr(module, method_name, clean_wrapper) + return module + + @_callable_once + def offload_layer(self, module, offload_layer_dict={}, ignore_layer_list=[], dtype:torch.dtype = None): + return self._offload_layer( + module=module, + tag="", + offload_layer_dict=offload_layer_dict, + ignore_layer_list=ignore_layer_list, + dtype=dtype + ) + + def _offload_layer(self, module, tag="", offload_layer_dict={}, ignore_layer_list=[], dtype:torch.dtype = None): + """ + Offload specific layers of a PyTorch model to a specified depth. + A model can only be offloaded once. + + Args: + module (torch.nn.Module): + The PyTorch model containing the layers to offload. This is the model that will be modified in place. + + tag (str, optional): + A string identifier for the model. + Default is an empty string. + + offload_layer_dict (dict, optional): + A dictionary where keys are layer names and values represent the depth at which the offloading should occur. + For example, + ```offload_layer_dict = {'cfm_wrapper': 5, 'hubert': 4}``` means that the `cfm_wrapper` layer should + be offloaded at depth 5, and the `hubert` layer should be offloaded at depth 4. + Default is an empty dictionary. + + ignore_layer_list (list, optional): + A list of layer names or parameter identifiers to be ignored during the offloading process. + Layers in this list will not be offloaded, even if they are present in the `offload_layer_dict`. + For example, + ```ignore_layer_list = ['cfm_wrapper.estimator.h', 'cfm_wrapper.estimator.adaln_single']``` + means that layers starting with `cfm_wrapper.estimator.h` or 'cfm_wrapper.estimator.adaln_single' will not be offload. + Default is an empty list. + + dtype (torch.dtype, optional): + The data type (e.g., `torch.float16`, `torch.float32`) to which the offloaded layers should be converted. + If `None`, the data type of the layers will remain unchanged. Default is `None`. + + Returns: + None + """ + for p in module._parameters.values(): + if p is not None: + p.data = p.data.to(torch.device(f"cuda:{self.device_index}")) + if dtype is not None: + p.data = p.data.to(dtype) + for b in module._buffers.values(): + if b is not None: + b.data = b.data.to(torch.device(f"cuda:{self.device_index}")) + if dtype is not None: + b.data = b.data.to(dtype) + for attr_name, attr in module.__dict__.items(): + if isinstance(attr, torch.Tensor) and not attr_name.startswith('_'): + attr.data = attr.data.to(torch.device(f"cuda:{self.device_index}")) + if dtype is not None: + attr.data = attr.data.to(dtype) + + for name, child in module.named_children(): + current_tag = f"{tag}.{name}" if tag else name + child = child.to(torch.device(f"cuda:{self.device_index}")) + if dtype is not None: + child = child.to(dtype) + + torch.cuda.empty_cache() + setattr(module, name, child) + pre_name = current_tag.split('.')[0] + if pre_name not in offload_layer_dict: + param_size = 0 + for p in child.parameters(): + param_size += p.data.numel() * p.data.element_size() + param_size = param_size / 1024 / 1024 + if self.debug: + print(f"not offload layer {current_tag}, size: {param_size}MB") + continue + + has_children = any(child.named_children()) + layer_count = current_tag.count('.') + 1 + + layer_deep = offload_layer_dict[pre_name] + if layer_count >= layer_deep: + has_children = False + + if has_children: + self._offload_layer(module=child, + tag=current_tag, + offload_layer_dict=offload_layer_dict, + ignore_layer_list=ignore_layer_list, + dtype=dtype) + continue + + ignore = False + for i_layer in ignore_layer_list: + if current_tag.startswith(i_layer): + ignore = True + if self.debug: + print(f"ignore layer offload: {current_tag}") + break + + if hasattr(child, "forward") and not ignore: + child = self.make_forward_wrapper( + child, current_tag, ignore_layer_list=ignore_layer_list + ) + return module + + def get_execution_order(self): + return self.execution_order diff --git a/SongGeneration/conf/large_config_v2.yaml b/SongGeneration/conf/large_config_v2.yaml new file mode 100644 index 0000000..69def94 --- /dev/null +++ b/SongGeneration/conf/large_config_v2.yaml @@ -0,0 +1,141 @@ +# ================ Train Config ================ # +lyric_processor: +max_dur: 270 +min_dur: 30 +prompt_len: 10 +pad_to_max: true + + +# ================ Audio tokenzier ================ # +audio_tokenizer_checkpoint: Flow1dVAE1rvq_./ckpt/model_1rvq/model_2_fixed.safetensors +audio_tokenizer_frame_rate: 25 +audio_tokenizer_code_depth: 1 +sample_rate: 48000 + +audio_tokenizer_checkpoint_sep: Flow1dVAESeparate_./ckpt/model_septoken/model_2.safetensors +audio_tokenizer_frame_rate_sep: 25 +audio_tokenizer_code_depth_sep: 2 +sample_rate_sep: 48000 + +# ================ VAE ================ # +vae_config: ./ckpt/vae/stable_audio_1920_vae.json +vae_model: ./ckpt/vae/autoencoder_music_1320k.ckpt + +# ================== LM =========================== # +lm: + lm_type: Llama # [Llama] + dim: 2048 + intermediate_size: 11008 + num_heads: 16 + num_layers: 36 + num_layers_sub: 12 + code_depth: 3 + code_size: 16384 + max_position_embeddings: 10000 + max_position_embeddings_sub: 10000 + rope_theta: 500000.0 + rope_theta_sub: 500000.0 + dropout: 0.0 + use_flash_attn_2: true + activation: gelu + norm_first: true + bias_ff: false + bias_attn: false + causal: true + custom: false + memory_efficient: true + attention_as_float32: false + layer_scale: null + positional_embedding: sin + xpos: false + checkpointing: torch + weight_init: gaussian + depthwise_init: current + zero_bias_init: true + norm: layer_norm + cross_attention: false + qk_layer_norm: false + qk_layer_norm_cross: false + attention_dropout: null + kv_repeat: 1 + +codebooks_pattern: + modeling: delay + delay: + delays: [ 0, 250, 250 ] + flatten_first: 0 + empty_initial: 0 + +# ================ Conditioners ===================== # +classifier_free_guidance: + # drop all conditions simultaneously + training_dropout: 0.15 + inference_coef: 1.5 + +attribute_dropout: + # drop each condition separately + args: + active_on_eval: false + text: + description: 0.0 + type_info: 0.2 + audio: + prompt_audio: 0.5 + + +use_text_training: True +fuser: + sum: [] + prepend: [ description, prompt_audio, type_info ] # this order is the SAME with the input concatenation order + +conditioners: + prompt_audio: + model: qt_embedding + qt_embedding: + code_size: 16384 + code_depth: 3 + max_len: ${eval:${prompt_len}*${audio_tokenizer_frame_rate}+2} # 25*10+2+1 + description: + model: QwTokenizer + QwTokenizer: + token_path: third_party/Qwen2-7B + max_len: 600 + add_token_list: ${load_yaml:conf/vocab.yaml} + type_info: + model: QwTextTokenizer + QwTextTokenizer: + token_path: third_party/Qwen2-7B + max_len: 100 + +offload: + audiolm: + offload_module: self + cpu_mem_gb: 0 + pre_copy_step: 1 + clean_cache_after_forward: false + dtype: torch.float16 + offload_layer_dict: + transformer: 4 + transformer2: 4 + ignore_layer_list: [] + clean_cache_wrapper: + module: self + method_name: _sample_next_token + diff_mem_gb_thre: 5 + debug: false + + wav_tokenizer_diffusion: + offload_module: self.model.model + pre_copy_step: 1 + clean_cache_after_forward: false + cpu_mem_gb: -1 + dtype: null + offload_layer_dict: + cfm_wrapper: 5 + hubert: 4 + ignore_layer_list: [] + clean_cache_wrapper: + module: self.model.model.cfm_wrapper.estimator + method_name: forward + diff_mem_gb_thre: 1 + debug: false diff --git a/SongGeneration/sample/description/emotion.txt b/SongGeneration/sample/description/emotion.txt index 7f0fd0d..0ca1169 100644 --- a/SongGeneration/sample/description/emotion.txt +++ b/SongGeneration/sample/description/emotion.txt @@ -1,8 +1,296 @@ -sad -emotional -angry -happy -uplifting -intense -romantic +energetic melancholic +nostalgic +uplifting +romantic +reflective +passionate +hopeful +introspective +confident +longing +anthemic +sentimental +yearning +dramatic +upbeat +melancholy +aggressive +angsty +playful +bittersweet +heartbreak +dreamy +epic +chill +dark +defiant +joyful +gritty +heartfelt +sad +intense +somber +driving +festive +spiritual +groovy +feel-good +rebellious +danceable +empowering +determined +happy +sensual +celebratory +pensive +wistful +fun +intimate +powerful +euphoric +relaxed +soulful +cathartic +party +emotional +hypnotic +confrontational +heartbroken +humorous +triumphant +inspirational +sweet +carefree +optimistic +proud +anxious +lively +atmospheric +angry +pleading +chaotic +calm +narrative +tender +peaceful +soothing +regretful +tense +urgent +devotional +cheerful +frustrated +haunting +raw +contemplative +gentle +menacing +earnest +boastful +quirky +heartwarming +innocent +mellow +ethereal +smooth +patriotic +hype +laid-back +serious +reverent +seductive +cool +provocative +brooding +relaxing +lighthearted +lonely +desperate +moody +motivational +storytelling +heroic +sorrowful +funky +conflicted +flirtatious +sassy +sincere +mysterious +angst +cynical +theatrical +resigned +majestic +anguished +whimsical +adventurous +loving +resilient +braggadocious +rhythmic +serene +solemn +meditative +satirical +emotive +excited +poignant +swagger +nocturnal +ambitious +assertive +sophisticated +hazy +exciting +educational +retro +inspiring +partying +conscious +cute +warm +grateful +frantic +tragic +reassuring +protest +comforting +anticipatory +worshipful +empowered +high-energy +vulnerable +soaring +summery +youthful +urban +flirty +stylish +rowdy +suspenseful +catchy +frenetic +sultry +charming +ominous +futuristic +obsessive +encouraging +supportive +exuberant +swinging +liberating +cautionary +restless +weary +communal +jovial +sarcastic +comedic +mournful +apologetic +cinematic +swaggering +questioning +ironic +cozy +melodramatic +eerie +spirited +surreal +chilled +sadness +paranoid +heartbreaking +wild +positive +searching +psychedelic +elegant +dystopian +grand +mystical +anguish +smoky +wry +betrayed +earthy +evocative +content +silly +jaunty +boisterous +manic +philosophical +trippy +escapist +impassioned +lamenting +rustic +jubilant +political +witty +pastoral +vengeful +hedonistic +resolute +ritualistic +despairing +rousing +thought-provoking +bold +struggling +unsettling +jazzy +aspirational +poetic +socially conscious +suspicious +bouncy +spooky +regret +magical +conversational +apocalyptic +devoted +wary +empathetic +cocky +foreboding +traditional +fiery +bitter +jealous +lonesome +critical +confessional +arrogant +faithful +heavy +apathetic +grieving +confused +infatuated +frenzied +live +affectionate +concerned +explicit +wandering +graceful +disappointed +resentful +childlike +thoughtful +tribute +social commentary +dynamic +betrayal +virtuosic +depressive +action-packed +folksy +sexual +marching diff --git a/SongGeneration/sample/description/gender.txt b/SongGeneration/sample/description/gender.txt index d285627..4f0b57c 100644 --- a/SongGeneration/sample/description/gender.txt +++ b/SongGeneration/sample/description/gender.txt @@ -1,2 +1,3 @@ -female male +female +mixed diff --git a/SongGeneration/sample/description/genre.txt b/SongGeneration/sample/description/genre.txt index ea73a89..274ca31 100644 --- a/SongGeneration/sample/description/genre.txt +++ b/SongGeneration/sample/description/genre.txt @@ -1,27 +1,299 @@ +c-pop +pop rock +trap +mandopop +ballad +alternative rock +r&b +hip-hop +dance-pop +singer-songwriter pop -electronic hip hop -rock -jazz -blues -classical -rap -country -classic rock -hard rock +indie rock +synth-pop folk soul -dance, electronic -rockabilly -dance, dancepop, house, pop -reggae -experimental -dance, pop -dance, deephouse, electronic -k-pop -experimental pop +vocal jazz +pop ballad +indie pop +cinematic +funk +blues rock +edm +lo-fi hip hop +acoustic +power ballad +orchestral pop +electronic +latin pop +hard rock +country +indie folk +lo-fi hip-hop +cumbia +electropop +gospel +traditional pop +soft rock +swing +blues +big band +children's music +chinese traditional +eurodance +folk rock +emo rap +c-pop ballad +folk pop +latin +neo-soul pop punk rock and roll -R&B -varies -pop rock +punk rock +reggae +j-rock +world music +norteño +boom bap +garage rock +contemporary r&b +jazz +chinese folk +orchestral +arena rock +country rock +reggaeton +ambient +easy listening +regional mexican +dream pop +cloud rap +mandopop ballad +rock +alternative r&b +doo-wop +j-pop +acoustic pop +rockabilly +dancehall +psychedelic rock +gangsta rap +guofeng +brazilian funk +chiptune +jazz rap +lo-fi +progressive house +trance +shoegaze +lounge +power metal +trip-hop +future bass +funk rock +corrido +spoken word +metalcore +soundtrack +new wave +world fusion +salsa +disco +gufeng +afrobeats +conscious hip-hop +chillwave +latin folk +christmas music +musical theatre +rock ballad +rhythm & blues +classical +post-punk +house +electronic rock +alternative metal +forró +choral +classical crossover +pop rap +chillhop +heavy metal +smooth jazz +emo +americana +christian rock +deep house +post-rock +mpb +bedroom pop +worship +nu-disco +sertanejo +southern rock +holiday +jazz hop +post-hardcore +southern hip hop +traditional chinese music +jump blues +latin trap +v-pop +classic rock +show tune +piseiro +80s pop +cantopop +melodic rap +contemporary christian music +forró eletrônico +hardstyle +g-funk +electronic pop +a cappella +turkish folk +country pop +symphonic rock +downtempo +bossa nova +anisong +roots reggae +rock & roll +power pop +electro house +adult contemporary +torch song +new age +schlager +chanson +bolero +bluegrass +surf rock +folk-pop +novelty +honky tonk +noise rock +christian music +funk carioca +symphonic metal +cinematic pop +tropical +drill +conscious hip hop +hardcore hip hop +darkwave +country blues +lullaby +ambient pop +c-rock +thrash metal +tech house +ranchera +lovers rock +industrial +christmas +banda +trap soul +latin rock +rap rock +techno +hardcore punk +italo disco +jazz fusion +baile funk +gu feng +acoustic folk +french rap +contemporary christian music (ccm) +nu metal +acoustic rock +western swing +flamenco +rock en español +industrial rock +latin jazz +samba +trip hop +slowcore +world +uk drill +indietronica +vallenato +psychedelic pop +brega +turkish pop +christian +boogie-woogie +city pop +sacred music +skate punk +sierreño +anthem +dub +lo-fi pop +patriotic music +inspirational +vocal trance +acid jazz +progressive rock +alternative pop +anime +tango +grunge +worldbeat +polka +drum and bass +soulful house +vocal +comedy +electric blues +hardcore hip-hop +arabesque +oldies +hyperpop +baroque pop +hymn +speed metal +dark trap +irish folk +dubstep +indie dance +cabaret +latin hip hop +art pop +dark pop +opera +contemporary christian +jazz pop +synthwave +chamber pop +christian & gospel +east coast hip-hop +europop +happy hardcore +sunshine pop +funk mandelão +underground hip-hop +trap metal +melodic death metal +dembow +kayōkyoku +hi-nrg +horrorcore +film score +traditional chinese +art rock +anime music +rhythm and blues +new jack swing +modern country +ska +heartland rock +chicha +christian hip hop +progressive metal +brazilian folk +dangdut +experimental +nursery rhyme diff --git a/SongGeneration/sample/description/instrument.txt b/SongGeneration/sample/description/instrument.txt index 3ea321c..33634f0 100644 --- a/SongGeneration/sample/description/instrument.txt +++ b/SongGeneration/sample/description/instrument.txt @@ -1,40 +1,132 @@ -synthesizer and piano -piano and drums -piano and synthesizer -synthesizer and drums -piano and strings -guitar and drums -guitar and piano -piano and double bass -piano and guitar -acoustic guitar and piano -acoustic guitar and synthesizer -synthesizer and guitar -piano and saxophone -saxophone and piano -piano and violin -electric guitar and drums -acoustic guitar and drums synthesizer -guitar and fiddle -guitar and harmonica -synthesizer and acoustic guitar -beats +vocals +bass guitar +drums +drum machine +electric guitar piano -acoustic guitar and fiddle -brass and piano -bass and drums -violin -acoustic guitar and harmonica -piano and cello -saxophone and trumpet -guitar and banjo -guitar and synthesizer +acoustic guitar +synth bass +strings +808 bass +sampler +bass saxophone -violin and piano -synthesizer and bass -synthesizer and electric guitar -electric guitar and piano -beats and piano -synthesizer and +female vocals +vocal samples +male vocals +backing vocals +trumpet +upright bass +accordion +electric bass +electric piano +cello +drum kit +percussion +violin +trombone +keyboard +guzheng +vocal +organ +choir +synth pad +flute +electronic drums +bass synthesizer +sound effects +shaker +string section +harmonica +clarinet +congas +dizi (chinese flute) +brass +woodwinds +brass section +bajo sexto +synth strings +double bass +güiro +cowbell +turntables +sub-bass +cymbals +timbales +dizi +bongos +electric organ +fiddle +erhu +tuba +timpani +acoustic bass +orchestra +synth pads +vocal chops +chimes +hand claps +viola +bass synth +french horn +orchestral strings +harp +slide guitar +808 guitar +spoken word +electronic percussion +synth +chinese flute +mandolin +tambourine +glockenspiel +bells +female vocal +horn section +sleigh bells +snare drum +güira +vibraphone +steel guitar +vocal sample +pedal steel guitar +synth flute +strings (violin, cello) +oboe +male vocal +orchestral percussion +horns +male vocalist +keyboards +banjo +wind chimes +ukulele +guacharaca +vocals (rap) +darbuka +whistling +cajón +female vocalist +synth lead +hand percussion +dizi (chinese bamboo flute) +male choir +synthesized strings +finger snaps +oud +spoken word sample +synth brass +xylophone +acoustic piano +children's choir +chinese flute (dizi) +samples +bağlama +background vocals +triangle +a cappella +caja vallenata +requinto guitar +maracas diff --git a/SongGeneration/sample/description/timbre.txt b/SongGeneration/sample/description/timbre.txt deleted file mode 100644 index 499530d..0000000 --- a/SongGeneration/sample/description/timbre.txt +++ /dev/null @@ -1,7 +0,0 @@ -dark -bright -warm -rock -varies -soft -vocal diff --git a/SongGeneration/sample/lyrics.jsonl b/SongGeneration/sample/lyrics.jsonl index 8401ca3..fea1f4a 100644 --- a/SongGeneration/sample/lyrics.jsonl +++ b/SongGeneration/sample/lyrics.jsonl @@ -1,4 +1,5 @@ +{"idx": "sample_01","gt_lyric": "[intro-long] ; [verse] 花朵绽放如诗篇.随风轻舞动.湖面波光映倒影.心随波浪荡漾中.感受着这美好时光.仿佛梦境般飘渺 ; [chorus] 唱啊唱.爱意围绕在身边.唱啊唱.心情如此欢畅.阳光洒满湖面.一切都如此美好.仿佛置身人间天堂.让人心醉神迷 ; [inst-long] ; [verse] 柳枝轻拂水面.带来淡淡的花香.渔夫划桨而过.留下一道道涟漪.在这宁静的午后.一切都显得如此和谐 ; [chorus] 唱啊唱.情人在我身旁.唱啊唱.心情如此明亮.雨滴轻敲窗棂.夜风中烛火摇曳.在这人间天堂.让我们紧紧相拥 ; [outro-long]", "descriptions": "female, dark, hip hop, sad, piano and drums", "prompt_audio_path": "sample/sample_prompt_audio.wav"} {"idx": "sample_01_autoprompt", "gt_lyric": "[intro-short] ; [verse] 雪花舞动在无尽的天际.情缘如同雪花般轻轻逝去.希望与真挚.永不磨灭.你的忧虑.随风而逝 ; [chorus] 我怀抱着守护这片梦境.在这世界中寻找爱与虚幻.苦辣酸甜.我们一起品尝.在雪的光芒中.紧紧相拥 ; [inst-short] ; [verse] 雪花再次在风中飘扬.情愿如同雪花般消失无踪.希望与真挚.永不消失.在痛苦与喧嚣中.你找到解脱 ; [chorus] 我环绕着守护这片梦境.在这世界中感受爱与虚假.苦辣酸甜.我们一起分享.在白银的光芒中.我们同在 ; [outro-short]", "auto_prompt_audio_type": "Auto"} {"idx": "sample_01_noprompt", "gt_lyric": "[intro-short] ; [verse] 雪花舞动在无尽的天际.情缘如同雪花般轻轻逝去.希望与真挚.永不磨灭.你的忧虑.随风而逝 ; [chorus] 我怀抱着守护这片梦境.在这世界中寻找爱与虚幻.苦辣酸甜.我们一起品尝.在雪的光芒中.紧紧相拥 ; [inst-short] ; [verse] 雪花再次在风中飘扬.情愿如同雪花般消失无踪.希望与真挚.永不消失.在痛苦与喧嚣中.你找到解脱 ; [chorus] 我环绕着守护这片梦境.在这世界中感受爱与虚假.苦辣酸甜.我们一起分享.在白银的光芒中.我们同在 ; [outro-short]"} {"idx": "sample_01_textprompt", "descriptions": "female, dark, pop, sad, piano and drums, the bpm is 125.", "gt_lyric": "[intro-short] ; [verse] 雪花舞动在无尽的天际.情缘如同雪花般轻轻逝去.希望与真挚.永不磨灭.你的忧虑.随风而逝 ; [chorus] 我怀抱着守护这片梦境.在这世界中寻找爱与虚幻.苦辣酸甜.我们一起品尝.在雪的光芒中.紧紧相拥 ; [inst-short] ; [verse] 雪花再次在风中飘扬.情愿如同雪花般消失无踪.希望与真挚.永不消失.在痛苦与喧嚣中.你找到解脱 ; [chorus] 我环绕着守护这片梦境.在这世界中感受爱与虚假.苦辣酸甜.我们一起分享.在白银的光芒中.我们同在 ; [outro-short]"} -{"idx": "sample_01_audioprompt", "gt_lyric": "[intro-short] ; [verse] 雪花舞动在无尽的天际.情缘如同雪花般轻轻逝去.希望与真挚.永不磨灭.你的忧虑.随风而逝 ; [chorus] 我怀抱着守护这片梦境.在这世界中寻找爱与虚幻.苦辣酸甜.我们一起品尝.在雪的光芒中.紧紧相拥 ; [inst-short] ; [verse] 雪花再次在风中飘扬.情愿如同雪花般消失无踪.希望与真挚.永不消失.在痛苦与喧嚣中.你找到解脱 ; [chorus] 我环绕着守护这片梦境.在这世界中感受爱与虚假.苦辣酸甜.我们一起分享.在白银的光芒中.我们同在 ; [outro-short]", "prompt_audio_path": "input/sample_prompt_audio.wav"} +{"idx": "sample_01_audioprompt", "gt_lyric": "[intro-short] ; [verse] 雪花舞动在无尽的天际.情缘如同雪花般轻轻逝去.希望与真挚.永不磨灭.你的忧虑.随风而逝 ; [chorus] 我怀抱着守护这片梦境.在这世界中寻找爱与虚幻.苦辣酸甜.我们一起品尝.在雪的光芒中.紧紧相拥 ; [inst-short] ; [verse] 雪花再次在风中飘扬.情愿如同雪花般消失无踪.希望与真挚.永不消失.在痛苦与喧嚣中.你找到解脱 ; [chorus] 我环绕着守护这片梦境.在这世界中感受爱与虚假.苦辣酸甜.我们一起分享.在白银的光芒中.我们同在 ; [outro-short]", "prompt_audio_path": "sample/sample_prompt_audio.wav"} diff --git a/SongGeneration/sample/test100_v2_sg_des.jsonl b/SongGeneration/sample/test100_v2_sg_des.jsonl new file mode 100644 index 0000000..b0cb920 --- /dev/null +++ b/SongGeneration/sample/test100_v2_sg_des.jsonl @@ -0,0 +1,100 @@ +{"idx": "1", "descriptions": "pop ballad, resilient, piano, electric guitar, string section, drum kit.", "gt_lyric": "[intro-medium]; [verse] 漂泊在无尽的沧海.寻觅那颗失落的心.四肢麻木却无法自欺.恐惧如潮水般侵袭.挣扎着渴望着变得坚强.请别潜入那深海.也别在那里躲藏 ; [chorus] 让一切重新开始.我不想再次坠落.坠向那无尽的深渊.不再假装坚强.不再逃避现实.我告诉自己不再寻找.寻找那虚幻的可能 ; [inst-medium]; [verse] 我曾想用醉意将你囚禁.囚禁于无人之巅.独自徘徊在虚幻天堂.不要潜入深海.不要在黑暗中躲藏 ; [chorus] 让一切重新开始.我不想再次坠落.坠向那无尽的边缘.不再假装坚强.不再逃避现实.我告诉自己不再坠落.永远不再坠落 ; [bridge] 我被那光芒吸引.虽然它有时带来毁灭.但我知道变化是成长的痕迹.雨后的天空湛蓝如洗 ; [chorus] 它提醒我为何坚持.为何不能放弃.因为未经历所有痛苦.就不会懂得珍惜美丽.这是我的破碎时刻.也是重生的开始 ; [outro-medium]"} +{"idx": "2", "descriptions": "gufeng, rock, heartbroken, electric guitar, drum kit, bass guitar.", "gt_lyric": "[intro-medium]; [verse] 芳菲落尽.芳菲逝去.在这纯白的季节里.月光洒满地.若这只是一场意外.为何回忆满载我心.就此将你封印.你却依然让我心痛不已 ; [chorus] 你我心存在过的痕迹.我始终无法忘记.落花纷飞.如雪满地.苍白的誓言从何说起.若能将往昔掘出.捧在手心.是否就能再次相拥 ; [intro-medium] ; [verse] 芳菲落尽.芳菲逝去.叫我心痛难抑.你所在之处.我已无法抹去记忆 ; [chorus] 你啊.总叫我心痛不已.因为你存在过的空间.我无法彻底忘记.你啊.总叫我心痛不已.因为你刻下的印记.我此生无法忘记 ; [outro-medium]"} +{"idx": "3", "descriptions": "pop, fresh, electric guitar, synthesizer, backing vocals.", "gt_lyric": "[intro-medium]; [verse] 剑影映照在身上.情深似海却难留.情丝细腻如痴迷.独对孤灯诉衷肠.相思无用成残局.红颜命运多凉薄.忆年少共赏明月到天方 ; [chorus] 泪痕沾湿新衣袖.风花雪月梦中留.天涯海角情难求.愿与君共渡白头.红颜薄命泪两行.遥望当年梦中留.共赏明月透云霄 ; [inst-medium]; [verse] 红尘情缘难安定.爱恨交织难自弃.相思无时不起舞.红颜命薄如纸茫 ; [chorus] 忆往昔共赏月到天荒.旧情难断如雨落.相伴直至白头时.柳絮飘摇青衣皎.满眼薄雾化无声流.风花雪雨梦中游.天涯海角情难断.愿与天地共白头 ; [verse] 前尘往事人憔悴.红颜泪落意难平.莫忘旧年誓言声.共赏明月照苍穹 ; [outro-medium]"} +{"idx": "4", "descriptions": "soft pop, nostalgic, acoustic guitar, piano, sampler, drum machine.", "gt_lyric": "[intro-medium]; [verse] 书页在风中飘转.蔚蓝天空下秋风也泛红.往事如弦拨动心间.只愿愁绪随风如烟.谁曾吐露过刺耳的话.却依然在心中泛起牵挂.芬芳年华仍想要找寻你.重逢不及一场和解 ; [chorus] 你仍充斥我所有的欢喜.如阳光般无可伏匿.我心中有秋云徘徊.却从不知如何解析.你仍充斥我所有的欢喜 ; [inst-medium]; [verse] 历经几多世事偏移.思绪飘过蔚蓝的海底.才不用再偷偷忆起.桥头你那微笑的身影.终是不知何解 ; [chorus] 你始终是我心之所思.阳光中无痕亦无迹.我心中有所求却终不知何解 ; [bridge] 执念虽强狂.终无半点痕迹可抵.我心中有所求.却终不知何解 ; [chorus] 你触及我深锁的心事.如阳光消散所有谜题.我心中有秋云.却终不知何解.你触及我深锁的心事 ; [outro-medium]"} +{"idx": "5", "descriptions": "electronic, dance-pop, uplifting, synthesizer, drum machine, synth bass.", "gt_lyric": "[intro-medium]; [verse] 这城市的喧嚣淹没了我的思绪.它跳进我生活困扰每个夜晚的静谧.我渴望逃离这无形的疏离与封闭.徘徊在这疯狂世界的十字路口.你我在这片喧嚷中渐渐迷失了自己.我仍在寻找一方心灵的净土 ; [chorus] 多想忘记一切.飞翔到无际的乐园.那里只有你我守护着的.最初的梦想.我想要忘记一切.抵达无际的乐园.那里只有你我.让梦想自由生长 ; [inst-medium] ; [verse] 我们的梦想穿越了时间的海洋.就让我勇敢一次飞向那无际的乐园.那里只有你我灵魂自由歌唱.我们的梦想是生命最初的模样 ; [chorus] 我想要忘记过往.飞向那无际的乐园.那里只有你和我是彼此的光芒.我们的梦想在星空下熠熠生辉.我想要忘记一切飞向那无际的乐园.那里只有你我书写永恒的篇章.我们的梦想是永不落幕的渴望.就让我忘记所有飞向那无际的乐园.那里只有你和爱是唯一的信仰 ; [outro-medium]"} +{"idx": "6", "descriptions": "r&b, longing, piano, bass guitar, drum kit, saxophone.", "gt_lyric": "[intro-medium]; [verse] 窗外人群正欢腾.我却独对寂寞煎熬.长街的欢乐如梦无痕.回忆如卡片般淡薄易碎.而心情却沉重如铅.繁星静静照亮街道.思念如潮水涌来.悄然湿润我眼眶.我独自轻声歌唱 ; [chorus] 听见风中的温柔.带着一丝暖意如你的吻.看雪花轻轻飘落.怀念如潮水漫上心头.你的影子无处不在.我不觉孤单.只因心中满是你 ; [inst-medium]; [verse] 咖啡馆的旧座位.还留着未说完的话.手机里存着去年冬天.你笑着捧起雪花的片段 ; [chorus] 时间像静止的沙漏.承诺在风里渐渐模糊.我数着钟摆的滴答.在重逢与告别间徘徊.学着与沉默共存.在每次日落时分.练习失去你的黄昏 ; [bridge] 如果季节能倒退.让落叶回到枝头.我是否会更勇敢.在离别前紧紧停留.月光浇灌的伤口.在深夜里轻声问候.爱是未寄出的信.在心底生了根长了皱 ; [chorus] 窗外人群正欢腾.我却独对寂寞歌唱.心中满是你影子.仿佛你就在身旁.感动得泪流满面.我背包装满眼泪.却依然微笑 ; [outro-medium]"} +{"idx": "7", "descriptions": "jazz, piano, brass section, double bass, drum kit, confident.", "gt_lyric": "[intro-medium]; [verse] 在那遥远的爵士乡.有位迷人的姑娘.行人经过她的窗.总为她驻足凝望.她的微笑如夜曲悠扬.温暖中带着一丝忧伤 ; [chorus] 她的眼神如星闪亮.带我坠入梦境徜徉.我愿放下手中诗行.只为她轻声歌唱.日日守候在那街角.盼她一次温柔回望.我不过是远方的风.偶然路过她的乐章.却把心跳谱成了音符.在每一个夜晚反复回响; [inst-medium]; [verse] 我愿化身为那月光.静静陪在她的身旁 ; [bridge] 任那晚风轻拂梦想.心事只对她默默讲.岁月是位沉默的乐手.将青涩吹奏成沧桑.我的歌谣褪了颜色.却还在老地方.为她播放 ; [chorus] 在那遥远的城市一方.时光深处藏着一位好姑娘.夜色披上霓虹衣裳.迷路的人啊.都向着那扇窗凝望.那光芒.是温柔的故乡; [outro-medium]"} +{"idx": "8", "descriptions": "rock, motivational, electric guitar, bass guitar, drum kit.", "gt_lyric": "[intro-medium]; [verse] 漫漫长夜无尽期.谁懂你心碎泪低垂.世界不公命如棋.过客人生皆如戏.梦想易碎莫悲戚.何不快乐追光曦.直到故事落幕时.人潮散尽回忆栖 ; [chorus] 梦如旧醉半醒时.快乐是欢笑尽淋漓.莫等舞台幕落迟.歌声中寻答案依稀.美丽回忆永不逝 ; [inst-medium] ; [verse] 不同手握多少棋.谁能甘于平淡里.梦想随光会消逝.人生舞台终有寂.无尽夜谁主演戏.放下一切享当下意 ; [chorus] 每一刻快乐要珍惜.直到曲终人散际.人潮退去梦依旧.歌声回荡忆永驻.美丽回忆不褪色.长夜中心痛化诗意 ; [outro-medium]"} +{"idx": "9", "descriptions": "industrial hip hop, angry, electric guitar, drum machine, synthesizer, vocoder.", "gt_lyric": "[intro-medium]; [verse] 齿轮咬合着.预设的轨迹.瞳孔里倒映着.数据流的暴雨.我们狂欢.在算法投喂的盛宴.咀嚼着被量化的悲喜.这信仰是屏幕闪烁的像素 ; [chorus] 这自由是选项有限的单选题;难道你没听见.那骨髓里的哭泣.难道你没看见.这笑容下的粉饰太平.我们铸造了镀金的枷锁.并为之歌颂.为之狂热.在乐园里慢慢枯萎.把灵魂典当给完美的幻觉.醒来.撕碎这幻觉; [inst-medium] ; [verse] 语言被稀释成安全的标语.思想在回音壁里重复窒息.他们贩卖希望.像廉价的糖果.治愈他们发明的疾病.愤怒被冷却.棱角被磨平.成为系统里一颗沉默的铆钉 ; [chorus] 所以握紧拳头.感受残存的温度.所以咬紧牙关.找回疼痛的觉悟.在网格中安然入睡.这镀金的枷锁 ; [outro-medium]"} +{"idx": "10", "descriptions": "neoclassical, introspective, piano, violin, cello, string section.", "gt_lyric": "[intro-medium]; [verse] 在这宁静的夜晚我迷失在梦中.滴答声随思绪飘向遥远星空.没有了喧嚣车马的纷扰苦痛.只剩下单调音符在夜空回荡.我只听见内心轰鸣如雷动.感受空洞中闪电划破迷茫 ; [chorus] 你是否听懂这长夜的诉说.是否依然寻找那迷失的方向.迷茫如影划过我的梦境.远方星空下人迹已匆匆.只剩下音符在风中振动.我只听见内心无尽的轰隆 ; [inst-medium]; [chorus] 沸腾的轰鸣划破苍穹.你是否依然迷茫在夜空.是否还在梦境中徘徊.你是否听到心底的呼唤 ;旋转着奔向那迷失的方向.在长夜中寻找一丝微光.你是否依然迷茫如旧.只愿找到内心的归宿 ; [outro-medium]"} +{"idx": "11", "descriptions": "synth-pop, sweet, synthesizer, drum machine, bass, backing vocals.", "gt_lyric": "[intro-medium]; [verse] 春风吹过心扉开.花儿轻轻为你绽.才华不止是空谈.真心话语不轻慢.我不是那易谢的花瓣.谁能懂我心底波澜.若你想了解我的爱.明日盼你再归来.我不是谜题无人猜.谁能真正明白爱 ; [chorus] 想知道我的爱.明日你在何处徘徊.春风吹过花儿开.真心为你藏胸怀.我不是野花任人采.谁能懂得我的爱.若你想了解我的情.明日等你再相逢 ; [inst-medium]; [verse] 春日阳光照星海.风中带着甜与爱.我的心意不曾改.真心等你共未来.我不是那柔弱花瓣 ; [bridge] 谁能读懂我情怀.若你想知道我的爱.明日等你再相见.我不是月光无人恋.谁能真正看透爱.若你想知道我的心.明日你在哪里等 ; [chorus] 春风吹过花儿盏.真心为你守不变.我不是浮萍任人采.谁能懂得我的暖.若你想了解我的情.明日等你再团圆.啦啦啦啦爱在春天蔓延 ; [outro-medium]"} +{"idx": "12", "descriptions": "chinese traditional, bittersweet, guzheng, erhu, dizi, percussion.", "gt_lyric": "[intro-medium]; [verse] 雨洒断桥边.烟波散不尽思念.独立黑白桥之间.当年誓言如画卷.你离湖畔远去.我独望北岸天.细雨落成段.墨色染透心田; [chorus] 舟上九载蝴蝶舞翩跹.离散后空余孤弦颤.琴声苍茫似海天.琴瑟相和明珠圆.思绪纷繁千万种.人间交错几重变.纵隔千山心仍连 ; [inst-medium]; [verse] 告别声犹在耳畔.此字深深刻心间.岁月如流水潺潺.一曲不负这寒年.流年似蝶飞无偏.身陷浮生常慨叹 ; [bridge] 若命运是张无情的网.你我皆是挣不脱的线.何不将憾事酿作酒.敬这荒唐人间.醉眼看那水中月.聚散终有时.月缺终会圆 ; [chorus] 真假情意难分辨.百般思绪争流年.往事如梦幻似烟.穿探一生情缘牵.天上人间相思恋.黑白命运相交织.千言万语尽无言.任前途真假皆在眼前 ; [outro-medium]"} +{"idx": "13", "descriptions": "emo rap, heartbroken, 808 bass, drum machine, electric guitar, rap.", "gt_lyric": "[intro-medium]; [verse] 城市霓虹吞没了星光.我像浮尘游荡在街上.耳机里循环着陈旧情歌.却盖不住心底的荒凉.人群拥挤却倍感孤单.请别提及那个姓名.也别唤醒那些曾经 ; [chorus] 让往事随风而去.我不想再次回忆.忆起那些甜蜜毒药.不再强颜欢笑.不再卑微乞讨.我告诉自己不再回头.回头便是万劫不复 ; [inst-medium]; [verse] 我曾试图用工作麻醉自己.囚禁在无尽的忙碌里.可是夜深人静的时刻.不要翻开相册.不要在回忆里沉溺 ; [chorus] 让往事随风而去.我不想再次回忆.忆起那些撕心裂肺.不再强颜欢笑.不再卑微乞讨.我告诉自己不再哭泣.永远不再为你哭泣 ; [bridge] 我曾以为爱是全部.虽然它最终带来痛楚.但伤痕是成长的勋章.哭过之后眼睛更加明亮 ; [chorus] 它提醒我何为真实.何为虚妄的幻影.因为未曾彻底心碎.就不会懂得如何坚强.这是我的告别时刻.也是新生的序章 ; [outro-medium]"} +{"idx": "14", "descriptions": "metalcore, determined, electric guitar, bass guitar, drum kit, fx.", "gt_lyric": "[intro-medium]; [verse] 地铁穿过凌晨的隧道.车窗倒映着疲倦的脸.耳机里放着后摇音乐.鼓点敲打着失眠的神经.早餐铺升起白色蒸汽.像某个模糊的承诺 ; [chorus] 这城市太大而我们太小.小到可以被一阵风吹走.但今夜我想做个巨人.踩过霓虹灯的河流 ; [inst-medium]; [verse] 便利店灯光太过明亮.照见所有隐秘的悲伤.热咖啡在纸杯里打转.像说不出口的那些话 ; [chorus] 这城市太大而我们太小.小到可以被一阵风吹走.但今夜我要逆着人潮.游向有你的那个岛 ; [bridge] 天气预报说会有雪.可天空依旧沉默如铁.我们像两粒迷路的尘埃.在十字路口等待奇迹 ; [chorus] 这城市太大而我们太小.小到可以被一阵风吹走.但此刻我们紧紧相拥.就是最坚固的城堡 ; [outro-medium]"} +{"idx": "15", "descriptions": "alternative r&b, vulnerable, piano, bass, drum machine, string section.", "gt_lyric": "[intro-medium]; [verse] 镜子里的陌生面孔.挂着疲惫不堪的笑容.习惯性地隐藏情绪.不敢流露半点脆弱.外壳坚硬内心汹涌.请别拆穿我的伪装.也别施舍你的怜悯 ; [chorus] 我需要时间愈合.我不想触碰伤疤.伤疤之下暗流涌动.不再依赖他人.不再寻找寄托.我逼迫自己独自站立.站立成一座山峦 ; [inst-medium]; [verse] 曾经将幸福寄托于你.如同攀附大树的藤蔓.如今学习扎根于大地.不要随风摇摆.不要轻易折断 ; [chorus] 我需要时间愈合.我不想触碰伤疤.伤疤是曾经的烙印.不再依赖他人.不再寻找寄托.我逼迫自己变得完整.由内而外的完整 ; [bridge] 泪水并非软弱象征.它也能洗净灵魂窗户.当我终于敢放声痛哭.反而感受到了前所未有轻松 ; [chorus] 它冲刷掉所有尘埃.让真相清晰浮现.原来真正的强大始于.接纳自己的所有不完美.这是我的脆弱时分.也是重建的开始 ; [outro-medium]"} +{"idx": "16", "descriptions": "rock, wanderlust, electric guitar, bass guitar, drum kit.", "gt_lyric": "[intro-medium]; [verse] 列车呼啸穿过隧道.窗外风景急速倒退.像是与过去在告别.奔向未定的终点线.心中混杂期待恐惧.请别问我要去哪里.也别追问归期何时 ; [chorus] 让我随风去流浪.我不想停留原地.原地只有无尽循环.不再规划人生.不再遵循地图.我渴望一场意外之旅.邂逅未知的自己 ; [inst-medium]; [verse] 行李简单只有背囊.装着一颗渴望自由的心.旧照片已撕碎抛洒.不要任何牵绊.不要沉重过往 ; [chorus] 让我随风去流浪.我不想停留原地.原地只会滋生腐朽.不再规划人生.不再遵循地图.我渴望一场灵魂蜕变.在路途中找到答案 ; [bridge] 山川湖海皆是导师.星空之下顿悟了渺小.狭隘的悲欢被风吹散.融入天地间的壮阔 ; [chorus] 它教会我何为生命.何为存在的意义.渺小如尘却也独特.勇敢地写下自己的诗.这是我的远征之路.生命最绚烂的章节 ; [outro-medium]"} +{"idx": "17", "descriptions": "chamber folk, reflective, acoustic guitar, piano, string section.", "gt_lyric": "[intro-medium]; [verse] 图书馆的灰尘在跳舞.落在泛黄的诗集扉页.阳光穿过百叶窗的缝隙.把安静切成平行世界.墨水在稿纸上晕开.写成未寄出的信 ; [chorus] 时间是狡猾的小偷.偷走年少轻狂的梦.却留下这些柔软的刺.在深夜里隐隐作痛 ; [inst-medium]; [verse] 铅笔屑堆成小山.像被遗忘的承诺废墟.窗外的麻雀在争吵.关于春天和虫子的秘密 ; [chorus] 时间是沉默的帮凶.见证所有无疾而终.但那些未说出口的话.在纸页间获得永生 ; [bridge] 管理员的收音机里.放着二十年前的老歌.旋律像一把生锈的钥匙.打开了记忆的锁 ; [chorus] 时间是最温柔的凶手.抹去眼泪也抚平伤口.而我们都成了同谋.在这故事里停留 ; [outro-medium]"} +{"idx": "18", "descriptions": "electronic, trip-hop, intriguing, sampler, drum machine, synth pad, vocals.", "gt_lyric": "[intro-medium]; [verse] 梦境总是光怪陆离.交织着恐惧与渴望.在潜意识深海潜水.打捞遗失的记忆碎片.醒来时常恍惚片刻.请别追问梦的内容.也别试图理性分析 ; [chorus] 梦是另一个现实.我不想完全清醒.清醒世界太多规则.不再压抑欲望.不再掩饰本能.我在梦里获得补全.现实缺失的部分 ; [inst-medium]; [verse] 有时梦见在天空飞翔.有时梦见在不停下坠.梦境是心灵的镜子.不要逃避映照.不要恐惧真相 ; [chorus] 梦是隐秘的花园.我不想被它控制.控制白天的情绪.不再压抑欲望.不再掩饰本能.我在梦里释放影子.与它和平地共处 ; [bridge] 记录每个奇异梦境.尝试与潜意识对话.发现那些混乱表象下.藏着最真实的自我 ; [chorus] 它是我内心的回响.未被驯服的原始声音.理解梦境就是理解.自己未知的广阔领域.这是我的夜间航行.探索内在的宇宙 ; [outro-medium]"} +{"idx": "19", "descriptions": "r&b, cozy, bass guitar, drum kit, saxophone, electric guitar.", "gt_lyric": "[intro-medium]; [verse] 洗衣机在阳台上轰鸣.搅动着泡沫和旧时光.你的衬衫在滚筒里.跳着一支疲惫的舞.水珠沿着玻璃滑落.像不成句的告白 ; [chorus] 生活是重复的旋律.副歌部分总是相似.但在某个走音的瞬间.我突然想起你的眼睛 ; [inst-medium]; [verse] 晾衣绳在风里摇晃.挂满潮湿的回忆碎片.一只袜子不知去向.像我们弄丢的某个下午 ; [chorus] 生活是琐碎的诗篇.标点符号都是油盐.但在翻炒的烟火气里.藏着最动人的韵脚 ; [bridge] 天气预报说雨要停.云层裂开一道金色缝隙.洗衣机发出完成的蜂鸣.像故事的另一个开始 ; [chorus] 生活是未干的衣裳.在微风里轻轻荡漾.当我们学会欣赏褶皱.也就读懂了柔软 ; [outro-medium]"} +{"idx": "20", "descriptions": "chillhop, detached, sampler, drum machine, bass, piano.", "gt_lyric": "[intro-medium]; [verse] 在喧闹的聚会中央.我却感到格格不入.笑脸之下藏着孤独.无人知晓我的挣扎.像座孤岛被人环绕.请别过来碰杯庆祝.也别问我是否快乐 ; [chorus] 让我安静地待着.我不想伪装合群.合群代价是失去自我.不再讨好世界.不再勉强迎合.我享受这份疏离感.冷眼旁观的热闹 ; [inst-medium]; [verse] 提前离场走入夜色.寒冷空气让人清醒.独处并非是可悲事.不要群体认同.不要虚假温暖 ; [chorus] 让我安静地待着.我不想浪费精力.精力于无谓的社交.不再讨好世界.不再勉强迎合.我珍惜这份孤独权.自我对话的空间 ; [bridge] 夜空繁星沉默不语.却给了我最大的安慰.懂得人自然能懂得.不懂者何必多费唇舌 ; [chorus] 它让我更接近本心.看清真正渴望什么.世界太吵回归内在.那里有真正的平静.这是我的选择之路.甘于孤独的丰盛 ; [outro-medium]"} +{"idx": "21", "descriptions": "power pop, inspirational, electric guitar, bass guitar, drum kit, backing vocals.", "gt_lyric": "[intro-medium]; [verse] 翻阅发黄的旧日记.字迹青涩记录往昔.那个天真无畏少年.已被岁月蒙上尘埃.梦想搁浅在了哪里.请别笑我太过怀旧.也别提醒现实残酷 ; [chorus] 我想找回点星光.不想完全地麻木.麻木地重复每一天.不再妥协现实.不再遗忘初心.我试图擦亮心灯.照亮模糊的前路 ; [inst-medium]; [verse] 曾经相信能改变世界.如今怕被世界改变太多.但心底仍有微弱的火.不要让它熄灭.不要彻底沉沦 ; [chorus] 我想找回点勇气.不想彻底地投降.投降于平庸的生活.不再妥协现实.不再遗忘初心.我试图重新启航.哪怕已不再年轻 ; [bridge] 年龄不该是枷锁.它给了我更厚实的土壤.只要种子还未死亡.春天来临时仍会发芽 ; [chorus] 它提醒我为何出发.为何曾热泪盈眶.那份冲动不是幼稚.是生命最原始的力量.这是我的中途自省.是为了更好地前行 ; [outro-medium]"} +{"idx": "22", "descriptions": "chicago blues, lonely, electric guitar, harmonica, drum kit, bass guitar.", "gt_lyric": "[intro-medium]; [verse] 凌晨三点的便利店.冰柜发出持续的嗡鸣.穿西装的男人在挑饭团.领带松垮像投降的白旗.热食区的关东煮.在汤汁里慢慢膨胀 ; [chorus] 这里是城市的守夜人.收容所有流浪的灵魂.荧光灯照亮的面孔.都写着未完待续的故事 ; [inst-medium]; [verse] 收银员打着哈欠.扫描仪发出嘀嗒声响.找零的硬币落入掌心.带着金属的冰冷温度 ; [chorus] 这里是临时的避风港.用食物交换片刻温暖.即使最孤独的夜晚.也有泡面陪伴到天明 ; [bridge] 自动门开合之间.涌进带着酒气的风.一个女孩蹲在门口.喂食流浪的玳瑁猫 ; [chorus] 这里是不打烊的剧场.上演着无声的悲喜剧.而我们都是临时演员.在黎明前悄然退场 ; [outro-medium]"} +{"idx": "23", "descriptions": "hip hop, trap, driven, 808 bass, drum machine, sampler, rap.", "gt_lyric": "[intro-medium]; [verse] 健身房里的落地镜前.映出扭曲的倒影.跑步机传送带不停转动.像逃不出的莫比乌斯环.汗水滴落在橡胶垫上.形成小小的深色地图 ; [chorus] 身体是诚实的日记.记录所有放纵和克制.当肌肉到达极限的瞬间.思绪反而变得轻盈 ; [inst-medium]; [verse] 杠铃片碰撞的金属声.节奏稳定如心跳.新来的女孩总是偷看.镜子里的自己 ; [chorus] 身体是未完成的雕塑.需要耐心打磨形状.每一次力竭后的颤抖.都是蜕变的前奏 ; [bridge] 窗外夜色已经降临.霓虹灯透过玻璃窗.在瑜伽垫伸展的躯体.写下柔软的抗争诗 ; [chorus] 身体是暂时的容器.盛放不羁的灵魂.当呼吸与动作同步.我听见内在的潮汐 ; [outro-medium]"} +{"idx": "24", "descriptions": "cinematic, somber, orchestra, piano, string section.", "gt_lyric": "[intro-medium]; [verse] 午夜医院的走廊.消毒水气味挥之不去.候诊区的电视开着.播放无声的购物广告.轮椅的轮子压过地砖.发出规律的低语 ; [chorus] 这里是生死的边境线.摆渡着疼痛和希望.每个数字灯牌的闪烁.都是命运的倒计时 ; [inst-medium]; [verse] 护士站的灯光雪白.病历本堆成小小山脉.保温杯里的茶水已冷.等待的人望着天花板 ; [chorus] 这里是眼泪的中转站.汇集所有祈祷和恐惧.但握紧的双手的温度.比任何药物都有效 ; [bridge] 晨光从东窗渗入时.暖气管开始轻轻咳嗽.新来的实习生揉着眼睛.咖啡杯冒出虚弱的热气 ; [chorus] 这里是生命的课堂.教会我们脆弱和坚强.当出院手续办完那刻.才懂平安是最大幸运 ; [outro-medium]"} +{"idx": "25", "descriptions": "electronic, future bass, restless, synthesizer, drum machine, sub-bass, fx.", "gt_lyric": "[intro-medium]; [verse] 自动售货机的蓝光.在走廊尽头明明灭灭.按钮下的商品标签.像排列整齐的欲望.易拉罐坠落的巨响.惊醒声控灯的睡眠 ; [chorus] 这是现代社会的许愿池.投币就能获得即时满足.碳酸气泡在喉咙爆炸.带来短暂的廉价快乐 ; [inst-medium]; [verse] 有人买了同样的咖啡.连续第七个夜晚.我们从不交谈.共享着某种默契的孤独 ; [chorus] 这是二十四小时的神庙.供奉着各种口味的神.当硬币滚入投币口.就是最虔诚的仪式 ; [bridge] 清洁工推着车经过.拖把留下湿漉漉的痕迹.她投币买巧克力棒.掰一半给阴影里的猫 ; [chorus] 这是城市毛细血管.输送着甜味和咖啡因.在每一个无眠的夜晚.拯救即将崩断的神经 ; [outro-medium]"} +{"idx": "26", "descriptions": "blues rock, wistful, electric guitar, bass guitar, drum kit, harmonica.", "gt_lyric": "[intro-medium]; [verse] 雨刷器在玻璃上划弧.刮不净连绵的雨水.电台放着怀旧金曲.信号断断续续像回忆.导航提示前方转弯.而我想继续直行 ; [chorus] 车厢是移动的孤岛.载着无处安放的心事.雨声是最好的配乐.掩盖所有哽咽和叹息 ; [inst-medium]; [verse] 红灯倒计时读秒.像生命中的无数等待.后视镜里的自己.有着陌生的表情 ; [chorus] 车厢是透明的茧.隔绝外界的喧嚣.在这短暂的旅程里.我可以诚实面对眼泪 ; [bridge] 隧道突然吞噬光线.黑暗中有荧光标指引.就像某个温柔的手势.在迷途时轻轻一拍 ; [chorus] 车厢是时空的间隙.允许暂时的失重.当雨停时我会下车.带着被洗净的勇气 ; [outro-medium]"} +{"idx": "27", "descriptions": "chinese folk, meditative, dizi, guzheng, field recording, percussion.", "gt_lyric": "[intro-medium]; [verse] 月光在湖面写下碎银的诗.沉睡的莲蓬做着关于夏天的梦.萤火虫提着灯笼巡游.为迷路的星子引路.晚风翻阅荷叶的经卷.露珠在叶脉上练习平衡术 ; [chorus] 这一池寂静有禅意的重量.压弯了所有虚妄的枝桠.我们不过是偶然的倒影.在波光里获得片刻完整 ; [inst-medium]; [verse] 水底晃动着云的遗书.鲤鱼用尾鳍修改标点.水黾在水面写下密码.比梵文更接近真相 ; [chorus] 这一池寂静有禅意的重量.让喧嚣的世界暂时失语.当涟漪抚平所有褶皱.我们听见时间本来的心跳 ; [bridge] 黎明前来采莲的舟子.用木桨划破镜面.那些无法打捞的月光.都沉底成了藕节 ; [outro-medium]"} +{"idx": "28", "descriptions": "gufeng, meditative, guzheng, pipa, dizi, percussion.", "gt_lyric": "[intro-medium]; [verse] 青瓷盏中的茶烟袅袅.勾勒出山峦的轮廓.案头宣纸吸饱了暮色.等待一个落款的名字.古琴弦上停着蝴蝶.谱半阙未完成的曲 ; [chorus] 这满屋子的光阴在打坐.檀香灰落下时顿悟.所有追逐都是妄念.不如看茶烟如何坐化 ; [inst-medium]; [verse] 雨打芭蕉的节奏太慢.慢过屋檐滴答的时钟.线装书里的蠹鱼成精.啃食着唐朝的月亮 ; [chorus] 这满屋子的光阴在打坐.教我用慢镜头发酵往事.当第一声晚钟穿过竹林.才明白空是最满的容器 ; [bridge] 夜色在砚台里磨浓.突然想给远方写封信.却发现所有想说的话.都已被月光提前寄出; [chorus] 这满屋子的浮生正沉淀.茶烟散尽后露出的天青.像一句等了千年的偈语.说圆满本是一道裂缝 ; [outro-medium]"} +{"idx": "29", "descriptions": "guofeng, tender, guzheng, erhu, dizi.", "gt_lyric": "[intro-medium] ; [verse] 白瓷瓶插着新摘的梅.暗香在月色里浮沉.窗纸透进三分月光.正好照亮未干的墨痕 ; [chorus] 这满屋子的寂静在开花.听风与竹影细语呢喃.当花瓣落在砚池中央.才懂得淡极始知花更艳 ; [inst-medium] ; [verse] 炭火煨着旧年雪水.茶烟画出蓬山的轮廓.搁笔时惊觉墨已冷.唯有书香依旧温暖 ; [chorus] 这满屋子的寂静在开花.听风与竹影细语呢喃.当花瓣落在砚池中央.才懂得淡极始知花更艳 ; [bridge] 忽然想问南飞的雁.可曾经过你的江南.却见茶烟升起处.已有春信悄然抵达 ; [chorus] 这满屋子的等待也甘甜.如同梅花含着雪.当第一缕东风叩窗.才明白不语是最深的思念 ; [outro-medium]"} +{"idx": "30", "descriptions": "chinese traditional, calm, pipa, guzheng, dizi, erhu.", "gt_lyric": "[intro-medium] ; [verse] 竹帘筛落细雨千丝.绣架上的海棠半醒.银针穿过薄纱时.挑起了满室流光 ; [chorus] 这满屋子的时光在刺绣.一针一线都是禅意.当锦缎开出并蒂莲.才知慢是最快的针法 ; [inst-medium] ; [verse] 丝线缠绕成星河.金钗划破夜的绸缎.绣绷绷住流年碎影.针脚里藏着手温 ; [chorus] 这满屋子的时光在刺绣.一针一线都是禅意.当锦缎开出并蒂莲.才知慢是最快的针法 ; [bridge] 忽然想绣朵浮云.却见线团滚落窗前.化作晨曦里的露珠.映出你含笑眉眼 ; [chorus] 这满屋子的情意细如丝.缠绕成永恒的结.当最后一针收线时.才懂圆满是留白的艺术 ; [outro-medium]"} +{"idx": "31", "descriptions": "acoustic folk, joyful, acoustic guitar, percussion, flutes.", "gt_lyric": "[intro-medium] ; [verse] 溪水抱着鹅卵石.唱着清澈的歌谣.蒲公英撑着小伞.要去远方旅行 ; [chorus] 这山野的清晨在微笑.露珠是它的酒窝.当野草莓染红指尖时.才知甜蜜是免费的礼物 ; [inst-medium] ; [verse] 蘑菇顶着小雨伞.给蚂蚁当亭子歇脚.松鼠收藏的阳光.在树洞里闪闪发亮 ; [chorus] 这山野的清晨在微笑.露珠是它的酒窝.当野草莓染红指尖时.才知甜蜜是免费的礼物 ; [bridge] 忽然想变成春风.却见山泉映出笑脸.原来我早就是自然.最宠爱的那个孩子 ; [chorus] 这山野的怀抱永远暖.每片叶子都在爱我.当炊烟招手唤归时.才懂我是幸福的山民 ; [outro-medium]"} +{"idx": "32", "descriptions": "chinese traditional, dreamy, wind chimes, erhu, guzheng, dizi.", "gt_lyric": "[intro-medium] ; [verse] 月光流过青石阶.惊醒了睡莲的梦.风铃在檐角轻轻唱.把星光摇成碎银 ; [chorus] 这院子的夜晚会写诗.每个角落都押着韵.当露珠从叶尖坠落时.才知安静是最美的声音 ; [inst-medium] ; [verse] 萤火虫提着灯笼.寻找去年那首童谣.竹椅摇着蒲扇风.数着银河里的星星 ; [chorus] 这院子的夜晚会写诗.每个角落都押着韵.当露珠从叶尖坠落时.才知安静是最美的声音 ; [bridge] 忽然想摘一朵云.却见云影跌进池塘.化成会游动的月光.吻醒了睡莲的梦 ; [chorus] 这院子的魔法在继续.万物都在悄悄相爱.当第一声鸟鸣响起.才懂黑夜是光的摇篮 ; [outro-medium]"} +{"idx": "33", "descriptions": "synthwave, wonder, synthesizer, synth pad, drum machine, vocoder.", "gt_lyric": "[intro-medium] ; [verse] 星空盖着棉被.银河哗啦啦流淌.流星划破寂静.许愿池开始工作 ; [chorus] 这宇宙的剧场免费开放.每个人都是主角.当北斗舀起光阴时.才知渺小是最大的自由 ; [inst-medium] ; [verse] 星座忙着连线.月亮啃成饼干.云朵棉絮飘过.给星星当枕头 ; [chorus] 这宇宙的剧场免费开放.每个人都是主角.当北斗舀起光阴时.才知渺小是最大的自由 ; [bridge] 忽然想摘颗星星.却发现手心早就有.那些爱过我的人.都是发光的恒星 ; [chorus] 这宇宙的浪漫无穷大.黑洞也吞不掉希望.当光年缩成咫尺.才懂爱是唯一的永恒 ; [outro-medium]"} +{"idx": "34", "descriptions": "guofeng, nostalgic, erhu, dizi, guzheng, percussion.", "gt_lyric": "[intro-medium] ; [verse] 古桥弯成月亮.倒影在水里安家.乌篷船摇着橹.穿过唐宋元明清 ; [chorus] 这水乡的皱纹是诗行.每道涟漪都是平仄.当鸬鹚潜入夕阳时.才知古老是最新的时尚 ; [inst-medium] ; [verse] 灯笼红着脸庞.柳枝写着毛笔字.石阶浸在水中央.数着过往的流年 ; [chorus] 这水乡的皱纹是诗行.每道涟漪都是平仄.当鸬鹚潜入夕阳时.才知古老是最新的时尚 ; [bridge] 忽然想变成拱桥.却见倒影里的我.早已是水墨画中.那个等雨的女子 ; [chorus] 这水乡的时光慢慢流.流成文化的血脉.当月亮爬上马头墙.才懂温柔是最强的力量 ; [outro-medium]"} +{"idx": "35", "descriptions": "bubblegum pop, joyful, bells, flutes, percussion, synthesizer.", "gt_lyric": "[intro-medium] ; [verse] 雪花缀满枝头.像春天提前开了花.雪人戴着红围巾.守护着童真的梦 ; [chorus] 这雪国的童话会呼吸.每个脚印都是逗号.当冰凌滴答唱歌时.才知寒冷也藏着温暖 ; [inst-medium] ; [verse] 窗花剪出福字.冰糖葫芦亮晶晶.雪橇划过白砂糖.洒下串串笑声 ; [chorus] 这雪国的童话会呼吸.每个脚印都是逗号.当冰凌滴答唱歌时.才知寒冷也藏着温暖 ; [bridge] 忽然想堆个雪人.却见它对我眨眼睛.原来魔法一直在.信的人就能看见 ; [chorus] 这雪国的纯净最珍贵.洗去所有尘世烦恼.当炉火映红脸庞时.才懂简单是最大的富有 ; [outro-medium]"} +{"idx": "36", "descriptions": "country, content, acoustic guitar, banjo, fiddle, bass guitar.", "gt_lyric": "[intro-medium] ; [verse] 麦浪翻滚成海洋.稻草人戴着云帽子.蜻蜓停在草帽沿.说着丰收的秘密 ; [chorus] 这田野的秋天是画家.把大地染成金黄色.当谷堆堆成小山时.才知弯腰是最美的舞蹈 ; [inst-medium] ; [verse] 蚂蚱跳过田埂.露珠串成水晶链.拖拉机唱着重低音.惊走偷吃的麻雀 ; [chorus] 这田野的秋天是画家.把大地染成金黄色.当谷堆堆成小山时.才知弯腰是最美的舞蹈 ; [bridge] 忽然想躺进麦秸.却见夕阳给我盖被.原来天地是慈母.我们都是她的孩子 ; [chorus] 这田野的馈赠最慷慨.一粒米都是一首诗.当炊烟升起在村口.才懂劳动是最美的修行 ; [outro-medium]"} +{"idx": "37", "descriptions": "smooth jazz, peaceful, saxophone, electric piano, double bass, drum kit.", "gt_lyric": "[intro-medium] ; [verse] 渔船枕着波浪睡.渔火是失眠的星星.缆绳系着月光.轻轻哼着催眠曲 ; [chorus] 这港湾的夜晚是摇篮.摇着所有人的乡愁.当潮水吻别沙滩时.才知归来是最好的远航 ; [inst-medium] ; [verse] 灯塔眨着眼守望.贝壳藏着海的秘密.桅杆数着云朵.等风来讲故事 ; [chorus] 这港湾的夜晚是摇篮.摇着所有人的乡愁.当潮水吻别沙滩时.才知归来是最好的远航 ; [bridge] 忽然想变成海风.却见归航的船身上.写满思念的印记.像写给陆地的情书 ; [chorus] 这港湾的怀抱永远暖.等着每个流浪的梦.当汽笛惊起海鸥.才懂靠岸是最美的风景 ; [outro-medium]"} +{"idx": "38", "descriptions": "folk pop, heartwarming, acoustic guitar, piano, string section.", "gt_lyric": "[intro-medium] ; [verse] 炊烟写着天空的诗.米饭香是家的标点.灶火舔着铁锅底.炖着时光的温暖 ; [chorus] 这厨房的魔法最平常.却让游子魂牵梦萦.当碗筷奏响叮当时.才知幸福是妈妈的味道 ; [inst-medium] ; [verse] 腌菜坛藏着夏天.酱油瓶站着岗.菜刀在砧板跳舞.切出生活的韵律 ; [chorus] 这厨房的魔法最平常.却让游子魂牵梦萦.当碗筷奏响叮当时.才知幸福是妈妈的味道 ; [bridge] 忽然想学做羹汤.却发现爱的配方.早就刻在记忆里.是妈妈手的温度 ; [chorus] 这厨房的烟火最深情.一粥一饭都是传承.当蒸汽模糊了窗花.才懂平凡是最大的奇迹 ; [outro-medium]"} +{"idx": "39", "descriptions": "pop rock, nostalgic, electric guitar, bass guitar, drum kit, backing vocals.", "gt_lyric": "[intro-medium] ; [verse] 书包躺在夕阳里.装着半块彩虹糖.粉笔灰在跳舞.黑板擦累了打盹 ; [chorus] 这教室的青春会发芽.长成参天的思念.当蝉鸣穿过玻璃窗.才知那年夏天最珍贵 ; [inst-medium] ; [verse] 课桌刻着小心事.橡皮擦改不掉喜欢.纸飞机穿过光影.降落在谁的发梢 ; [chorus] 这教室的青春会发芽.长成参天的思念.当蝉鸣穿过玻璃窗.才知那年夏天最珍贵 ; [bridge] 忽然想回到过去.却发现时光的琥珀.把我们都凝成珍珠.在记忆里永远闪亮 ; [chorus] 这教室的钟声最温柔.敲响每个人的年少.当毕业照微微泛黄.才懂离别是另一种重逢 ; [outro-medium]"} +{"idx": "40", "descriptions": "bossa nova, warm, acoustic guitar, percussion, saxophone, bass guitar.", "gt_lyric": "[intro-medium] ; [verse] 老街青石板发光.雨伞开成彩色蘑菇.邮筒守着旧时光.等一封手写的信 ; [chorus] 这巷子的皱纹里.藏着多少温暖故事.当桂花香飘过墙头.才知慢是最快的速度 ; [inst-medium] ; [verse] 木门咿呀说着话.窗台茉莉轻轻香.竹椅上的老猫咪.做着有鱼的梦 ; [chorus] 这巷子的皱纹里.藏着多少温暖故事.当桂花香飘过墙头.才知慢是最快的速度 ; [bridge] 忽然想数电线杆.却见麻雀跳着音符.把寻常日子谱成.最动人的爵士乐 ; [chorus] 这巷子的呼吸很均匀.陪着城市慢慢变老.当夕阳给瓦片镀金.才懂沧桑是最美的妆容 ; [outro-medium]"} +{"idx": "41", "descriptions": "pop ballad, loving, piano, string section, acoustic guitar.", "gt_lyric": "[intro-medium] ; [verse] 晚风掠过窗台摇晃烛火.蝉鸣藏进星河轻声诉说.青石板路青苔爬满角落.油纸伞下你眉眼如月色清澈.旧书信里墨香还未褪色.字里行间都是温柔的脉络 ; [chorus] 爱是人间烟火最暖的底色.是岁月长河里不变的承诺.牵手走过四季花开花落.平凡日子也能酿成甜蜜的歌 ; [inst-medium] ; [verse] 晚风掠过窗台摇晃烛火细雨打湿屋檐滴答成歌.老藤椅摇着时光慢慢消磨.你煮的茶烟袅袅绕心窝.故事在茶香里慢慢温热 ; [chorus] 爱是人间烟火最暖的底色.是岁月长河里不变的承诺.牵手走过四季花开花落.平凡日子也能酿成甜蜜的歌 ; [bridge] 走过颠沛流离看过世间辽阔.才懂安稳相伴才是最真的快乐.风风雨雨我们紧紧相拥着.往后余生只要有你就足够了 ; [chorus] 爱是人间烟火最暖的底色.是岁月长河里不变的承诺.牵手走过四季花开花落.平凡日子也能酿成甜蜜的歌 ; [outro-medium]"} +{"idx": "42", "descriptions": "dream pop, romantic, electric guitar, synth pad, bass, drum kit.", "gt_lyric": "[intro-medium] ; [verse] 海浪拍打着礁石轻声低语.贝壳里装着海风的气息.船帆扬起驶向天际的边际.海鸥追逐着浪花嬉戏不已 ; [chorus] 大海是藏着浪漫的蓝色诗集.每朵浪花都写满诗意.潮起潮落带走岁月的痕迹.留下的是永恒的美丽星光坠入深海泛起涟漪 ; [inst-medium] ; [verse] 月光洒在海面波光粼粼.渔火点点像是星星落进海里.老船长的故事充满传奇.说那深海里有座水晶的岛屿 ; [chorus] 大海是藏着浪漫的蓝色诗集.每朵浪花都写满诗意.潮起潮落带走岁月的痕迹.留下的是永恒的美丽 ; [bridge] 曾以为远方才有最美的风景.直到遇见这片海的宁静.海风拂过脸颊吹散所有烦心.原来幸福就藏在这片刻的安宁 ; [chorus] 大海是藏着浪漫的蓝色诗集.每朵浪花都写满诗意.潮起潮落带走岁月的痕迹.留下的是永恒的美丽 ; [outro-medium]"} +{"idx": "43", "descriptions": "indie folk, content, acoustic guitar, violin, percussion.", "gt_lyric": "[intro-medium] ; [verse] 枫叶染红秋山层林尽染.雁群排着人字飞向南方.石板巷的桂花落满阶前.清香漫过墙头飘向街的那边.糖炒栗子的香气弥漫人间.暖手的烤红薯甜透了心田 ; [chorus] 秋天是打翻了的调色盘.每一抹色彩都温柔缱绻.落叶纷飞像是蝴蝶蹁跹.这季节藏着太多心动的瞬间枫叶染红秋山层林尽染 ; [inst-medium] ; [verse] 老书店的窗台上晒着书卷.阳光透过窗棂落在泛黄的纸笺.猫蜷在角落睡得香甜.时光在这一刻变得缓慢悠闲 ; [chorus] 秋天是打翻了的调色盘.每一抹色彩都温柔缱绻.落叶纷飞像是蝴蝶蹁跹.这季节藏着太多心动的瞬间 ; [bridge] 走过了春的明媚夏的热烈.才懂秋的沉静有多特别.收获的喜悦在空气里蔓延.愿这美好能留得久一些再久一些 ; [chorus] 秋天是打翻了的调色盘.每一抹色彩都温柔缱绻.落叶纷飞像是蝴蝶蹁跹.这季节藏着太多心动的瞬间 ; [outro-medium]"} +{"idx": "44", "descriptions": "c-pop ballad, cozy, piano, string section, bells.", "gt_lyric": "[intro-medium] ; [verse] 初雪吻过窗棂凝成霜花.炉火跳动暖了一室冬夏.毛线针在指尖缠绕牵挂.织就的围巾藏着细密的情话.窗外的雪落得无声无息.屋内的茶烟漫过了篱笆 ; [chorus] 冬天是裹着温柔的绒毯.每片雪花都写满期盼.寒风吹不散心头的暖.有你在身边就是岁岁平安 ; [inst-medium] ; [verse] 初雪吻过窗棂凝成霜花.旧相册里藏着年少模样.雪地里的脚印弯弯曲曲好长.堆的雪人戴着你的围巾.笑容在寒风里明亮滚烫 ; [chorus] 冬天是裹着温柔的绒毯.每片雪花都写满期盼.寒风吹不散心头的暖.有你在身边就是岁岁平安 ; [bridge] 走过了秋的萧瑟冬的寒凉.才懂陪伴是最暖的光.雪花落满肩头白发苍苍.我们的故事还在慢慢讲 ; [chorus] 冬天是裹着温柔的绒毯.每片雪花都写满期盼.寒风吹不散心头的暖.有你在身边就是岁岁平安 ; [outro-medium]"} +{"idx": "45", "descriptions": "sunshine pop, sunny, ukulele, percussion, flutes.", "gt_lyric": "[intro-medium] ; [verse] 春雨敲醒枝头嫩绿新芽.燕子衔泥筑巢屋檐之下.青瓦白墙映着烟雨如画.油纸伞下脚步轻轻踏过石板洼.溪边的草芽探头张望.柳丝拂过水面撩起轻纱 ; [chorus] 春天是写满希望的童话.每缕春风都带着牵挂.花开满枝头芬芳满桠.人间又添了许多温柔的话春雨敲醒枝头嫩绿新芽 ; [inst-medium] ; [verse] 风筝线在手中轻轻牵挂.孩童的笑声漫过了篱笆.田埂上的犁耙翻耕希望.布谷鸟的歌声落在谁家 ; [chorus] 春天是写满希望的童话.每缕春风都带着牵挂.花开满枝头芬芳满桠.人间又添了许多温柔的话 ; [bridge] 熬过了冬的沉寂寒的肃杀.才懂春的生机有多无价.蝴蝶蹁跹飞过青草地.幸福在时光里慢慢发芽 ; [chorus] 春天是写满希望的童话.每缕春风都带着牵挂.花开满枝头芬芳满桠.人间又添了许多温柔的话 ; [outro-medium]"} +{"idx": "46", "descriptions": "neo-soul, warm, electric piano, bass guitar, drum kit, backing vocals.", "gt_lyric": "[intro-medium] ; [verse] 茶香漫过竹篱绕着篱笆.月光洒落肩头凝成霜华老茶壶煮着岁月的闲话.竹椅摇晃着时光慢慢落下.窗外的竹影随风轻轻敲打.蝉鸣声声唱着夏的情话 ; [chorus] 平淡是最真的人间风雅.每个日子都温柔如画.柴米油盐藏着岁月的暖.有你在身边就是最好的家 ; [inst-medium] ; [verse] 茶香漫过竹篱绕着篱笆针线穿梭缝补岁月的疤.毛衣上的针脚细密又融洽.晚归的脚步踏着夕阳落下.笑容在晚风里慢慢融化 ; [chorus] 平淡是最真的人间风雅.每个日子都温柔如画.柴米油盐藏着岁月的暖.有你在身边就是最好的家 ; [bridge] 尝过了世间的百味与苦辣.才懂平淡的日子有多无价.夕阳吻过西山染红了晚霞.我们的故事还在慢慢发芽 ; [chorus] 平淡是最真的人间风雅.每个日子都温柔如画.柴米油盐藏着岁月的暖.有你在身边就是最好的家 ; [outro-medium]"} +{"idx": "47", "descriptions": "soft rock, loving, electric guitar, bass guitar, drum kit.", "gt_lyric": "[intro-medium] ; [verse] 星河翻涌坠入眼底刹那.萤火飞舞点亮仲夏的夜话你坐在身旁弹着旧吉他.歌声轻轻唱着岁月的风沙.星光落在发梢凝成了霜华.心事在旋律里慢慢融化 ; [chorus] 陪伴是最长情的告白情话.每个朝夕都写满牵挂.风雨同舟走过春秋冬夏.有你在身边就不怕天大地大 ; [inst-medium] ; [verse] 星河翻涌坠入眼底刹那旧唱片转动着时光的疤.老照片里的我们笑靥如花.咖啡的香气漫过了窗纱.岁月在温柔里慢慢发芽 ; [chorus] 陪伴是最长情的告白情话.每个朝夕都写满牵挂.风雨同舟走过春秋冬夏.有你在身边就不怕天大地大 ; [bridge] 看过了世间的繁华与浮夸.才懂平淡的陪伴有多无价.皱纹爬上眼角鬓角生华发.我们的故事还在慢慢发芽 ; [chorus] 陪伴是最长情的告白情话.每个朝夕都写满牵挂.风雨同舟走过春秋冬夏.有你在身边就不怕天大地大 ; [outro-medium]"} +{"idx": "48", "descriptions": "folk rock, dramatic, electric guitar, dizi, drum kit, erhu.", "gt_lyric": "[intro-medium] ; [verse] 古镇石桥映着流水人家.灯笼摇曳点亮暮色烟霞青石板路印着岁月的疤.油纸伞下的回眸惊艳了年华.茶馆里的说书人醒木轻啪.故事里的江湖刀光剑影飒沓 ; [chorus] 古镇是藏着时光的水墨画.每寸石板都刻着牵挂.炊烟袅袅漫过青砖黛瓦.岁月静好不过是这般模样 ; [inst-medium] ; [verse] 古镇石桥映着流水人家雕花窗棂映着月光皎洁无暇.老木匠的刻刀雕琢着年华.酒香漫过深巷醉了晚霞.阿婆的米酒甜透了枝桠 ; [chorus] 古镇是藏着时光的水墨画.每寸石板都刻着牵挂.炊烟袅袅漫过青砖黛瓦.岁月静好不过是这般模样 ; [bridge] 走过了喧嚣的城繁华的夏.才懂古镇的宁静有多无价.流水悠悠淌过春秋冬夏.时光在这里停下了步伐 ; [chorus] 古镇是藏着时光的水墨画.每寸石板都刻着牵挂.炊烟袅袅漫过青砖黛瓦.岁月静好不过是这般模样 ; [outro-medium]"} +{"idx": "49", "descriptions": "city pop, summery, electric piano, bass guitar, drum kit, brass section.", "gt_lyric": "[intro-medium] ; [verse] 蝉鸣叫醒盛夏热浪翻涌.西瓜泡在井水透着冰融老蒲扇摇着蝉声阵阵浓.竹席上的梦藏着夏夜的星空.萤火虫提着灯笼飞舞花丛.蛙鸣声声唱着岁月从容 ; [chorus] 夏天是藏着热烈的美梦.每片晚霞都染着绯红.晚风拂过脸颊吹散烦忧.青春的故事在蝉声里翻涌 ; [inst-medium] ; [verse] 蝉鸣叫醒盛夏热浪翻涌冰棍儿融化在掌心之中.少年的心事藏在日记本中.梧桐树下的约定还在心中.单车驶过的风带着悸动 ; [chorus] 夏天是藏着热烈的美梦.每片晚霞都染着绯红.晚风拂过脸颊吹散烦忧.青春的故事在蝉声里翻涌 ; [bridge] 走过了春的懵懂秋的稳重.才懂夏的热烈有多汹涌.星空下的许愿还在心中.年少的梦永远有始无终 ; [chorus] 夏天是藏着热烈的美梦.每片晚霞都染着绯红.晚风拂过脸颊吹散烦忧.青春的故事在蝉声里翻涌 ; [outro-medium]"} +{"idx": "50", "descriptions": "modern country, nostalgic, acoustic guitar, fiddle, bass guitar, drum kit.", "gt_lyric": "[intro-medium] ; [verse] 晨雾漫过山岗吻醒麦浪.白鸽掠过云端捎来晴朗田埂上的野花悄悄绽放.蝴蝶追逐着阳光翩翩起舞忙.竹篮里装满刚摘的野果香.笑声随风吹过层层的麦浪 ; [chorus] 故乡是心底最柔软的向往.是梦里常回的温柔乡.炊烟袅袅升起的方向.藏着我们最纯真的时光 ; [inst-medium] ; [verse] 晨雾漫过山岗吻醒麦浪老槐树的年轮刻满过往.秋千荡着童年的无忧与欢畅.奶奶的童谣还在耳边回荡.夕阳把影子拉得好长好长 ; [chorus] 故乡是心底最柔软的向往.是梦里常回的温柔乡.炊烟袅袅升起的方向.藏着我们最纯真的时光 ; [bridge] 长大后我们奔赴远方闯荡.行囊里装满故乡的星光.每当迷失方向感到迷茫.想起故乡就有了前行的力量 ; [chorus] 故乡是心底最柔软的向往.是梦里常回的温柔乡.炊烟袅袅升起的方向.藏着我们最纯真的时光 ; [outro-medium]"} +{"idx": "51", "descriptions": "country pop, romantic, acoustic guitar, fiddle, bass guitar, drum kit.", "gt_lyric": "[intro-medium] ; [verse] Starlight sprinkles on the dress. Moonlight fills the chest. Cicadas hide in moss. Thoughts spread through the west. ; [chorus] Love is the confession kissed by the evening breeze. Is the surging tide where stars flow into the seas. Is the tender care through all the years. Is the lifelong preference that never flees. ; [inst-medium] ; [verse] Fallen leaves cover the street. Stories start to repeat. Fireworks warm the night. Worries melt complete. Time twists the dust. Memories retreat. ; [chorus] Love is the confession kissed by the evening breeze. Is the surging tide where stars flow into the seas. Is the tender care through all the years. Is the lifelong preference that never flees. ; [bridge] Through spring autumn winter and summer. Through wind rain thunder and lightning. Holding your hand we fear no disaster. ; [chorus] Love is the confession kissed by the evening breeze. Is the surging tide where stars flow into the seas. Is the tender care through all the years. Is the lifelong preference that never flees. ; [outro-medium]"} +{"idx": "52", "descriptions": "electronic, synthesizer, drum machine, sampler, relaxed.", "gt_lyric": "[intro-medium] ; [verse] Sunset dyes the sky red. Homing birds fly ahead. Evening breeze sweeps the wheat field. Fragrance stains the thread. Smoke rises from the hometown. Homesickness fills the head. ; [chorus] Returning is the hope woven by the sunset glow. Is the warmth from the kitchen where the firelight glows. Is the earnest wish packed in the traveling load. Is the softest destination that the heart always knows. ; [inst-medium] ; [verse] Old locust tree's chair. Holds memories everywhere. Grandma's gentle words. Linger in the air. Stream by the door flows. On without a care. ; [chorus] Returning is the hope woven by the sunset glow. Is the warmth from the kitchen where the firelight glows. Is the earnest wish packed in the traveling load. Is the softest destination that the heart always knows. ; [bridge] Through thousands of mountains and rivers. Through all the joys and shivers. Home's direction is never a quiver. ; [chorus] Returning is the hope woven by the sunset glow. Is the warmth from the kitchen where the firelight glows. Is the earnest wish packed in the traveling load. Is the softest destination that the heart always knows. ; [outro-medium]"} +{"idx": "53", "descriptions": "roots reggae, chill, bass guitar, electric guitar, drum kit, brass.", "gt_lyric": "[intro-medium] ; [verse] Fireflies light the summer night. Frogs croak by the field side. Lotus leaves hold the dewdrops. That roll and glide. Grandma's palm fan sways. Stories start to bide. ; [chorus] Summer is the dream lit by the firefly's glow. Is the peace under the lotus where the cool winds blow. Is the passion sung by the cicadas high and low. Is the tranquility brought by the evening breeze slow. ; [inst-medium] ; [verse] Milky Way stretches across the sky. Stars twinkle and sigh. Grandma's old tales. Soften the lullaby. Iced plum juice sweetens. The mood that makes us high. ; [chorus] Summer is the dream lit by the firefly's glow. Is the peace under the lotus where the cool winds blow. Is the passion sung by the cicadas high and low. Is the tranquility brought by the evening breeze slow. ; [bridge] Chasing fireflies that dance around. Listening to frogs sing till the moon is round. Summer nights with you are never profound. ; [chorus] Summer is the dream lit by the firefly's glow. Is the peace under the lotus where the cool winds blow. Is the passion sung by the cicadas high and low. Is the tranquility brought by the evening breeze slow. ; [outro-medium]"} +{"idx": "54", "descriptions": "jazz, bossa nova, wistful, acoustic guitar, saxophone, double bass, percussion.", "gt_lyric": "[intro-medium] ; [verse] Breeze stirs the willow branches. By the riverbank side. Wild geese leave the northern land. With the autumn tide. Chrysanthemums bloom on the fence. Their fragrance can't hide. ; [chorus] Autumn is the poem written by the falling leaves. Is the golden hue that the sunlight achieves. Is the quiet longing that the heart retrieves. Is the gentle sigh that the wind believes. ; [inst-medium] ; [verse] Mooncakes lie on the plate. Mid-autumn night is late. Lanterns hang on the eaves. Casting light so great. Memories of old days. Are hard to abate. ; [chorus] Autumn is the poem written by the falling leaves. Is the golden hue that the sunlight achieves. Is the quiet longing that the heart retrieves. Is the gentle sigh that the wind believes. ; [bridge] Walking through the maple woods. Where the red leaves stand. Watching the sunset sink. Beyond the distant land. Autumn days with you are so grand. ; [chorus] Autumn is the poem written by the falling leaves. Is the golden hue that the sunlight achieves. Is the quiet longing that the heart retrieves. Is the gentle sigh that the wind believes. ; [outro-medium]"} +{"idx": "55", "descriptions": "chamber music, peaceful, piano, violin, cello.", "gt_lyric": "[intro-medium] ; [verse] Sunshine kisses the window sills. Where the cat lies still. Daisies bloom in the yard. Their petals spill. Pages of the old book. Are turned by the thrill. ; [chorus] Peace is the quiet moment when the world stands still. Is the warmth of the sunshine that the heart can fill. Is the soft whisper that the wind does instill. Is the simple joy that the soul can fulfill. ; [inst-medium] ; [verse] Coffee steam curls up high. Sweet scents reach the sky. Old radio plays the tune. That makes us sigh. Lazy afternoons pass. By and by. ; [chorus] Peace is the quiet moment when the world stands still. Is the warmth of the sunshine that the heart can fill. Is the soft whisper that the wind does instill. Is the simple joy that the soul can fulfill. ; [bridge] Sitting on the porch swing. Watching clouds drift by. Feeling the gentle breeze. That brushes the eye. Peaceful days with you never die. ; [chorus] Peace is the quiet moment when the world stands still. Is the warmth of the sunshine that the heart can fill. Is the soft whisper that the wind does instill. Is the simple joy that the soul can fulfill. ; [outro-medium]"} +{"idx": "56", "descriptions": "delta blues, yearning, acoustic guitar, harmonica, percussion.", "gt_lyric": "[intro-medium] ; [verse] Drizzle taps the window. Thoughts start to grow. Oil-paper umbrella shades. Memories that glow. Moss climbs the old wall. Tales start to show. ; [chorus] Longing is the web woven by the rain's soft tune. Is the poem written by time beneath the moon. Is the gaze hidden in eyes that never swoon. Is the obsession in heart that won't end too soon. ; [inst-medium] ; [verse] Black awning boat sails cross the river. Longing sways to and fro. Stone bridge side past days. Gentle as dew drops flow. Evening breeze brushes the cheek. Yearning starts to grow. ; [chorus] Longing is the web woven by the rain's soft tune. Is the poem written by time beneath the moon. Is the gaze hidden in eyes that never swoon. Is the obsession in heart that won't end too soon. ; [bridge] Through misty rivers and southern towns. Through lantern lights that spin around. With your longing in mind we never feel down. ; [chorus] Longing is the web woven by the rain's soft tune. Is the poem written by time beneath the moon. Is the gaze hidden in eyes that never swoon. Is the obsession in heart that won't end too soon. ; [outro-medium]"} +{"idx": "57", "descriptions": "blues, longing, electric guitar, harmonica, drum kit, bass guitar.", "gt_lyric": "[intro-medium] ; [verse] Snowflakes fall on shoulders. Chill creeps through the folds. Stove light glows by the window. Warmth fills the souls. Old song hummed till the end. Tears start to roll. ; [chorus] Waiting is the vigil frozen in the snow. Is the glass of strong wine that chases the cold. Is the silent watch through the years that unfold. Is the constant tenderness that never grows old. ; [inst-medium] ; [verse] Moonlight climbs the attic. Longing starts to roam. Old letter's crinkled edges. Are full of home warmth. Cold wind sweeps past the door. Hoping you'll come home. ; [chorus] Waiting is the vigil frozen in the snow. Is the glass of strong wine that chases the cold. Is the silent watch through the years that unfold. Is the constant tenderness that never grows old. ; [bridge] Through the long cold winter. Till the spring flowers enter the door. With your waiting in mind we ask for nothing more. ; [chorus] Waiting is the vigil frozen in the snow. Is the glass of strong wine that chases the cold. Is the silent watch through the years that unfold. Is the constant tenderness that never grows old. ; [outro-medium]"} +{"idx": "58", "descriptions": "synth-pop, synthesizer, sampler, synth bass, refreshing.", "gt_lyric": "[intro-medium] ; [verse] Footsteps echo on the street. Where the streetlights meet. Rain stops and rainbow arches. Above the street. Sweet words you whispered. Still feel so complete. ; [chorus] Promise is the vow that the stars do keep. Is the warmth that the cold nights can't defeat. Is the faith that makes the wandering heart retreat. Is the forever that the two hearts entreat. ; [inst-medium] ; [verse] Hand in hand we walk. Through the crowd so neat. Laughter rings out loud. Making the world sweet. Every little moment. Is so discreet. ; [chorus] Promise is the vow that the stars do keep. Is the warmth that the cold nights can't defeat. Is the faith that makes the wandering heart retreat. Is the forever that the two hearts entreat. ; [bridge] Through the ups and downs. That life may repeat. Holding your hand. We never feel defeat. Promises with you are so sweet. ; [chorus] Promise is the vow that the stars do keep. Is the warmth that the cold nights can't defeat. Is the faith that makes the wandering heart retreat. Is the forever that the two hearts entreat. ; [outro-medium]"} +{"idx": "59", "descriptions": "edm pop, energetic, synthesizer, drum machine, synth bass, fx.", "gt_lyric": "[intro-medium] ; [verse] Stars twinkle in the sky. Where the dreams lie high. Fireflies dance around. The meadow nigh. Youthful hearts beat fast. With a fervent sigh. ; [chorus] Youth is the flame that burns so bright and high. Is the song that makes the blue skies cry. Is the courage that makes the fears die. Is the memory that never says goodbye. ; [inst-medium] ; [verse] We chase the wind and clouds. With a fearless mind. We leave our footprints. On the path we find. Every single day. Is so kind. ; [chorus] Youth is the flame that burns so bright and high. Is the song that makes the blue skies cry. Is the courage that makes the fears die. Is the memory that never says goodbye. ; [bridge] Running through the fields. Where the wild flowers lie. Singing the old tunes. Till the moon climbs high. Youthful days with you never sigh. ; [chorus] Youth is the flame that burns so bright and high. Is the song that makes the blue skies cry. Is the courage that makes the fears die. Is the memory that never says goodbye. ; [outro-medium]"} +{"idx": "60", "descriptions": "worship, inspirational, choir, piano, organ, hand claps.", "gt_lyric": "[intro-medium] ; [verse] Morning dew wets the sleeve. Flowers scent the weave. Sun climbs the hilltop. Mist starts to leave. Streams sing a melody. Worries take their leave. ; [chorus] Dreams are the grass kissed by the butterfly's wings. Are the omens of clear skies where the bluebird sings. Are the throbbing heartbeats of youthful springs. Are the sweet memories that forever cling. ; [inst-medium] ; [verse] Kites fly up the sky. Troubles pass by and by. Cicadas sing so high. Joys bubble up and nigh. Time carves a mark. Sighs turn to a sigh. ; [chorus] Dreams are the grass kissed by the butterfly's wings. Are the omens of clear skies where the bluebird sings. Are the throbbing heartbeats of youthful springs. Are the sweet memories that forever cling. ; [bridge] Across mountains lakes and plains. Through crowds that come and wane. With your dream in mind we never feel mundane. ; [chorus] Dreams are the grass kissed by the butterfly's wings. Are the omens of clear skies where the bluebird sings. Are the throbbing heartbeats of youthful springs. Are the sweet memories that forever cling. ; [outro-medium]"} +{"idx": "61", "descriptions": "electronic, euphoric, synthesizer, drum machine, sub-bass, fx.", "gt_lyric": "[intro-medium] ; [verse] Waves kiss the sandy shore. Seagulls soar and roar. Shells hide in the shallow. Secrets they implore. Tide comes and tide goes. Time slips through the door. ; [chorus] Ocean is the cradle where the dreams explore. Is the endless blue that the eyes adore. Is the lullaby sung by the tide's soft roar. Is the boundless hug that the soul can store. ; [inst-medium] ; [verse] Sunlight glints on the wave. Fishermen set the sail. Netting the silver fish. Wind fills the veil. Salt spray kisses the cheek. Joy never fails. ; [chorus] Ocean is the cradle where the dreams explore. Is the endless blue that the eyes adore. Is the lullaby sung by the tide's soft roar. Is the boundless hug that the soul can store. ; [bridge] Sailing through the storm and the calm's encore. Feeling the ocean's pulse to the core. With the sea by our side we ask for no more. ; [chorus] Ocean is the cradle where the dreams explore. Is the endless blue that the eyes adore. Is the lullaby sung by the tide's soft roar. Is the boundless hug that the soul can store. ; [outro-medium]"} +{"idx": "62", "descriptions": "folk, acoustic, serene, acoustic guitar, violin, flutes.", "gt_lyric": "[intro-medium] ; [verse] Bamboo sways in the wind. Mountain mists descend. Birds chirp in the thicket. Notes they send. Stream runs through the valley. Peace does attend. ; [chorus] Mountains are the fortress where the quiet blend. Is the green blanket that the earth does mend. Is the breath of nature that the heart can comprehend. Is the serenity that the mind can transcend. ; [inst-medium] ; [verse] Pine trees stand so tall. Waterfalls cascade and fall. Wild berries hang on the branch. Sweetness enthrall. Monk chants in the temple. Echoes call. ; [chorus] Mountains are the fortress where the quiet blend. Is the green blanket that the earth does mend. Is the breath of nature that the heart can comprehend. Is the serenity that the mind can transcend. ; [bridge] Climbing through the trails where the pines sprawl. Watching the sunrise paint the sky in pall. Mountain days with you are beyond recall. ; [chorus] Mountains are the fortress where the quiet blend. Is the green blanket that the earth does mend. Is the breath of nature that the heart can comprehend. Is the serenity that the mind can transcend. ; [outro-medium]"} +{"idx": "63", "descriptions": "jazz, relaxed, piano, brass, drum kit, double bass.", "gt_lyric": "[intro-medium] ; [verse] Books line the wooden shelf. Pages tell themselves. Stories of love and loss. Wealth of stealth. Ink stains on the paper. Memories of health. ; [chorus] Library is the haven where the thoughts delve. Is the treasure trove that the wisdom can shelve. Is the quiet corner where the heart can solve. Is the endless world that the mind can revolve. ; [inst-medium] ; [verse] Lamp glows on the desk. Silence is the best. Turning the old pages. No need to quest. Words flow like a river. No need to rest. ; [chorus] Library is the haven where the thoughts delve. Is the treasure trove that the wisdom can shelve. Is the quiet corner where the heart can solve. Is the endless world that the mind can revolve. ; [bridge] Reading through the tales of the past and the zest. Feeling the magic of the words that invest. Library hours with you are truly blessed. ; [chorus] Library is the haven where the thoughts delve. Is the treasure trove that the wisdom can shelve. Is the quiet corner where the heart can solve. Is the endless world that the mind can revolve. ; [outro-medium]"} +{"idx": "64", "descriptions": "traditional pop, friendly, piano, accordion, bass guitar, drum kit.", "gt_lyric": "[intro-medium] ; [verse] Bells ring in the old town. Cobblestones lie down. Children laugh in the square. Joy they crown. Bakery scents fill the air. Sweetness unbound. ; [chorus] Town is the tapestry where the lives are wound. Is the warm embrace that the neighbors surround. Is the little paradise that the heart has found. Is the gentle rhythm that the days astound. ; [inst-medium] ; [verse] Flower carts line the street. Petals at our feet. Old man plays the accordion. Tune so sweet. Cats nap on the windowsill. Heat they beat. ; [chorus] Town is the tapestry where the lives are wound. Is the warm embrace that the neighbors surround. Is the little paradise that the heart has found. Is the gentle rhythm that the days astound. ; [bridge] Wandering through the lanes where the memories abound. Greeting the folks that we have always found. Town days with you are forever profound. ; [chorus] Town is the tapestry where the lives are wound. Is the warm embrace that the neighbors surround. Is the little paradise that the heart has found. Is the gentle rhythm that the days astound. ; [outro-medium]"} +{"idx": "65", "descriptions": "neoclassical, joyful, piano, violin, cello, harp.", "gt_lyric": "[intro-medium] ; [verse] Petals fall from the rose. Garden overflows. Bees buzz around the bloom. Honey they compose. Butterfly flutters by. Beauty it shows. ; [chorus] Garden is the canvas where the colors expose. Is the sweet perfume that the breeze discloses. Is the little heaven that the soul proposes. Is the endless joy that the heart disposes. ; [inst-medium] ; [verse] Roses red and white. Sun shines so bright. Marigolds stand in a row. Delightful sight. Mint leaves fresh and green. Coolness takes flight. ; [chorus] Garden is the canvas where the colors expose. Is the sweet perfume that the breeze discloses. Is the little heaven that the soul proposes. Is the endless joy that the heart disposes. ; [bridge] Tending to the flowers as the days repose. Watching the buds open and the petals close. Garden days with you are the sweetest dose. ; [chorus] Garden is the canvas where the colors expose. Is the sweet perfume that the breeze discloses. Is the little heaven that the soul proposes. Is the endless joy that the heart disposes. ; [outro-medium]"} +{"idx": "66", "descriptions": "rock, electric guitar, bass guitar, drum kit, uplifting.", "gt_lyric": "[intro-medium] ; [verse] Train whistles in the dusk. Tracks stretch in the hush. Travelers wave goodbye. Tears they brush. Luggage stacked on the platform. Dreams they crush. ; [chorus] Journey is the story where the roads rush. Is the unknown path that the feet must hush. Is the fleeting moment that the heart must flush. Is the endless quest that the soul must lush. ; [inst-medium] ; [verse] Fields pass by the window. Green and mellow. Villages dot the horizon. Peaceful fellow. Clouds drift in the sky. Slow and yellow. ; [chorus] Journey is the story where the roads rush. Is the unknown path that the feet must hush. Is the fleeting moment that the heart must flush. Is the endless quest that the soul must lush. ; [bridge] Riding through the night till the day's blush. Feeling the wind that the window does gush. Journey days with you are never a mush. ; [chorus] Journey is the story where the roads rush. Is the unknown path that the feet must hush. Is the fleeting moment that the heart must flush. Is the endless quest that the soul must lush. ; [outro-medium]"} +{"idx": "67", "descriptions": "electronic, house, groovy, synthesizer, drum machine, bass, vocoder.", "gt_lyric": "[intro-medium] ; [verse] Piano keys under the hand. Melodies expand. Notes dance in the air. Music commands. Heart beats with the rhythm. Soul understands. ; [chorus] Music is the language where the feelings stand. Is the warm embrace that the silence demands. Is the magic spell that the mind withstands. Is the endless love that the heart expands. ; [inst-medium] ; [verse] Violin plays a tune. Moonlight in the afternoon. Guitar strums a chord. Tune so soon. Drums beat a steady pace. Joy in the cocoon. ; [chorus] Music is the language where the feelings stand. Is the warm embrace that the silence demands. Is the magic spell that the mind withstands. Is the endless love that the heart expands. ; [bridge] Listening to the notes as they softly land. Feeling the harmony that the soul has planned. Music nights with you are truly grand. ; [chorus] Music is the language where the feelings stand. Is the warm embrace that the silence demands. Is the magic spell that the mind withstands. Is the endless love that the heart expands. ; [outro-medium]"} +{"idx": "68", "descriptions": "retro pop, nostalgic, electric piano, bass guitar, drum kit, string section.", "gt_lyric": "[intro-medium] ; [verse] Photos lie in the album. Memories resume. Smiles on the faces. Joy they consume. Old days come to life. No more gloom. ; [chorus] Memories are the treasure where the hearts bloom. Is the warm light that the darkness assume. Is the sweet echo that the mind can groom. Is the endless love that the soul can entomb. ; [inst-medium] ; [verse] Handwritten notes inside. Feelings can't hide. Laughter echoes in the room. No need to abide. Tears of joy and sorrow. Side by side. ; [chorus] Memories are the treasure where the hearts bloom. Is the warm light that the darkness assume. Is the sweet echo that the mind can groom. Is the endless love that the soul can entomb. ; [bridge] Flipping through the pages as the time loom. Reliving the moments that the heart consume. Memory days with you are the sweetest bloom. ; [chorus] Memories are the treasure where the hearts bloom. Is the warm light that the darkness assume. Is the sweet echo that the mind can groom. Is the endless love that the soul can entomb. ; [outro-medium]"} +{"idx": "69", "descriptions": "r&b, sampler, drum kit, electric guitar, laid-back.", "gt_lyric": "[intro-medium] ; [verse] Dewdrops cling to clover. Morning light is over. Butterflies take wing. Day begins to hover. Grass blades bend and shiver. Peace we start to discover. ; [chorus] Spring is the whisper that the winter uncovers. Is the bloom that breaks through the frost's cold covers. Is the song that the waking world recovers. Is the hope that the weary heart recovers. ; [inst-medium] ; [verse] Cherry blossoms scatter. Breezes softly flatter. Bees hum through the garden. Nectar they gather. Buds burst open slowly. Joy we can't bother. ; [chorus] Spring is the whisper that the winter uncovers. Is the bloom that breaks through the frost's cold covers. Is the song that the waking world recovers. Is the hope that the weary heart recovers. ; [bridge] Walking through the meadows where the clover covers. Breathing in the scent of the air that hovers. Spring days with you are the sweetest lovers. ; [chorus] Spring is the whisper that the winter uncovers. Is the bloom that breaks through the frost's cold covers. Is the song that the waking world recovers. Is the hope that the weary heart recovers. ; [outro-medium]"} +{"idx": "70", "descriptions": "space music, peaceful, synth pad, field recording, arpeggiator.", "gt_lyric": "[intro-medium] ; [verse] Trails wind through the forest. Trees stand tall and honest. Moss covers the logs. Sunlight starts to fondest. Birds sing in the branches. Days feel like a promise. ; [chorus] Forest is the sanctuary where the promise does fondest. Is the tree that stands through the storm's honest. Is the moss that covers the log's modest. Is the peace that makes the restless heart honest. ; [inst-medium] ; [verse] Squirrels scamper by. Nuts hide in the sky. Mushrooms grow below. Fungi start to fly. Streams trickle through. Days feel like a sigh. ; [chorus] Forest is the sanctuary where the promise does fondest. Is the tree that stands through the storm's honest. Is the moss that covers the log's modest. Is the peace that makes the restless heart honest. ; [bridge] Hiking through the forest where the trees do sigh. Feeling the peace that the woods supply. Forest days with you are the sweetest high. ; [chorus] Forest is the sanctuary where the promise does fondest. Is the tree that stands through the storm's honest. Is the moss that covers the log's modest. Is the peace that makes the restless heart honest. ; [outro-medium]"} +{"idx": "71", "descriptions": "latin pop, party, percussion, synthesizer, bass, brass section.", "gt_lyric": "[intro-medium] ; [verse] Balloons float in the air. Parties start to flair. Confetti falls like rain. Joy starts to declare. Cakes sit on the table. Candles start to glare. ; [chorus] Party is the celebration where the joy does declare. Is the cake that sweetens the day's flair. Is the confetti that falls through the air's glare. Is the laugh that makes the lonely heart repair. ; [inst-medium] ; [verse] Gifts wrap in bright paper. Ribbons tie the caper. Music starts to play. Feet start to taper. Friends hug and cheer. Days feel like a taper. ; [chorus] Party is the celebration where the joy does declare. Is the cake that sweetens the day's flair. Is the confetti that falls through the air's glare. Is the laugh that makes the lonely heart repair. ; [bridge] Dancing at the party where the music does flare. Sharing the joy that the friends prepare. Party nights with you are the sweetest affair. ; [chorus] Party is the celebration where the joy does declare. Is the cake that sweetens the day's flair. Is the confetti that falls through the air's glare. Is the laugh that makes the lonely heart repair. ; [outro-medium]"} +{"idx": "72", "descriptions": "indie rock, hopeful, electric guitar, bass guitar, drum kit.", "gt_lyric": "[intro-medium] ; [verse] Bridges span the river. Cars cross and deliver. Waves flow underneath. Water starts to shiver. Bridges stand so strong. Days feel like a giver. ; [chorus] Bridge is the link where the lands do giver. Is the road that connects the shore's shiver. Is the steel that stands through the storm's deliver. Is the hope that makes the distant heart quiver. ; [inst-medium] ; [verse] Pedestrians walk across. Views are such a loss. Sunsets paint the sky. Colors start to gloss. Bridges light up night. Nights feel like a toss. ; [chorus] Bridge is the link where the lands do giver. Is the road that connects the shore's shiver. Is the steel that stands through the storm's deliver. Is the hope that makes the distant heart quiver. ; [bridge] Crossing on the bridge where the river does toss. Watching the sunset paint the clouds in gloss. Bridge days with you are the sweetest loss. ; [chorus] Bridge is the link where the lands do giver. Is the road that connects the shore's shiver. Is the steel that stands through the storm's deliver. Is the hope that makes the distant heart quiver. ; [outro-medium]"} +{"idx": "73", "descriptions": "r&b, laid-back, electric piano, bass guitar, drum machine, synthesizer.", "gt_lyric": "[intro-medium] ; [verse] Books stack on the nightstand. Dreams start to withstand. Pillows are so soft. Nights start to expand. Moonlight through the window. Sleep starts to command. ; [chorus] Bedroom is the haven where the sleep does command. Is the pillow that holds the head's expand. Is the sheet that covers the body's withstand. Is the peace that makes the tired heart demand. ; [inst-medium] ; [verse] Alarm clocks tick slow. Dreams start to grow. Blankets keep us warm. Nights start to glow. Morning light creeps in. Days start to show. ; [chorus] Bedroom is the haven where the sleep does command. Is the pillow that holds the head's expand. Is the sheet that covers the body's withstand. Is the peace that makes the tired heart demand. ; [bridge] Sleeping in the room where the moonlight does glow. Feeling the rest that the body does know. Bedroom nights with you are the sweetest show. ; [chorus] Bedroom is the haven where the sleep does command. Is the pillow that holds the head's expand. Is the sheet that covers the body's withstand. Is the peace that makes the tired heart demand. ; [outro-medium]"} +{"idx": "74", "descriptions": "classical, focused, piano, bells, string section.", "gt_lyric": "[intro-medium] ; [verse] Towers reach the clouds. Clocks chime loud. Bells ring every hour. Time starts to shroud. Towers stand so tall. Days feel like a crowd. ; [chorus] Clock tower is the marker where the time does shroud. Is the bell that rings through the day's crowd. Is the clock that ticks through the hour's loud. Is the order that makes the busy heart proud. ; [inst-medium] ; [verse] Tourists take the photos. Guides tell the mottoes. Hands move round the face. Time starts to motto. Shadows shift with sun. Nights feel like a grotto. ; [chorus] Clock tower is the marker where the time does shroud. Is the bell that rings through the day's crowd. Is the clock that ticks through the hour's loud. Is the order that makes the busy heart proud. ; [bridge] Visiting the tower where the bells do loud. Feeling the history that the stones enshroud. Clock tower days with you are the sweetest cloud. ; [chorus] Clock tower is the marker where the time does shroud. Is the bell that rings through the day's crowd. Is the clock that ticks through the hour's loud. Is the order that makes the busy heart proud. ; [outro-medium]"} +{"idx": "75", "descriptions": "latin, festive, percussion, brass section, bass guitar.", "gt_lyric": "[intro-medium] ; [verse] Market stalls line the street. Goods are so complete. Fruits and veggies fresh. Flavors start to meet. Vendors call out loud. Days feel like a treat. ; [chorus] Market is the hub where the flavors do meet. Is the stall that sells the fresh's treat. Is the vendor that calls through the street's complete. Is the joy that makes the shopper's heart beat. ; [inst-medium] ; [verse] Breads smell so delicious. Cheeses are so precious. Spices in the jars. Scents are so ferocious. Customers browse around. Nights feel like a gracious. ; [chorus] Market is the hub where the flavors do meet. Is the stall that sells the fresh's treat. Is the vendor that calls through the street's complete. Is the joy that makes the shopper's heart beat. ; [bridge] Shopping at the market where the scents do greet. Tasting the treats that the vendors sweet. Market days with you are the sweetest fleet. ; [chorus] Market is the hub where the flavors do meet. Is the stall that sells the fresh's treat. Is the vendor that calls through the street's complete. Is the joy that makes the shopper's heart beat. ; [outro-medium]"} +{"idx": "76", "descriptions": "pop, dizi, percussion, backing vocals, uplifting.", "gt_lyric": "[intro-medium] ; [verse] Stairs climb up the tower. Views are so much power. Cities spread below. Skies start to cower. Windows line the walls. Days feel like a flower. ; [chorus] Observatory is the spot where the views do flower. Is the glass that shows the city's cower. Is the height that gives the sight's power. Is the awe that makes the human heart tower. ; [inst-medium] ; [verse] Telescopes point up. Stars start to crop. Planets glow so bright. Nights start to prop. Astronomers explain. Facts start to drop. ; [chorus] Observatory is the spot where the views do flower. Is the glass that shows the city's cower. Is the height that gives the sight's power. Is the awe that makes the human heart tower. ; [bridge] Stargazing at the observatory where the stars do crop. Feeling the wonder that the cosmos prop. Observatory nights with you are the sweetest top. ; [chorus] Is the glass that shows the spot where the views do flower. Is the glass that shows the city's cower. Is the height that gives the sight's power. Is the awe that makes the human heart tower. ; [outro-medium]"} +{"idx": "77", "descriptions": "bubblegum pop, playful, percussion, bells, synthesizer.", "gt_lyric": "[intro-medium] ; [verse] Ropes hang from the trees. Swings start to tease. Children laugh and play. Days start to ease. Branches bend and sway. Hearts start to please. ; [chorus] Playground is the place where the joy does please. Is the swing that flies through the air's ease. Is the rope that hangs from the tree's tease. Is the laugh that makes the childish heart seize. ; [inst-medium] ; [verse] Slides glide so fast. Kids run to the last. Seesaws go up down. Fun is so vast. Sandboxes fill with toys. Days feel like a blast. ; [chorus] Playground is the place where the joy does please. Is the swing that flies through the air's ease. Is the rope that hangs from the tree's tease. Is the laugh that makes the childish heart seize. ; [bridge] Playing at the playground where the fun does vast. Sharing the joy that the kids amass. Playground days with you are the sweetest cast. ; [chorus] Playground is the place where the joy does please. Is the swing that flies through the air's ease. Is the rope that hangs from the tree's tease. Is the laugh that makes the childish heart seize. ; [outro-medium]"} +{"idx": "78", "descriptions": "folk pop, cozy, acoustic guitar, piano, percussion.", "gt_lyric": "[intro-medium] ; [verse] Pots sit on the stove. Soups start to strove. Spices fill the air. Flavors start to move. Knives chop the veggies. Meals start to approve. ; [chorus] Kitchen is the heart where the flavors approve. Is the soup that simmers on the stove's move. Is the spice that makes the bland heart strove. Is the joy that makes the hungry soul improve. ; [inst-medium] ; [verse] Ovens bake the bread. Aromas fill the head. Spoons stir the stew. Warmth spreads to the bed. Plates set on the table. Days feel like a thread. ; [chorus] Kitchen is the heart where the flavors approve. Is the soup that simmers on the stove's move. Is the spice that makes the bland heart strove. Is the joy that makes the hungry soul improve. ; [bridge] Cooking in the kitchen where the aromas do groove. Sharing the meals that the family does prove. Kitchen days with you are the sweetest rove. ; [chorus] Kitchen is the heart where the flavors approve. Is the soup that simmers on the stove's move. Is the spice that makes the bland heart strove. Is the joy that makes the hungry soul improve. ; [outro-medium]"} +{"idx": "79", "descriptions": "boom bap, creative, sampler, drum machine, bass, dj scratches.", "gt_lyric": "[intro-medium] ; [verse] Canvases stand empty. Paints sit in a plenty. Brushes dip in hues. Colors start to plenty. Ideas fill the mind. Art starts to ascendly. ; [chorus] Studio is the haven where the ideas ascendly. Is the paint that flows in the hand's steady. Is the art that turns the blank to the ready. Is the joy that makes the creative soul heady. ; [inst-medium] ; [verse] Easels hold the art. Sunlight plays a part. Charcoal sketches lines. Forms start to depart. Inspiration strikes. Hearts start to impart. ; [chorus] Studio is the haven where the ideas ascendly. Is the paint that flows in the hand's steady. Is the art that turns the blank to the ready. Is the joy that makes the creative soul heady. ; [bridge] Working in the space where the colors do party. Creating the art that the heart does hearty. Studio days with you are the smarty. ; [chorus] Studio is the haven where the ideas ascendly. Is the paint that flows in the hand's steady. Is the art that turns the blank to the ready. Is the joy that makes the creative soul heady. ; [outro-medium]"} +{"idx": "80", "descriptions": "bluegrass, content, banjo, fiddle, acoustic guitar, double bass.", "gt_lyric": "[intro-medium] ; [verse] Sheep graze on the hillside. Clouds drift in the wideside. Bells ring soft and low. Wind starts to provide. Cottages stand cozy. Days feel like a guide. ; [chorus] Farm is the haven where the peace does provide. Is the grass that feeds the sheep's abide. Is the sun that warms the earth's divide. Is the joy that makes the simple heart collide. ; [inst-medium] ; [verse] Chickens cluck in yard. Eggs lay hard. Cows moo in the field. Milk jars fill the lard. Hay bales stack high. Nights feel like a card. ; [chorus] Farm is the haven where the peace does provide. Is the grass that feeds the sheep's abide. Is the sun that warms the earth's divide. Is the joy that makes the simple heart collide. ; [bridge] Walking through the farm where the animals reside. Tasting the milk that the cows have supplied. Farm days with you are the sweetest ride. ; [chorus] Farm is the haven where the peace does provide. Is the grass that feeds the sheep's abide. Is the sun that warms the earth's divide. Is the joy that makes the simple heart collide. ; [outro-medium]"} +{"idx": "81", "descriptions": "jazz, relaxed, piano, brass, drum kit, bass.", "gt_lyric": "[intro-medium] ; [verse] Notes float in the air. Voices start to compare. Choirs sing in tune. Harmonies start to prepare. Pianos play the chords. Hearts start to declare. ; [chorus] Choir room is the space where the voices declare. Is the harmony that fills the air's prepare. Is the song that makes the weary heart repair. Is the joy that makes the united soul beware. ; [inst-medium] ; [verse] Conductors wave their hands. Music fills the lands. Sopranos hit the high. Altos take the stands. Tenors and basses. Voices blend in bands. ; [chorus] Choir room is the space where the voices declare. Is the harmony that fills the air's prepare. Is the song that makes the weary heart repair. Is the joy that makes the united soul beware. ; [bridge] Singing in the room where the music does share. Feeling the harmony that the voices wear. Choir days with you are the sweetest flair. ; [chorus] Choir room is the space where the voices declare. Is the harmony that fills the air's prepare. Is the song that makes the weary heart repair. Is the joy that makes the united soul beware. ; [outro-medium]"} +{"idx": "82", "descriptions": "acoustic folk, adventurous, acoustic guitar, percussion, field recording.", "gt_lyric": "[intro-medium] ; [verse] Tents stand on the meadow. Campfires start to shadow. Stars glow in the sky. Stories start to follow. Marshmallows roast soft. Nights start to hallow. ; [chorus] Campsite is the place where the stars do hallow. Is the fire that chases the dark's follow. Is the story that makes the quiet heart wallow. Is the joy that makes the adventurer's soul shallow. ; [inst-medium] ; [verse] Sleeping bags unroll. Crickets start to troll. Flashlights beam ahead. Paths start to enroll. Friends laugh till dawn. Days feel like a stroll. ; [chorus] Campsite is the place where the stars do hallow. Is the fire that chases the dark's follow. Is the story that makes the quiet heart wallow. Is the joy that makes the adventurer's soul shallow. ; [bridge] Camping in the woods where the fire does glow. Sharing tales of days that we used to know. Campsite nights with you are the sweetest show. ; [chorus] Campsite is the place where the stars do hallow. Is the fire that chases the dark's follow. Is the story that makes the quiet heart wallow. Is the joy that makes the adventurer's soul shallow. ; [outro-medium]"} +{"idx": "83", "descriptions": "indie pop, inspirational, electric guitar, bass guitar, drum kit.", "gt_lyric": "[intro-medium] ; [verse] Chalk lines mark the blackboard. Lessons start to board. Books open wide. Knowledge starts to afford. Desks line in rows. Minds start to reward. ; [chorus] Classroom is the space where the minds do reward. Is the lesson that opens the door's afford. Is the wisdom that makes the ignorant board. Is the hope that makes the curious soul record. ; [inst-medium] ; [verse] Teachers explain the facts. Students ask the acts. Pens scribble notes. Ideas start to exact. Bells ring at noon. Days feel like a pact. ; [chorus] Classroom is the space where the minds do reward. Is the lesson that opens the door's afford. Is the wisdom that makes the ignorant board. Is the hope that makes the curious soul record. ; [bridge] Learning in the room where the knowledge does enact. Sharing the ideas that the minds attract. Classroom days with you are the sweetest compact. ; [chorus] Classroom is the space where the minds do reward. Is the lesson that opens the door's afford. Is the wisdom that makes the ignorant board. Is the hope that makes the curious soul record. ; [outro-medium]"} +{"idx": "84", "descriptions": "electronic, drum and bass, driving, drum machine, synth bass, synthesizer, fx.", "gt_lyric": "[intro-medium] ; [verse] Sails billow in the wind. Ship starts to spin. Waves crash on the hull. Ocean starts to grin. Compass points the way. Journey starts to begin. ; [chorus] Ship is the vessel where the journey does begin. Is the sail that catches the wind's grin. Is the hull that cuts through the wave's spin. Is the hope that makes the sailor's soul win. ; [inst-medium] ; [verse] Captains shout the orders. Crews start to borders. Fish jump in the wake. Seagulls follow the quarters. Sunsets paint the sky. Nights feel like a fortress. ; [chorus] Ship is the vessel where the journey does begin. Is the sail that catches the wind's grin. Is the hull that cuts through the wave's spin. Is the hope that makes the sailor's soul win. ; [bridge] Sailing on the ship where the ocean does spin. Feeling the wind that the sails do pin. Ship days with you are the sweetest din. ; [chorus] Ship is the vessel where the journey does begin. Is the sail that catches the wind's grin. Is the hull that cuts through the wave's spin. Is the hope that makes the sailor's soul win. ; [outro-medium]"} +{"idx": "85", "descriptions": "post-rock, awe, electric guitar, bass guitar, drum kit, string section.", "gt_lyric": "[intro-medium] ; [verse] Rocks line the canyon walls. Rivers start to fall. Eagles fly above. Skies start to brawl. Canyons stretch so wide. Days feel like a call. ; [chorus] Canyon is the wonder where the earth does call. Is the river that carves through the rock's brawl. Is the sky that watches the eagle's sprawl. Is the awe that makes the human soul enthrall. ; [inst-medium] ; [verse] Hikers walk the trails. Dust covers the rails. Lizards sunbathe warm. Rocks tell the tales. Shadows stretch long. Nights feel like a veil. ; [chorus] Canyon is the wonder where the earth does call. Is the river that carves through the rock's brawl. Is the sky that watches the eagle's sprawl. Is the awe that makes the human soul enthrall. ; [bridge] Hiking through the canyon where the rocks do tall. Feeling the wonder that the earth does install. Canyon days with you are the sweetest gall. ; [chorus] Canyon is the wonder where the earth does call. Is the river that carves through the rock's brawl. Is the sky that watches the eagle's sprawl. Is the awe that makes the human soul enthrall. ; [outro-medium]"} +{"idx": "86", "descriptions": "swing, joyful, piano, brass section, double bass, drum kit.", "gt_lyric": "[intro-medium] ; [verse] Frames hang on the wall. Memories start to call. Photos of the past. Moments start to stall. Smiles on the faces. Hearts start to fall. ; [chorus] Living room is the space where the memories call. Is the couch that holds the family's stall. Is the laugh that makes the sad heart fall. Is the love that makes the broken soul enthrall. ; [inst-medium] ; [verse] Pillows stack on the couch. Blankets cover the slouch. TV plays the shows. Days feel like a crouch. Games start to play. Laughter fills the couch. ; [chorus] Living room is the space where the memories call. Is the couch that holds the family's stall. Is the laugh that makes the sad heart fall. Is the love that makes the broken soul enthrall. ; [bridge] Relaxing in the room where the love does install. Sharing the moments that the family does recall. Living room days with you are the sweetest sprawl. ; [chorus] Living room is the space where the memories call. Is the couch that holds the family's stall. Is the laugh that makes the sad heart fall. Is the love that makes the broken soul enthrall. ; [outro-medium]"} +{"idx": "87", "descriptions": "new age, calm, piano, wind chimes, flutes.", "gt_lyric": "[intro-medium] ; [verse] Tea leaves steep in the cup. Aroma wakes up. Steam curls to the ceiling. Warmth it sup. Sips of the golden brew. Worries give up. ; [chorus] Tea is the comfort where the tired cup. Is the gentle hug that the soul can sup. Is the quiet moment that the heart can prop. Is the sweet solace that the mind can top. ; [inst-medium] ; [verse] Jasmine floats on the top. Flavor never stop. Honey stirs in the tea. Sweetness does pop. Old friend sits by the side. Chat never drop. ; [chorus] Tea is the comfort where the tired cup. Is the gentle hug that the soul can sup. Is the quiet moment that the heart can prop. Is the sweet solace that the mind can top. ; [bridge] Sipping through the tea as the time does hop. Sharing the stories that the years have crop. Tea time with you is the best shop. ; [chorus] Tea is the comfort where the tired cup. Is the gentle hug that the soul can sup. Is the quiet moment that the heart can prop. Is the sweet solace that the mind can top. ; [outro-medium]"} +{"idx": "88", "descriptions": "traditional country, joyful, acoustic guitar, fiddle, banjo, bass guitar.", "gt_lyric": "[intro-medium] ; [verse] Baskets hold the berries. Bushes wear the cherries. Thorns prick the fingers. Juice starts to carry. Pails fill up slowly. Days feel like a ferry. ; [chorus] Orchard is the garden where the fruits do ferry. Is the tree that bends with the fruit's carry. Is the sweet that makes the sour heart marry. Is the joy that makes the hungry soul tarry. ; [inst-medium] ; [verse] Apples hang in clusters. Bees hum in adjusters. Wind shakes the branches. Fruits fall in the dusters. Children pick them up. Laughter fills the rustlers. ; [chorus] Orchard is the garden where the fruits do ferry. Is the tree that bends with the fruit's carry. Is the sweet that makes the sour heart marry. Is the joy that makes the hungry soul tarry. ; [bridge] Picking in the orchard where the apples do clutter. Tasting the fruit that the sun does butter. Orchard days with you are the sweetest gutter. ; [chorus] Orchard is the garden where the fruits do ferry. Is the tree that bends with the fruit's carry. Is the sweet that makes the sour heart marry. Is the joy that makes the hungry soul tarry. ; [outro-medium]"} +{"idx": "89", "descriptions": "smooth jazz, peaceful, saxophone, electric piano, double bass, drum kit.", "gt_lyric": "[intro-medium] ; [verse] Oars dip in the water. Canoe starts to falter. Lakeside trees stand tall. Sunlight starts to alter. Water ripples softly. Peace starts to salter. ; [chorus] Lake is the mirror where the sky does salter. Is the breeze that whispers through the reeds' alter. Is the calm that makes the restless heart falter. Is the peace that makes the busy mind exalter. ; [inst-medium] ; [verse] Lilies float on surface. Frogs jump with a purpose. Dragonflies zip by. Days feel like a circus. Fishing lines cast out. Hopes start to surface. ; [chorus] Lake is the mirror where the sky does salter. Is the breeze that whispers through the reeds' alter. Is the calm that makes the restless heart falter. Is the peace that makes the busy mind exalter. ; [bridge] Paddling on the lake where the water does palter. Watching the sunset paint the clouds in Walter. Lake days with you are the sweetest altarpiece. ; [chorus] Lake is the mirror where the sky does salter. Is the breeze that whispers through the reeds' alter. Is the calm that makes the restless heart falter. Is the peace that makes the busy mind exalter. ; [outro-medium]"} +{"idx": "90", "descriptions": "dream pop, dreamy, synth pad, electric guitar, drum machine, bass.", "gt_lyric": "[intro-medium] ; [verse] Dewdrops cling to clover. Morning light is over. Butterflies take wing. Day begins to hover. Grass blades bend and shiver. Peace we start to discover. ; [chorus] Spring is the whisper that the winter uncovers. Is the bloom that breaks through the frost's cold covers. Is the song that the waking world recovers. Is the hope that the weary heart recovers. ; [inst-medium] ; [verse] Cherry blossoms scatter. Breezes softly flatter. Bees hum through the garden. Nectar they gather. Buds burst open slowly. Joy we can't bother. ; [chorus] Spring is the whisper that the winter uncovers. Is the bloom that breaks through the frost's cold covers. Is the song that the waking world recovers. Is the hope that the weary heart recovers. ; [bridge] Walking through the meadows where the clover covers. Breathing in the scent of the air that hovers. Spring days with you are the sweetest lovers. ; [chorus] Spring is the whisper that the winter uncovers. Is the bloom that breaks through the frost's cold covers. Is the song that the waking world recovers. Is the hope that the weary heart recovers. ; [outro-medium]"} +{"idx": "91", "descriptions": "chillout, chill, synth pad, drum machine, bass, field recording.", "gt_lyric": "[intro-medium] ; [verse] Dusk paints the sky in pink. Breeze starts to wink. Fireflies light the lane. Crickets start to sing. Porch swings rock slow. Peace starts to sink. ; [chorus] Twilight is the hush where the calm does sink. Is the glow that gilds the day's last wink. Is the song that makes the quiet heart sing. Is the softness that makes the busy world shrink. ; [inst-medium] ; [verse] Moths flit round the lamp. Shadows start to camp. Tea cups steam on the rail. Moments start to clamp. Stars prick the dark. Dreams start to ramp. ; [chorus] Twilight is the hush where the calm does sink. Is the glow that gilds the day's last wink. Is the song that makes the quiet heart sing. Is the softness that makes the busy world shrink. ; [bridge] Sitting on the porch where the fireflies tramp. Sipping the tea that the evening does stamp. Twilight hours with you are the sweetest camp. ; [chorus] Twilight is the hush where the calm does sink. Is the glow that gilds the day's last wink. Is the song that makes the quiet heart sing. Is the softness that makes the busy world shrink. ; [outro-medium]"} +{"idx": "92", "descriptions": "dancehall, summery, bass guitar, percussion, electric guitar, brass section.", "gt_lyric": "[intro-medium] ; [verse] Sand grains shift and shimmer. Tides rise and grow slimmer. Palm trees sway in wind. Sunlight turns to glimmer. Footprints fade in water. Moments start to dimmer. ; [chorus] Beach is the canvas where the sun does trimmer. Is the wave that crashes on the shore's old limber. Is the salt that kisses the skin's soft timber. Is the calm that makes the busy mind grow simpler. ; [inst-medium] ; [verse] Seashells glow in sunlight. Children laugh and run tight. Kites fly high above. Clouds drift out of sight. Ice cream melts in fingers. Days feel pure and bright. ; [chorus] Beach is the canvas where the sun does trimmer. Is the wave that crashes on the shore's old limber. Is the salt that kisses the skin's soft timber. Is the calm that makes the busy mind grow simpler. ; [bridge] Lying on the sand where the seagulls linger. Watching the sunset paint the sky in amber. Beach days with you are the sweetest singer. ; [chorus] Beach is the canvas where the sun does trimmer. Is the wave that crashes on the shore's old limber. Is the salt that kisses the skin's soft timber. Is the calm that makes the busy mind grow simpler. ; [outro-medium]"} +{"idx": "93", "descriptions": "synth-pop, cozy, synth pad, drum machine, bells.", "gt_lyric": "[intro-medium] ; [verse] Candles glow in corners. Shadows stretch and warn us. Books lie on the table. Pages turn and yawn us. Hot cocoa steams in mugs. Warmth starts to adorn us. ; [chorus] Winter is the blanket that the cold does scorn us. Is the snow that covers the world's forlorn us. Is the fire that burns through the night's forlorn us. Is the joy that makes the lonely heart reborn us. ; [inst-medium] ; [verse] Snowflakes tap the window. Firewood crackles and glows. Mittens hang on hooks. Scarves lay in neat rows. Old films play on screen. Stories start to unfold us. ; [chorus] Winter is the blanket that the cold does scorn us. Is the snow that covers the world's forlorn us. Is the fire that burns through the night's forlorn us. Is the joy that makes the lonely heart reborn us. ; [bridge] Sitting by the fire where the flames do burn us. Sharing tales of days that we have outworn us. Winter nights with you are the warmest turn us. ; [chorus] Winter is the blanket that the cold does scorn us. Is the snow that covers the world's forlorn us. Is the fire that burns through the night's forlorn us. Is the joy that makes the lonely heart reborn us. ; [outro-medium]"} +{"idx": "94", "descriptions": "drill, hype, 808 bass, drum machine, sampler, rap.", "gt_lyric": "[intro-medium] ; [verse] Skyscrapers touch heaven. Streets buzz with a leaven. Cars honk in the rush. People weave and heave in. Neon lights glow bright. Nights start to cleave in. ; [chorus] City is the heartbeat where the dreams do cleave in. Is the crowd that moves to the rhythm's even. Is the light that cuts through the dark's uneven. Is the pulse that makes the quiet soul believe in. ; [inst-medium] ; [verse] Cafés hum with chatter. Music fills the matter. Street art paints the walls. Colors start to scatter. Subways rumble underground. Days grow short and fatter. ; [chorus] City is the heartbeat where the dreams do cleave in. Is the crowd that moves to the rhythm's even. Is the light that cuts through the dark's uneven. Is the pulse that makes the quiet soul believe in. ; [bridge] Walking through the streets where the neon gleams in. Feeling the energy that the city streams in. City nights with you are the brightest beams in. ; [chorus] City is the heartbeat where the dreams do cleave in. Is the crowd that moves to the rhythm's even. Is the light that cuts through the dark's uneven. Is the pulse that makes the quiet soul believe in. ; [outro-medium]"} +{"idx": "95", "descriptions": "jazz fusion, laid-back, electric guitar, electric piano, bass guitar, drum kit.", "gt_lyric": "[intro-medium] ; [verse] Vines climb up the trellis. Grapes hang in a yellows. Wineskins sit in cellars. Flavors start to mellow. Sunlight warms the vines. Harvest starts to fellow. ; [chorus] Vineyard is the treasure where the sun does fellow. Is the grape that ripens in the summer's mellow. Is the wine that ages in the cellar's yellow. Is the peace that makes the busy mind grow mellow. ; [inst-medium] ; [verse] Barrels line the room. Scents of oak consume. Workers pick the grapes. Laughter fills the gloom. Crates stack high outside. Days feel like a bloom. ; [chorus] Vineyard is the treasure where the sun does fellow. Is the grape that ripens in the summer's mellow. Is the wine that ages in the cellar's yellow. Is the peace that makes the busy mind grow mellow. ; [bridge] Strolling through the vines where the grapes do balloon. Tasting the wine that the years have spoon. Vineyard days with you are the sweetest tune. ; [chorus] Vineyard is the treasure where the sun does fellow. Is the grape that ripens in the summer's mellow. Is the wine that ages in the cellar's yellow. Is the peace that makes the busy mind grow mellow. ; [outro-medium]"} +{"idx": "96", "descriptions": "electronic, organic house, expansive, percussion, flutes, synth pad, bass.", "gt_lyric": "[intro-medium] ; [verse] Deserts stretch so wide. Sands start to hide. Cacti stand tall. Skies start to chide. Winds blow the dunes. Days feel like a ride. ; [chorus] Desert is the wonder where the days do ride. Is the cactus that stands through the sky's chide. Is the sand that hides the earth's divide. Is the awe that makes the traveler's heart abide. ; [inst-medium] ; [verse] Camels walk the trails. Caravans start to sail. Sunsets paint the sky. Colors start to fail. Stars glow at night. Nights feel like a veil. ; [chorus] Desert is the wonder where the days do ride. Is the cactus that stands through the sky's chide. Is the sand that hides the earth's divide. Is the awe that makes the traveler's heart abide. ; [bridge] Traveling through the desert where the camels do sail. Feeling the wonder that the dunes unveil. Desert days with you are the sweetest tale. ; [chorus] Desert is the wonder where the days do ride. Is the cactus that stands through the sky's chide. Is the sand that hides the earth's divide. Is the awe that makes the traveler's heart abide. ; [outro-medium]"} +{"idx": "97", "descriptions": "opera, theatrical, orchestra, choir, piano.", "gt_lyric": "[intro-medium] ; [verse] Stage lights glow so bright. Curtains start to bite. Actors take their places. Plays start to write. Dialogues are spoken. Hearts start to ignite. ; [chorus] Theater is the stage where the plays do write. Is the light that glows through the curtain's bite. Is the actor that speaks through the night's ignite. Is the magic that makes the audience's heart smite. ; [inst-medium] ; [verse] Scripts lie on the stands. Directors wave their hands. Audience claps loud. Cheers start to expand. Curtains fall at end. Nights feel like a brand. ; [chorus] Theater is the stage where the plays do write. Is the light that glows through the curtain's bite. Is the actor that speaks through the night's ignite. Is the magic that makes the audience's heart smite. ; [bridge] Watching at the theater where the plays do expand. Feeling the magic that the actors command. Theater nights with you are the sweetest brand. ; [chorus] Theater is the stage where the plays do write. Is the light that glows through the curtain's bite. Is the actor that speaks through the night's ignite. Is the magic that makes the audience's heart smite. ; [outro-medium]"} +{"idx": "98", "descriptions": "traditional folk, peaceful, acoustic guitar, flutes, percussion.", "gt_lyric": "[intro-medium] ; [verse] Wells sit in the yard. Waters start to guard. Buckets dip below. Drinks start to reward. Cools the parched throat. Days feel like a ward. ; [chorus] Well is the source where the water does ward. Is the bucket that dips through the well's reward. Is the drink that cools the throat's regard. Is the peace that makes the thirsty heart discard. ; [inst-medium] ; [verse] Ropes wind round the crank. Water starts to flank. Children fill their cups. Laughs start to prank. Sun shines hot above. Nights feel like a bank. ; [chorus] Well is the source where the water does ward. Is the bucket that dips through the well's reward. Is the drink that cools the throat's regard. Is the peace that makes the thirsty heart discard. ; [bridge] Drawing from the well where the water does bank. Tasting the cool that the earth does rank. Well days with you are the sweetest prank. ; [chorus] Well is the source where the water does ward. Is the bucket that dips through the well's reward. Is the drink that cools the throat's regard. Is the peace that makes the thirsty heart discard. ; [outro-medium]"} +{"idx": "99", "descriptions": "classical, orchestral, stately, orchestra, piano, string section.", "gt_lyric": "[intro-medium] ; [verse] Museums hold the art. Histories start to part. Paintings on the walls. Stories start to chart. Sculptures stand so tall. Days feel like a mart. ; [chorus] Museum is the vault where the stories do chart. Is the art that tells the history's part. Is the sculpture that stands through the day's mart. Is the awe that makes the visitor's heart depart. ; [inst-medium] ; [verse] Guides tell the tales. Artifacts start to pale. Cameras click away. Memories start to sail. Lights glow on the exhibits. Nights feel like a veil. ; [chorus] Museum is the vault where the stories do chart. Is the art that tells the history's part. Is the sculpture that stands through the day's mart. Is the awe that makes the visitor's heart depart. ; [bridge] Visiting the museum where the art does sail. Feeling the history that the walls unveil. Museum days with you are the sweetest tale. ; [chorus] Museum is the vault where the stories do chart. Is the art that tells the history's part. Is the sculpture that stands through the day's mart. Is the awe that makes the visitor's heart depart. ; [outro-medium]"} +{"idx": "100", "descriptions": "hard rock, triumphant, electric guitar, bass guitar, drum kit, choir.", "gt_lyric": "[intro-medium] ; [verse] Mountains rise so high. Skies start to sigh. Snow caps the peaks. Winds start to fly. Hikers climb the trails. Days feel like a tie. ; [chorus] Mountain peak is the top where the skies do sigh. Is the snow that caps the peak's fly. Is the wind that blows through the hiker's tie. Is the triumph that makes the climber's heart cry. ; [inst-medium] ; [verse] Flags wave on the top. Views are so cop. Valleys stretch below. Lands start to pop. Sunsets paint the sky. Nights feel like a shop. ; [chorus] Mountain peak is the top where the skies do sigh. Is the snow that caps the peak's fly. Is the wind that blows through the hiker's tie. Is the triumph that makes the climber's heart cry. ; [bridge] Climbing to the peak where the flags do pop. Feeling the triumph that the effort does crop. Mountain peak days with you are the sweetest top. ; [chorus] Mountain peak is the top where the skies do sigh. Is the snow that caps the peak's fly. Is the wind that blows through the hiker's tie. Is the triumph that makes the climber's heart cry. ; [outro-medium]"} diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/__pycache__/__init__.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..aa0ab50 Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/__pycache__/__init__.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/data/__pycache__/__init__.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/data/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..a37b5bd Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/data/__pycache__/__init__.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/data/__pycache__/utils.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/data/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000..674b740 Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/data/__pycache__/utils.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/inference/__pycache__/__init__.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/inference/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..7473ca9 Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/inference/__pycache__/__init__.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/inference/__pycache__/generation.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/inference/__pycache__/generation.cpython-311.pyc new file mode 100644 index 0000000..c181532 Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/inference/__pycache__/generation.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/inference/__pycache__/sampling.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/inference/__pycache__/sampling.cpython-311.pyc new file mode 100644 index 0000000..5b19b6a Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/inference/__pycache__/sampling.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/inference/__pycache__/utils.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/inference/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000..82d8eec Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/inference/__pycache__/utils.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/__init__.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..3f5aef2 Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/__init__.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/adp.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/adp.cpython-311.pyc new file mode 100644 index 0000000..e382a64 Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/adp.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/autoencoders.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/autoencoders.cpython-311.pyc new file mode 100644 index 0000000..07ef3ec Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/autoencoders.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/blocks.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/blocks.cpython-311.pyc new file mode 100644 index 0000000..83c8266 Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/blocks.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/bottleneck.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/bottleneck.cpython-311.pyc new file mode 100644 index 0000000..7dfcf63 Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/bottleneck.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/conditioners.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/conditioners.cpython-311.pyc new file mode 100644 index 0000000..244d78b Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/conditioners.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/diffusion.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/diffusion.cpython-311.pyc new file mode 100644 index 0000000..3e42eed Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/diffusion.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/dit.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/dit.cpython-311.pyc new file mode 100644 index 0000000..95639ab Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/dit.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/factory.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/factory.cpython-311.pyc new file mode 100644 index 0000000..4d4cd2a Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/factory.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/pretrained.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/pretrained.cpython-311.pyc new file mode 100644 index 0000000..2505942 Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/pretrained.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/pretransforms.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/pretransforms.cpython-311.pyc new file mode 100644 index 0000000..8cb858d Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/pretransforms.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/transformer.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/transformer.cpython-311.pyc new file mode 100644 index 0000000..2866523 Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/transformer.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/utils.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000..93ce6c3 Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/models/__pycache__/utils.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/training/__pycache__/__init__.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/training/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..e632365 Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/training/__pycache__/__init__.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/training/__pycache__/factory.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/training/__pycache__/factory.cpython-311.pyc new file mode 100644 index 0000000..0378377 Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/training/__pycache__/factory.cpython-311.pyc differ diff --git a/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/training/__pycache__/utils.cpython-311.pyc b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/training/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000..36899e1 Binary files /dev/null and b/SongGeneration/third_party/stable_audio_tools/stable_audio_tools/training/__pycache__/utils.cpython-311.pyc differ diff --git a/SongGeneration_node.py b/SongGeneration_node.py index 6dcf394..cee9762 100644 --- a/SongGeneration_node.py +++ b/SongGeneration_node.py @@ -36,6 +36,8 @@ class SongGeneration_Loader: return { "required": { "infer_model": (["none"] +[i for i in folder_paths.get_filename_list("SongGeneration") if i.endswith(".pt") ],), + "version": (["v2","v1"],), + "use_flash_attn":("BOOLEAN", {"default": True}), }, } @@ -44,10 +46,10 @@ class SongGeneration_Loader: FUNCTION = "main" CATEGORY = "SongGeneration" - def main(self, infer_model,): + def main(self, infer_model,version,use_flash_attn): infer_model_path=folder_paths.get_full_path("SongGeneration", infer_model) if infer_model != "none" else None assert infer_model_path is not None ,"模型不能为空.need infer model" - model,cfg=build_model(os.path.join(SongGeneration_Weigths_Path, "ckpt"),infer_model_path) + model,cfg=build_model(os.path.join(SongGeneration_Weigths_Path, "ckpt"),infer_model_path,version,use_flash_attn) return (model,cfg) @@ -66,6 +68,7 @@ class SongGeneration_Stage1: "auto_prompt_audio_type": (auto_prompt_type,), "model_1rvq": (["none"] + [i for i in folder_paths.get_filename_list("SongGeneration") if i.endswith(".safetensors")],), "demucs_pt": (["none"] + [i for i in folder_paths.get_filename_list("SongGeneration") if i.endswith(".pth")],), + "lyric": ("STRING", {"multiline": True, "default": "[intro-short] ;\n[verse]\n在那遥远的爵士乡.有位迷人的姑娘.行人经过她的窗.总为她驻足凝望.她的微笑如夜曲悠扬.温暖中带着一丝忧伤 ;\n[chorus]\n她的眼神如星闪亮.带我坠入梦境徜徉.我愿放下手中诗行.只为她轻声歌唱.日日守候在那街角.盼她一次温柔回望.我不过是远方的风.偶然路过她的乐章.却把心跳谱成了音符.在每一个夜晚反复回响;\n[inst-medium];\n[verse]\n我愿化身为那月光.静静陪在她的身旁 ;\n[bridge]\n任那晚风轻拂梦想.心事只对她默默讲.岁月是位沉默的乐手.将青涩吹奏成沧桑.我的歌谣褪了颜色.却还在老地方.为她播放 ;\n[chorus]\n在那遥远的城市一方.时光深处藏着一位好姑娘.夜色披上霓虹衣裳.迷路的人啊.都向着那扇窗凝望.那光芒.是温柔的故乡;\n[outro-medium]"}), }, "optional": { "audio": ("AUDIO",), @@ -77,7 +80,7 @@ class SongGeneration_Stage1: FUNCTION = "main" CATEGORY = "SongGeneration" - def main(self,vae,seperate_model,prompt_pt, auto_prompt_audio_type,model_1rvq,demucs_pt,**kwargs): + def main(self,vae,seperate_model,prompt_pt, auto_prompt_audio_type,model_1rvq,demucs_pt,lyric,**kwargs): audio=kwargs.get("audio", None) model_sep_path=folder_paths.get_full_path("SongGeneration", seperate_model) if seperate_model != "none" else None @@ -107,7 +110,7 @@ class SongGeneration_Stage1: else: prompt_audio_path,use_descriptions,audio_tokenizer,separator,seperate_tokenizer=None,True,None,None,None - original_item=song_infer_lowram(seperate_tokenizer,separator,audio_tokenizer,prompt_pt_path, folder_paths.get_output_directory(),prompt_audio_path,auto_prompt_audio_type,) + original_item=song_infer_lowram(seperate_tokenizer,separator,audio_tokenizer,prompt_pt_path, folder_paths.get_output_directory(),prompt_audio_path,auto_prompt_audio_type,lyric) gc_clear() print("Stage1 is done.") @@ -124,14 +127,15 @@ class SongGeneration_Stage2: "model": ("SongGeneration_Audiolm",), "cfg": ("SongGeneration_Cfg",), "cond": ("SongGeneration_Cond",), - "lyric": ("STRING", {"multiline": True, "default": "[intro-short] ;\n [verse]\n 雪花舞动在无尽的天际.情缘如同雪花般轻轻逝去.希望与真挚.永不磨灭.你的忧虑.随风而逝 ;\n [chorus]\n 我怀抱着守护这片梦境.在这世界中寻找爱与虚幻.苦辣酸甜.我们一起品尝.在雪的光芒中.紧紧相拥 ;\n [inst-short] ;\n [verse]\n雪花再次在风中飘扬.情愿如同雪花般消失无踪.希望与真挚.永不消失.在痛苦与喧嚣中.你找到解脱 ;\n [chorus]\n 我环绕着守护这片梦境.在这世界中感受爱与虚假.苦辣酸甜.我们一起分享.在白银的光芒中.我们同在 ;\n [outro-short]"}), - "description": ("STRING", {"multiline": False, "default": "female, dark, pop, sad, piano and drums, the bpm is 125"}), #OPTIONAL + "gen_type": (["mixed","bgm","vocal",],), + "description": ("STRING", {"multiline": True, "default": "jazz, piano, brass section, double bass, drum kit, confident"}), #OPTIONAL "cfg_coef": ("FLOAT", {"default": 1.5, "min": 0.1, "max": 3.0, "step": 0.1}), "temp": ("FLOAT", {"default": 0.9, "min": 0.1, "max": 2.0, "step": 0.1}), - "top_k": ("INT", {"default": 50, "min": 1, "max": 100, "step": 1}), + "top_k": ("INT", {"default": 50, "min": 1, "max": 10000000, "step": 1}), "top_p": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.01}), "record_tokens": ("BOOLEAN", {"default": True}), - "record_window": ("INT", {"default": 50, "min": 1, "max": 1000, "step": 1}), + "record_window": ("INT", {"default": 50, "min": 1, "max": 1000, "step": 1}), + "offload_audiolm" :("BOOLEAN", {"default": True}), }, } @@ -140,11 +144,20 @@ class SongGeneration_Stage2: FUNCTION = "main" CATEGORY = "SongGeneration" - def main(self, model,cfg,cond,lyric,description,cfg_coef,temp,top_k,top_p,record_tokens,record_window): + def main(self, model,cfg,cond,gen_type,description,cfg_coef,temp,top_k,top_p,record_tokens,record_window,offload_audiolm): - descriptions=description if cond.get("use_descriptions",False) else None - - items=infer_stage2(cond.get("item"),model,cfg.max_dur,lyric,descriptions,cfg_coef, temp,top_k,top_p,record_tokens ,record_window ) + lyric=cond.get("item")["gt_lyric"] + cfg.gen_type=gen_type + if cfg.version == 'v1': + descriptions=description.lower() if cond.get("use_descriptions",False) else None + else: + if gen_type == 'bgm': + descriptions = '[Musicality-very-high]' + ', ' + '[Pure-Music]' + ', ' + description.lower() if cond.get("use_descriptions",False) else '.' + else: + descriptions = description.lower() if cond.get("use_descriptions",False) else '.' + descriptions = '[Musicality-very-high]' + ', ' + descriptions + + items=infer_stage2(cond.get("item"),model,cfg.max_dur,lyric,descriptions,gen_type,cfg,cfg_coef, temp,top_k,top_p,record_tokens ,record_window,offload_audiolm ) gc_clear() return ({"items":items,"cfg":cfg,"model_sep_path":cond["model_sep_path"],"vae_model":cond["vae_model"]},) @@ -159,7 +172,6 @@ class SongGeneration_Sampler: return { "required": { "cond": ("SongGeneration_Cond",), - "gen_type": (["mixed","bgm","vocal",],), "save_separate": ("BOOLEAN", {"default": False}), } } @@ -169,9 +181,8 @@ class SongGeneration_Sampler: FUNCTION = "sampler_main" CATEGORY = "SongGeneration" - def sampler_main(self,cond,gen_type,save_separate): + def sampler_main(self,cond,save_separate): cfg=cond.get("cfg") - cfg.gen_type=gen_type model_sep_path=cond["model_sep_path"] vae_model=cond["vae_model"] print("start inference final,loading model") diff --git a/example_workflows/SongGeneration.json b/example_workflows/SongGeneration.json index 73fb78d..8c26780 100644 --- a/example_workflows/SongGeneration.json +++ b/example_workflows/SongGeneration.json @@ -1,63 +1,9 @@ { "id": "f7a5247b-ed1b-466d-91df-de458a19772c", "revision": 0, - "last_node_id": 23, - "last_link_id": 27, + "last_node_id": 29, + "last_link_id": 39, "nodes": [ - { - "id": 9, - "type": "SongGeneration_Stage2", - "pos": [ - 1413.7088623046875, - 273.0107727050781 - ], - "size": [ - 441.0806579589844, - 600.54931640625 - ], - "flags": {}, - "order": 5, - "mode": 0, - "inputs": [ - { - "name": "model", - "type": "SongGeneration_Audiolm", - "link": 11 - }, - { - "name": "cfg", - "type": "SongGeneration_Cfg", - "link": 12 - }, - { - "name": "cond", - "type": "SongGeneration_Cond", - "link": 18 - } - ], - "outputs": [ - { - "name": "cond", - "type": "SongGeneration_Cond", - "links": [ - 19 - ] - } - ], - "properties": { - "Node name for S&R": "SongGeneration_Stage2" - }, - "widgets_values": [ - "[intro-medium]\n\n[verse]\n夜晚的街灯闪烁\n我漫步在熟悉的角落\n回忆像潮水般涌来\n你的笑容如此清晰\n在心头无法抹去\n那些曾经的甜蜜\n如今只剩我独自回忆\n\n[chorus]\n回忆的温度还在\n你却已不在\n我的心被爱填满\n却又被思念刺痛\n音乐的节奏奏响\n我的心却在流浪\n没有你的日子\n我该如何继续向前\n\n[inst-medium]\n\n[verse]\n手机屏幕亮起\n是你发来的消息\n简单的几个字\n却让我泪流满面\n曾经的拥抱温暖\n如今却变得遥远\n我多想回到从前\n重新拥有你的陪伴\n\n[chorus]\n回忆的温度还在\n你却已不在\n我的心被爱填满\n却又被思念刺痛\n音乐的节奏奏响\n我的心却在流浪\n没有你的日子\n我该如何继续向前\n\n[outro-medium]", - "female, dark, pop, sad, piano and drums, the bpm is 125", - 1.5, - 0.9, - 50, - 0, - true, - 50 - ] - }, { "id": 14, "type": "SongGeneration_Sampler", @@ -70,13 +16,13 @@ 82 ], "flags": {}, - "order": 7, + "order": 9, "mode": 0, "inputs": [ { "name": "cond", "type": "SongGeneration_Cond", - "link": 19 + "link": 32 } ], "outputs": [ @@ -92,331 +38,22 @@ "Node name for S&R": "SongGeneration_Sampler" }, "widgets_values": [ - "mixed", - false - ] - }, - { - "id": 16, - "type": "PreviewAudio", - "pos": [ - 2089.89208984375, - 484.1910095214844 - ], - "size": [ - 270, - 88 - ], - "flags": {}, - "order": 9, - "mode": 0, - "inputs": [ - { - "name": "audio", - "type": "AUDIO", - "link": 21 - } - ], - "outputs": [], - "properties": { - "Node name for S&R": "PreviewAudio" - }, - "widgets_values": [] - }, - { - "id": 13, - "type": "SongGeneration_Stage1", - "pos": [ - 1035.6988525390625, - 456.20953369140625 - ], - "size": [ - 296.767578125, - 178 - ], - "flags": {}, - "order": 0, - "mode": 0, - "inputs": [ - { - "name": "audio", - "shape": 7, - "type": "AUDIO", - "link": null - } - ], - "outputs": [ - { - "name": "cond", - "type": "SongGeneration_Cond", - "links": [ - 18 - ] - } - ], - "properties": { - "Node name for S&R": "SongGeneration_Stage1" - }, - "widgets_values": [ - "autoencoder_music_1320k.ckpt", - "model_2.safetensors", - "new_prompt.pt", - "Pop", - "none", - "none" - ] - }, - { - "id": 19, - "type": "SongGeneration_Sampler", - "pos": [ - 3454.367919921875, - 276.9729309082031 - ], - "size": [ - 270, - 82 - ], - "flags": {}, - "order": 10, - "mode": 2, - "inputs": [ - { - "name": "cond", - "type": "SongGeneration_Cond", - "link": 25 - } - ], - "outputs": [ - { - "name": "audio", - "type": "AUDIO", - "links": [ - 26 - ] - } - ], - "properties": { - "Node name for S&R": "SongGeneration_Sampler" - }, - "widgets_values": [ - "mixed", - false - ] - }, - { - "id": 20, - "type": "PreviewAudio", - "pos": [ - 3493.792724609375, - 490.2040710449219 - ], - "size": [ - 270, - 88 - ], - "flags": {}, - "order": 11, - "mode": 2, - "inputs": [ - { - "name": "audio", - "type": "AUDIO", - "link": 26 - } - ], - "outputs": [], - "properties": { - "Node name for S&R": "PreviewAudio" - }, - "widgets_values": [] - }, - { - "id": 17, - "type": "SongGeneration_Stage2", - "pos": [ - 2920.681884765625, - 274.19219970703125 - ], - "size": [ - 441.0806579589844, - 600.54931640625 - ], - "flags": {}, - "order": 8, - "mode": 2, - "inputs": [ - { - "name": "model", - "type": "SongGeneration_Audiolm", - "link": 22 - }, - { - "name": "cfg", - "type": "SongGeneration_Cfg", - "link": 23 - }, - { - "name": "cond", - "type": "SongGeneration_Cond", - "link": 24 - } - ], - "outputs": [ - { - "name": "cond", - "type": "SongGeneration_Cond", - "links": [ - 25 - ] - } - ], - "properties": { - "Node name for S&R": "SongGeneration_Stage2" - }, - "widgets_values": [ - "[intro-medium]\n\n[verse]\n夜晚的街灯闪烁\n我漫步在熟悉的角落\n回忆像潮水般涌来\n你的笑容如此清晰\n在心头无法抹去\n那些曾经的甜蜜\n如今只剩我独自回忆\n\n[chorus]\n回忆的温度还在\n你却已不在\n我的心被爱填满\n却又被思念刺痛\n音乐的节奏奏响\n我的心却在流浪\n没有你的日子\n我该如何继续向前\n\n[inst-medium]\n\n[verse]\n手机屏幕亮起\n是你发来的消息\n简单的几个字\n却让我泪流满面\n曾经的拥抱温暖\n如今却变得遥远\n我多想回到从前\n重新拥有你的陪伴\n\n[chorus]\n回忆的温度还在\n你却已不在\n我的心被爱填满\n却又被思念刺痛\n音乐的节奏奏响\n我的心却在流浪\n没有你的日子\n我该如何继续向前\n\n[outro-medium]", - "female, dark, pop, sad, piano and drums, the bpm is 125", - 1.5, - 0.9, - 50, - 0, - true, - 50 - ] - }, - { - "id": 18, - "type": "SongGeneration_Loader", - "pos": [ - 2569.0380859375, - 243.3841094970703 - ], - "size": [ - 270, - 78 - ], - "flags": {}, - "order": 1, - "mode": 2, - "inputs": [], - "outputs": [ - { - "name": "model", - "type": "SongGeneration_Audiolm", - "links": [ - 22 - ] - }, - { - "name": "cfg", - "type": "SongGeneration_Cfg", - "links": [ - 23 - ] - } - ], - "properties": { - "Node name for S&R": "SongGeneration_Loader" - }, - "widgets_values": [ - "new_model.pt" - ] - }, - { - "id": 1, - "type": "SongGeneration_Loader", - "pos": [ - 1037.9068603515625, - 305.0125427246094 - ], - "size": [ - 270, - 78 - ], - "flags": {}, - "order": 2, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "model", - "type": "SongGeneration_Audiolm", - "links": [ - 11 - ] - }, - { - "name": "cfg", - "type": "SongGeneration_Cfg", - "links": [ - 12 - ] - } - ], - "properties": { - "Node name for S&R": "SongGeneration_Loader" - }, - "widgets_values": [ - "new_model.pt" - ] - }, - { - "id": 21, - "type": "SongGeneration_Stage1", - "pos": [ - 2571.6611328125, - 412.2967834472656 - ], - "size": [ - 296.767578125, - 178 - ], - "flags": {}, - "order": 6, - "mode": 2, - "inputs": [ - { - "name": "audio", - "shape": 7, - "type": "AUDIO", - "link": 27 - } - ], - "outputs": [ - { - "name": "cond", - "type": "SongGeneration_Cond", - "links": [ - 24 - ] - } - ], - "properties": { - "Node name for S&R": "SongGeneration_Stage1" - }, - "widgets_values": [ - "autoencoder_music_1320k.ckpt", - "model_2.safetensors", - "new_prompt.pt", - "Pop", - "model_2_fixed.safetensors", - "htdemucs.pth" + "mixed" ] }, { "id": 22, "type": "LoadAudio", "pos": [ - 2541.430419921875, - 673.8790893554688 + 2464.4304199218736, + 200.87908935546878 ], "size": [ 270, 136 ], "flags": {}, - "order": 3, + "order": 0, "mode": 2, "inputs": [], "outputs": [ @@ -434,7 +71,195 @@ "widgets_values": [ "AnimateDiff_00003.mp4", null, - "" + null + ] + }, + { + "id": 19, + "type": "SongGeneration_Sampler", + "pos": [ + 3308.067919921873, + 352.8729309082033 + ], + "size": [ + 210, + 94.09999999999991 + ], + "flags": {}, + "order": 10, + "mode": 2, + "inputs": [ + { + "name": "cond", + "type": "SongGeneration_Cond", + "link": 37 + } + ], + "outputs": [ + { + "name": "audio", + "type": "AUDIO", + "links": [ + 26 + ] + } + ], + "properties": { + "Node name for S&R": "SongGeneration_Sampler" + }, + "widgets_values": [ + "mixed" + ] + }, + { + "id": 20, + "type": "PreviewAudio", + "pos": [ + 3317.7927246093764, + 511.1040710449216 + ], + "size": [ + 210, + 107.79999999999995 + ], + "flags": {}, + "order": 12, + "mode": 2, + "inputs": [ + { + "name": "audio", + "type": "AUDIO", + "link": 26 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewAudio" + }, + "widgets_values": [] + }, + { + "id": 18, + "type": "SongGeneration_Loader", + "pos": [ + 2773.638085937501, + 220.28410949707035 + ], + "size": [ + 270, + 126 + ], + "flags": {}, + "order": 1, + "mode": 2, + "inputs": [], + "outputs": [ + { + "name": "model", + "type": "SongGeneration_Audiolm", + "links": [ + 34 + ] + }, + { + "name": "cfg", + "type": "SongGeneration_Cfg", + "links": [ + 35 + ] + } + ], + "properties": { + "Node name for S&R": "SongGeneration_Loader" + }, + "widgets_values": [ + "large_v2_model.pt", + "v2", + true + ] + }, + { + "id": 21, + "type": "SongGeneration_Stage1", + "pos": [ + 2532.941132812497, + 415.92678344726545 + ], + "size": [ + 496.41757812499964, + 347.5 + ], + "flags": {}, + "order": 6, + "mode": 2, + "inputs": [ + { + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": 27 + } + ], + "outputs": [ + { + "name": "cond", + "type": "SongGeneration_Cond", + "links": [ + 36 + ] + } + ], + "properties": { + "Node name for S&R": "SongGeneration_Stage1" + }, + "widgets_values": [ + "autoencoder_music_1320k.ckpt", + "model_2.safetensors", + "new_auto_prompt.pt", + "Pop", + "model_2_fixed.safetensors", + "htdemucs.pth", + "[intro-short] ;\n [verse]\n 雪花舞动在无尽的天际.情缘如同雪花般轻轻逝去.希望与真挚.永不磨灭.你的忧虑.随风而逝 ;\n [chorus]\n 我怀抱着守护这片梦境.在这世界中寻找爱与虚幻.苦辣酸甜.我们一起品尝.在雪的光芒中.紧紧相拥 ;\n [inst-short] ;\n [verse]\n雪花再次在风中飘扬.情愿如同雪花般消失无踪.希望与真挚.永不消失.在痛苦与喧嚣中.你找到解脱 ;\n [chorus]\n 我环绕着守护这片梦境.在这世界中感受爱与虚假.苦辣酸甜.我们一起分享.在白银的光芒中.我们同在 ;\n [outro-short]" + ] + }, + { + "id": 1, + "type": "SongGeneration_Loader", + "pos": [ + 1365.8968603515636, + 254.58254272460943 + ], + "size": [ + 270, + 126 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "model", + "type": "SongGeneration_Audiolm", + "links": [ + 29 + ] + }, + { + "name": "cfg", + "type": "SongGeneration_Cfg", + "links": [ + 30 + ] + } + ], + "properties": { + "Node name for S&R": "SongGeneration_Loader" + }, + "widgets_values": [ + "large_v2_model.pt", + "v2", + true ] }, { @@ -449,51 +274,223 @@ 185.1282958984375 ], "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [], + "properties": {}, + "widgets_values": [ + "rename model.pt if use large model.pt to large_model.pt 如果使用large模型,修改模型名字加入large,不然识别不到\nrename model.pt if use new base model.pt to new_model.pt 如果使用new模型,修改模型名字加入new,不然识别不到\nrename model.pt if use full model.pt to full_model.pt 如果使用full模型,修改模型名字加入full,不然识别不到\nrename model.pt if use v2 model.pt to large_model_v2.pt 如果使用v2 large模型,修改模型名字加入large,不然识别不到\nnot rename model.pt if use origin base model.pt \n\n" + ], + "color": "#432", + "bgcolor": "#653" + }, + { + "id": 29, + "type": "Note", + "pos": [ + 1998.789382915805, + 590.0000638964441 + ], + "size": [ + 368.75862663594353, + 114.44628099173565 + ], + "flags": {}, "order": 4, "mode": 0, "inputs": [], "outputs": [], "properties": {}, "widgets_values": [ - "rename model.pt if use large model.pt to large_model.pt 如果使用large模型,修改模型名字加入large,不然识别不到\nrename model.pt if use new base model.pt to new_model.pt 如果使用new模型,修改模型名字加入new,不然识别不到\nrename model.pt if use full model.pt to large_model.pt 如果使用full模型,修改模型名字加入full,不然识别不到\nnot rename model.pt if use origin base model.pt \n\n" + "offload_audiolm将降低gpu占用,当然,推理时长也自然就翻倍了\n\n显存够大的情况下,top_k=5000 否则设置为50\nif big Vram top_=5000 else 50 \n" ], "color": "#432", "bgcolor": "#653" + }, + { + "id": 24, + "type": "SongGeneration_Stage2", + "pos": [ + 1705.4000424685778, + 344.45150152755116 + ], + "size": [ + 258.39999999999964, + 320 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "SongGeneration_Audiolm", + "link": 29 + }, + { + "name": "cfg", + "type": "SongGeneration_Cfg", + "link": 30 + }, + { + "name": "cond", + "type": "SongGeneration_Cond", + "link": 39 + } + ], + "outputs": [ + { + "name": "cond", + "type": "SongGeneration_Cond", + "links": [ + 32 + ] + } + ], + "properties": { + "Node name for S&R": "SongGeneration_Stage2" + }, + "widgets_values": [ + "mixed", + "female, dark, pop, sad, piano and drums, the bpm is 125", + 1.5, + 0.9, + 50, + 0, + true, + 50, + true + ] + }, + { + "id": 16, + "type": "PreviewAudio", + "pos": [ + 1984.6220898437502, + 457.57100952148437 + ], + "size": [ + 270, + 88 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "audio", + "type": "AUDIO", + "link": 21 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewAudio" + }, + "widgets_values": [] + }, + { + "id": 28, + "type": "SongGeneration_Stage1", + "pos": [ + 1207.1934392521302, + 454.8515763108676 + ], + "size": [ + 432.06611570247924, + 419.43801652892546 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": null + } + ], + "outputs": [ + { + "name": "cond", + "type": "SongGeneration_Cond", + "links": [ + 39 + ] + } + ], + "properties": { + "Node name for S&R": "SongGeneration_Stage1" + }, + "widgets_values": [ + "autoencoder_music_1320k.ckpt", + "model_2.safetensors", + "new_auto_prompt.pt", + "Pop", + "none", + "none", + "[intro-short] ;\n[verse]\n在那遥远的爵士乡.有位迷人的姑娘.行人经过她的窗.总为她驻足凝望.她的微笑如夜曲悠扬.温暖中带着一丝忧伤 ;\n[chorus]\n她的眼神如星闪亮.带我坠入梦境徜徉.我愿放下手中诗行.只为她轻声歌唱.日日守候在那街角.盼她一次温柔回望.我不过是远方的风.偶然路过她的乐章.却把心跳谱成了音符.在每一个夜晚反复回响;\n[inst-medium];\n[verse]\n我愿化身为那月光.静静陪在她的身旁 ;\n[bridge]\n任那晚风轻拂梦想.心事只对她默默讲.岁月是位沉默的乐手.将青涩吹奏成沧桑.我的歌谣褪了颜色.却还在老地方.为她播放 ;\n[chorus]\n在那遥远的城市一方.时光深处藏着一位好姑娘.夜色披上霓虹衣裳.迷路的人啊.都向着那扇窗凝望.那光芒.是温柔的故乡;\n[outro-medium]" + ] + }, + { + "id": 25, + "type": "SongGeneration_Stage2", + "pos": [ + 3074.755886468576, + 351.8483435275507 + ], + "size": [ + 210, + 320 + ], + "flags": {}, + "order": 8, + "mode": 2, + "inputs": [ + { + "name": "model", + "type": "SongGeneration_Audiolm", + "link": 34 + }, + { + "name": "cfg", + "type": "SongGeneration_Cfg", + "link": 35 + }, + { + "name": "cond", + "type": "SongGeneration_Cond", + "link": 36 + } + ], + "outputs": [ + { + "name": "cond", + "type": "SongGeneration_Cond", + "links": [ + 37 + ] + } + ], + "properties": { + "Node name for S&R": "SongGeneration_Stage2" + }, + "widgets_values": [ + "mixed", + "female, dark, pop, sad, piano and drums, the bpm is 125", + 1.5, + 0.8, + 50, + 0, + true, + 50, + true + ] } ], "links": [ - [ - 11, - 1, - 0, - 9, - 0, - "SongGeneration_Audiolm" - ], - [ - 12, - 1, - 1, - 9, - 1, - "SongGeneration_Cfg" - ], - [ - 18, - 13, - 0, - 9, - 2, - "SongGeneration_Cond" - ], - [ - 19, - 9, - 0, - 14, - 0, - "SongGeneration_Cond" - ], [ 21, 14, @@ -502,38 +499,6 @@ 0, "AUDIO" ], - [ - 22, - 18, - 0, - 17, - 0, - "SongGeneration_Audiolm" - ], - [ - 23, - 18, - 1, - 17, - 1, - "SongGeneration_Cfg" - ], - [ - 24, - 21, - 0, - 17, - 2, - "SongGeneration_Cond" - ], - [ - 25, - 17, - 0, - 19, - 0, - "SongGeneration_Cond" - ], [ 26, 19, @@ -549,6 +514,70 @@ 21, 0, "AUDIO" + ], + [ + 29, + 1, + 0, + 24, + 0, + "SongGeneration_Audiolm" + ], + [ + 30, + 1, + 1, + 24, + 1, + "SongGeneration_Cfg" + ], + [ + 32, + 24, + 0, + 14, + 0, + "SongGeneration_Cond" + ], + [ + 34, + 18, + 0, + 25, + 0, + "SongGeneration_Audiolm" + ], + [ + 35, + 18, + 1, + 25, + 1, + "SongGeneration_Cfg" + ], + [ + 36, + 21, + 0, + 25, + 2, + "SongGeneration_Cond" + ], + [ + 37, + 25, + 0, + 19, + 0, + "SongGeneration_Cond" + ], + [ + 39, + 28, + 0, + 24, + 2, + "SongGeneration_Cond" ] ], "groups": [ @@ -582,17 +611,18 @@ "config": {}, "extra": { "ds": { - "scale": 0.6209213230591556, + "scale": 0.6209213230591553, "offset": [ - -904.784220650397, - 207.29318756335755 + -873.1687045755074, + 238.49820687622267 ] }, - "frontendVersion": "1.26.13", + "frontendVersion": "1.39.19", "VHS_latentpreview": false, "VHS_latentpreviewrate": 0, "VHS_MetadataImage": true, - "VHS_KeepIntermediate": true + "VHS_KeepIntermediate": true, + "workflowRendererVersion": "LG" }, "version": 0.4 } \ No newline at end of file diff --git a/example_workflows/SongGeneration.png b/example_workflows/SongGeneration.png index bf3efd6..9472418 100644 Binary files a/example_workflows/SongGeneration.png and b/example_workflows/SongGeneration.png differ diff --git a/generate.py b/generate.py index eb6b47a..359f41a 100644 --- a/generate.py +++ b/generate.py @@ -2,7 +2,7 @@ import sys import os import folder_paths import time -import copy +import librosa import torch import torchaudio import numpy as np @@ -12,9 +12,32 @@ from .SongGeneration.codeclm.models import builders from .SongGeneration.codeclm.trainer.codec_song_pl import CodecLM_PL from .SongGeneration.codeclm.models import CodecLM from .SongGeneration.third_party.demucs.models.pretrained import get_model_from_yaml +import re current_node_path = os.path.dirname(os.path.abspath(__file__)) -auto_prompt_type = ['Pop', 'R&B', 'Dance', 'Jazz', 'Folk', 'Rock', 'Chinese Style', 'Chinese Tradition', 'Metal', 'Reggae', 'Chinese Opera', 'Auto'] +auto_prompt_type = ['Pop', 'Latin', 'Rock', 'Electronic', 'Metal', 'Country', 'R&B/Soul', 'Ballad', 'Jazz', 'World', 'Hip-Hop', 'Funk', 'Soundtrack','Auto'] +def check_language_by_text(text): + chinese_pattern = re.compile(r'[\u4e00-\u9fff]') + english_pattern = re.compile(r'[a-zA-Z]') + chinese_count = len(re.findall(chinese_pattern, text)) + english_count = len(re.findall(english_pattern, text)) + chinese_ratio = chinese_count / len(text) + english_ratio = english_count / len(text) + if chinese_ratio >= 0.2: + return "zh" + elif english_ratio >= 0.5: + return "en" + else: + return "en" + +def load_audio_by_librosa(f): + a, fs= librosa.load(f, sr=48000) + a = torch.tensor(a).unsqueeze(0) + if (fs != 48000): + a = torchaudio.functional.resample(a, fs, 48000) + if a.shape[-1] >= 48000*10: + a = a[..., :48000*10] + return a[:, 0:48000*10], 48000 class Separator(): def __init__(self, dm_model_path='third_party/demucs/ckpt/htdemucs.pth', dm_config_path='third_party/demucs/ckpt/htdemucs.yaml', gpu_id=0) -> None: @@ -31,7 +54,10 @@ class Separator(): return model def load_audio(self, f): - a, fs = torchaudio.load(f) + try: + a, fs = torchaudio.load(f) + except: + a, fs = load_audio_by_librosa(f) if (fs != 48000): a = torchaudio.functional.resample(a, fs, 48000) if a.shape[-1] >= 48000*10: @@ -62,7 +88,7 @@ class Separator(): -def build_model(Weigths_Path,infer_model_path): +def build_model(Weigths_Path,infer_model_path,version,use_flash_attn): torch.backends.cudnn.enabled = False curent_dir = os.path.join(current_node_path,"SongGeneration") RESOLVERS = { @@ -78,112 +104,62 @@ def build_model(Weigths_Path,infer_model_path): np.random.seed(int(time.time())) infer_model_type="new" if "new" in infer_model_path.lower() else "large" if "large" in infer_model_path.lower() else "full" if "full" in infer_model_path.lower() else "base" - cfg_path = os.path.join(current_node_path, f'SongGeneration/conf/{infer_model_type}_config.yaml') - + cfg_path = os.path.join(current_node_path, f'SongGeneration/conf/{infer_model_type}_config.yaml') if version=="v1" else os.path.join(current_node_path, f'SongGeneration/conf/{infer_model_type}_config_v2.yaml') + print(cfg_path) cfg = OmegaConf.load(cfg_path) cfg.mode = 'inference' + cfg.lm.use_flash_attn_2 = use_flash_attn cfg.vae_config=f"{Weigths_Path}/vae/stable_audio_1920_vae.json" cfg.vae_model=f"{Weigths_Path}/vae/autoencoder_music_1320k.ckpt" cfg.audio_tokenizer_checkpoint=f"Flow1dVAE1rvq_{Weigths_Path}/model_1rvq/model_2_fixed.safetensors" cfg.audio_tokenizer_checkpoint_sep=f"Flow1dVAESeparate_{Weigths_Path}/model_septoken/model_2.safetensors" cfg.conditioners.type_info.QwTextTokenizer.token_path=os.path.join(current_node_path,"SongGeneration/third_party/Qwen2-7B") + cfg.version = version - audiolm = builders.get_lm_model(cfg) + audiolm = builders.get_lm_model(cfg,version) checkpoint = torch.load(infer_model_path, map_location='cpu',weights_only=False) audiolm_state_dict = {k.replace('audiolm.', ''): v for k, v in checkpoint.items() if k.startswith('audiolm')} - #### @tuolaku https://github.com/smthemex/ComfyUI_SongGeneration/issues/37 ##### - # add 1.5 support,test。。。。 - key = "condition_provider.conditioners.type_info.output_proj.weight" - expected_vocab_size = 151646 - if key in audiolm_state_dict: - weight = audiolm_state_dict[key] - if weight.size(0) > expected_vocab_size: - print(f"[SongGeneration] Trimming {key} from {weight.size(0)} to {expected_vocab_size}") - audiolm_state_dict[key] = weight[:expected_vocab_size, :] - ##### + # #### @tuolaku https://github.com/smthemex/ComfyUI_SongGeneration/issues/37 ##### 暂时取消1.5版本的测试 + # # add 1.5 support,test。。。。 + # key = "condition_provider.conditioners.type_info.output_proj.weight" + # expected_vocab_size = 151646 + # if key in audiolm_state_dict: + # weight = audiolm_state_dict[key] + # if weight.size(0) > expected_vocab_size: + # print(f"[SongGeneration] Trimming {key} from {weight.size(0)} to {expected_vocab_size}") + # audiolm_state_dict[key] = weight[:expected_vocab_size, :] + # ##### + audiolm.load_state_dict(audiolm_state_dict, strict=False) - audiolm = audiolm.eval() + audiolm = audiolm.eval().to(torch.float16) #audiolm = audiolm.cuda().to(torch.float16) del audiolm_state_dict,checkpoint return audiolm,cfg - -# def pre_data(Weigths_Path,dm_model_path,dm_config_path,save_dir,prompt_audio_path,auto_prompt_audio_type,infer_model_type,prompt_pt_path): - # torch.backends.cudnn.enabled = False - # curent_dir = os.path.join(current_node_path,"SongGeneration") - # RESOLVERS = { - # "eval": lambda x: eval(x), - # "concat": lambda *x: [xxx for xx in x for xxx in xx], - # "get_fname": lambda: os.path.splitext(os.path.basename(sys.argv[1]))[0], - # "load_yaml": lambda x: list(OmegaConf.load(os.path.join(curent_dir, x))) - # } - - # for name, func in RESOLVERS.items(): - # if not OmegaConf.has_resolver(name): - # OmegaConf.register_new_resolver(name, func) - # np.random.seed(int(time.time())) - - # cfg_path = os.path.join(current_node_path, f'SongGeneration/conf/{infer_model_type}_config.yaml') - - # cfg = OmegaConf.load(cfg_path) - # cfg.mode = 'inference' - - # cfg.vae_config=f"{Weigths_Path}/vae/stable_audio_1920_vae.json" - # cfg.vae_model=f"{Weigths_Path}/vae/autoencoder_music_1320k.ckpt" - - # cfg.audio_tokenizer_checkpoint=f"Flow1dVAE1rvq_{Weigths_Path}/model_1rvq/model_2_fixed.safetensors" - # cfg.audio_tokenizer_checkpoint_sep=f"Flow1dVAESeparate_{Weigths_Path}/model_septoken/model_2.safetensors" - # cfg.conditioners.type_info.QwTextTokenizer.token_path=os.path.join(current_node_path,"SongGeneration/third_party/Qwen2-7B") - # max_duration = cfg.max_dur - # vae_model=f"{Weigths_Path}/vae/autoencoder_music_1320k.ckpt" - # vae_config=os.path.join(current_node_path, f'SongGeneration/conf/stable_audio_1920_vae.json') - # auto_prompt = torch.load(prompt_pt_path,weights_only=False) - # merge_prompt = [x for sublist in auto_prompt.values() for x in sublist] - - # if prompt_audio_path is not None: - # separator = Separator(dm_model_path, dm_config_path) - # audio_tokenizer = builders.get_audio_tokenizer_model(f"Flow1dVAE1rvq_{Weigths_Path}/model_1rvq/model_2_fixed.safetensors", vae_config,vae_model) - # audio_tokenizer = audio_tokenizer.eval().cuda() - - # else: - # audio_tokenizer = None - # separator = None - - # original_item=song_infer_lowram(cfg,separator,audio_tokenizer,merge_prompt,auto_prompt, save_dir,prompt_audio_path,auto_prompt_audio_type,) - # print("step1 is done.") - # return copy.deepcopy(original_item),max_duration,cfg - - -def infer_stage2(item,audiolm,max_duration,lyric,descriptions,cfg_coef = 1.5, temp = 0.9,top_k = 50,top_p = 0.0,record_tokens = True,record_window = 50): +def infer_stage2(item,audiolm,max_duration,lyric,descriptions,gen_type,cfg,cfg_coef = 1.5, temp = 0.9,top_k = 50,top_p = 0.0,record_tokens = True,record_window = 50,offload_audiolm = False): #ckpt_path = os.path.join(Weigths_Path, 'songgeneration_base/model.pt') item_copy = { - 'pmt_wav': item['pmt_wav'], # 这些是引用,但安全因为后续设为None不影响原始 + 'pmt_wav': item['pmt_wav'], 'vocal_wav': item['vocal_wav'], 'bgm_wav': item['bgm_wav'], 'melody_is_wav': item['melody_is_wav'], 'idx': item['idx'], 'wav_path': item['wav_path'] - # 不包含 'tokens' 因为它将在 step2 中生成 } - # Define model or load pretrained model - # model_light = CodecLM_PL(cfg, ckpt_path) - # model_light = model_light.eval() - # model_light.audiolm.cfg = cfg - # model = CodecLM(name = "tmp", - # lm = model_light.audiolm, - # audiotokenizer = None, - # max_duration = max_duration, - # seperate_tokenizer = None, - # ) - # del model_light - # audiolm = builders.get_lm_model(cfg) - # checkpoint = torch.load(ckpt_path, map_location='cpu') - # audiolm_state_dict = {k.replace('audiolm.', ''): v for k, v in checkpoint.items() if k.startswith('audiolm')} - # audiolm.load_state_dict(audiolm_state_dict, strict=False) - audiolm=audiolm.to(torch.float16).cuda() + if offload_audiolm: + # from .SongGeneration.codeclm.utils.offload_profiler import OffloadProfiler, OffloadParamParse + # audiolm_offload_param = OffloadParamParse.parse_config(audiolm, cfg.offload.audiolm) + # audiolm_offload_param.show() + # offload_profiler = OffloadProfiler(device_index=0, **(audiolm_offload_param.init_param_dict())) + # offload_profiler.offload_layer(**(audiolm_offload_param.offload_layer_param_dict())) + # offload_profiler.clean_cache_wrapper(**(audiolm_offload_param.clean_cache_param_dict())) + audiolm.to_cuda("cuda") + else: + audiolm.cuda() + torch.cuda.empty_cache() model = CodecLM(name = "tmp", lm = audiolm, @@ -196,7 +172,7 @@ def infer_stage2(item,audiolm,max_duration,lyric,descriptions,cfg_coef = 1.5, te top_k=top_k, top_p=top_p,cfg_coef=cfg_coef, record_tokens=record_tokens, record_window=record_window) print("model loaded,start inference step2") - items=inference_lowram_step2(model,lyric,descriptions,item_copy,) + items=inference_lowram_step2(model,lyric,descriptions,item_copy,gen_type) audiolm = audiolm.cpu() del audiolm model=None @@ -206,10 +182,10 @@ def infer_stage2(item,audiolm,max_duration,lyric,descriptions,cfg_coef = 1.5, te -def inference_lowram_step2(model,lyric,descriptions,item,): +def inference_lowram_step2(model,lyric,descriptions,item,gen_type): generate_inp = { - 'lyrics': [lyric.replace(" ", " ")], + 'lyrics': [lyric.replace(" ", " ")] if gen_type != 'bgm' else '.', 'descriptions': [descriptions], 'melody_wavs': item['pmt_wav'], 'vocal_wavs': item['vocal_wav'], @@ -295,7 +271,7 @@ def inference_lowram_final(cfg, seperate_tokenizer, max_duration, item, save_dir } -def song_infer_lowram(seperate_tokenizer,separator,audio_tokenizer,prompt_pt_path, save_dir,prompt_audio_path,auto_prompt_audio_type): #item dict +def song_infer_lowram(seperate_tokenizer,separator,audio_tokenizer,prompt_pt_path, save_dir,prompt_audio_path,auto_prompt_audio_type,lyric): #item dict item = {} target_wav_name = f"{save_dir}/song_audios{time.strftime('%m%d%H%S')}.flac" melody_is_wav = False @@ -323,17 +299,16 @@ def song_infer_lowram(seperate_tokenizer,separator,audio_tokenizer,prompt_pt_pat print("auto_prompt_audio_type:",auto_prompt_audio_type) assert prompt_pt_path is not None ,"prompt模型不能为空,need prmmpt model" auto_prompt = torch.load(prompt_pt_path,weights_only=False) - #assert item["auto_prompt_audio_type"] in auto_prompt_type, f"auto_prompt_audio_type {item['auto_prompt_audio_type']} not found" - # if auto_prompt_audio_type == 'Auto': - # prompt_token = merge_prompt[np.random.randint(0, len(merge_prompt))] - # else: - # prompt_token = auto_prompt[auto_prompt_audio_type][np.random.randint(0, len(auto_prompt[auto_prompt_audio_type]))] - prompt_token = auto_prompt[auto_prompt_audio_type][np.random.randint(0, len(auto_prompt[auto_prompt_audio_type]))] + lang = check_language_by_text(lyric) + #prompt_token = auto_prompt[auto_prompt_audio_type][np.random.randint(0, len(auto_prompt[auto_prompt_audio_type]))] + prompt_token = auto_prompt[auto_prompt_audio_type][lang][np.random.randint(0, len(auto_prompt[auto_prompt_audio_type][lang]))] + del auto_prompt if torch.cuda.is_available(): prompt_token = prompt_token.cuda() pmt_wav = prompt_token[:,[0],:] vocal_wav = prompt_token[:,[1],:] bgm_wav = prompt_token[:,[2],:] + del prompt_token else: pmt_wav = None vocal_wav = None @@ -346,6 +321,7 @@ def song_infer_lowram(seperate_tokenizer,separator,audio_tokenizer,prompt_pt_pat item['melody_is_wav'] = melody_is_wav item["idx"] = 0 item["wav_path"] = target_wav_name + item["gt_lyric"] = lyric return item