codejin/diffsingerkr
6
1import numpy as np2import mido, os, pickle, yaml, argparse, math, librosa, hgtk, logging3from tqdm import tqdm4from pysptk.sptk import rapt5from typing import List, Tuple6from argparse import Namespace # for type7import torch8from typing import Dict9 10from meldataset import mel_spectrogram, spectrogram, spec_energy11from Arg_Parser import Recursive_Parse12 13def Convert_Feature_Based_Music(14 music: List[Tuple[float, str, int]],15 sample_rate: int,16 frame_shift: int,17 consonant_duration: int= 3,18 equality_duration: bool= False19 ):20 previous_used = 021 lyrics = []22 notes = []23 durations = []24 for message_time, lyric, note in music:25 duration = round(message_time * sample_rate) + previous_used26 previous_used = duration % frame_shift27 duration = duration // frame_shift28 29 if lyric == '<X>':30 lyrics.append(lyric)31 notes.append(note)32 durations.append(duration)33 else:34 lyrics.extend(Decompose(lyric))35 notes.extend([note] * 3)36 if equality_duration or duration < consonant_duration * 3:37 split_duration = [duration // 3] * 338 split_duration[1] += duration % 339 durations.extend(split_duration)40 else:41 durations.extend([42 consonant_duration, # onset43 duration - consonant_duration * 2, # nucleus44 consonant_duration # coda45 ])46 47 return lyrics, notes, durations48 49def Expand_by_Duration(50 lyrics: List[str],51 notes: List[int],52 durations: List[int],53 ):54 lyrics = sum([[lyric] * duration for lyric, duration in zip(lyrics, durations)], [])55 notes = sum([*[[note] * duration for note, duration in zip(notes, durations)]], [])56 durations = [index for duration in durations for index in range(duration)]57 58 return lyrics, notes, durations59 60def Decompose(syllable: str):61 onset, nucleus, coda = hgtk.letter.decompose(syllable)62 coda += '_'63 64 return onset, nucleus, coda65 