Spaces:
Sleeping
Sleeping
from .base import MelodyDatasetHandler | |
class Genre(MelodyDatasetHandler): | |
name = "genre" | |
def __init__(self, melody_type, *args, **kwargs): | |
import json | |
with open("data/genre/word_data_zh.json", "r", encoding="utf-8") as f: | |
song_db_zh = json.load(f) | |
song_db_zh = {f"zh_{song['id']}": song for song in song_db_zh} # id as major | |
with open("data/genre/word_data_en.json", "r", encoding="utf-8") as f: | |
song_db_en = json.load(f) | |
song_db_en = {f"en_{song['id']}": song for song in song_db_en} # id as major | |
self.song_db = {**song_db_zh, **song_db_en} | |
def get_song_ids(self): | |
return list(self.song_db.keys()) | |
def get_style_keywords(self, song_id): | |
genre = self.song_db[song_id]["genre"] | |
super_genre = self.song_db[song_id]["super-genre"] | |
gender = self.song_db[song_id]["gender"] | |
return (genre, super_genre, gender) | |
def get_phrase_length(self, song_id): | |
# Return the number of lyrics (excluding SP/AP) in each phrase of the song | |
song = self.song_db[song_id] | |
note_lyrics = song.get("note_lyrics", []) | |
phrase_lengths = [] | |
for phrase in note_lyrics: | |
count = sum(1 for word in phrase if word not in ("SP", "AP")) | |
phrase_lengths.append(count) | |
return phrase_lengths | |
def iter_song_phrases(self, song_id): | |
segment_id = 1 | |
song = self.song_db[song_id] | |
for phrase_score, phrase_lyrics in zip(song["score"], song["note_lyrics"]): | |
segment = { | |
"note_start_times": [n[0] for n in phrase_score], | |
"note_end_times": [n[1] for n in phrase_score], | |
"note_lyrics": [character for character in phrase_lyrics], | |
"note_midi": [n[2] for n in phrase_score], | |
} | |
yield segment | |
segment_id += 1 | |