Amourman/inzynierka-synth40-100k
Architektura synth40. tu jest 40 parametrów i inny tryb cech pann_mfcc_hilbert, embedding PANN/Cnn14 zamiast log-mel. Primary key to midi_48 zamiast midi_60 jak w synth37. inzynierka-synth40-100k 100 004 presetów syntezatora synth40, stokenizowane pod trening Transformer-VAE. Rekordy leżą na gładkich i spójnych brzmieniowo trajektoriach w przestrzeni brzmienia, cel modelu to przestrzeń latentna, po której da się organicznie ewoluować brzmienie z seeda w duchu Synplant2 od… See the full description on the dataset page: https://huggingface.co/datasets/Amourman/inzynierka-synth40-100k.
Architektura synth40. tu jest 40 parametrów i inny tryb cech pann_mfcc_hilbert, embedding PANN/Cnn14 zamiast log-mel. Primary key to midi_48 zamiast midi_60 jak w synth37.
inzynierka-synth40-100k
100 004 presetów syntezatora synth40, stokenizowane pod trening Transformer-VAE. Rekordy leżą na gładkich i spójnych brzmieniowo trajektoriach w przestrzeni brzmienia, cel modelu to przestrzeń latentna, po której da się organicznie ewoluować brzmienie z seeda w duchu Synplant2 od Sonic Charge.
Fragmenty kodu są od codexa, nakierowanie na poprawne użycie tego repo.
tl;dr
- 100 004 rekordy: Splity są przygotowane: train 79 885 / validation 10 198 / test 9 921 — nieregularne liczby, bo całe trajektorie trafiają po jednej stronie podziału.
- `preset_tokens/`: Preset jako 14 tokenów modułów, teraz 40 parametrów.
- `audio_tokens/`: Kody z EnCodeca. Tokenizowany jest tylko widok
midi_48, niemidi_60jak w poprzednim datasecie — synth40 ma inny domyślny ton). Preset renderowany jest na 4 tonach (36/48/60/72) do walidacji DSP w generacji, ale jako tokeny zapisany jest wyłącznie primary. 100 004 wiersze tokenów audio (1/rekord). - `features/` i `manifest.jsonl` nie wchodzą jako input do modelu, to katalog metryk na temat datasetu do późniejszej analizy i metadane rekordów w JSONie, możesz sobie zerknąć.
- Wiersz
[i]w każdympreset_tokens/*.npyifeatures/*.npyodpowiada linii[i]wmanifest.jsonl. Audio szukasz po(record_id, view_id)waudio_tokens/audio_token_index.jsonl. Wszystko spinane jest kluczemrecord_id. - EnCodec: 8 codebooks × 1024 symbols, 75 kl/s. Tokenizowany jest tylko primary
midi_48: 450 klatek = 6 s, stałe dla każdego rekordu.
co się zmieniło względem inzynierka-transformer-100k
Warstwa tokenizera presetów (preset_tokens/, 14 modułów × 7 parametrów, 14 × 5 tras jest taka sama
drzewo repo
manifest.jsonl katalog: 1 rekord / linia, metadane
preset_tokens/ **input treningu**: preset jako tensory, 14 tokenów modułów, 40 parametrów
audio_tokens/ **input treningu**: kody EnCodec w shardach + indeks, widok primary
features/ Cechy do budowy zbioru (pann_mfcc_hilbert)
audit_report.json audyt jakości datasetu
generation_summary.json konfiguracja generacji
render_attempts.jsonl każda próba renderu, w tym odrzucone
sound_archive_calibration.json geometria datasetu: skalowanie + PCA 8D + CVT (Centra Teselacji Woronoja, do wyboru centr nisz dźwiękowych przy ewolucji)
viewer/ tylko po to żeby HF dobrze robił podgląd datasetupliki po kolei
manifest.jsonl
1 obiekt JSON na linię, 100 004 linie. Najważniejsze pola:
import json
recs = [json.loads(l) for l in open("manifest.jsonl", encoding="utf-8")]preset_tokens/
Preset jako 14 tokenów modułów: OSC A/B, szum, mikser źródeł, FM, filtr, obwiednie wzmocnienia i modulacji, LFO, drive/delay/reverb, unison itp. Każdy z ≤7 parametrami i ≤5 trasami modulacji. Pliki statyczne opisują strukturę, per-rekordowe niosą wartości.
import numpy as np
pv = np.load("preset_tokens/parameter_values.npy", mmap_mode="r") # (100004,14,7)
mod = np.load("preset_tokens/module_activity.npy", mmap_mode="r") # (100004,14)
i = 42
preset_i = pv[i] # tensor presetu rekordu i (= linia i w manifest.jsonl)audio_tokens/
Dźwięk skompresowany EnCodekiem 24 kHz do kodów: 8 codebooków, wartości 0–1023. Preset renderowany jest na 4 tonach (36/48/60/72) do walidacji DSP w generacji datasetu, ale jako tokeny zapisany jest wyłącznie widok primary — tu midi_48 (w poprzednim datasecie to było midi_60, bo tamten wariant miał inny domyślny prymarny ton). Model i tak używa wyłącznie primary widoku.
- shardy
audio_tokens-XXXXX.npz— 1563 pliki, po ≤64 widoków, każdy ma: codes- (rows, 8, 450) uint16 - kodylengths- (rows,) int32 - długość dlamidi_48zawsze 450- indeks
audio_token_index.jsonl— 100 004 linie: dla każdegorecord_idpodajeshard,row,token_length,split. codec_metadata.json— konfiguracja kodeka.
Nie ciągniesz shardów ręcznie, tylko przez indeks:
import json, numpy as np
idx = {} # (record_id, view) -> (shard, row, len)
for l in open("audio_tokens/audio_token_index.jsonl", encoding="utf-8"):
e = json.loads(l); idx[(e["record_id"], e["view_id"])] = (e["shard"], e["row"], e["token_length"])
shard, row, T = idx[("qd-2843-branch-2-00009292:21:0", "midi_48")]
codes = np.load(f"audio_tokens/{shard}")["codes"][row][:, :T] # (8, T) uint16, wartości 0..1023features/
Cechy z trybu pann_mfcc_hilbert embedding PANN/Cnn14 2048d + trajektoria MFCC + obwiednia Hilberta attack/tail + poziom analityczny dla widoku primary:
local_features.npy(100004, 2497) float32: 2048 PANN + 449 MFCC/Hilbert/poziom — do liczenia słyszalnej odległości między krokami trajektorii.global_features.npy(100004, 2088) float32: 2048 PANN + 32 statystyki + 8 deskryptorów.
Nie ma tu odpowiednika starej tabelki "3 rozmiary FFT × mel bands" — większość wymiarów to embedding PANN, nie pasma melowe.
jak złożyć jeden przykład treningowy
# rekord i: i = linia w manifest.jsonl = wiersz w preset_tokens/*.npy = wiersz w features/*.npy
rec = recs[i]
enc_preset = { # WEJŚCIE/CEL: preset
"parameter_values": pv[i], # (14,7) float32
"parameter_activity": pa[i], # (14,7) bool
"module_activity": mod[i], # (14,) bool
# + statyczne: module_ids, module_activity_mask, parameter_mask, route_mask
}
codes = load_view(rec["record_id"], "midi_48") # (8, T) — WEJŚCIE/CEL: audio
split = rec["split"] # train / validation / test
weight = rec["activity_mask"] # do ważenia straty na parametrachEnkoder dostaje preset + kody audio midi_48 -> rzutuje do latentu -> dekoder odtwarza z powrotem kody audio, 40 parametrów, aktywność i routing.
trajektorie
record_id = trajektoria:krok:próba. Rekordy jednej trajektorii mają wspólny trajectory_id i rosnący step_index, sąsiednie kroki różnią się małą wartością odległości pann_mfcc_hilbert. prev / current / next mają ten sam trajectory_id. Kolejne step_index to wartości na potencjalną lossfunction pilnującą spójnego kierunku w przestrzeni latentnej.
split train-test-val jak są podzielone
Podział po liniach seedów root_seed_id: cała trajektoria trafia w train lub validation lub test. Weź używaj pola split i nie tasuj tego jeszcze raz, bo byś rozdzielił trajektorie.
jakość / pokrycie archiwum
audit_report.json: 0 warningów, 100 004 unikalnych rekordów, 99 999 unikalnych presetów.- 254 linie root (
root_lineage_count), efektywnie 235.2 (effective_root_lineage_count) — żadna pojedyncza linia nie dominuje (największa to 0.9% datasetu). - 1890 zajętych nisz QSD, 92.3% pokrycia.
- 7633 trajektorie, 92 117 par kroków, wszystkie w paśmie celu [0.03, 0.10].
