diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..ba4ed8760feb03ca11a88765bc192ee7a96b67d8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,23 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +tests/inputs/mardy20s.flac filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Bass)_htdemucs_6s_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Drum-Bass)_model_bs_roformer_ep_937_sdr_10_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Drums)_htdemucs_6s_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Guitar)_htdemucs_6s_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Instrumental)_2_HP-UVR_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Instrumental)_kuielab_b_vocals_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Instrumental)_MGM_MAIN_v4_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Instrumental)_model_bs_roformer_ep_317_sdr_12_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Instrumental)_UVR-MDX-NET-Inst_HQ_4_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(No[[:space:]]Drum-Bass)_model_bs_roformer_ep_937_sdr_10_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Other)_htdemucs_6s_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Piano)_htdemucs_6s_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Vocals)_2_HP-UVR_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Vocals)_htdemucs_6s_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Vocals)_kuielab_b_vocals_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Vocals)_MGM_MAIN_v4_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Vocals)_model_bs_roformer_ep_317_sdr_12_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_(Vocals)_UVR-MDX-NET-Inst_HQ_4_spectrogram.png filter=lfs diff=lfs merge=lfs -text +tests/inputs/reference/expected_mardy20s_spectrogram.png filter=lfs diff=lfs merge=lfs -text diff --git a/audio_separator/__init__.py b/audio_separator/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/audio_separator/model-data.json b/audio_separator/model-data.json new file mode 100644 index 0000000000000000000000000000000000000000..654f730fcd8af3db734e31191fa8f4a3635747e9 --- /dev/null +++ b/audio_separator/model-data.json @@ -0,0 +1,22 @@ +{ + "vr_model_data": { + "97dc361a7a88b2c4542f68364b32c7f6": { + "vr_model_param": "4band_v4_ms_fullband", + "primary_stem": "Dry", + "nout": 32, + "nout_lstm": 128, + "is_karaoke": false, + "is_bv_model": false, + "is_bv_model_rebalanced": 0.0 + } + }, + "mdx_model_data": { + "cb790d0c913647ced70fc6b38f5bea1a": { + "compensate": 1.010, + "mdx_dim_f_set": 2560, + "mdx_dim_t_set": 8, + "mdx_n_fft_scale_set": 5120, + "primary_stem": "Instrumental" + } + } +} \ No newline at end of file diff --git a/audio_separator/models-scores.json b/audio_separator/models-scores.json new file mode 100644 index 0000000000000000000000000000000000000000..ab41f2b7b984f3143b3305c6005f88a66b8f4629 --- /dev/null +++ b/audio_separator/models-scores.json @@ -0,0 +1,55430 @@ +{ + "1_HP-UVR.pth": { + "model_name": "VR Arch Single Model v5: 1_HP-UVR", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.24871, + "SIR": 15.4624, + "SAR": 4.83391, + "ISR": 8.8857 + }, + "instrumental": { + "SDR": 14.8927, + "SIR": 19.3158, + "SAR": 18.24, + "ISR": 18.8107 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 5.43096, + "SIR": 12.0094, + "SAR": 5.75084, + "ISR": 12.7187 + }, + "instrumental": { + "SDR": 10.6068, + "SIR": 18.0944, + "SAR": 12.3348, + "ISR": 14.9249 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.37912, + "SIR": 18.9104, + "SAR": 8.54122, + "ISR": 15.3526 + }, + "instrumental": { + "SDR": 15.3357, + "SIR": 21.73, + "SAR": 16.6099, + "ISR": 21.9107 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.68601, + "SIR": 5.35433, + "SAR": 4.00494, + "ISR": 12.7504 + }, + "instrumental": { + "SDR": 11.3974, + "SIR": 21.6121, + "SAR": 13.2817, + "ISR": 15.9813 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 9.77937, + "SIR": 20.2537, + "SAR": 9.60245, + "ISR": 13.3208 + }, + "instrumental": { + "SDR": 12.781, + "SIR": 15.3895, + "SAR": 13.3742, + "ISR": 23.1482 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.84219, + "SIR": 16.1098, + "SAR": 9.47788, + "ISR": 13.4743 + }, + "instrumental": { + "SDR": 11.0084, + "SIR": 15.7127, + "SAR": 12.9399, + "ISR": 19.7754 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 9.73747, + "SIR": 18.9403, + "SAR": 10.333, + "ISR": 14.4066 + }, + "instrumental": { + "SDR": 14.318, + "SIR": 18.8837, + "SAR": 15.8694, + "ISR": 22.3595 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.91892, + "SIR": 20.3204, + "SAR": 5.93576, + "ISR": 10.5446 + }, + "instrumental": { + "SDR": 17.9788, + "SIR": 23.2555, + "SAR": 21.5719, + "ISR": 21.9236 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 9.15237, + "SIR": 25.8856, + "SAR": 9.99461, + "ISR": 12.9868 + }, + "instrumental": { + "SDR": 12.4142, + "SIR": 16.693, + "SAR": 15.1214, + "ISR": 18.7991 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 9.03781, + "SIR": 18.0127, + "SAR": 7.57484, + "ISR": 10.4891 + }, + "instrumental": { + "SDR": 13.3057, + "SIR": 14.2951, + "SAR": 13.8743, + "ISR": 24.6434 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 10.2091, + "SIR": 23.0624, + "SAR": 10.6547, + "ISR": 17.3402 + }, + "instrumental": { + "SDR": 13.2878, + "SIR": 20.8786, + "SAR": 14.4586, + "ISR": 22.0027 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 10.0986, + "SIR": 20.6672, + "SAR": 9.75169, + "ISR": 15.2152 + }, + "instrumental": { + "SDR": 14.9512, + "SIR": 21.3993, + "SAR": 16.138, + "ISR": 27.0006 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 6.76939, + "SIR": 17.5586, + "SAR": 6.98892, + "ISR": 12.3147 + }, + "instrumental": { + "SDR": 14.8124, + "SIR": 20.1259, + "SAR": 15.7944, + "ISR": 24.8105 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 7.43502, + "SIR": 18.5542, + "SAR": 7.8475, + "ISR": 13.134 + }, + "instrumental": { + "SDR": 15.5321, + "SIR": 20.5767, + "SAR": 16.245, + "ISR": 18.7807 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.57991, + "SIR": 16.4946, + "SAR": 3.3243, + "ISR": 7.31346 + }, + "instrumental": { + "SDR": 14.8819, + "SIR": 17.3794, + "SAR": 18.4389, + "ISR": 29.5074 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 8.2519, + "SIR": 19.1926, + "SAR": 8.72244, + "ISR": 14.1103 + }, + "instrumental": { + "SDR": 13.3555, + "SIR": 18.9906, + "SAR": 15.1787, + "ISR": 19.5638 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.89595, + "SIR": 22.4832, + "SAR": 6.83054, + "ISR": 10.5802 + }, + "instrumental": { + "SDR": 13.7255, + "SIR": 17.3371, + "SAR": 16.0628, + "ISR": 21.1358 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -20.544, + "SIR": -37.706, + "SAR": 0.60976, + "ISR": 0.2973 + }, + "instrumental": { + "SDR": 11.6498, + "SIR": 49.0042, + "SAR": 12.4641, + "ISR": 16.1127 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.08146, + "SIR": 15.5686, + "SAR": 5.40936, + "ISR": 8.49432 + }, + "instrumental": { + "SDR": 16.2047, + "SIR": 17.0075, + "SAR": 16.996, + "ISR": 26.9043 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 8.09982, + "SIR": 18.5838, + "SAR": 8.74048, + "ISR": 13.0896 + }, + "instrumental": { + "SDR": 13.9941, + "SIR": 19.1888, + "SAR": 16.7467, + "ISR": 19.5069 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 8.99043, + "SIR": 18.7958, + "SAR": 9.75759, + "ISR": 14.2486 + }, + "instrumental": { + "SDR": 18.8229, + "SIR": 25.0371, + "SAR": 19.7476, + "ISR": 27.6669 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 5.56311, + "SIR": 18.1942, + "SAR": 6.0561, + "ISR": 11.368 + }, + "instrumental": { + "SDR": 12.8085, + "SIR": 17.9619, + "SAR": 15.7333, + "ISR": 18.1057 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.47258, + "SIR": 13.2462, + "SAR": 3.17736, + "ISR": 5.63786 + }, + "instrumental": { + "SDR": 10.3255, + "SIR": 12.4029, + "SAR": 15.0933, + "ISR": 19.4058 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.18906, + "SIR": 22.5721, + "SAR": 5.73903, + "ISR": 9.24557 + }, + "instrumental": { + "SDR": 14.975, + "SIR": 19.4188, + "SAR": 17.948, + "ISR": 18.9743 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 6.18507, + "SIR": 16.4992, + "SAR": 6.30036, + "ISR": 10.0651 + }, + "instrumental": { + "SDR": 14.1405, + "SIR": 18.0741, + "SAR": 16.8313, + "ISR": 26.3192 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 7.5812, + "SIR": 16.1195, + "SAR": 7.46711, + "ISR": 13.4299 + }, + "instrumental": { + "SDR": 14.0101, + "SIR": 18.3, + "SAR": 14.5392, + "ISR": 21.4193 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.76299, + "SIR": 18.7505, + "SAR": 8.23403, + "ISR": 11.5089 + }, + "instrumental": { + "SDR": 9.76063, + "SIR": 13.0942, + "SAR": 11.6006, + "ISR": 21.6246 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 4.71433, + "SIR": 14.0367, + "SAR": 3.94581, + "ISR": 8.26944 + }, + "instrumental": { + "SDR": 10.3109, + "SIR": 12.6439, + "SAR": 12.5739, + "ISR": 21.6968 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 8.12746, + "SIR": 21.5389, + "SAR": 9.30687, + "ISR": 13.3151 + }, + "instrumental": { + "SDR": 12.8668, + "SIR": 18.001, + "SAR": 15.5456, + "ISR": 17.7115 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 11.7225, + "SIR": 22.8344, + "SAR": 10.58, + "ISR": 13.4283 + }, + "instrumental": { + "SDR": 11.5839, + "SIR": 13.1001, + "SAR": 10.4395, + "ISR": 23.6291 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 9.20913, + "SIR": 19.282, + "SAR": 10.0456, + "ISR": 13.8778 + }, + "instrumental": { + "SDR": 11.7055, + "SIR": 16.7757, + "SAR": 13.7724, + "ISR": 16.9293 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.1419, + "SIR": 30.1871, + "SAR": 10.9111, + "ISR": 15.3985 + }, + "instrumental": { + "SDR": 16.1001, + "SIR": 22.8839, + "SAR": 19.7081, + "ISR": 19.6091 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 1.88926, + "SIR": 8.76664, + "SAR": 4.81204, + "ISR": 8.86849 + }, + "instrumental": { + "SDR": 9.9125, + "SIR": 14.02, + "SAR": 12.4588, + "ISR": 16.7232 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.4278, + "SIR": 24.0343, + "SAR": 12.6541, + "ISR": 21.4862 + }, + "instrumental": { + "SDR": 20.8791, + "SIR": 29.5482, + "SAR": 21.5446, + "ISR": 27.4235 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.1582, + "SIR": 19.0278, + "SAR": 11.3987, + "ISR": 18.4367 + }, + "instrumental": { + "SDR": 10.827, + "SIR": 17.4836, + "SAR": 11.1509, + "ISR": 18.6054 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 6.23827, + "SIR": 17.2753, + "SAR": 6.55888, + "ISR": 10.6605 + }, + "instrumental": { + "SDR": 11.4443, + "SIR": 15.754, + "SAR": 13.6843, + "ISR": 24.0501 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.15022, + "SIR": 12.9594, + "SAR": 5.2702, + "ISR": 12.1 + }, + "instrumental": { + "SDR": 14.2903, + "SIR": 22.4148, + "SAR": 17.1974, + "ISR": 18.2176 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 8.1041, + "SIR": 22.9987, + "SAR": 8.3819, + "ISR": 13.277 + }, + "instrumental": { + "SDR": 15.2919, + "SIR": 20.1393, + "SAR": 17.1399, + "ISR": 29.5608 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 9.70997, + "SIR": 25.086, + "SAR": 9.61721, + "ISR": 13.4541 + }, + "instrumental": { + "SDR": 16.8108, + "SIR": 21.3215, + "SAR": 18.4017, + "ISR": 24.6592 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 8.37693, + "SIR": 21.8776, + "SAR": 8.69275, + "ISR": 13.1925 + }, + "instrumental": { + "SDR": 12.2943, + "SIR": 16.7404, + "SAR": 13.7403, + "ISR": 21.0744 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.90122, + "SIR": 20.671, + "SAR": 8.24112, + "ISR": 12.8178 + }, + "instrumental": { + "SDR": 14.483, + "SIR": 19.329, + "SAR": 16.6609, + "ISR": 27.6775 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 7.90122, + "SIR": 18.7958, + "SAR": 8.23403, + "ISR": 12.9868 + }, + "instrumental": { + "SDR": 13.7255, + "SIR": 18.3, + "SAR": 15.7333, + "ISR": 21.4193 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "2_HP-UVR.pth": { + "model_name": "VR Arch Single Model v5: 2_HP-UVR", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.00778, + "SIR": 16.5022, + "SAR": 4.95801, + "ISR": 9.04026 + }, + "instrumental": { + "SDR": 14.9485, + "SIR": 20.0149, + "SAR": 19.0058, + "ISR": 18.6304 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 5.15725, + "SIR": 10.082, + "SAR": 5.58263, + "ISR": 12.6914 + }, + "instrumental": { + "SDR": 10.3331, + "SIR": 17.7535, + "SAR": 12.1266, + "ISR": 13.9989 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.84617, + "SIR": 20.7391, + "SAR": 9.16417, + "ISR": 14.8747 + }, + "instrumental": { + "SDR": 15.8721, + "SIR": 21.0334, + "SAR": 17.0938, + "ISR": 24.1636 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.17646, + "SIR": 6.21319, + "SAR": 3.37286, + "ISR": 12.6694 + }, + "instrumental": { + "SDR": 11.8308, + "SIR": 20.8908, + "SAR": 13.6898, + "ISR": 17.2492 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 9.78333, + "SIR": 19.528, + "SAR": 10.1362, + "ISR": 13.927 + }, + "instrumental": { + "SDR": 12.5802, + "SIR": 15.6572, + "SAR": 13.8603, + "ISR": 22.9156 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.94432, + "SIR": 16.1917, + "SAR": 9.61374, + "ISR": 13.5481 + }, + "instrumental": { + "SDR": 11.1097, + "SIR": 15.2072, + "SAR": 13.296, + "ISR": 20.4126 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.0817, + "SIR": 18.7539, + "SAR": 10.6444, + "ISR": 14.5992 + }, + "instrumental": { + "SDR": 14.4766, + "SIR": 18.5632, + "SAR": 16.1782, + "ISR": 24.8029 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 7.12834, + "SIR": 21.3618, + "SAR": 7.37531, + "ISR": 10.0298 + }, + "instrumental": { + "SDR": 17.2119, + "SIR": 21.2127, + "SAR": 21.2972, + "ISR": 21.9574 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 9.15686, + "SIR": 25.3675, + "SAR": 10.0502, + "ISR": 13.0838 + }, + "instrumental": { + "SDR": 12.3372, + "SIR": 16.2325, + "SAR": 15.0541, + "ISR": 19.6884 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 9.18828, + "SIR": 18.2793, + "SAR": 8.08023, + "ISR": 10.8534 + }, + "instrumental": { + "SDR": 13.1823, + "SIR": 14.3265, + "SAR": 14.2533, + "ISR": 24.7347 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 10.1216, + "SIR": 25.082, + "SAR": 10.8916, + "ISR": 16.3986 + }, + "instrumental": { + "SDR": 13.4235, + "SIR": 19.3639, + "SAR": 14.9457, + "ISR": 22.6478 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.98685, + "SIR": 20.6453, + "SAR": 9.72844, + "ISR": 14.7501 + }, + "instrumental": { + "SDR": 14.7031, + "SIR": 20.4256, + "SAR": 16.3468, + "ISR": 27.6831 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.45618, + "SIR": 18.7851, + "SAR": 7.63734, + "ISR": 12.4079 + }, + "instrumental": { + "SDR": 13.487, + "SIR": 17.408, + "SAR": 15.3937, + "ISR": 25.7793 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.32599, + "SIR": 21.1849, + "SAR": 8.68249, + "ISR": 13.2348 + }, + "instrumental": { + "SDR": 14.2519, + "SIR": 18.2063, + "SAR": 15.7006, + "ISR": 18.1793 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 4.12959, + "SIR": 16.0573, + "SAR": 4.07229, + "ISR": 7.33628 + }, + "instrumental": { + "SDR": 13.5519, + "SIR": 16.3618, + "SAR": 17.5517, + "ISR": 26.7607 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 8.24351, + "SIR": 19.1347, + "SAR": 8.96653, + "ISR": 13.8539 + }, + "instrumental": { + "SDR": 13.1893, + "SIR": 18.1446, + "SAR": 15.3549, + "ISR": 18.6805 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 7.08125, + "SIR": 20.9199, + "SAR": 7.14508, + "ISR": 11.225 + }, + "instrumental": { + "SDR": 13.6604, + "SIR": 17.9009, + "SAR": 15.7184, + "ISR": 19.1352 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -33.3785, + "SIR": -39.6633, + "SAR": 1.02618, + "ISR": 1.94862 + }, + "instrumental": { + "SDR": 10.6712, + "SIR": 48.8715, + "SAR": 11.7105, + "ISR": 14.6499 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.04137, + "SIR": 15.3063, + "SAR": 5.57995, + "ISR": 8.85756 + }, + "instrumental": { + "SDR": 16.0659, + "SIR": 17.1653, + "SAR": 17.1281, + "ISR": 27.3679 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 8.7064, + "SIR": 18.7822, + "SAR": 9.0536, + "ISR": 12.8876 + }, + "instrumental": { + "SDR": 13.7245, + "SIR": 18.3741, + "SAR": 16.7035, + "ISR": 19.5378 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.466, + "SIR": 21.2373, + "SAR": 11.4843, + "ISR": 16.0906 + }, + "instrumental": { + "SDR": 16.693, + "SIR": 21.0931, + "SAR": 18.3088, + "ISR": 28.5648 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 6.64894, + "SIR": 20.1887, + "SAR": 7.02405, + "ISR": 11.7596 + }, + "instrumental": { + "SDR": 13.4303, + "SIR": 17.418, + "SAR": 16.2131, + "ISR": 18.3726 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.54851, + "SIR": 13.8686, + "SAR": 3.21556, + "ISR": 5.48372 + }, + "instrumental": { + "SDR": 10.4532, + "SIR": 12.1858, + "SAR": 15.7379, + "ISR": 19.6449 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.98389, + "SIR": 20.7384, + "SAR": 7.43142, + "ISR": 11.3862 + }, + "instrumental": { + "SDR": 15.661, + "SIR": 19.5961, + "SAR": 17.9449, + "ISR": 24.9838 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 6.18863, + "SIR": 16.5062, + "SAR": 6.34427, + "ISR": 10.1041 + }, + "instrumental": { + "SDR": 14.146, + "SIR": 17.8738, + "SAR": 17.0247, + "ISR": 26.666 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 7.56396, + "SIR": 16.783, + "SAR": 7.68562, + "ISR": 12.7959 + }, + "instrumental": { + "SDR": 13.8673, + "SIR": 17.4061, + "SAR": 14.6248, + "ISR": 21.2252 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.96098, + "SIR": 18.2876, + "SAR": 8.56374, + "ISR": 11.7566 + }, + "instrumental": { + "SDR": 9.64605, + "SIR": 13.1294, + "SAR": 12.0116, + "ISR": 21.0546 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 4.92757, + "SIR": 12.2991, + "SAR": 4.36964, + "ISR": 8.5524 + }, + "instrumental": { + "SDR": 10.1842, + "SIR": 12.6915, + "SAR": 12.5298, + "ISR": 20.9447 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 8.43627, + "SIR": 20.6598, + "SAR": 9.49164, + "ISR": 13.7033 + }, + "instrumental": { + "SDR": 12.6497, + "SIR": 17.4029, + "SAR": 15.5961, + "ISR": 17.1511 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 11.3885, + "SIR": 22.1686, + "SAR": 9.95249, + "ISR": 12.6987 + }, + "instrumental": { + "SDR": 11.2248, + "SIR": 12.738, + "SAR": 10.7406, + "ISR": 23.7747 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 9.1546, + "SIR": 19.1153, + "SAR": 9.92178, + "ISR": 13.9526 + }, + "instrumental": { + "SDR": 11.8004, + "SIR": 15.8696, + "SAR": 13.8896, + "ISR": 19.32 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.3749, + "SIR": 30.0389, + "SAR": 11.0854, + "ISR": 15.5681 + }, + "instrumental": { + "SDR": 15.5418, + "SIR": 22.7203, + "SAR": 19.6135, + "ISR": 19.3445 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 5.48667, + "SIR": 12.2044, + "SAR": 8.7007, + "ISR": 9.78261 + }, + "instrumental": { + "SDR": 12.1585, + "SIR": 15.7049, + "SAR": 16.2092, + "ISR": 18.1336 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 14.4054, + "SIR": 29.0948, + "SAR": 14.8905, + "ISR": 21.3908 + }, + "instrumental": { + "SDR": 19.3764, + "SIR": 27.1385, + "SAR": 20.5411, + "ISR": 28.9143 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.2836, + "SIR": 20.2702, + "SAR": 12.5767, + "ISR": 18.5102 + }, + "instrumental": { + "SDR": 9.73039, + "SIR": 15.0866, + "SAR": 11.1375, + "ISR": 19.1111 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 6.3909, + "SIR": 15.7194, + "SAR": 6.61467, + "ISR": 11.0887 + }, + "instrumental": { + "SDR": 11.3889, + "SIR": 15.7268, + "SAR": 13.6124, + "ISR": 23.3422 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.67221, + "SIR": 15.8116, + "SAR": 6.46644, + "ISR": 11.5847 + }, + "instrumental": { + "SDR": 13.714, + "SIR": 19.362, + "SAR": 16.8602, + "ISR": 18.5052 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 8.28571, + "SIR": 22.7856, + "SAR": 8.59891, + "ISR": 12.9408 + }, + "instrumental": { + "SDR": 14.7266, + "SIR": 19.0016, + "SAR": 17.0098, + "ISR": 30.5897 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 9.74135, + "SIR": 24.7042, + "SAR": 10.1537, + "ISR": 13.61 + }, + "instrumental": { + "SDR": 16.5424, + "SIR": 21.2135, + "SAR": 18.6524, + "ISR": 24.0354 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 8.22333, + "SIR": 22.2872, + "SAR": 8.58902, + "ISR": 12.3432 + }, + "instrumental": { + "SDR": 11.966, + "SIR": 15.8178, + "SAR": 13.9315, + "ISR": 21.7672 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.56321, + "SIR": 19.3301, + "SAR": 8.16277, + "ISR": 13.0004 + }, + "instrumental": { + "SDR": 14.1486, + "SIR": 19.1956, + "SAR": 16.5119, + "ISR": 26.3537 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.22333, + "SIR": 19.1347, + "SAR": 8.58902, + "ISR": 12.6987 + }, + "instrumental": { + "SDR": 13.487, + "SIR": 17.8738, + "SAR": 15.7184, + "ISR": 21.2252 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "3_HP-Vocal-UVR.pth": { + "model_name": "VR Arch Single Model v5: 3_HP-Vocal-UVR", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 3.91517, + "SIR": 16.8581, + "SAR": 3.2452, + "ISR": 8.16718 + }, + "instrumental": { + "SDR": 15.4662, + "SIR": 20.2019, + "SAR": 18.6457, + "ISR": 19.0081 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 4.87231, + "SIR": 10.679, + "SAR": 5.30314, + "ISR": 14.2979 + }, + "instrumental": { + "SDR": 10.1178, + "SIR": 19.7643, + "SAR": 11.6539, + "ISR": 14.2331 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.78584, + "SIR": 20.6745, + "SAR": 8.79637, + "ISR": 15.9796 + }, + "instrumental": { + "SDR": 15.39, + "SIR": 22.6865, + "SAR": 16.7412, + "ISR": 20.3054 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.33282, + "SIR": 6.81916, + "SAR": 3.38208, + "ISR": 12.2759 + }, + "instrumental": { + "SDR": 11.6479, + "SIR": 20.9998, + "SAR": 13.1945, + "ISR": 17.4514 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 10.3712, + "SIR": 21.8084, + "SAR": 9.60849, + "ISR": 14.0572 + }, + "instrumental": { + "SDR": 13.0453, + "SIR": 16.2533, + "SAR": 13.2216, + "ISR": 20.2902 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.19688, + "SIR": 17.5484, + "SAR": 9.57108, + "ISR": 15.1891 + }, + "instrumental": { + "SDR": 11.4714, + "SIR": 17.7027, + "SAR": 12.7438, + "ISR": 20.8473 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.4279, + "SIR": 19.8254, + "SAR": 10.8294, + "ISR": 16.3092 + }, + "instrumental": { + "SDR": 14.9479, + "SIR": 20.8494, + "SAR": 15.8114, + "ISR": 24.9202 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.18588, + "SIR": 21.6962, + "SAR": 6.1854, + "ISR": 11.0684 + }, + "instrumental": { + "SDR": 18.9171, + "SIR": 25.7725, + "SAR": 21.9094, + "ISR": 22.6954 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 9.64193, + "SIR": 26.6181, + "SAR": 10.1025, + "ISR": 14.7193 + }, + "instrumental": { + "SDR": 12.9314, + "SIR": 18.7568, + "SAR": 15.1092, + "ISR": 18.9239 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 9.62488, + "SIR": 20.0665, + "SAR": 8.16844, + "ISR": 11.9757 + }, + "instrumental": { + "SDR": 13.978, + "SIR": 15.9196, + "SAR": 13.993, + "ISR": 25.775 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 11.0016, + "SIR": 25.9658, + "SAR": 11.3507, + "ISR": 18.836 + }, + "instrumental": { + "SDR": 14.0458, + "SIR": 21.9457, + "SAR": 14.9457, + "ISR": 23.2925 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 10.3204, + "SIR": 21.8704, + "SAR": 9.97393, + "ISR": 16.7 + }, + "instrumental": { + "SDR": 15.3138, + "SIR": 23.1138, + "SAR": 16.2695, + "ISR": 27.9776 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.10087, + "SIR": 18.958, + "SAR": 7.08537, + "ISR": 13.6148 + }, + "instrumental": { + "SDR": 14.759, + "SIR": 21.1519, + "SAR": 15.4328, + "ISR": 25.6944 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 7.09266, + "SIR": 18.035, + "SAR": 7.28869, + "ISR": 12.4561 + }, + "instrumental": { + "SDR": 16.3853, + "SIR": 23.3289, + "SAR": 17.736, + "ISR": 19.4768 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 1.86776, + "SIR": 15.9253, + "SAR": 1.5362, + "ISR": 7.23622 + }, + "instrumental": { + "SDR": 14.8172, + "SIR": 18.5467, + "SAR": 17.8699, + "ISR": 29.3533 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 8.4086, + "SIR": 20.583, + "SAR": 8.67683, + "ISR": 15.3268 + }, + "instrumental": { + "SDR": 13.6506, + "SIR": 20.222, + "SAR": 14.9289, + "ISR": 19.2371 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.65148, + "SIR": 19.8511, + "SAR": 6.44746, + "ISR": 11.2586 + }, + "instrumental": { + "SDR": 13.9796, + "SIR": 18.2897, + "SAR": 15.591, + "ISR": 20.778 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -24.8196, + "SIR": -33.9034, + "SAR": 0.063335, + "ISR": -0.206185 + }, + "instrumental": { + "SDR": 12.1553, + "SIR": 48.2966, + "SAR": 12.8159, + "ISR": 17.3851 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.13427, + "SIR": 17.0125, + "SAR": 5.3305, + "ISR": 9.62459 + }, + "instrumental": { + "SDR": 16.7184, + "SIR": 18.1468, + "SAR": 16.7563, + "ISR": 27.7495 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 9.51187, + "SIR": 20.3525, + "SAR": 9.70296, + "ISR": 16.0271 + }, + "instrumental": { + "SDR": 14.1807, + "SIR": 21.9168, + "SAR": 16.1741, + "ISR": 19.5927 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.501, + "SIR": 21.295, + "SAR": 10.8468, + "ISR": 18.1803 + }, + "instrumental": { + "SDR": 18.3438, + "SIR": 26.0776, + "SAR": 18.9514, + "ISR": 29.0685 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 5.0026, + "SIR": 19.2467, + "SAR": 5.54823, + "ISR": 10.5623 + }, + "instrumental": { + "SDR": 14.1638, + "SIR": 19.4386, + "SAR": 16.8441, + "ISR": 18.7556 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.43321, + "SIR": 15.4703, + "SAR": 2.65737, + "ISR": 5.55385 + }, + "instrumental": { + "SDR": 10.468, + "SIR": 12.3601, + "SAR": 15.0377, + "ISR": 19.4039 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.0421, + "SIR": 23.0577, + "SAR": 6.05479, + "ISR": 11.215 + }, + "instrumental": { + "SDR": 16.2768, + "SIR": 20.0932, + "SAR": 16.934, + "ISR": 21.3088 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 6.20149, + "SIR": 19.1073, + "SAR": 5.96094, + "ISR": 10.3622 + }, + "instrumental": { + "SDR": 14.1593, + "SIR": 18.4907, + "SAR": 16.4001, + "ISR": 28.6375 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 6.96345, + "SIR": 17.3898, + "SAR": 6.72148, + "ISR": 13.3801 + }, + "instrumental": { + "SDR": 14.5203, + "SIR": 19.5884, + "SAR": 14.9257, + "ISR": 20.8662 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 8.08213, + "SIR": 20.4998, + "SAR": 8.55644, + "ISR": 12.3076 + }, + "instrumental": { + "SDR": 9.84642, + "SIR": 14.1563, + "SAR": 11.5201, + "ISR": 22.9371 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 4.68281, + "SIR": 14.2775, + "SAR": 3.46882, + "ISR": 9.08678 + }, + "instrumental": { + "SDR": 10.683, + "SIR": 13.6028, + "SAR": 12.0386, + "ISR": 21.9524 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 8.54331, + "SIR": 21.2135, + "SAR": 9.13919, + "ISR": 15.824 + }, + "instrumental": { + "SDR": 13.0925, + "SIR": 20.0763, + "SAR": 15.095, + "ISR": 17.4334 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 12.4474, + "SIR": 24.3422, + "SAR": 10.9209, + "ISR": 14.2822 + }, + "instrumental": { + "SDR": 11.9888, + "SIR": 13.9326, + "SAR": 10.5722, + "ISR": 24.7506 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 9.48696, + "SIR": 20.8567, + "SAR": 9.90332, + "ISR": 14.5902 + }, + "instrumental": { + "SDR": 12.1449, + "SIR": 17.3311, + "SAR": 13.4512, + "ISR": 18.9254 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.5409, + "SIR": 30.087, + "SAR": 10.7854, + "ISR": 16.8471 + }, + "instrumental": { + "SDR": 16.6245, + "SIR": 24.8654, + "SAR": 20.0458, + "ISR": 19.6017 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 2.86481, + "SIR": 8.85314, + "SAR": 5.45329, + "ISR": 10.1158 + }, + "instrumental": { + "SDR": 10.6862, + "SIR": 15.5776, + "SAR": 13.5164, + "ISR": 15.7832 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 14.1155, + "SIR": 28.5913, + "SAR": 14.2347, + "ISR": 22.5612 + }, + "instrumental": { + "SDR": 20.2309, + "SIR": 29.5669, + "SAR": 20.6627, + "ISR": 32.7618 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.3247, + "SIR": 20.9764, + "SAR": 12.2169, + "ISR": 21.2506 + }, + "instrumental": { + "SDR": 10.3742, + "SIR": 18.7744, + "SAR": 10.7533, + "ISR": 19.3459 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 6.31983, + "SIR": 18.6562, + "SAR": 6.15057, + "ISR": 12.1549 + }, + "instrumental": { + "SDR": 12.0936, + "SIR": 17.3127, + "SAR": 13.3578, + "ISR": 24.9136 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.68265, + "SIR": 17.4903, + "SAR": 5.99527, + "ISR": 12.1328 + }, + "instrumental": { + "SDR": 13.8438, + "SIR": 20.3494, + "SAR": 15.9869, + "ISR": 18.8644 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 8.64884, + "SIR": 25.7387, + "SAR": 8.71953, + "ISR": 14.5045 + }, + "instrumental": { + "SDR": 15.7677, + "SIR": 21.1307, + "SAR": 17.1144, + "ISR": 31.3504 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 9.66948, + "SIR": 25.4119, + "SAR": 9.57384, + "ISR": 14.9568 + }, + "instrumental": { + "SDR": 17.821, + "SIR": 23.8168, + "SAR": 18.7191, + "ISR": 24.7344 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 8.92995, + "SIR": 22.3634, + "SAR": 9.40023, + "ISR": 14.7581 + }, + "instrumental": { + "SDR": 13.3516, + "SIR": 19.0998, + "SAR": 14.5473, + "ISR": 21.3029 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 8.21814, + "SIR": 21.5639, + "SAR": 8.34549, + "ISR": 14.0699 + }, + "instrumental": { + "SDR": 14.6893, + "SIR": 20.8312, + "SAR": 16.6097, + "ISR": 28.4509 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.21814, + "SIR": 20.3525, + "SAR": 8.34549, + "ISR": 14.0572 + }, + "instrumental": { + "SDR": 14.0458, + "SIR": 20.0763, + "SAR": 15.4328, + "ISR": 20.8662 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "4_HP-Vocal-UVR.pth": { + "model_name": "VR Arch Single Model v5: 4_HP-Vocal-UVR", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.13247, + "SIR": 15.6369, + "SAR": 4.46161, + "ISR": 9.59156 + }, + "instrumental": { + "SDR": 14.9272, + "SIR": 20.4818, + "SAR": 17.6023, + "ISR": 18.6389 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 4.70667, + "SIR": 9.1547, + "SAR": 5.63561, + "ISR": 15.3189 + }, + "instrumental": { + "SDR": 9.99389, + "SIR": 20.6067, + "SAR": 11.2725, + "ISR": 14.0836 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.67695, + "SIR": 19.5138, + "SAR": 8.81367, + "ISR": 16.6883 + }, + "instrumental": { + "SDR": 15.2974, + "SIR": 23.0615, + "SAR": 16.4926, + "ISR": 21.7556 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.68009, + "SIR": 6.93765, + "SAR": 3.80179, + "ISR": 12.8639 + }, + "instrumental": { + "SDR": 11.6498, + "SIR": 21.7705, + "SAR": 13.1645, + "ISR": 17.2212 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 10.2667, + "SIR": 20.1792, + "SAR": 10.1437, + "ISR": 15.7367 + }, + "instrumental": { + "SDR": 13.0328, + "SIR": 17.8452, + "SAR": 13.5695, + "ISR": 22.1146 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.98945, + "SIR": 16.0069, + "SAR": 9.495, + "ISR": 15.8425 + }, + "instrumental": { + "SDR": 11.1837, + "SIR": 18.1981, + "SAR": 12.391, + "ISR": 19.1886 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.3533, + "SIR": 18.5671, + "SAR": 10.644, + "ISR": 16.3089 + }, + "instrumental": { + "SDR": 14.794, + "SIR": 20.8559, + "SAR": 15.6846, + "ISR": 23.579 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.77921, + "SIR": 21.2356, + "SAR": 6.48015, + "ISR": 12.9815 + }, + "instrumental": { + "SDR": 18.2221, + "SIR": 24.5152, + "SAR": 20.7935, + "ISR": 22.7143 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 9.42073, + "SIR": 24.541, + "SAR": 9.88334, + "ISR": 15.7559 + }, + "instrumental": { + "SDR": 12.643, + "SIR": 19.5706, + "SAR": 14.6142, + "ISR": 18.391 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 9.52604, + "SIR": 16.957, + "SAR": 8.037, + "ISR": 12.5391 + }, + "instrumental": { + "SDR": 13.7151, + "SIR": 16.3357, + "SAR": 13.7748, + "ISR": 22.8928 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 10.8826, + "SIR": 24.1573, + "SAR": 11.2586, + "ISR": 19.4754 + }, + "instrumental": { + "SDR": 13.5627, + "SIR": 22.4968, + "SAR": 14.7527, + "ISR": 22.4351 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 10.2098, + "SIR": 20.6167, + "SAR": 10.0719, + "ISR": 17.5743 + }, + "instrumental": { + "SDR": 15.3437, + "SIR": 24.0073, + "SAR": 16.3457, + "ISR": 26.8621 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.12336, + "SIR": 17.4523, + "SAR": 7.43998, + "ISR": 14.7645 + }, + "instrumental": { + "SDR": 14.1192, + "SIR": 20.6636, + "SAR": 15.001, + "ISR": 23.6453 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 7.72779, + "SIR": 16.3995, + "SAR": 7.32047, + "ISR": 16.9334 + }, + "instrumental": { + "SDR": 15.9237, + "SIR": 25.5636, + "SAR": 16.2709, + "ISR": 18.4361 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.87861, + "SIR": 16.0076, + "SAR": 2.46015, + "ISR": 7.74823 + }, + "instrumental": { + "SDR": 14.4113, + "SIR": 17.9885, + "SAR": 17.3031, + "ISR": 28.4045 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 8.34587, + "SIR": 19.053, + "SAR": 8.61658, + "ISR": 15.9432 + }, + "instrumental": { + "SDR": 13.2879, + "SIR": 20.8668, + "SAR": 14.7945, + "ISR": 18.6885 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.62502, + "SIR": 16.7401, + "SAR": 6.47612, + "ISR": 11.634 + }, + "instrumental": { + "SDR": 13.4188, + "SIR": 18.297, + "SAR": 14.8591, + "ISR": 19.6905 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -21.2094, + "SIR": -40.1099, + "SAR": 0.462865, + "ISR": 3.67031 + }, + "instrumental": { + "SDR": 10.5227, + "SIR": 52.239, + "SAR": 11.0897, + "ISR": 13.9405 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.35629, + "SIR": 15.8628, + "SAR": 5.76441, + "ISR": 10.1244 + }, + "instrumental": { + "SDR": 16.5837, + "SIR": 18.7391, + "SAR": 16.6746, + "ISR": 26.3426 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 8.57781, + "SIR": 18.1643, + "SAR": 8.6365, + "ISR": 15.784 + }, + "instrumental": { + "SDR": 14.1628, + "SIR": 22.1182, + "SAR": 16.0756, + "ISR": 19.0953 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.1506, + "SIR": 19.4336, + "SAR": 10.5703, + "ISR": 18.1863 + }, + "instrumental": { + "SDR": 18.8857, + "SIR": 27.7745, + "SAR": 19.2882, + "ISR": 27.3143 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 4.92969, + "SIR": 16.7152, + "SAR": 5.4446, + "ISR": 11.2325 + }, + "instrumental": { + "SDR": 13.4916, + "SIR": 20.5148, + "SAR": 16.1495, + "ISR": 17.8874 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.39677, + "SIR": 13.9635, + "SAR": 2.82003, + "ISR": 5.70048 + }, + "instrumental": { + "SDR": 10.3135, + "SIR": 12.4438, + "SAR": 14.9513, + "ISR": 18.6463 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 7.6162, + "SIR": 21.7675, + "SAR": 7.44895, + "ISR": 13.2748 + }, + "instrumental": { + "SDR": 15.4824, + "SIR": 20.7977, + "SAR": 16.5705, + "ISR": 21.3009 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 6.16051, + "SIR": 18.0268, + "SAR": 6.00783, + "ISR": 10.643 + }, + "instrumental": { + "SDR": 14.1873, + "SIR": 18.7806, + "SAR": 16.3202, + "ISR": 27.5497 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 6.83194, + "SIR": 13.4755, + "SAR": 6.8711, + "ISR": 15.2048 + }, + "instrumental": { + "SDR": 14.343, + "SIR": 21.0919, + "SAR": 13.7404, + "ISR": 19.9369 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 8.42617, + "SIR": 18.5918, + "SAR": 8.83512, + "ISR": 13.4685 + }, + "instrumental": { + "SDR": 10.0471, + "SIR": 15.4826, + "SAR": 11.6525, + "ISR": 20.8751 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 4.40799, + "SIR": 9.89043, + "SAR": 3.94591, + "ISR": 10.4701 + }, + "instrumental": { + "SDR": 10.2851, + "SIR": 14.5194, + "SAR": 11.2261, + "ISR": 17.6695 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 8.3505, + "SIR": 19.1756, + "SAR": 8.86374, + "ISR": 15.6199 + }, + "instrumental": { + "SDR": 12.8628, + "SIR": 19.8675, + "SAR": 15.0554, + "ISR": 16.7884 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 12.2802, + "SIR": 22.5119, + "SAR": 11.4679, + "ISR": 15.7357 + }, + "instrumental": { + "SDR": 11.7872, + "SIR": 15.2864, + "SAR": 11.1203, + "ISR": 23.0367 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 9.25619, + "SIR": 19.2091, + "SAR": 9.88221, + "ISR": 14.9679 + }, + "instrumental": { + "SDR": 11.6922, + "SIR": 17.9643, + "SAR": 13.6356, + "ISR": 16.0659 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.2684, + "SIR": 28.9612, + "SAR": 10.5797, + "ISR": 17.0502 + }, + "instrumental": { + "SDR": 16.436, + "SIR": 24.7021, + "SAR": 19.7067, + "ISR": 19.5462 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 2.59637, + "SIR": 9.13157, + "SAR": 6.39332, + "ISR": 9.71978 + }, + "instrumental": { + "SDR": 10.194, + "SIR": 15.0814, + "SAR": 12.5173, + "ISR": 15.308 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 14.3684, + "SIR": 28.6667, + "SAR": 14.4789, + "ISR": 22.8522 + }, + "instrumental": { + "SDR": 19.3386, + "SIR": 29.4806, + "SAR": 19.9103, + "ISR": 32.3307 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.0873, + "SIR": 17.8703, + "SAR": 10.8269, + "ISR": 20.4341 + }, + "instrumental": { + "SDR": 11.0302, + "SIR": 19.7611, + "SAR": 11.225, + "ISR": 17.6389 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 6.11536, + "SIR": 15.587, + "SAR": 6.2916, + "ISR": 13.1744 + }, + "instrumental": { + "SDR": 11.569, + "SIR": 17.7935, + "SAR": 12.7457, + "ISR": 21.6239 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 6.04269, + "SIR": 17.7199, + "SAR": 6.36607, + "ISR": 12.8428 + }, + "instrumental": { + "SDR": 12.9125, + "SIR": 20.4129, + "SAR": 15.4367, + "ISR": 18.6254 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 8.78669, + "SIR": 23.9042, + "SAR": 8.79118, + "ISR": 15.3333 + }, + "instrumental": { + "SDR": 15.5209, + "SIR": 21.7498, + "SAR": 16.7422, + "ISR": 29.4908 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 9.97353, + "SIR": 24.067, + "SAR": 9.98042, + "ISR": 15.3978 + }, + "instrumental": { + "SDR": 17.2547, + "SIR": 23.3484, + "SAR": 18.2358, + "ISR": 24.1993 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 8.92523, + "SIR": 21.1312, + "SAR": 9.516, + "ISR": 15.3797 + }, + "instrumental": { + "SDR": 12.8788, + "SIR": 19.4166, + "SAR": 14.0514, + "ISR": 20.5532 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 8.03945, + "SIR": 19.9597, + "SAR": 8.36785, + "ISR": 14.808 + }, + "instrumental": { + "SDR": 14.5298, + "SIR": 21.413, + "SAR": 16.0827, + "ISR": 26.727 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.34587, + "SIR": 18.1643, + "SAR": 8.36785, + "ISR": 15.2048 + }, + "instrumental": { + "SDR": 13.5627, + "SIR": 20.5148, + "SAR": 15.001, + "ISR": 20.5532 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "5_HP-Karaoke-UVR.pth": { + "model_name": "VR Arch Single Model v5: 5_HP-Karaoke-UVR", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 2.37002, + "SIR": 20.6581, + "SAR": 1.28458, + "ISR": 4.10107 + }, + "instrumental": { + "SDR": 14.9129, + "SIR": 15.7183, + "SAR": 20.1, + "ISR": 19.509 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 4.12631, + "SIR": 20.9962, + "SAR": 0.86005, + "ISR": 5.41791 + }, + "instrumental": { + "SDR": 9.77765, + "SIR": 10.6192, + "SAR": 13.3887, + "ISR": 18.5952 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 5.75754, + "SIR": 23.402, + "SAR": 4.82637, + "ISR": 8.0752 + }, + "instrumental": { + "SDR": 12.2249, + "SIR": 13.8208, + "SAR": 14.8301, + "ISR": 22.8881 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 0.626275, + "SIR": 9.94143, + "SAR": 0.515735, + "ISR": 7.10507 + }, + "instrumental": { + "SDR": 11.9709, + "SIR": 15.449, + "SAR": 13.8028, + "ISR": 23.6236 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 5.22375, + "SIR": 23.2173, + "SAR": 4.45585, + "ISR": 7.65573 + }, + "instrumental": { + "SDR": 9.83016, + "SIR": 9.65897, + "SAR": 11.5199, + "ISR": 22.2742 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 2.03802, + "SIR": 16.5898, + "SAR": -0.86877, + "ISR": 2.67806 + }, + "instrumental": { + "SDR": 4.67641, + "SIR": 4.5102, + "SAR": 13.2892, + "ISR": 20.0426 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 2.64396, + "SIR": 22.754, + "SAR": 2e-05, + "ISR": 3.11022 + }, + "instrumental": { + "SDR": 7.90129, + "SIR": 7.06185, + "SAR": 14.6852, + "ISR": 22.1027 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.98136, + "SIR": 21.9962, + "SAR": 5.95488, + "ISR": 7.88767 + }, + "instrumental": { + "SDR": 16.4522, + "SIR": 18.8283, + "SAR": 21.0703, + "ISR": 22.5482 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 9.29402, + "SIR": 26.6818, + "SAR": 10.0371, + "ISR": 13.1765 + }, + "instrumental": { + "SDR": 12.455, + "SIR": 16.2953, + "SAR": 15.1409, + "ISR": 20.0204 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 9.17494, + "SIR": 24.4007, + "SAR": 4.11477, + "ISR": 7.16253 + }, + "instrumental": { + "SDR": 12.8207, + "SIR": 9.76355, + "SAR": 12.7336, + "ISR": 30.9008 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 10.5061, + "SIR": 27.6891, + "SAR": 11.2293, + "ISR": 16.4247 + }, + "instrumental": { + "SDR": 13.739, + "SIR": 19.5739, + "SAR": 15.3707, + "ISR": 23.5726 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 8.91157, + "SIR": 25.7552, + "SAR": 7.14882, + "ISR": 9.55243 + }, + "instrumental": { + "SDR": 13.2584, + "SIR": 14.2008, + "SAR": 14.9355, + "ISR": 32.1099 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 2.83911, + "SIR": 23.4852, + "SAR": 0.77468, + "ISR": 4.56767 + }, + "instrumental": { + "SDR": 11.2504, + "SIR": 8.17764, + "SAR": 13.5702, + "ISR": 23.2439 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 6.267, + "SIR": 24.4517, + "SAR": 6.91519, + "ISR": 10.2792 + }, + "instrumental": { + "SDR": 14.2564, + "SIR": 16.2753, + "SAR": 14.9453, + "ISR": 19.2375 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.94536, + "SIR": 20.8094, + "SAR": 2.50427, + "ISR": 4.86938 + }, + "instrumental": { + "SDR": 12.4875, + "SIR": 13.2666, + "SAR": 17.6702, + "ISR": 30.5098 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 4.5519, + "SIR": 21.514, + "SAR": 4.61754, + "ISR": 5.76929 + }, + "instrumental": { + "SDR": 9.75042, + "SIR": 10.0978, + "SAR": 15.7619, + "ISR": 20.788 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.1929, + "SIR": 25.0865, + "SAR": 3.90898, + "ISR": 7.33379 + }, + "instrumental": { + "SDR": 12.8645, + "SIR": 14.2523, + "SAR": 14.8487, + "ISR": 18.4454 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": 2.47434, + "SIR": 17.5772, + "SAR": 1.74966, + "ISR": 4.74526 + }, + "instrumental": { + "SDR": 9.0956, + "SIR": 8.34041, + "SAR": 11.9886, + "ISR": 28.2925 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 1.16767, + "SIR": 24.4379, + "SAR": -0.36296, + "ISR": 1.54159 + }, + "instrumental": { + "SDR": 15.5778, + "SIR": 10.313, + "SAR": 22.3135, + "ISR": 19.6916 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 7.09398, + "SIR": 20.3467, + "SAR": 6.88533, + "ISR": 9.06582 + }, + "instrumental": { + "SDR": 11.7232, + "SIR": 14.0921, + "SAR": 15.5965, + "ISR": 20.2129 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 7.83676, + "SIR": 24.0007, + "SAR": 9.26256, + "ISR": 10.9254 + }, + "instrumental": { + "SDR": 13.531, + "SIR": 15.8398, + "SAR": 17.2165, + "ISR": 31.7996 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 6.12105, + "SIR": 21.447, + "SAR": 6.409, + "ISR": 9.03096 + }, + "instrumental": { + "SDR": 12.4939, + "SIR": 15.4179, + "SAR": 15.4303, + "ISR": 18.6236 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 2.33194, + "SIR": 16.961, + "SAR": -0.19185, + "ISR": 2.87461 + }, + "instrumental": { + "SDR": 9.6199, + "SIR": 9.84252, + "SAR": 16.2327, + "ISR": 20.7356 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 1.98419, + "SIR": 28.532, + "SAR": 0.58217, + "ISR": 3.9544 + }, + "instrumental": { + "SDR": 11.9419, + "SIR": 10.6751, + "SAR": 14.4384, + "ISR": 18.9691 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 5.20256, + "SIR": 20.3411, + "SAR": 3.31471, + "ISR": 6.02608 + }, + "instrumental": { + "SDR": 12.8473, + "SIR": 13.6137, + "SAR": 16.5213, + "ISR": 28.6294 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 4.73143, + "SIR": 20.9692, + "SAR": 4.92334, + "ISR": 7.27296 + }, + "instrumental": { + "SDR": 12.9532, + "SIR": 12.4452, + "SAR": 13.9094, + "ISR": 21.2634 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 6.94257, + "SIR": 20.0432, + "SAR": 7.22916, + "ISR": 9.16384 + }, + "instrumental": { + "SDR": 8.09578, + "SIR": 9.96014, + "SAR": 11.2158, + "ISR": 23.4258 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 1.67678, + "SIR": 20.6534, + "SAR": 0.01114, + "ISR": 3.09242 + }, + "instrumental": { + "SDR": 8.43165, + "SIR": 7.24666, + "SAR": 15.372, + "ISR": 33.9394 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 4.43215, + "SIR": 23.2316, + "SAR": 2.39183, + "ISR": 5.04692 + }, + "instrumental": { + "SDR": 10.8677, + "SIR": 10.1434, + "SAR": 14.2553, + "ISR": 18.664 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 5.12551, + "SIR": 26.6695, + "SAR": 2.34288, + "ISR": 4.43896 + }, + "instrumental": { + "SDR": 5.10695, + "SIR": 3.9547, + "SAR": 5.4535, + "ISR": 28.8859 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 3.25431, + "SIR": 23.7119, + "SAR": 1.08353, + "ISR": 4.6803 + }, + "instrumental": { + "SDR": 5.79186, + "SIR": 6.29142, + "SAR": 11.0789, + "ISR": 19.9545 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 6.60276, + "SIR": 34.1921, + "SAR": 3.3619, + "ISR": 5.20793 + }, + "instrumental": { + "SDR": 14.4475, + "SIR": 13.3676, + "SAR": 16.51, + "ISR": 19.6462 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 0.60822, + "SIR": 17.869, + "SAR": 0.38194, + "ISR": 4.6327 + }, + "instrumental": { + "SDR": 8.18715, + "SIR": 9.50725, + "SAR": 13.0135, + "ISR": 18.7294 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 5.38711, + "SIR": 26.3399, + "SAR": 4.74832, + "ISR": 8.57357 + }, + "instrumental": { + "SDR": 12.6023, + "SIR": 14.1386, + "SAR": 14.9156, + "ISR": 28.9532 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 4.09805, + "SIR": 20.559, + "SAR": 3.8303, + "ISR": 6.01517 + }, + "instrumental": { + "SDR": 2.49153, + "SIR": 3.15333, + "SAR": 9.33386, + "ISR": 24.2134 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 4.255, + "SIR": 21.3071, + "SAR": 4.10065, + "ISR": 7.21003 + }, + "instrumental": { + "SDR": 10.3007, + "SIR": 11.0636, + "SAR": 13.2231, + "ISR": 30.2452 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 6.58559, + "SIR": 19.4079, + "SAR": 6.9424, + "ISR": 11.2179 + }, + "instrumental": { + "SDR": 12.7295, + "SIR": 17.6338, + "SAR": 15.811, + "ISR": 19.1735 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 7.78755, + "SIR": 24.0087, + "SAR": 7.47872, + "ISR": 11.2765 + }, + "instrumental": { + "SDR": 14.543, + "SIR": 17.0304, + "SAR": 16.3599, + "ISR": 28.2525 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 6.81987, + "SIR": 26.6712, + "SAR": 6.12698, + "ISR": 9.03664 + }, + "instrumental": { + "SDR": 16.1393, + "SIR": 15.7737, + "SAR": 16.1919, + "ISR": 24.8093 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 8.2805, + "SIR": 25.3755, + "SAR": 8.52245, + "ISR": 11.7108 + }, + "instrumental": { + "SDR": 11.4196, + "SIR": 13.5415, + "SAR": 13.3605, + "ISR": 22.6007 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.77034, + "SIR": 20.2996, + "SAR": 8.54363, + "ISR": 12.7826 + }, + "instrumental": { + "SDR": 14.3102, + "SIR": 18.9809, + "SAR": 16.7468, + "ISR": 27.2321 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 5.20256, + "SIR": 22.754, + "SAR": 4.10065, + "ISR": 7.16253 + }, + "instrumental": { + "SDR": 12.2249, + "SIR": 13.2666, + "SAR": 14.9156, + "ISR": 22.5482 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "6_HP-Karaoke-UVR.pth": { + "model_name": "VR Arch Single Model v5: 6_HP-Karaoke-UVR", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 2.40569, + "SIR": 22.1346, + "SAR": 0.01828, + "ISR": 4.20645 + }, + "instrumental": { + "SDR": 14.9884, + "SIR": 15.2129, + "SAR": 19.224, + "ISR": 19.398 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 4.61504, + "SIR": 18.5853, + "SAR": 1.75763, + "ISR": 6.13348 + }, + "instrumental": { + "SDR": 10.3293, + "SIR": 11.221, + "SAR": 13.52, + "ISR": 18.4318 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 6.27414, + "SIR": 23.2346, + "SAR": 4.95217, + "ISR": 8.29752 + }, + "instrumental": { + "SDR": 12.558, + "SIR": 14.0447, + "SAR": 15.2018, + "ISR": 20.5359 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 0.00614, + "SIR": 7.77224, + "SAR": 0.14026, + "ISR": 7.2008 + }, + "instrumental": { + "SDR": 11.6506, + "SIR": 15.861, + "SAR": 13.7142, + "ISR": 21.8189 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 5.50836, + "SIR": 23.3981, + "SAR": 4.87885, + "ISR": 8.29334 + }, + "instrumental": { + "SDR": 10.5566, + "SIR": 10.2813, + "SAR": 11.4075, + "ISR": 23.0069 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 2.63666, + "SIR": 17.1416, + "SAR": 0.34978, + "ISR": 3.49187 + }, + "instrumental": { + "SDR": 5.18988, + "SIR": 5.19426, + "SAR": 12.7515, + "ISR": 19.6689 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 0.001045, + "SIR": 17.143, + "SAR": 0.0, + "ISR": 0.402455 + }, + "instrumental": { + "SDR": 5.62452, + "SIR": 4.90761, + "SAR": 24.9334, + "ISR": 17.5162 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 4.49108, + "SIR": 21.2738, + "SAR": 4.47166, + "ISR": 7.18649 + }, + "instrumental": { + "SDR": 17.9468, + "SIR": 19.7873, + "SAR": 21.9072, + "ISR": 21.991 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 9.50031, + "SIR": 26.7489, + "SAR": 10.4, + "ISR": 13.7043 + }, + "instrumental": { + "SDR": 12.5768, + "SIR": 17.0184, + "SAR": 15.1751, + "ISR": 18.7333 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 8.83438, + "SIR": 23.3221, + "SAR": 4.48195, + "ISR": 7.44542 + }, + "instrumental": { + "SDR": 12.6954, + "SIR": 9.97841, + "SAR": 12.7788, + "ISR": 30.7868 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 11.4136, + "SIR": 26.3365, + "SAR": 12.1671, + "ISR": 17.9544 + }, + "instrumental": { + "SDR": 14.4065, + "SIR": 20.9015, + "SAR": 15.8924, + "ISR": 23.4855 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.80753, + "SIR": 26.6171, + "SAR": 7.61718, + "ISR": 10.0965 + }, + "instrumental": { + "SDR": 14.2886, + "SIR": 14.2347, + "SAR": 15.1665, + "ISR": 33.5654 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 2.74924, + "SIR": 21.6133, + "SAR": 1.58186, + "ISR": 5.23802 + }, + "instrumental": { + "SDR": 13.426, + "SIR": 11.1279, + "SAR": 14.2701, + "ISR": 25.4548 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 4.64021, + "SIR": 20.95, + "SAR": 5.06153, + "ISR": 9.5488 + }, + "instrumental": { + "SDR": 15.8081, + "SIR": 19.9898, + "SAR": 18.3629, + "ISR": 18.8289 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.59429, + "SIR": 19.959, + "SAR": 2.25885, + "ISR": 5.76088 + }, + "instrumental": { + "SDR": 13.703, + "SIR": 15.297, + "SAR": 18.129, + "ISR": 30.1415 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 4.18976, + "SIR": 20.748, + "SAR": 5.54638, + "ISR": 5.5326 + }, + "instrumental": { + "SDR": 9.45943, + "SIR": 9.8325, + "SAR": 16.0838, + "ISR": 20.532 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.31114, + "SIR": 25.3629, + "SAR": 3.98212, + "ISR": 7.27301 + }, + "instrumental": { + "SDR": 12.9745, + "SIR": 13.7369, + "SAR": 15.2978, + "ISR": 19.9168 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": 1.27974, + "SIR": 7.30975, + "SAR": 0.66439, + "ISR": 4.19622 + }, + "instrumental": { + "SDR": 15.1283, + "SIR": 20.2394, + "SAR": 15.4304, + "ISR": 29.5477 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 1.26588, + "SIR": 21.2452, + "SAR": 0.0017, + "ISR": 2.15839 + }, + "instrumental": { + "SDR": 13.9829, + "SIR": 10.7949, + "SAR": 19.583, + "ISR": 20.0131 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 6.8873, + "SIR": 20.8616, + "SAR": 5.88701, + "ISR": 7.92103 + }, + "instrumental": { + "SDR": 12.016, + "SIR": 13.5267, + "SAR": 14.9936, + "ISR": 21.0662 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 5.19442, + "SIR": 23.5415, + "SAR": 6.80425, + "ISR": 9.1183 + }, + "instrumental": { + "SDR": 15.5002, + "SIR": 16.4718, + "SAR": 18.3747, + "ISR": 33.361 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 0.03535, + "SIR": 4.1695, + "SAR": 0.1037, + "ISR": 3.26091 + }, + "instrumental": { + "SDR": 15.9356, + "SIR": 22.3127, + "SAR": 21.6331, + "ISR": 18.4239 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 2.88156, + "SIR": 16.7721, + "SAR": 1.47556, + "ISR": 3.83899 + }, + "instrumental": { + "SDR": 10.1574, + "SIR": 10.7556, + "SAR": 16.1756, + "ISR": 20.2921 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 3e-05, + "SIR": 25.0255, + "SAR": 0.00053, + "ISR": 3.27158 + }, + "instrumental": { + "SDR": 14.0022, + "SIR": 13.6025, + "SAR": 17.5628, + "ISR": 19.5107 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 5.42512, + "SIR": 21.2921, + "SAR": 3.55915, + "ISR": 6.23482 + }, + "instrumental": { + "SDR": 13.0463, + "SIR": 13.8092, + "SAR": 16.4955, + "ISR": 34.3083 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 4.30165, + "SIR": 19.3769, + "SAR": 4.68588, + "ISR": 7.54588 + }, + "instrumental": { + "SDR": 14.2955, + "SIR": 14.3822, + "SAR": 15.2098, + "ISR": 24.3896 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 6.95729, + "SIR": 20.5847, + "SAR": 7.485, + "ISR": 9.2506 + }, + "instrumental": { + "SDR": 8.41637, + "SIR": 10.3323, + "SAR": 11.2411, + "ISR": 24.6364 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 1.54235, + "SIR": 22.0931, + "SAR": 0.00234, + "ISR": 3.44139 + }, + "instrumental": { + "SDR": 9.43017, + "SIR": 8.279, + "SAR": 15.2115, + "ISR": 23.9707 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 4.71403, + "SIR": 22.1302, + "SAR": 2.98669, + "ISR": 5.61629 + }, + "instrumental": { + "SDR": 11.4655, + "SIR": 10.9668, + "SAR": 14.0492, + "ISR": 18.3294 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 7.26775, + "SIR": 27.2817, + "SAR": 4.90781, + "ISR": 7.6703 + }, + "instrumental": { + "SDR": 7.92315, + "SIR": 6.76672, + "SAR": 6.81889, + "ISR": 29.6706 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 4.26969, + "SIR": 24.0666, + "SAR": 3.02549, + "ISR": 6.08719 + }, + "instrumental": { + "SDR": 6.98965, + "SIR": 7.60775, + "SAR": 10.7882, + "ISR": 19.6705 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 6.82935, + "SIR": 31.2641, + "SAR": -0.001175, + "ISR": 3.07653 + }, + "instrumental": { + "SDR": 15.222, + "SIR": 11.5805, + "SAR": 15.2478, + "ISR": 19.7549 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": -0.0, + "SIR": 1.65806, + "SAR": -2e-05, + "ISR": 0.01738 + }, + "instrumental": { + "SDR": 6.78315, + "SIR": 6.05593, + "SAR": 32.2085, + "ISR": 19.1614 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 5.74493, + "SIR": 20.266, + "SAR": 5.54303, + "ISR": 10.3481 + }, + "instrumental": { + "SDR": 14.6914, + "SIR": 17.2938, + "SAR": 15.8017, + "ISR": 27.5643 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 3.81733, + "SIR": 19.0782, + "SAR": 4.25342, + "ISR": 7.31583 + }, + "instrumental": { + "SDR": 5.96654, + "SIR": 6.49313, + "SAR": 9.05095, + "ISR": 22.7231 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 4.10796, + "SIR": 22.7148, + "SAR": 3.64233, + "ISR": 7.24707 + }, + "instrumental": { + "SDR": 10.6031, + "SIR": 11.3933, + "SAR": 12.9657, + "ISR": 31.9148 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 6.34193, + "SIR": 18.6291, + "SAR": 6.91061, + "ISR": 11.1377 + }, + "instrumental": { + "SDR": 13.1981, + "SIR": 18.1297, + "SAR": 16.5326, + "ISR": 19.5379 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 8.46422, + "SIR": 25.181, + "SAR": 8.59972, + "ISR": 12.585 + }, + "instrumental": { + "SDR": 15.2965, + "SIR": 18.6346, + "SAR": 17.4095, + "ISR": 23.6427 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 5.62149, + "SIR": 25.5108, + "SAR": 5.43217, + "ISR": 9.20098 + }, + "instrumental": { + "SDR": 16.4761, + "SIR": 16.7174, + "SAR": 16.7227, + "ISR": 24.5484 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 8.52432, + "SIR": 25.6619, + "SAR": 8.61282, + "ISR": 12.2143 + }, + "instrumental": { + "SDR": 11.7204, + "SIR": 14.2243, + "SAR": 13.4859, + "ISR": 22.2115 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.55174, + "SIR": 19.6464, + "SAR": 8.34298, + "ISR": 13.0978 + }, + "instrumental": { + "SDR": 14.3714, + "SIR": 19.1923, + "SAR": 16.5584, + "ISR": 27.3065 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 4.64021, + "SIR": 21.2921, + "SAR": 4.25342, + "ISR": 7.24707 + }, + "instrumental": { + "SDR": 12.9745, + "SIR": 13.7369, + "SAR": 15.2978, + "ISR": 21.991 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "7_HP2-UVR.pth": { + "model_name": "VR Arch Single Model v5: 7_HP2-UVR", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.93236, + "SIR": 17.387, + "SAR": 4.36463, + "ISR": 8.40421 + }, + "instrumental": { + "SDR": 15.0848, + "SIR": 19.1375, + "SAR": 18.9953, + "ISR": 18.7277 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.05415, + "SIR": 13.9499, + "SAR": 6.28066, + "ISR": 12.4333 + }, + "instrumental": { + "SDR": 11.1818, + "SIR": 17.7609, + "SAR": 13.2374, + "ISR": 15.8376 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.83053, + "SIR": 20.3737, + "SAR": 9.04699, + "ISR": 15.2785 + }, + "instrumental": { + "SDR": 15.7707, + "SIR": 21.1389, + "SAR": 17.0835, + "ISR": 25.3722 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 3.40247, + "SIR": 6.60429, + "SAR": 4.62521, + "ISR": 12.9349 + }, + "instrumental": { + "SDR": 12.178, + "SIR": 21.1637, + "SAR": 13.9718, + "ISR": 17.3191 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 10.4273, + "SIR": 21.1451, + "SAR": 10.3944, + "ISR": 14.0964 + }, + "instrumental": { + "SDR": 13.181, + "SIR": 15.7752, + "SAR": 14.2406, + "ISR": 24.6048 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.18038, + "SIR": 16.9563, + "SAR": 9.8804, + "ISR": 13.8982 + }, + "instrumental": { + "SDR": 11.3496, + "SIR": 15.5824, + "SAR": 13.4221, + "ISR": 21.1611 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.3502, + "SIR": 19.9206, + "SAR": 10.988, + "ISR": 13.9799 + }, + "instrumental": { + "SDR": 14.4664, + "SIR": 17.7813, + "SAR": 16.62, + "ISR": 26.3967 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 7.43604, + "SIR": 22.297, + "SAR": 7.31999, + "ISR": 10.1423 + }, + "instrumental": { + "SDR": 16.9287, + "SIR": 21.0305, + "SAR": 21.4404, + "ISR": 21.0038 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 9.50602, + "SIR": 26.4427, + "SAR": 10.4688, + "ISR": 13.5006 + }, + "instrumental": { + "SDR": 12.4628, + "SIR": 16.5996, + "SAR": 15.2764, + "ISR": 18.6923 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 9.19081, + "SIR": 18.8539, + "SAR": 8.2361, + "ISR": 11.0304 + }, + "instrumental": { + "SDR": 12.9633, + "SIR": 14.3792, + "SAR": 14.4101, + "ISR": 23.0108 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 10.5409, + "SIR": 22.9143, + "SAR": 11.5136, + "ISR": 17.2841 + }, + "instrumental": { + "SDR": 13.9244, + "SIR": 20.2426, + "SAR": 15.2089, + "ISR": 22.1341 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 10.288, + "SIR": 20.8054, + "SAR": 10.0895, + "ISR": 15.978 + }, + "instrumental": { + "SDR": 15.1317, + "SIR": 21.3943, + "SAR": 16.6096, + "ISR": 28.0967 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 8.24604, + "SIR": 21.1342, + "SAR": 8.46357, + "ISR": 12.9112 + }, + "instrumental": { + "SDR": 12.9823, + "SIR": 16.7981, + "SAR": 14.6151, + "ISR": 27.3577 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 9.44201, + "SIR": 22.99, + "SAR": 9.50292, + "ISR": 14.1576 + }, + "instrumental": { + "SDR": 13.9197, + "SIR": 18.1114, + "SAR": 15.4591, + "ISR": 18.577 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 4.3843, + "SIR": 16.7187, + "SAR": 4.53434, + "ISR": 7.55322 + }, + "instrumental": { + "SDR": 13.6042, + "SIR": 16.3222, + "SAR": 17.4393, + "ISR": 27.1831 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 8.42091, + "SIR": 19.764, + "SAR": 9.13352, + "ISR": 14.1109 + }, + "instrumental": { + "SDR": 13.3145, + "SIR": 18.2575, + "SAR": 15.4218, + "ISR": 18.9897 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.91406, + "SIR": 22.991, + "SAR": 6.97285, + "ISR": 10.8305 + }, + "instrumental": { + "SDR": 14.2234, + "SIR": 17.5496, + "SAR": 16.5915, + "ISR": 21.3062 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -13.3854, + "SIR": -36.6305, + "SAR": 0.13971, + "ISR": 3.13368 + }, + "instrumental": { + "SDR": 12.4084, + "SIR": 48.926, + "SAR": 13.1819, + "ISR": 17.6772 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.28245, + "SIR": 15.189, + "SAR": 5.87541, + "ISR": 9.4287 + }, + "instrumental": { + "SDR": 16.362, + "SIR": 17.5719, + "SAR": 17.2561, + "ISR": 27.0459 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 9.04796, + "SIR": 18.9988, + "SAR": 9.62702, + "ISR": 13.8841 + }, + "instrumental": { + "SDR": 13.7249, + "SIR": 19.232, + "SAR": 16.2698, + "ISR": 19.1654 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 11.4078, + "SIR": 22.8579, + "SAR": 12.4746, + "ISR": 17.4099 + }, + "instrumental": { + "SDR": 16.8064, + "SIR": 22.412, + "SAR": 18.605, + "ISR": 29.699 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 7.09854, + "SIR": 22.8819, + "SAR": 7.51915, + "ISR": 11.6399 + }, + "instrumental": { + "SDR": 12.8702, + "SIR": 16.6661, + "SAR": 16.3938, + "ISR": 18.2569 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.63844, + "SIR": 14.6048, + "SAR": 3.2755, + "ISR": 5.58584 + }, + "instrumental": { + "SDR": 10.5784, + "SIR": 12.3036, + "SAR": 15.6486, + "ISR": 19.4757 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 7.14744, + "SIR": 22.3991, + "SAR": 7.63438, + "ISR": 11.5593 + }, + "instrumental": { + "SDR": 15.2128, + "SIR": 18.3167, + "SAR": 16.9511, + "ISR": 22.8588 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 6.44784, + "SIR": 17.4852, + "SAR": 6.56487, + "ISR": 10.3718 + }, + "instrumental": { + "SDR": 14.429, + "SIR": 18.2085, + "SAR": 17.1185, + "ISR": 28.0977 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.09312, + "SIR": 17.7768, + "SAR": 8.12612, + "ISR": 13.4193 + }, + "instrumental": { + "SDR": 13.8988, + "SIR": 17.9638, + "SAR": 14.9284, + "ISR": 20.6086 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 8.30713, + "SIR": 18.7674, + "SAR": 9.09077, + "ISR": 12.7464 + }, + "instrumental": { + "SDR": 10.0367, + "SIR": 13.9504, + "SAR": 12.0476, + "ISR": 21.8967 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 5.10818, + "SIR": 14.1312, + "SAR": 4.42982, + "ISR": 8.71197 + }, + "instrumental": { + "SDR": 10.4711, + "SIR": 13.0184, + "SAR": 12.7884, + "ISR": 22.791 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 8.33733, + "SIR": 22.0611, + "SAR": 9.76658, + "ISR": 13.5259 + }, + "instrumental": { + "SDR": 13.0386, + "SIR": 17.8098, + "SAR": 16.0153, + "ISR": 17.5294 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 12.4636, + "SIR": 24.6266, + "SAR": 10.826, + "ISR": 13.4003 + }, + "instrumental": { + "SDR": 12.1421, + "SIR": 13.3813, + "SAR": 11.2898, + "ISR": 26.1565 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 9.0366, + "SIR": 19.3842, + "SAR": 9.92364, + "ISR": 13.7406 + }, + "instrumental": { + "SDR": 12.1188, + "SIR": 16.1186, + "SAR": 14.2281, + "ISR": 18.0852 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.1914, + "SIR": 29.5799, + "SAR": 11.0196, + "ISR": 15.7821 + }, + "instrumental": { + "SDR": 16.2859, + "SIR": 22.9974, + "SAR": 20.1242, + "ISR": 19.4437 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 5.99552, + "SIR": 11.9636, + "SAR": 9.74422, + "ISR": 10.283 + }, + "instrumental": { + "SDR": 12.817, + "SIR": 15.7251, + "SAR": 17.3806, + "ISR": 18.6098 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 14.3667, + "SIR": 28.5043, + "SAR": 14.6887, + "ISR": 21.6084 + }, + "instrumental": { + "SDR": 18.6669, + "SIR": 26.6962, + "SAR": 19.7765, + "ISR": 31.3672 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.45, + "SIR": 20.6107, + "SAR": 12.6396, + "ISR": 18.915 + }, + "instrumental": { + "SDR": 9.79974, + "SIR": 15.8961, + "SAR": 11.2031, + "ISR": 19.5192 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 6.71609, + "SIR": 14.1348, + "SAR": 7.11794, + "ISR": 11.2593 + }, + "instrumental": { + "SDR": 11.5634, + "SIR": 15.9534, + "SAR": 13.5375, + "ISR": 21.8897 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.89447, + "SIR": 16.8714, + "SAR": 6.65307, + "ISR": 11.5714 + }, + "instrumental": { + "SDR": 13.5069, + "SIR": 18.8977, + "SAR": 16.5729, + "ISR": 18.9864 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 8.77945, + "SIR": 24.268, + "SAR": 9.28198, + "ISR": 13.7379 + }, + "instrumental": { + "SDR": 15.7713, + "SIR": 20.2268, + "SAR": 17.9744, + "ISR": 32.1029 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 9.80116, + "SIR": 26.0144, + "SAR": 10.0654, + "ISR": 13.3923 + }, + "instrumental": { + "SDR": 16.7233, + "SIR": 20.8795, + "SAR": 18.5056, + "ISR": 24.2901 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 8.27226, + "SIR": 21.8389, + "SAR": 8.96911, + "ISR": 13.0366 + }, + "instrumental": { + "SDR": 12.1889, + "SIR": 16.3723, + "SAR": 13.755, + "ISR": 21.1589 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.95115, + "SIR": 20.8892, + "SAR": 8.6603, + "ISR": 12.6023 + }, + "instrumental": { + "SDR": 14.436, + "SIR": 18.7546, + "SAR": 16.8965, + "ISR": 28.7178 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.30713, + "SIR": 20.3737, + "SAR": 9.04699, + "ISR": 13.0366 + }, + "instrumental": { + "SDR": 13.5069, + "SIR": 17.8098, + "SAR": 16.0153, + "ISR": 21.3062 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "8_HP2-UVR.pth": { + "model_name": "VR Arch Single Model v5: 8_HP2-UVR", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.5483, + "SIR": 18.0967, + "SAR": 4.25896, + "ISR": 7.83695 + }, + "instrumental": { + "SDR": 15.0298, + "SIR": 18.8059, + "SAR": 19.0634, + "ISR": 19.0558 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 4.5217, + "SIR": 9.25839, + "SAR": 5.11401, + "ISR": 12.5705 + }, + "instrumental": { + "SDR": 9.79435, + "SIR": 17.7386, + "SAR": 11.5506, + "ISR": 13.705 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.91456, + "SIR": 19.9612, + "SAR": 9.02234, + "ISR": 14.8232 + }, + "instrumental": { + "SDR": 15.8334, + "SIR": 21.5055, + "SAR": 17.1998, + "ISR": 24.742 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 1.8577, + "SIR": 5.69392, + "SAR": 3.41346, + "ISR": 12.0947 + }, + "instrumental": { + "SDR": 11.8434, + "SIR": 20.992, + "SAR": 13.6334, + "ISR": 16.7193 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 9.72525, + "SIR": 20.2734, + "SAR": 9.75812, + "ISR": 12.9511 + }, + "instrumental": { + "SDR": 12.7109, + "SIR": 14.9283, + "SAR": 13.7881, + "ISR": 23.4522 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.86058, + "SIR": 17.1129, + "SAR": 9.56094, + "ISR": 12.586 + }, + "instrumental": { + "SDR": 11.1257, + "SIR": 14.8721, + "SAR": 13.4094, + "ISR": 20.8899 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.0362, + "SIR": 19.4624, + "SAR": 10.5458, + "ISR": 13.9267 + }, + "instrumental": { + "SDR": 14.5052, + "SIR": 18.4534, + "SAR": 16.2467, + "ISR": 24.5399 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.89598, + "SIR": 22.4134, + "SAR": 7.45517, + "ISR": 10.0019 + }, + "instrumental": { + "SDR": 16.9104, + "SIR": 20.3231, + "SAR": 21.5075, + "ISR": 22.0859 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 9.35862, + "SIR": 25.3578, + "SAR": 10.1324, + "ISR": 13.3908 + }, + "instrumental": { + "SDR": 12.4171, + "SIR": 16.8515, + "SAR": 15.1402, + "ISR": 18.6435 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 9.1635, + "SIR": 19.0642, + "SAR": 7.91343, + "ISR": 10.4067 + }, + "instrumental": { + "SDR": 13.1921, + "SIR": 14.228, + "SAR": 14.3025, + "ISR": 25.2771 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 9.99689, + "SIR": 21.3627, + "SAR": 10.7317, + "ISR": 16.633 + }, + "instrumental": { + "SDR": 13.1696, + "SIR": 20.0343, + "SAR": 14.5301, + "ISR": 21.2391 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.94976, + "SIR": 21.9598, + "SAR": 9.5192, + "ISR": 13.3106 + }, + "instrumental": { + "SDR": 14.9411, + "SIR": 19.6014, + "SAR": 16.6301, + "ISR": 28.4452 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.69217, + "SIR": 19.6891, + "SAR": 8.05813, + "ISR": 12.1802 + }, + "instrumental": { + "SDR": 13.4725, + "SIR": 17.321, + "SAR": 15.1231, + "ISR": 25.7254 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.63925, + "SIR": 21.3111, + "SAR": 8.93167, + "ISR": 12.888 + }, + "instrumental": { + "SDR": 14.465, + "SIR": 18.3457, + "SAR": 15.6787, + "ISR": 18.7529 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 4.01996, + "SIR": 19.4165, + "SAR": 3.80985, + "ISR": 6.81264 + }, + "instrumental": { + "SDR": 13.4967, + "SIR": 15.6968, + "SAR": 17.7825, + "ISR": 30.6874 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 8.38851, + "SIR": 19.5639, + "SAR": 9.12248, + "ISR": 13.4169 + }, + "instrumental": { + "SDR": 13.2897, + "SIR": 18.119, + "SAR": 15.6201, + "ISR": 19.0483 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.81846, + "SIR": 21.1041, + "SAR": 6.8353, + "ISR": 10.2105 + }, + "instrumental": { + "SDR": 13.6215, + "SIR": 16.768, + "SAR": 15.9908, + "ISR": 20.8525 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -15.0131, + "SIR": -34.6622, + "SAR": 0.42234, + "ISR": 0.90929 + }, + "instrumental": { + "SDR": 11.2162, + "SIR": 46.1306, + "SAR": 12.576, + "ISR": 15.6722 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 5.99497, + "SIR": 16.9166, + "SAR": 5.58985, + "ISR": 8.1484 + }, + "instrumental": { + "SDR": 16.3515, + "SIR": 16.7041, + "SAR": 17.2802, + "ISR": 28.3457 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 8.89536, + "SIR": 20.1338, + "SAR": 8.90963, + "ISR": 12.2676 + }, + "instrumental": { + "SDR": 13.667, + "SIR": 17.7732, + "SAR": 16.9273, + "ISR": 19.953 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.5114, + "SIR": 21.0131, + "SAR": 11.5402, + "ISR": 16.1858 + }, + "instrumental": { + "SDR": 16.6453, + "SIR": 21.3635, + "SAR": 18.5128, + "ISR": 28.6812 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 5.52437, + "SIR": 18.6882, + "SAR": 6.44174, + "ISR": 10.934 + }, + "instrumental": { + "SDR": 14.0757, + "SIR": 17.6763, + "SAR": 17.08, + "ISR": 18.2607 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.38589, + "SIR": 13.6967, + "SAR": 2.98159, + "ISR": 5.12145 + }, + "instrumental": { + "SDR": 10.2681, + "SIR": 11.843, + "SAR": 15.5523, + "ISR": 19.5709 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.73026, + "SIR": 22.5991, + "SAR": 6.52306, + "ISR": 9.44696 + }, + "instrumental": { + "SDR": 14.9734, + "SIR": 18.1106, + "SAR": 17.3611, + "ISR": 21.8388 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 6.12047, + "SIR": 17.6122, + "SAR": 6.14048, + "ISR": 9.4555 + }, + "instrumental": { + "SDR": 14.0483, + "SIR": 17.3905, + "SAR": 17.0588, + "ISR": 27.6397 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 7.29692, + "SIR": 15.8046, + "SAR": 7.455, + "ISR": 12.4417 + }, + "instrumental": { + "SDR": 13.5648, + "SIR": 17.2329, + "SAR": 14.3899, + "ISR": 19.3636 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.99284, + "SIR": 18.9859, + "SAR": 8.62869, + "ISR": 12.0115 + }, + "instrumental": { + "SDR": 9.88753, + "SIR": 13.7357, + "SAR": 12.1866, + "ISR": 21.7101 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 4.715, + "SIR": 13.7218, + "SAR": 4.32933, + "ISR": 7.9927 + }, + "instrumental": { + "SDR": 10.3648, + "SIR": 12.5321, + "SAR": 13.1412, + "ISR": 21.7225 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 8.3018, + "SIR": 21.214, + "SAR": 9.3766, + "ISR": 13.2167 + }, + "instrumental": { + "SDR": 12.9149, + "SIR": 17.7767, + "SAR": 15.8697, + "ISR": 17.5457 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 11.6007, + "SIR": 23.0134, + "SAR": 10.1728, + "ISR": 12.4659 + }, + "instrumental": { + "SDR": 11.3141, + "SIR": 11.6633, + "SAR": 9.94532, + "ISR": 23.8187 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 9.45214, + "SIR": 20.0448, + "SAR": 10.3347, + "ISR": 13.5173 + }, + "instrumental": { + "SDR": 11.8848, + "SIR": 15.7662, + "SAR": 14.2046, + "ISR": 18.4133 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.2031, + "SIR": 32.0996, + "SAR": 11.3027, + "ISR": 14.7336 + }, + "instrumental": { + "SDR": 16.1664, + "SIR": 22.1659, + "SAR": 20.1328, + "ISR": 19.7074 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.32301, + "SIR": 9.21441, + "SAR": 6.13258, + "ISR": 10.45 + }, + "instrumental": { + "SDR": 10.0885, + "SIR": 15.2584, + "SAR": 13.273, + "ISR": 15.3141 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.8531, + "SIR": 28.1247, + "SAR": 14.4393, + "ISR": 20.6479 + }, + "instrumental": { + "SDR": 19.439, + "SIR": 27.2839, + "SAR": 20.652, + "ISR": 27.5765 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.9901, + "SIR": 20.7114, + "SAR": 12.2736, + "ISR": 17.7449 + }, + "instrumental": { + "SDR": 9.81901, + "SIR": 14.9903, + "SAR": 11.2065, + "ISR": 19.5773 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 6.45781, + "SIR": 16.1148, + "SAR": 6.90846, + "ISR": 10.8658 + }, + "instrumental": { + "SDR": 11.5644, + "SIR": 15.6986, + "SAR": 13.8691, + "ISR": 22.8434 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.50834, + "SIR": 15.3045, + "SAR": 6.04962, + "ISR": 11.4284 + }, + "instrumental": { + "SDR": 13.6646, + "SIR": 20.2119, + "SAR": 16.6316, + "ISR": 18.326 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 8.22251, + "SIR": 23.4458, + "SAR": 8.59403, + "ISR": 12.6463 + }, + "instrumental": { + "SDR": 14.9076, + "SIR": 19.1517, + "SAR": 17.0845, + "ISR": 29.8717 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 9.65171, + "SIR": 25.0941, + "SAR": 9.78456, + "ISR": 12.5468 + }, + "instrumental": { + "SDR": 16.5769, + "SIR": 20.5809, + "SAR": 18.5276, + "ISR": 24.697 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 8.30663, + "SIR": 21.702, + "SAR": 8.76429, + "ISR": 12.5591 + }, + "instrumental": { + "SDR": 12.1806, + "SIR": 16.273, + "SAR": 13.9889, + "ISR": 21.2666 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.82587, + "SIR": 20.0076, + "SAR": 8.39395, + "ISR": 12.7493 + }, + "instrumental": { + "SDR": 14.2692, + "SIR": 19.0398, + "SAR": 16.5854, + "ISR": 27.17 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.22251, + "SIR": 19.9612, + "SAR": 8.59403, + "ISR": 12.4659 + }, + "instrumental": { + "SDR": 13.4967, + "SIR": 17.7386, + "SAR": 15.6787, + "ISR": 21.2666 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "9_HP2-UVR.pth": { + "model_name": "VR Arch Single Model v5: 9_HP2-UVR", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.22431, + "SIR": 18.2506, + "SAR": 4.90021, + "ISR": 8.40822 + }, + "instrumental": { + "SDR": 15.1383, + "SIR": 19.3881, + "SAR": 19.1667, + "ISR": 19.0479 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 5.91892, + "SIR": 13.4315, + "SAR": 5.87209, + "ISR": 11.5725 + }, + "instrumental": { + "SDR": 11.1616, + "SIR": 17.0683, + "SAR": 13.1556, + "ISR": 15.7575 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.71013, + "SIR": 20.7683, + "SAR": 8.92713, + "ISR": 14.4059 + }, + "instrumental": { + "SDR": 15.6761, + "SIR": 20.8755, + "SAR": 17.1283, + "ISR": 22.5582 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.77383, + "SIR": 6.66241, + "SAR": 3.43567, + "ISR": 11.2882 + }, + "instrumental": { + "SDR": 11.9648, + "SIR": 20.1375, + "SAR": 13.7891, + "ISR": 17.8352 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 9.77113, + "SIR": 20.1864, + "SAR": 9.9855, + "ISR": 13.1812 + }, + "instrumental": { + "SDR": 12.7192, + "SIR": 15.3332, + "SAR": 13.7734, + "ISR": 23.266 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.95266, + "SIR": 17.2787, + "SAR": 9.72487, + "ISR": 12.7692 + }, + "instrumental": { + "SDR": 11.1685, + "SIR": 15.0105, + "SAR": 13.5501, + "ISR": 21.0401 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.0512, + "SIR": 19.6575, + "SAR": 10.5758, + "ISR": 14.0432 + }, + "instrumental": { + "SDR": 14.5793, + "SIR": 18.5896, + "SAR": 16.3065, + "ISR": 25.0471 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 7.34105, + "SIR": 22.0818, + "SAR": 7.45141, + "ISR": 10.1942 + }, + "instrumental": { + "SDR": 17.2842, + "SIR": 21.2746, + "SAR": 21.3936, + "ISR": 22.2958 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 9.30976, + "SIR": 26.1301, + "SAR": 10.1868, + "ISR": 12.9209 + }, + "instrumental": { + "SDR": 12.4818, + "SIR": 16.3577, + "SAR": 15.3424, + "ISR": 18.9259 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 9.36682, + "SIR": 19.3628, + "SAR": 8.15558, + "ISR": 10.5532 + }, + "instrumental": { + "SDR": 13.2204, + "SIR": 14.351, + "SAR": 14.4808, + "ISR": 25.6181 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 10.1264, + "SIR": 22.8787, + "SAR": 10.9172, + "ISR": 16.2352 + }, + "instrumental": { + "SDR": 13.2989, + "SIR": 19.5949, + "SAR": 14.9069, + "ISR": 22.0512 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.96521, + "SIR": 21.5663, + "SAR": 9.65443, + "ISR": 14.2792 + }, + "instrumental": { + "SDR": 15.013, + "SIR": 20.2952, + "SAR": 16.6908, + "ISR": 28.1565 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 6.7797, + "SIR": 18.8522, + "SAR": 7.17519, + "ISR": 11.1195 + }, + "instrumental": { + "SDR": 14.3973, + "SIR": 18.1526, + "SAR": 16.0058, + "ISR": 25.9338 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 7.82901, + "SIR": 19.2128, + "SAR": 8.15814, + "ISR": 12.5959 + }, + "instrumental": { + "SDR": 15.2524, + "SIR": 19.3853, + "SAR": 16.9795, + "ISR": 18.5459 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.58801, + "SIR": 16.3083, + "SAR": 2.74386, + "ISR": 6.85394 + }, + "instrumental": { + "SDR": 14.8996, + "SIR": 17.6975, + "SAR": 19.1122, + "ISR": 29.7667 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 8.34758, + "SIR": 19.9418, + "SAR": 9.10171, + "ISR": 13.4363 + }, + "instrumental": { + "SDR": 13.359, + "SIR": 18.1552, + "SAR": 15.6388, + "ISR": 19.2491 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.77543, + "SIR": 19.4681, + "SAR": 6.6889, + "ISR": 9.95323 + }, + "instrumental": { + "SDR": 13.6185, + "SIR": 16.8184, + "SAR": 15.8543, + "ISR": 20.5589 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -13.2878, + "SIR": -35.3836, + "SAR": 0.43443, + "ISR": 0.6351 + }, + "instrumental": { + "SDR": 11.6237, + "SIR": 46.4515, + "SAR": 12.9895, + "ISR": 16.6862 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.04038, + "SIR": 16.6786, + "SAR": 5.28286, + "ISR": 8.36533 + }, + "instrumental": { + "SDR": 16.3444, + "SIR": 16.8185, + "SAR": 17.3767, + "ISR": 28.0542 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 8.61089, + "SIR": 19.8581, + "SAR": 9.04009, + "ISR": 12.5559 + }, + "instrumental": { + "SDR": 13.6583, + "SIR": 18.2553, + "SAR": 16.6041, + "ISR": 19.6878 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 9.31669, + "SIR": 20.4576, + "SAR": 10.4625, + "ISR": 14.7162 + }, + "instrumental": { + "SDR": 17.9295, + "SIR": 22.342, + "SAR": 19.3893, + "ISR": 29.0074 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 0.00221, + "SIR": 4.74317, + "SAR": 0.00125, + "ISR": 4.2203 + }, + "instrumental": { + "SDR": 16.6629, + "SIR": 24.4063, + "SAR": 21.6347, + "ISR": 18.6024 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.44665, + "SIR": 14.0945, + "SAR": 3.01467, + "ISR": 5.32001 + }, + "instrumental": { + "SDR": 10.3958, + "SIR": 12.0877, + "SAR": 15.5962, + "ISR": 20.362 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.067, + "SIR": 21.6977, + "SAR": 6.9542, + "ISR": 10.0683 + }, + "instrumental": { + "SDR": 15.4921, + "SIR": 19.7167, + "SAR": 18.0298, + "ISR": 22.376 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 6.20469, + "SIR": 17.5996, + "SAR": 6.2824, + "ISR": 9.6513 + }, + "instrumental": { + "SDR": 14.1098, + "SIR": 17.6084, + "SAR": 17.0794, + "ISR": 27.5637 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 7.27363, + "SIR": 17.11, + "SAR": 7.5736, + "ISR": 12.0952 + }, + "instrumental": { + "SDR": 13.9028, + "SIR": 17.2235, + "SAR": 14.9143, + "ISR": 19.7105 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.98183, + "SIR": 19.1511, + "SAR": 8.49003, + "ISR": 11.5501 + }, + "instrumental": { + "SDR": 9.5881, + "SIR": 13.0311, + "SAR": 11.7381, + "ISR": 22.1402 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 4.83956, + "SIR": 13.4483, + "SAR": 4.2598, + "ISR": 7.71912 + }, + "instrumental": { + "SDR": 10.2326, + "SIR": 12.5918, + "SAR": 13.1154, + "ISR": 22.0488 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 8.27487, + "SIR": 22.0604, + "SAR": 9.2993, + "ISR": 13.1682 + }, + "instrumental": { + "SDR": 13.0906, + "SIR": 17.8775, + "SAR": 16.0108, + "ISR": 17.8114 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 11.5831, + "SIR": 23.3267, + "SAR": 9.95767, + "ISR": 12.1257 + }, + "instrumental": { + "SDR": 11.3388, + "SIR": 11.5746, + "SAR": 9.83662, + "ISR": 24.0402 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 9.27707, + "SIR": 19.8508, + "SAR": 10.2183, + "ISR": 13.398 + }, + "instrumental": { + "SDR": 12.0478, + "SIR": 15.9282, + "SAR": 14.0329, + "ISR": 18.2832 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.2488, + "SIR": 31.8434, + "SAR": 11.2218, + "ISR": 15.0046 + }, + "instrumental": { + "SDR": 16.2059, + "SIR": 22.4921, + "SAR": 20.0902, + "ISR": 19.688 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.7769, + "SIR": 10.7739, + "SAR": 6.76779, + "ISR": 8.6522 + }, + "instrumental": { + "SDR": 11.0431, + "SIR": 14.4797, + "SAR": 14.4037, + "ISR": 17.2019 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.7959, + "SIR": 28.6967, + "SAR": 13.964, + "ISR": 20.2307 + }, + "instrumental": { + "SDR": 19.7435, + "SIR": 26.9783, + "SAR": 20.9271, + "ISR": 29.2887 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.6518, + "SIR": 21.2137, + "SAR": 11.8402, + "ISR": 16.9075 + }, + "instrumental": { + "SDR": 10.3149, + "SIR": 14.7172, + "SAR": 11.4537, + "ISR": 20.5416 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 6.49728, + "SIR": 16.6313, + "SAR": 6.91648, + "ISR": 11.128 + }, + "instrumental": { + "SDR": 11.7356, + "SIR": 15.9875, + "SAR": 13.9733, + "ISR": 23.4678 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.33799, + "SIR": 14.4166, + "SAR": 5.4313, + "ISR": 10.8145 + }, + "instrumental": { + "SDR": 14.8741, + "SIR": 21.0435, + "SAR": 17.9999, + "ISR": 18.6252 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 7.99198, + "SIR": 23.5181, + "SAR": 8.34209, + "ISR": 12.5971 + }, + "instrumental": { + "SDR": 15.2871, + "SIR": 19.385, + "SAR": 17.2405, + "ISR": 29.9486 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 9.57819, + "SIR": 25.6947, + "SAR": 9.74428, + "ISR": 12.9988 + }, + "instrumental": { + "SDR": 16.9069, + "SIR": 20.8965, + "SAR": 18.9081, + "ISR": 24.8489 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 8.26817, + "SIR": 22.9365, + "SAR": 8.88114, + "ISR": 12.2538 + }, + "instrumental": { + "SDR": 12.3143, + "SIR": 16.0665, + "SAR": 14.2893, + "ISR": 21.7174 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.91646, + "SIR": 20.7634, + "SAR": 8.41774, + "ISR": 12.6083 + }, + "instrumental": { + "SDR": 14.3384, + "SIR": 18.8894, + "SAR": 16.899, + "ISR": 27.8449 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 7.98183, + "SIR": 19.6575, + "SAR": 8.34209, + "ISR": 12.1257 + }, + "instrumental": { + "SDR": 13.6583, + "SIR": 18.1526, + "SAR": 16.0058, + "ISR": 22.0488 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "10_SP-UVR-2B-32000-1.pth": { + "model_name": "VR Arch Single Model v5: 10_SP-UVR-2B-32000-1", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.55666, + "SIR": 13.1594, + "SAR": 4.60601, + "ISR": 8.92065 + }, + "instrumental": { + "SDR": 15.0844, + "SIR": 20.3956, + "SAR": 18.4196, + "ISR": 18.3987 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 4.31353, + "SIR": 9.47502, + "SAR": 5.09269, + "ISR": 12.714 + }, + "instrumental": { + "SDR": 9.37283, + "SIR": 17.8028, + "SAR": 10.9615, + "ISR": 13.6907 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.39411, + "SIR": 18.5401, + "SAR": 8.48992, + "ISR": 14.5754 + }, + "instrumental": { + "SDR": 14.8965, + "SIR": 21.17, + "SAR": 16.3839, + "ISR": 19.8328 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 1.74179, + "SIR": 5.5464, + "SAR": 3.16704, + "ISR": 12.0086 + }, + "instrumental": { + "SDR": 11.5079, + "SIR": 20.401, + "SAR": 13.3993, + "ISR": 16.4562 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 9.52752, + "SIR": 19.8896, + "SAR": 9.07667, + "ISR": 12.0783 + }, + "instrumental": { + "SDR": 12.5666, + "SIR": 14.1582, + "SAR": 13.1657, + "ISR": 21.3663 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.67034, + "SIR": 15.6915, + "SAR": 9.32621, + "ISR": 13.102 + }, + "instrumental": { + "SDR": 10.894, + "SIR": 15.2413, + "SAR": 13.0435, + "ISR": 19.5403 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 9.73292, + "SIR": 18.7999, + "SAR": 10.3168, + "ISR": 13.7927 + }, + "instrumental": { + "SDR": 14.163, + "SIR": 18.2858, + "SAR": 15.9504, + "ISR": 23.6148 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.36253, + "SIR": 20.2471, + "SAR": 5.68376, + "ISR": 9.20478 + }, + "instrumental": { + "SDR": 18.0967, + "SIR": 22.247, + "SAR": 22.1453, + "ISR": 21.5731 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 8.71165, + "SIR": 25.2214, + "SAR": 9.7953, + "ISR": 12.3997 + }, + "instrumental": { + "SDR": 12.2931, + "SIR": 16.0846, + "SAR": 14.9762, + "ISR": 19.2765 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 8.70022, + "SIR": 17.3035, + "SAR": 7.49171, + "ISR": 10.3478 + }, + "instrumental": { + "SDR": 12.927, + "SIR": 14.1498, + "SAR": 13.9197, + "ISR": 23.1908 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 9.81558, + "SIR": 22.7435, + "SAR": 10.4558, + "ISR": 16.2504 + }, + "instrumental": { + "SDR": 12.9624, + "SIR": 19.7632, + "SAR": 14.1727, + "ISR": 22.2328 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.79323, + "SIR": 20.358, + "SAR": 9.15326, + "ISR": 13.3217 + }, + "instrumental": { + "SDR": 14.6342, + "SIR": 19.7319, + "SAR": 15.9498, + "ISR": 26.4234 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 6.06859, + "SIR": 17.2859, + "SAR": 6.67274, + "ISR": 11.3402 + }, + "instrumental": { + "SDR": 14.5972, + "SIR": 19.4296, + "SAR": 16.1956, + "ISR": 24.7395 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 7.33408, + "SIR": 18.786, + "SAR": 8.0449, + "ISR": 12.1352 + }, + "instrumental": { + "SDR": 15.3814, + "SIR": 20.1613, + "SAR": 17.2909, + "ISR": 18.7949 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 1.55404, + "SIR": 13.2299, + "SAR": 1.81962, + "ISR": 7.02643 + }, + "instrumental": { + "SDR": 15.0181, + "SIR": 18.0565, + "SAR": 18.6274, + "ISR": 26.4225 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 7.89549, + "SIR": 18.321, + "SAR": 8.40817, + "ISR": 13.7358 + }, + "instrumental": { + "SDR": 13.1567, + "SIR": 18.4196, + "SAR": 15.0427, + "ISR": 18.8103 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.39555, + "SIR": 20.6244, + "SAR": 6.03627, + "ISR": 9.92927 + }, + "instrumental": { + "SDR": 13.5042, + "SIR": 16.9237, + "SAR": 15.2106, + "ISR": 21.7277 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -24.9708, + "SIR": -37.1873, + "SAR": 0.228475, + "ISR": 3.20742 + }, + "instrumental": { + "SDR": 10.4729, + "SIR": 46.5401, + "SAR": 11.515, + "ISR": 14.9476 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 5.66326, + "SIR": 14.2253, + "SAR": 4.92814, + "ISR": 8.64637 + }, + "instrumental": { + "SDR": 15.3789, + "SIR": 17.3207, + "SAR": 16.958, + "ISR": 26.0429 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 8.48859, + "SIR": 18.4375, + "SAR": 9.18019, + "ISR": 12.8338 + }, + "instrumental": { + "SDR": 13.3166, + "SIR": 18.527, + "SAR": 15.9151, + "ISR": 19.4388 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 9.11344, + "SIR": 20.7022, + "SAR": 10.1758, + "ISR": 14.1646 + }, + "instrumental": { + "SDR": 15.3215, + "SIR": 20.0917, + "SAR": 17.5812, + "ISR": 28.1135 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 6.06374, + "SIR": 20.5727, + "SAR": 6.73396, + "ISR": 10.0258 + }, + "instrumental": { + "SDR": 12.677, + "SIR": 15.9207, + "SAR": 15.8225, + "ISR": 19.4481 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.38899, + "SIR": 12.2626, + "SAR": 2.94463, + "ISR": 5.42674 + }, + "instrumental": { + "SDR": 10.1886, + "SIR": 12.2725, + "SAR": 15.0454, + "ISR": 18.137 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 1.74227, + "SIR": 19.9194, + "SAR": 2.18712, + "ISR": 7.65378 + }, + "instrumental": { + "SDR": 15.7806, + "SIR": 20.0186, + "SAR": 18.262, + "ISR": 22.63 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 5.93724, + "SIR": 15.3569, + "SAR": 6.10264, + "ISR": 9.87626 + }, + "instrumental": { + "SDR": 13.8299, + "SIR": 18.0726, + "SAR": 16.7343, + "ISR": 24.7768 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 6.317, + "SIR": 12.3429, + "SAR": 5.98735, + "ISR": 12.7055 + }, + "instrumental": { + "SDR": 14.0098, + "SIR": 18.4262, + "SAR": 14.3086, + "ISR": 20.2315 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.82226, + "SIR": 18.1491, + "SAR": 8.47455, + "ISR": 11.8146 + }, + "instrumental": { + "SDR": 9.70422, + "SIR": 13.4805, + "SAR": 11.733, + "ISR": 20.6292 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 4.1161, + "SIR": 8.73569, + "SAR": 4.05106, + "ISR": 8.94053 + }, + "instrumental": { + "SDR": 9.86386, + "SIR": 13.1755, + "SAR": 11.693, + "ISR": 17.179 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 7.7524, + "SIR": 20.5942, + "SAR": 8.74542, + "ISR": 12.9702 + }, + "instrumental": { + "SDR": 12.601, + "SIR": 17.5097, + "SAR": 15.4571, + "ISR": 17.4277 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 10.9523, + "SIR": 22.9112, + "SAR": 9.60426, + "ISR": 11.903 + }, + "instrumental": { + "SDR": 11.4931, + "SIR": 12.0426, + "SAR": 10.5119, + "ISR": 24.1665 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 8.36228, + "SIR": 18.5196, + "SAR": 9.28727, + "ISR": 12.8736 + }, + "instrumental": { + "SDR": 11.8727, + "SIR": 16.3804, + "SAR": 14.023, + "ISR": 19.8458 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 9.68673, + "SIR": 29.9738, + "SAR": 10.5015, + "ISR": 14.4612 + }, + "instrumental": { + "SDR": 15.2893, + "SIR": 22.5907, + "SAR": 19.287, + "ISR": 19.322 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.30439, + "SIR": 8.44296, + "SAR": 6.62538, + "ISR": 9.58403 + }, + "instrumental": { + "SDR": 9.91908, + "SIR": 15.382, + "SAR": 13.1648, + "ISR": 15.4699 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.8223, + "SIR": 26.1613, + "SAR": 13.3089, + "ISR": 19.6004 + }, + "instrumental": { + "SDR": 20.2388, + "SIR": 27.2012, + "SAR": 21.2514, + "ISR": 28.438 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.4937, + "SIR": 19.4429, + "SAR": 11.7425, + "ISR": 17.5716 + }, + "instrumental": { + "SDR": 9.72552, + "SIR": 15.1745, + "SAR": 10.9276, + "ISR": 18.6733 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 6.13402, + "SIR": 16.0478, + "SAR": 6.28158, + "ISR": 10.9519 + }, + "instrumental": { + "SDR": 11.3114, + "SIR": 15.9395, + "SAR": 13.4249, + "ISR": 22.4215 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 2.9839, + "SIR": 4.65898, + "SAR": 1.55571, + "ISR": 10.5974 + }, + "instrumental": { + "SDR": 18.178, + "SIR": 26.5809, + "SAR": 20.3547, + "ISR": 17.9172 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 7.38466, + "SIR": 21.0508, + "SAR": 7.79172, + "ISR": 12.3868 + }, + "instrumental": { + "SDR": 15.7027, + "SIR": 20.1125, + "SAR": 17.4991, + "ISR": 28.0891 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 8.35869, + "SIR": 24.3349, + "SAR": 8.66062, + "ISR": 12.0172 + }, + "instrumental": { + "SDR": 16.9297, + "SIR": 21.0908, + "SAR": 18.7642, + "ISR": 24.095 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 7.75028, + "SIR": 21.6046, + "SAR": 8.55142, + "ISR": 11.6882 + }, + "instrumental": { + "SDR": 12.0793, + "SIR": 15.4816, + "SAR": 14.0158, + "ISR": 21.6839 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.46119, + "SIR": 19.7891, + "SAR": 7.97103, + "ISR": 12.4279 + }, + "instrumental": { + "SDR": 14.2304, + "SIR": 18.8039, + "SAR": 16.389, + "ISR": 25.723 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 7.46119, + "SIR": 18.5401, + "SAR": 7.97103, + "ISR": 12.0172 + }, + "instrumental": { + "SDR": 13.3166, + "SIR": 18.2858, + "SAR": 15.4571, + "ISR": 20.6292 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "11_SP-UVR-2B-32000-2.pth": { + "model_name": "VR Arch Single Model v5: 11_SP-UVR-2B-32000-2", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.38186, + "SIR": 13.6055, + "SAR": 4.31086, + "ISR": 8.63485 + }, + "instrumental": { + "SDR": 15.3254, + "SIR": 20.4471, + "SAR": 19.4538, + "ISR": 18.7182 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 4.61384, + "SIR": 10.2422, + "SAR": 4.80059, + "ISR": 12.4588 + }, + "instrumental": { + "SDR": 9.54512, + "SIR": 17.5755, + "SAR": 11.2566, + "ISR": 14.1752 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.2642, + "SIR": 19.2592, + "SAR": 8.39931, + "ISR": 14.3811 + }, + "instrumental": { + "SDR": 14.8186, + "SIR": 21.0005, + "SAR": 16.5319, + "ISR": 19.9054 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 1.99406, + "SIR": 6.30951, + "SAR": 3.1006, + "ISR": 11.4657 + }, + "instrumental": { + "SDR": 11.5838, + "SIR": 19.7417, + "SAR": 13.4876, + "ISR": 17.2048 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 9.49051, + "SIR": 20.3363, + "SAR": 8.80304, + "ISR": 11.828 + }, + "instrumental": { + "SDR": 12.4692, + "SIR": 13.9747, + "SAR": 12.9802, + "ISR": 21.1922 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.62613, + "SIR": 15.9568, + "SAR": 9.31362, + "ISR": 13.0723 + }, + "instrumental": { + "SDR": 10.9411, + "SIR": 15.2113, + "SAR": 13.0171, + "ISR": 19.8292 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 9.69432, + "SIR": 19.2793, + "SAR": 10.1191, + "ISR": 13.5519 + }, + "instrumental": { + "SDR": 14.1343, + "SIR": 18.1194, + "SAR": 15.8495, + "ISR": 24.1207 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.0848, + "SIR": 20.3658, + "SAR": 5.4703, + "ISR": 8.45097 + }, + "instrumental": { + "SDR": 18.1645, + "SIR": 22.117, + "SAR": 22.5022, + "ISR": 21.4384 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 8.6596, + "SIR": 25.8751, + "SAR": 9.85267, + "ISR": 12.2801 + }, + "instrumental": { + "SDR": 12.2606, + "SIR": 15.9448, + "SAR": 15.0563, + "ISR": 19.4169 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 8.68082, + "SIR": 18.2666, + "SAR": 7.24287, + "ISR": 10.005 + }, + "instrumental": { + "SDR": 12.878, + "SIR": 13.824, + "SAR": 13.847, + "ISR": 24.1875 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 9.84797, + "SIR": 23.4706, + "SAR": 10.4109, + "ISR": 16.0513 + }, + "instrumental": { + "SDR": 13.0979, + "SIR": 19.5504, + "SAR": 14.4432, + "ISR": 22.6134 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.74748, + "SIR": 20.6581, + "SAR": 8.94782, + "ISR": 13.0916 + }, + "instrumental": { + "SDR": 14.5602, + "SIR": 19.5197, + "SAR": 15.9022, + "ISR": 26.6374 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 5.78824, + "SIR": 17.2413, + "SAR": 6.35979, + "ISR": 11.2602 + }, + "instrumental": { + "SDR": 14.9635, + "SIR": 19.5241, + "SAR": 16.1938, + "ISR": 24.8392 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 6.86097, + "SIR": 18.6092, + "SAR": 7.46524, + "ISR": 11.6822 + }, + "instrumental": { + "SDR": 15.6088, + "SIR": 20.1364, + "SAR": 17.89, + "ISR": 18.7545 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 1.42423, + "SIR": 14.7608, + "SAR": 1.7754, + "ISR": 6.74381 + }, + "instrumental": { + "SDR": 14.8927, + "SIR": 17.723, + "SAR": 18.9541, + "ISR": 27.369 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 7.84459, + "SIR": 18.7054, + "SAR": 8.34885, + "ISR": 13.4779 + }, + "instrumental": { + "SDR": 13.1435, + "SIR": 18.2079, + "SAR": 15.1135, + "ISR": 18.9942 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.24479, + "SIR": 19.5704, + "SAR": 5.57451, + "ISR": 9.53887 + }, + "instrumental": { + "SDR": 13.4719, + "SIR": 16.6878, + "SAR": 15.0485, + "ISR": 21.5875 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -14.362, + "SIR": -36.8235, + "SAR": 0.05692, + "ISR": 2.97604 + }, + "instrumental": { + "SDR": 11.5248, + "SIR": 46.5231, + "SAR": 12.1418, + "ISR": 16.2859 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 5.75014, + "SIR": 15.2202, + "SAR": 5.01357, + "ISR": 8.3006 + }, + "instrumental": { + "SDR": 15.6365, + "SIR": 16.9556, + "SAR": 16.8094, + "ISR": 26.8088 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 8.15072, + "SIR": 18.7709, + "SAR": 8.71484, + "ISR": 12.5102 + }, + "instrumental": { + "SDR": 13.7908, + "SIR": 18.6218, + "SAR": 16.2998, + "ISR": 19.7491 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 8.04521, + "SIR": 20.3281, + "SAR": 9.19245, + "ISR": 13.4945 + }, + "instrumental": { + "SDR": 16.5021, + "SIR": 20.5096, + "SAR": 18.2521, + "ISR": 28.5136 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 0.734605, + "SIR": 11.7582, + "SAR": 0.28468, + "ISR": 5.58422 + }, + "instrumental": { + "SDR": 15.3042, + "SIR": 19.7121, + "SAR": 18.9849, + "ISR": 19.4355 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.37459, + "SIR": 12.9288, + "SAR": 2.93736, + "ISR": 5.22264 + }, + "instrumental": { + "SDR": 10.1648, + "SIR": 12.0941, + "SAR": 15.4173, + "ISR": 18.5163 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 1.15221, + "SIR": 20.5995, + "SAR": 1.55236, + "ISR": 7.32372 + }, + "instrumental": { + "SDR": 16.1042, + "SIR": 20.376, + "SAR": 18.058, + "ISR": 22.4219 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 5.89508, + "SIR": 16.155, + "SAR": 5.95612, + "ISR": 9.52464 + }, + "instrumental": { + "SDR": 13.8018, + "SIR": 17.6361, + "SAR": 16.8416, + "ISR": 25.6079 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 5.85588, + "SIR": 12.0053, + "SAR": 5.62864, + "ISR": 12.298 + }, + "instrumental": { + "SDR": 14.3336, + "SIR": 18.6347, + "SAR": 14.5938, + "ISR": 19.7336 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.60294, + "SIR": 18.4607, + "SAR": 8.30484, + "ISR": 11.435 + }, + "instrumental": { + "SDR": 9.59475, + "SIR": 13.2285, + "SAR": 11.6414, + "ISR": 20.986 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 3.97519, + "SIR": 10.2667, + "SAR": 3.59107, + "ISR": 8.33597 + }, + "instrumental": { + "SDR": 10.1096, + "SIR": 13.0706, + "SAR": 12.1869, + "ISR": 19.1603 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 7.72201, + "SIR": 21.5301, + "SAR": 8.83955, + "ISR": 12.6502 + }, + "instrumental": { + "SDR": 12.6775, + "SIR": 17.4183, + "SAR": 15.54, + "ISR": 17.6848 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 10.9152, + "SIR": 23.0828, + "SAR": 9.54188, + "ISR": 11.7552 + }, + "instrumental": { + "SDR": 11.4927, + "SIR": 12.0964, + "SAR": 10.566, + "ISR": 24.4476 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 8.40956, + "SIR": 18.7681, + "SAR": 9.27832, + "ISR": 12.8404 + }, + "instrumental": { + "SDR": 11.8489, + "SIR": 16.354, + "SAR": 14.0441, + "ISR": 19.9596 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 9.6756, + "SIR": 30.6905, + "SAR": 10.4859, + "ISR": 14.4171 + }, + "instrumental": { + "SDR": 15.2941, + "SIR": 22.4912, + "SAR": 19.2023, + "ISR": 19.3543 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.07049, + "SIR": 8.86747, + "SAR": 5.96601, + "ISR": 9.11737 + }, + "instrumental": { + "SDR": 10.1071, + "SIR": 15.2494, + "SAR": 13.069, + "ISR": 15.7414 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.1122, + "SIR": 27.1205, + "SAR": 13.5418, + "ISR": 19.7598 + }, + "instrumental": { + "SDR": 19.4212, + "SIR": 26.8558, + "SAR": 20.5656, + "ISR": 27.3669 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 9.97273, + "SIR": 19.2215, + "SAR": 11.1354, + "ISR": 17.7203 + }, + "instrumental": { + "SDR": 10.0736, + "SIR": 15.59, + "SAR": 11.0266, + "ISR": 18.8722 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 6.03998, + "SIR": 16.9494, + "SAR": 6.1379, + "ISR": 10.7825 + }, + "instrumental": { + "SDR": 11.2962, + "SIR": 15.852, + "SAR": 13.5976, + "ISR": 23.4322 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 1.60752, + "SIR": 5.48203, + "SAR": 1.35698, + "ISR": 10.3112 + }, + "instrumental": { + "SDR": 15.4661, + "SIR": 26.3381, + "SAR": 18.7769, + "ISR": 17.9984 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 7.30248, + "SIR": 20.9118, + "SAR": 7.61325, + "ISR": 12.2099 + }, + "instrumental": { + "SDR": 15.962, + "SIR": 20.1418, + "SAR": 17.6917, + "ISR": 28.3288 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 8.14863, + "SIR": 24.9556, + "SAR": 8.30588, + "ISR": 11.7522 + }, + "instrumental": { + "SDR": 16.9524, + "SIR": 20.7986, + "SAR": 18.7984, + "ISR": 24.2858 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 7.79451, + "SIR": 22.4829, + "SAR": 8.58089, + "ISR": 11.7168 + }, + "instrumental": { + "SDR": 12.0624, + "SIR": 15.373, + "SAR": 13.8614, + "ISR": 22.0634 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.22383, + "SIR": 20.1185, + "SAR": 7.87232, + "ISR": 12.1618 + }, + "instrumental": { + "SDR": 14.085, + "SIR": 18.6513, + "SAR": 16.4229, + "ISR": 25.9444 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 7.30248, + "SIR": 18.7681, + "SAR": 7.61325, + "ISR": 11.7522 + }, + "instrumental": { + "SDR": 13.7908, + "SIR": 18.2079, + "SAR": 15.54, + "ISR": 20.986 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "12_SP-UVR-3B-44100.pth": { + "model_name": "VR Arch Single Model v5: 12_SP-UVR-3B-44100", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.02814, + "SIR": 13.8688, + "SAR": 3.86639, + "ISR": 7.45564 + }, + "instrumental": { + "SDR": 15.0726, + "SIR": 18.9793, + "SAR": 19.1598, + "ISR": 18.6167 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 4.93034, + "SIR": 10.449, + "SAR": 5.22867, + "ISR": 12.0323 + }, + "instrumental": { + "SDR": 10.0922, + "SIR": 17.3567, + "SAR": 11.9871, + "ISR": 14.2859 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.14578, + "SIR": 20.7771, + "SAR": 7.94933, + "ISR": 13.4559 + }, + "instrumental": { + "SDR": 15.2385, + "SIR": 19.9489, + "SAR": 16.4486, + "ISR": 23.5334 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.585, + "SIR": 7.26795, + "SAR": 3.35357, + "ISR": 11.4714 + }, + "instrumental": { + "SDR": 11.9982, + "SIR": 19.7547, + "SAR": 13.6384, + "ISR": 18.1648 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 9.63349, + "SIR": 20.8366, + "SAR": 8.96628, + "ISR": 11.8193 + }, + "instrumental": { + "SDR": 12.6868, + "SIR": 13.8917, + "SAR": 13.1537, + "ISR": 24.6912 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.71592, + "SIR": 15.9061, + "SAR": 9.43897, + "ISR": 13.3975 + }, + "instrumental": { + "SDR": 11.0122, + "SIR": 15.3479, + "SAR": 13.0051, + "ISR": 19.7634 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 9.92737, + "SIR": 18.6469, + "SAR": 10.3047, + "ISR": 14.545 + }, + "instrumental": { + "SDR": 14.2452, + "SIR": 18.73, + "SAR": 15.6826, + "ISR": 24.4004 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.59732, + "SIR": 21.2289, + "SAR": 6.75736, + "ISR": 9.91152 + }, + "instrumental": { + "SDR": 17.2441, + "SIR": 21.8697, + "SAR": 21.3371, + "ISR": 21.1316 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 8.70133, + "SIR": 25.6276, + "SAR": 9.87426, + "ISR": 12.0406 + }, + "instrumental": { + "SDR": 11.9984, + "SIR": 15.5671, + "SAR": 15.0333, + "ISR": 19.6758 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 8.58659, + "SIR": 17.6204, + "SAR": 7.38273, + "ISR": 10.0118 + }, + "instrumental": { + "SDR": 12.5841, + "SIR": 13.6179, + "SAR": 13.9716, + "ISR": 22.9587 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 9.69846, + "SIR": 22.1192, + "SAR": 10.1502, + "ISR": 16.334 + }, + "instrumental": { + "SDR": 12.8085, + "SIR": 19.7623, + "SAR": 14.2077, + "ISR": 21.2653 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.84933, + "SIR": 21.2017, + "SAR": 9.0412, + "ISR": 13.4185 + }, + "instrumental": { + "SDR": 14.5717, + "SIR": 19.3707, + "SAR": 16.11, + "ISR": 27.9267 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 6.43966, + "SIR": 17.6976, + "SAR": 6.78796, + "ISR": 11.3965 + }, + "instrumental": { + "SDR": 14.0883, + "SIR": 18.396, + "SAR": 15.4366, + "ISR": 24.944 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 7.72585, + "SIR": 20.7561, + "SAR": 8.28962, + "ISR": 12.0577 + }, + "instrumental": { + "SDR": 14.7708, + "SIR": 18.1527, + "SAR": 17.1991, + "ISR": 18.1932 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.398, + "SIR": 17.7581, + "SAR": 2.82674, + "ISR": 6.59425 + }, + "instrumental": { + "SDR": 13.7013, + "SIR": 15.9021, + "SAR": 17.8286, + "ISR": 28.0489 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 7.88729, + "SIR": 18.9982, + "SAR": 8.5793, + "ISR": 13.2669 + }, + "instrumental": { + "SDR": 12.974, + "SIR": 17.983, + "SAR": 15.1671, + "ISR": 18.8691 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.24364, + "SIR": 20.0766, + "SAR": 5.62216, + "ISR": 9.52464 + }, + "instrumental": { + "SDR": 12.7571, + "SIR": 15.9233, + "SAR": 14.8433, + "ISR": 18.1566 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -22.5095, + "SIR": -39.506, + "SAR": 0.40621, + "ISR": 0.46604 + }, + "instrumental": { + "SDR": 10.141, + "SIR": 47.6819, + "SAR": 11.0849, + "ISR": 14.3503 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 5.84255, + "SIR": 14.3917, + "SAR": 5.25149, + "ISR": 8.78137 + }, + "instrumental": { + "SDR": 15.8792, + "SIR": 17.4008, + "SAR": 17.0551, + "ISR": 26.0931 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 8.39653, + "SIR": 19.0845, + "SAR": 8.30213, + "ISR": 12.0674 + }, + "instrumental": { + "SDR": 13.4939, + "SIR": 17.6494, + "SAR": 16.0763, + "ISR": 19.7919 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 9.81424, + "SIR": 20.4989, + "SAR": 10.4545, + "ISR": 15.2281 + }, + "instrumental": { + "SDR": 16.9992, + "SIR": 21.6924, + "SAR": 18.6378, + "ISR": 28.344 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 0.58262, + "SIR": 7.17757, + "SAR": 0.19646, + "ISR": 5.06085 + }, + "instrumental": { + "SDR": 13.9715, + "SIR": 19.9999, + "SAR": 17.5695, + "ISR": 18.7622 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.42283, + "SIR": 13.5122, + "SAR": 3.05493, + "ISR": 5.45809 + }, + "instrumental": { + "SDR": 10.3022, + "SIR": 12.2305, + "SAR": 15.4814, + "ISR": 18.6963 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.81387, + "SIR": 21.0838, + "SAR": 6.18649, + "ISR": 9.49702 + }, + "instrumental": { + "SDR": 16.208, + "SIR": 20.1215, + "SAR": 18.13, + "ISR": 24.1106 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 5.91358, + "SIR": 17.3857, + "SAR": 5.88287, + "ISR": 9.31887 + }, + "instrumental": { + "SDR": 13.8848, + "SIR": 17.3547, + "SAR": 16.8783, + "ISR": 27.1805 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 6.55312, + "SIR": 15.1974, + "SAR": 6.54748, + "ISR": 12.5038 + }, + "instrumental": { + "SDR": 13.6404, + "SIR": 18.1728, + "SAR": 14.7092, + "ISR": 17.7815 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.49493, + "SIR": 18.3552, + "SAR": 8.16201, + "ISR": 11.2232 + }, + "instrumental": { + "SDR": 9.36637, + "SIR": 12.5978, + "SAR": 11.5028, + "ISR": 21.2161 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 3.93884, + "SIR": 9.79519, + "SAR": 3.64735, + "ISR": 8.36923 + }, + "instrumental": { + "SDR": 9.67626, + "SIR": 12.8617, + "SAR": 11.8042, + "ISR": 18.3969 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 7.471, + "SIR": 20.22, + "SAR": 8.97851, + "ISR": 12.29 + }, + "instrumental": { + "SDR": 12.594, + "SIR": 16.6172, + "SAR": 15.5781, + "ISR": 17.3924 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 11.289, + "SIR": 23.2038, + "SAR": 9.63599, + "ISR": 12.043 + }, + "instrumental": { + "SDR": 11.0513, + "SIR": 11.6475, + "SAR": 10.055, + "ISR": 24.484 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 8.68702, + "SIR": 19.7453, + "SAR": 9.74042, + "ISR": 12.7187 + }, + "instrumental": { + "SDR": 11.6058, + "SIR": 15.213, + "SAR": 14.1023, + "ISR": 18.1782 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 9.42229, + "SIR": 28.8034, + "SAR": 10.2956, + "ISR": 14.5663 + }, + "instrumental": { + "SDR": 15.5409, + "SIR": 22.5657, + "SAR": 19.2258, + "ISR": 19.5192 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 2.99776, + "SIR": 8.94443, + "SAR": 7.34837, + "ISR": 9.13308 + }, + "instrumental": { + "SDR": 10.2386, + "SIR": 14.8091, + "SAR": 12.9585, + "ISR": 15.8542 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.8707, + "SIR": 25.4991, + "SAR": 13.2785, + "ISR": 20.3103 + }, + "instrumental": { + "SDR": 20.1243, + "SIR": 27.6273, + "SAR": 20.9628, + "ISR": 28.1562 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 9.6324, + "SIR": 19.4792, + "SAR": 10.4926, + "ISR": 16.2551 + }, + "instrumental": { + "SDR": 9.94676, + "SIR": 14.6482, + "SAR": 11.0144, + "ISR": 19.2249 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 6.22008, + "SIR": 16.8543, + "SAR": 6.47889, + "ISR": 10.8592 + }, + "instrumental": { + "SDR": 11.1009, + "SIR": 15.3297, + "SAR": 13.3787, + "ISR": 23.7143 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.30538, + "SIR": 14.9096, + "SAR": 5.67958, + "ISR": 11.3022 + }, + "instrumental": { + "SDR": 13.0586, + "SIR": 19.4625, + "SAR": 16.1133, + "ISR": 18.481 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 8.23986, + "SIR": 23.4319, + "SAR": 8.4494, + "ISR": 12.8163 + }, + "instrumental": { + "SDR": 14.714, + "SIR": 19.1031, + "SAR": 16.8113, + "ISR": 29.9726 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 8.36405, + "SIR": 24.4449, + "SAR": 8.86552, + "ISR": 11.9543 + }, + "instrumental": { + "SDR": 16.5202, + "SIR": 20.6881, + "SAR": 18.1013, + "ISR": 24.1135 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 7.93737, + "SIR": 22.5637, + "SAR": 8.46623, + "ISR": 11.6299 + }, + "instrumental": { + "SDR": 11.6523, + "SIR": 15.1138, + "SAR": 13.979, + "ISR": 21.6857 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.12085, + "SIR": 19.1023, + "SAR": 7.62759, + "ISR": 12.3058 + }, + "instrumental": { + "SDR": 14.0382, + "SIR": 18.5704, + "SAR": 16.3556, + "ISR": 26.0105 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 7.49493, + "SIR": 19.0845, + "SAR": 7.94933, + "ISR": 11.9543 + }, + "instrumental": { + "SDR": 13.0586, + "SIR": 17.983, + "SAR": 15.4814, + "ISR": 21.1316 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "13_SP-UVR-4B-44100-1.pth": { + "model_name": "VR Arch Single Model v5: 13_SP-UVR-4B-44100-1", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.41826, + "SIR": 14.6844, + "SAR": 4.2865, + "ISR": 8.28759 + }, + "instrumental": { + "SDR": 14.8749, + "SIR": 19.2658, + "SAR": 18.7497, + "ISR": 18.731 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 4.98532, + "SIR": 10.0177, + "SAR": 5.29026, + "ISR": 12.1635 + }, + "instrumental": { + "SDR": 10.0819, + "SIR": 17.5659, + "SAR": 12.1074, + "ISR": 14.0863 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.38654, + "SIR": 20.808, + "SAR": 8.3166, + "ISR": 13.7502 + }, + "instrumental": { + "SDR": 14.9009, + "SIR": 20.3153, + "SAR": 16.691, + "ISR": 20.6964 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.91697, + "SIR": 7.49656, + "SAR": 3.99703, + "ISR": 12.1556 + }, + "instrumental": { + "SDR": 11.9512, + "SIR": 20.3185, + "SAR": 13.6902, + "ISR": 18.0258 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 9.78854, + "SIR": 20.2237, + "SAR": 9.92833, + "ISR": 13.2697 + }, + "instrumental": { + "SDR": 12.5207, + "SIR": 15.1626, + "SAR": 13.8834, + "ISR": 22.8307 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.59545, + "SIR": 16.3628, + "SAR": 9.18637, + "ISR": 12.5797 + }, + "instrumental": { + "SDR": 10.84, + "SIR": 14.7996, + "SAR": 13.0028, + "ISR": 20.122 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 9.6345, + "SIR": 18.6996, + "SAR": 10.2487, + "ISR": 13.808 + }, + "instrumental": { + "SDR": 14.2413, + "SIR": 18.4264, + "SAR": 16.0357, + "ISR": 24.1197 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.73358, + "SIR": 21.9277, + "SAR": 6.8544, + "ISR": 9.00087 + }, + "instrumental": { + "SDR": 16.6595, + "SIR": 20.5913, + "SAR": 21.2521, + "ISR": 20.6173 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 8.89178, + "SIR": 25.8769, + "SAR": 9.9147, + "ISR": 12.0276 + }, + "instrumental": { + "SDR": 12.1371, + "SIR": 15.6452, + "SAR": 15.3373, + "ISR": 18.8936 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 8.6614, + "SIR": 18.1423, + "SAR": 7.43352, + "ISR": 9.79423 + }, + "instrumental": { + "SDR": 13.0206, + "SIR": 13.6758, + "SAR": 13.9994, + "ISR": 24.2626 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 9.98951, + "SIR": 23.3727, + "SAR": 10.4646, + "ISR": 15.7627 + }, + "instrumental": { + "SDR": 12.9827, + "SIR": 19.2392, + "SAR": 14.6142, + "ISR": 22.2657 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.80261, + "SIR": 20.9007, + "SAR": 9.67106, + "ISR": 14.4635 + }, + "instrumental": { + "SDR": 14.7152, + "SIR": 20.4592, + "SAR": 16.4465, + "ISR": 27.4427 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 6.6711, + "SIR": 18.0848, + "SAR": 6.89336, + "ISR": 11.3345 + }, + "instrumental": { + "SDR": 14.3313, + "SIR": 18.9451, + "SAR": 15.6149, + "ISR": 25.2544 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 7.46491, + "SIR": 17.8794, + "SAR": 7.8588, + "ISR": 11.6634 + }, + "instrumental": { + "SDR": 13.9786, + "SIR": 17.6716, + "SAR": 15.4965, + "ISR": 20.0721 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.5194, + "SIR": 15.8413, + "SAR": 2.27776, + "ISR": 6.87151 + }, + "instrumental": { + "SDR": 14.1063, + "SIR": 16.7401, + "SAR": 18.3552, + "ISR": 28.7067 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 7.94543, + "SIR": 19.1868, + "SAR": 8.5286, + "ISR": 13.1133 + }, + "instrumental": { + "SDR": 13.115, + "SIR": 17.9577, + "SAR": 15.2125, + "ISR": 19.5041 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.51509, + "SIR": 19.2956, + "SAR": 6.58455, + "ISR": 10.0709 + }, + "instrumental": { + "SDR": 13.3243, + "SIR": 16.9425, + "SAR": 15.6506, + "ISR": 20.4946 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -29.051, + "SIR": -37.8741, + "SAR": 0.70834, + "ISR": -0.90944 + }, + "instrumental": { + "SDR": 9.28536, + "SIR": 46.5568, + "SAR": 10.8375, + "ISR": 13.5086 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.04273, + "SIR": 15.2185, + "SAR": 5.80012, + "ISR": 8.68761 + }, + "instrumental": { + "SDR": 15.8014, + "SIR": 17.0753, + "SAR": 17.2208, + "ISR": 26.0686 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 8.06754, + "SIR": 19.8207, + "SAR": 8.18037, + "ISR": 11.5825 + }, + "instrumental": { + "SDR": 13.4792, + "SIR": 17.1294, + "SAR": 16.4137, + "ISR": 19.8525 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 8.2755, + "SIR": 19.3087, + "SAR": 8.95044, + "ISR": 12.7896 + }, + "instrumental": { + "SDR": 17.8133, + "SIR": 22.126, + "SAR": 19.4998, + "ISR": 28.5727 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 3.07514, + "SIR": 16.1756, + "SAR": 2.04702, + "ISR": 7.39154 + }, + "instrumental": { + "SDR": 13.2322, + "SIR": 17.1006, + "SAR": 16.5759, + "ISR": 18.3298 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.32322, + "SIR": 12.0928, + "SAR": 3.08007, + "ISR": 5.47207 + }, + "instrumental": { + "SDR": 10.2374, + "SIR": 12.2337, + "SAR": 15.0952, + "ISR": 18.8107 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 4.61471, + "SIR": 16.8314, + "SAR": 5.69008, + "ISR": 9.00259 + }, + "instrumental": { + "SDR": 15.4581, + "SIR": 19.8594, + "SAR": 17.7709, + "ISR": 21.6855 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 6.09813, + "SIR": 15.6501, + "SAR": 6.25027, + "ISR": 9.83092 + }, + "instrumental": { + "SDR": 13.9968, + "SIR": 17.8731, + "SAR": 16.9864, + "ISR": 25.6636 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 6.87252, + "SIR": 15.7198, + "SAR": 7.31811, + "ISR": 12.3802 + }, + "instrumental": { + "SDR": 13.6735, + "SIR": 17.5715, + "SAR": 14.2639, + "ISR": 20.1323 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.93513, + "SIR": 18.9585, + "SAR": 8.71966, + "ISR": 11.6686 + }, + "instrumental": { + "SDR": 9.82902, + "SIR": 13.2975, + "SAR": 12.0334, + "ISR": 21.8169 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 4.32691, + "SIR": 12.8676, + "SAR": 3.97944, + "ISR": 7.63503 + }, + "instrumental": { + "SDR": 10.4932, + "SIR": 12.5298, + "SAR": 13.4283, + "ISR": 22.0864 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 8.16301, + "SIR": 21.7809, + "SAR": 9.34315, + "ISR": 12.73 + }, + "instrumental": { + "SDR": 12.7761, + "SIR": 17.238, + "SAR": 15.8078, + "ISR": 17.7607 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 11.4597, + "SIR": 23.1536, + "SAR": 10.6549, + "ISR": 13.5269 + }, + "instrumental": { + "SDR": 11.1292, + "SIR": 12.995, + "SAR": 10.817, + "ISR": 24.6006 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 9.00818, + "SIR": 20.0705, + "SAR": 10.0386, + "ISR": 13.1714 + }, + "instrumental": { + "SDR": 11.5563, + "SIR": 15.5264, + "SAR": 14.0823, + "ISR": 17.0441 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 9.79125, + "SIR": 29.4913, + "SAR": 10.4872, + "ISR": 15.0597 + }, + "instrumental": { + "SDR": 16.0196, + "SIR": 22.6459, + "SAR": 19.8371, + "ISR": 19.6068 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 2.30705, + "SIR": 8.59699, + "SAR": 6.80478, + "ISR": 9.91799 + }, + "instrumental": { + "SDR": 9.25459, + "SIR": 15.055, + "SAR": 12.046, + "ISR": 14.839 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.5074, + "SIR": 26.3587, + "SAR": 13.049, + "ISR": 19.1806 + }, + "instrumental": { + "SDR": 20.8636, + "SIR": 26.645, + "SAR": 21.9877, + "ISR": 29.1322 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.2598, + "SIR": 19.377, + "SAR": 11.357, + "ISR": 17.4191 + }, + "instrumental": { + "SDR": 10.1679, + "SIR": 15.5676, + "SAR": 11.0068, + "ISR": 18.8198 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 6.19851, + "SIR": 17.4315, + "SAR": 6.44975, + "ISR": 10.4084 + }, + "instrumental": { + "SDR": 11.2299, + "SIR": 15.1968, + "SAR": 13.8059, + "ISR": 24.1121 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 4.51984, + "SIR": 11.638, + "SAR": 4.68858, + "ISR": 11.2223 + }, + "instrumental": { + "SDR": 13.7783, + "SIR": 21.6232, + "SAR": 16.6126, + "ISR": 17.9909 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 7.84301, + "SIR": 23.6197, + "SAR": 8.17242, + "ISR": 12.3188 + }, + "instrumental": { + "SDR": 14.9459, + "SIR": 19.1077, + "SAR": 17.2316, + "ISR": 30.1052 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 9.15174, + "SIR": 25.4632, + "SAR": 8.93095, + "ISR": 12.3378 + }, + "instrumental": { + "SDR": 17.1115, + "SIR": 20.6906, + "SAR": 18.7004, + "ISR": 24.8482 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 8.02677, + "SIR": 23.2843, + "SAR": 8.57835, + "ISR": 11.4552 + }, + "instrumental": { + "SDR": 11.8811, + "SIR": 15.1211, + "SAR": 14.086, + "ISR": 21.8536 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.6846, + "SIR": 20.7786, + "SAR": 8.4539, + "ISR": 12.2047 + }, + "instrumental": { + "SDR": 14.2158, + "SIR": 18.655, + "SAR": 16.7755, + "ISR": 28.0416 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 7.84301, + "SIR": 18.9585, + "SAR": 8.17242, + "ISR": 12.0276 + }, + "instrumental": { + "SDR": 13.3243, + "SIR": 17.5715, + "SAR": 15.6149, + "ISR": 20.6964 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "14_SP-UVR-4B-44100-2.pth": { + "model_name": "VR Arch Single Model v5: 14_SP-UVR-4B-44100-2", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.5248, + "SIR": 13.5222, + "SAR": 4.46966, + "ISR": 8.8485 + }, + "instrumental": { + "SDR": 14.8167, + "SIR": 19.8877, + "SAR": 18.6056, + "ISR": 18.3775 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 4.50422, + "SIR": 9.35119, + "SAR": 5.2104, + "ISR": 12.7287 + }, + "instrumental": { + "SDR": 9.81308, + "SIR": 18.0013, + "SAR": 11.5798, + "ISR": 13.6069 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.31222, + "SIR": 19.9216, + "SAR": 8.41086, + "ISR": 14.3203 + }, + "instrumental": { + "SDR": 15.4006, + "SIR": 20.8796, + "SAR": 16.716, + "ISR": 22.6893 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.66562, + "SIR": 7.74842, + "SAR": 3.72953, + "ISR": 12.3266 + }, + "instrumental": { + "SDR": 11.8215, + "SIR": 20.4704, + "SAR": 13.638, + "ISR": 18.2074 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 9.87923, + "SIR": 19.9102, + "SAR": 9.87533, + "ISR": 13.2056 + }, + "instrumental": { + "SDR": 12.6597, + "SIR": 15.1439, + "SAR": 13.6654, + "ISR": 21.7636 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.64272, + "SIR": 15.9929, + "SAR": 9.35723, + "ISR": 12.9232 + }, + "instrumental": { + "SDR": 10.8569, + "SIR": 15.1289, + "SAR": 13.0045, + "ISR": 19.6896 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 9.70688, + "SIR": 18.2884, + "SAR": 10.366, + "ISR": 14.1405 + }, + "instrumental": { + "SDR": 14.3108, + "SIR": 18.7936, + "SAR": 16.0897, + "ISR": 23.6964 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.93587, + "SIR": 21.7611, + "SAR": 6.80393, + "ISR": 9.73137 + }, + "instrumental": { + "SDR": 17.0138, + "SIR": 20.7423, + "SAR": 21.3503, + "ISR": 21.4343 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 8.92399, + "SIR": 25.9582, + "SAR": 9.8791, + "ISR": 12.5412 + }, + "instrumental": { + "SDR": 12.1403, + "SIR": 16.0969, + "SAR": 15.1034, + "ISR": 18.814 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 8.89648, + "SIR": 17.8489, + "SAR": 7.56405, + "ISR": 10.1354 + }, + "instrumental": { + "SDR": 13.0456, + "SIR": 13.8515, + "SAR": 13.9523, + "ISR": 24.3331 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 10.1654, + "SIR": 23.8652, + "SAR": 10.5501, + "ISR": 16.4109 + }, + "instrumental": { + "SDR": 13.0762, + "SIR": 19.7323, + "SAR": 14.6128, + "ISR": 22.4236 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.87981, + "SIR": 21.0161, + "SAR": 9.57051, + "ISR": 13.7883 + }, + "instrumental": { + "SDR": 14.8092, + "SIR": 19.9202, + "SAR": 16.2827, + "ISR": 27.503 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.25203, + "SIR": 18.8013, + "SAR": 7.45612, + "ISR": 12.4327 + }, + "instrumental": { + "SDR": 13.614, + "SIR": 18.0469, + "SAR": 15.2312, + "ISR": 25.1401 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.14154, + "SIR": 19.0885, + "SAR": 8.55902, + "ISR": 12.854 + }, + "instrumental": { + "SDR": 14.4857, + "SIR": 18.4205, + "SAR": 15.2542, + "ISR": 21.2744 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.88173, + "SIR": 15.9683, + "SAR": 2.64208, + "ISR": 7.27436 + }, + "instrumental": { + "SDR": 14.2268, + "SIR": 17.1532, + "SAR": 18.3193, + "ISR": 28.7752 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 8.04085, + "SIR": 18.7211, + "SAR": 8.54688, + "ISR": 13.59 + }, + "instrumental": { + "SDR": 13.2073, + "SIR": 18.4398, + "SAR": 15.1521, + "ISR": 20.052 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.77572, + "SIR": 22.2527, + "SAR": 6.59366, + "ISR": 10.2828 + }, + "instrumental": { + "SDR": 13.6398, + "SIR": 16.9955, + "SAR": 15.9125, + "ISR": 21.715 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -17.4213, + "SIR": -34.6844, + "SAR": 1.38369, + "ISR": -1.08296 + }, + "instrumental": { + "SDR": 9.81801, + "SIR": 45.1931, + "SAR": 11.1872, + "ISR": 13.8325 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.27353, + "SIR": 13.9943, + "SAR": 5.86874, + "ISR": 9.35191 + }, + "instrumental": { + "SDR": 15.746, + "SIR": 17.7356, + "SAR": 17.3166, + "ISR": 24.8408 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 8.36012, + "SIR": 19.2626, + "SAR": 8.51897, + "ISR": 12.1376 + }, + "instrumental": { + "SDR": 13.6585, + "SIR": 17.7544, + "SAR": 16.5072, + "ISR": 19.6113 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 8.8139, + "SIR": 19.1961, + "SAR": 9.83911, + "ISR": 13.7534 + }, + "instrumental": { + "SDR": 17.1823, + "SIR": 21.7665, + "SAR": 18.9064, + "ISR": 28.0227 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 4.72719, + "SIR": 18.3205, + "SAR": 5.55217, + "ISR": 8.45251 + }, + "instrumental": { + "SDR": 12.5494, + "SIR": 16.8988, + "SAR": 16.1755, + "ISR": 18.2756 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.38323, + "SIR": 12.5471, + "SAR": 3.03811, + "ISR": 5.56346 + }, + "instrumental": { + "SDR": 10.2942, + "SIR": 12.3265, + "SAR": 15.0819, + "ISR": 19.1564 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.34138, + "SIR": 20.1964, + "SAR": 6.7755, + "ISR": 9.95848 + }, + "instrumental": { + "SDR": 14.1747, + "SIR": 16.1604, + "SAR": 16.1362, + "ISR": 21.7528 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 6.11604, + "SIR": 16.1178, + "SAR": 6.24741, + "ISR": 10.0044 + }, + "instrumental": { + "SDR": 14.0279, + "SIR": 17.9615, + "SAR": 16.8884, + "ISR": 26.0156 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 7.46436, + "SIR": 16.1781, + "SAR": 7.641, + "ISR": 12.6534 + }, + "instrumental": { + "SDR": 13.5482, + "SIR": 17.6419, + "SAR": 14.1705, + "ISR": 20.2154 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.92851, + "SIR": 18.7334, + "SAR": 8.68737, + "ISR": 11.6045 + }, + "instrumental": { + "SDR": 9.75899, + "SIR": 13.1036, + "SAR": 11.9679, + "ISR": 21.5514 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 5.00262, + "SIR": 13.8508, + "SAR": 4.39134, + "ISR": 8.26591 + }, + "instrumental": { + "SDR": 10.1498, + "SIR": 12.2515, + "SAR": 12.7174, + "ISR": 21.3025 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 8.17821, + "SIR": 21.4578, + "SAR": 9.43296, + "ISR": 12.9406 + }, + "instrumental": { + "SDR": 12.9526, + "SIR": 17.6838, + "SAR": 15.6887, + "ISR": 17.6637 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 11.3582, + "SIR": 22.5246, + "SAR": 10.5035, + "ISR": 13.4544 + }, + "instrumental": { + "SDR": 11.3707, + "SIR": 13.2049, + "SAR": 10.7477, + "ISR": 23.9461 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 9.08221, + "SIR": 19.4725, + "SAR": 10.028, + "ISR": 13.4082 + }, + "instrumental": { + "SDR": 11.7671, + "SIR": 15.8295, + "SAR": 14.0745, + "ISR": 17.8234 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 9.71127, + "SIR": 30.2996, + "SAR": 10.4048, + "ISR": 14.3588 + }, + "instrumental": { + "SDR": 15.9789, + "SIR": 22.1168, + "SAR": 19.7453, + "ISR": 19.6412 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 0.75369, + "SIR": 9.89789, + "SAR": 4.42746, + "ISR": 7.657 + }, + "instrumental": { + "SDR": 8.85454, + "SIR": 12.4224, + "SAR": 10.9395, + "ISR": 15.9617 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.7338, + "SIR": 27.9152, + "SAR": 14.0307, + "ISR": 20.0397 + }, + "instrumental": { + "SDR": 19.7726, + "SIR": 26.7053, + "SAR": 20.5342, + "ISR": 30.8862 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.4956, + "SIR": 19.617, + "SAR": 11.3343, + "ISR": 17.2533 + }, + "instrumental": { + "SDR": 10.1916, + "SIR": 15.2461, + "SAR": 11.236, + "ISR": 19.2265 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 6.31051, + "SIR": 17.0441, + "SAR": 6.48147, + "ISR": 11.0137 + }, + "instrumental": { + "SDR": 11.2954, + "SIR": 15.588, + "SAR": 13.6196, + "ISR": 23.47 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 4.77356, + "SIR": 12.6533, + "SAR": 5.00826, + "ISR": 11.6876 + }, + "instrumental": { + "SDR": 13.8303, + "SIR": 20.5646, + "SAR": 16.2602, + "ISR": 17.8629 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 8.01294, + "SIR": 22.6827, + "SAR": 8.21141, + "ISR": 12.8724 + }, + "instrumental": { + "SDR": 15.1509, + "SIR": 19.7286, + "SAR": 17.1011, + "ISR": 29.1674 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 9.19851, + "SIR": 24.9079, + "SAR": 9.1992, + "ISR": 12.7973 + }, + "instrumental": { + "SDR": 16.8754, + "SIR": 20.7992, + "SAR": 18.5041, + "ISR": 24.6454 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 8.05843, + "SIR": 23.7943, + "SAR": 8.59817, + "ISR": 11.5114 + }, + "instrumental": { + "SDR": 11.7621, + "SIR": 15.0864, + "SAR": 14.1552, + "ISR": 22.0227 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.59345, + "SIR": 20.7982, + "SAR": 8.29149, + "ISR": 12.0623 + }, + "instrumental": { + "SDR": 14.2786, + "SIR": 18.6844, + "SAR": 16.8824, + "ISR": 28.1603 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.01294, + "SIR": 19.0885, + "SAR": 8.29149, + "ISR": 12.4327 + }, + "instrumental": { + "SDR": 13.5482, + "SIR": 17.7544, + "SAR": 15.2542, + "ISR": 21.5514 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "15_SP-UVR-MID-44100-1.pth": { + "model_name": "VR Arch Single Model v5: 15_SP-UVR-MID-44100-1", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.04636, + "SIR": 14.85, + "SAR": 3.83909, + "ISR": 7.84627 + }, + "instrumental": { + "SDR": 15.8345, + "SIR": 19.119, + "SAR": 19.62, + "ISR": 19.9563 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 5.03427, + "SIR": 10.1512, + "SAR": 5.33985, + "ISR": 12.5775 + }, + "instrumental": { + "SDR": 10.3835, + "SIR": 17.9081, + "SAR": 12.3015, + "ISR": 14.015 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 7.99112, + "SIR": 21.4839, + "SAR": 8.19655, + "ISR": 13.376 + }, + "instrumental": { + "SDR": 14.5252, + "SIR": 19.7386, + "SAR": 16.5328, + "ISR": 19.8799 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.6814, + "SIR": 8.03735, + "SAR": 2.83774, + "ISR": 11.2194 + }, + "instrumental": { + "SDR": 12.4191, + "SIR": 19.3799, + "SAR": 14.1766, + "ISR": 19.2965 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 10.1383, + "SIR": 21.7378, + "SAR": 9.52697, + "ISR": 12.0016 + }, + "instrumental": { + "SDR": 12.966, + "SIR": 13.9437, + "SAR": 13.7839, + "ISR": 23.605 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.63794, + "SIR": 16.6805, + "SAR": 9.28839, + "ISR": 12.9153 + }, + "instrumental": { + "SDR": 10.8976, + "SIR": 14.9523, + "SAR": 12.9844, + "ISR": 20.7225 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.1303, + "SIR": 19.6198, + "SAR": 11.1093, + "ISR": 13.9669 + }, + "instrumental": { + "SDR": 14.5365, + "SIR": 18.0006, + "SAR": 16.6218, + "ISR": 25.4292 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.67131, + "SIR": 21.9459, + "SAR": 6.52327, + "ISR": 8.67098 + }, + "instrumental": { + "SDR": 17.0086, + "SIR": 20.4128, + "SAR": 21.8534, + "ISR": 21.4844 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 8.87081, + "SIR": 26.466, + "SAR": 10.0688, + "ISR": 12.1843 + }, + "instrumental": { + "SDR": 12.2049, + "SIR": 15.5198, + "SAR": 15.3823, + "ISR": 19.8869 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 9.18581, + "SIR": 19.1368, + "SAR": 7.92444, + "ISR": 10.3195 + }, + "instrumental": { + "SDR": 13.0956, + "SIR": 14.0175, + "SAR": 14.2788, + "ISR": 25.2758 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 10.4572, + "SIR": 23.6427, + "SAR": 11.2548, + "ISR": 17.0547 + }, + "instrumental": { + "SDR": 13.3908, + "SIR": 20.3204, + "SAR": 15.1459, + "ISR": 22.239 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.70679, + "SIR": 21.7597, + "SAR": 9.42591, + "ISR": 13.0422 + }, + "instrumental": { + "SDR": 14.5007, + "SIR": 19.1565, + "SAR": 16.1324, + "ISR": 28.4553 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.25525, + "SIR": 19.6589, + "SAR": 7.16343, + "ISR": 11.5635 + }, + "instrumental": { + "SDR": 13.1225, + "SIR": 16.846, + "SAR": 15.0242, + "ISR": 26.1152 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.15397, + "SIR": 22.7034, + "SAR": 8.8693, + "ISR": 11.9382 + }, + "instrumental": { + "SDR": 13.9533, + "SIR": 17.6081, + "SAR": 15.73, + "ISR": 19.3107 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 4.04418, + "SIR": 20.063, + "SAR": 3.63063, + "ISR": 6.31967 + }, + "instrumental": { + "SDR": 12.9942, + "SIR": 14.8376, + "SAR": 17.6322, + "ISR": 29.0027 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 7.96859, + "SIR": 19.6143, + "SAR": 8.50803, + "ISR": 12.9257 + }, + "instrumental": { + "SDR": 13.0289, + "SIR": 17.5142, + "SAR": 15.0729, + "ISR": 19.389 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.58093, + "SIR": 23.2464, + "SAR": 6.40487, + "ISR": 9.69841 + }, + "instrumental": { + "SDR": 13.2752, + "SIR": 16.008, + "SAR": 15.5397, + "ISR": 19.8241 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -0.017675, + "SIR": -26.9589, + "SAR": 0.06112, + "ISR": -1.50838 + }, + "instrumental": { + "SDR": 12.8414, + "SIR": 43.8834, + "SAR": 13.9884, + "ISR": 19.2608 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 5.76853, + "SIR": 16.4682, + "SAR": 5.2186, + "ISR": 8.01715 + }, + "instrumental": { + "SDR": 15.6622, + "SIR": 16.4191, + "SAR": 17.0878, + "ISR": 28.397 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 8.10637, + "SIR": 20.0302, + "SAR": 8.58733, + "ISR": 11.201 + }, + "instrumental": { + "SDR": 13.296, + "SIR": 16.4908, + "SAR": 16.6643, + "ISR": 19.7079 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 9.26583, + "SIR": 22.9489, + "SAR": 10.0914, + "ISR": 11.8722 + }, + "instrumental": { + "SDR": 14.8583, + "SIR": 17.847, + "SAR": 17.7752, + "ISR": 30.4277 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 6.15381, + "SIR": 21.8247, + "SAR": 7.08072, + "ISR": 10.013 + }, + "instrumental": { + "SDR": 13.3933, + "SIR": 15.7059, + "SAR": 17.3492, + "ISR": 19.3205 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.32531, + "SIR": 14.1833, + "SAR": 2.64588, + "ISR": 4.92155 + }, + "instrumental": { + "SDR": 10.2704, + "SIR": 11.7177, + "SAR": 15.7355, + "ISR": 18.9879 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 4.94258, + "SIR": 22.4066, + "SAR": 5.70052, + "ISR": 8.67636 + }, + "instrumental": { + "SDR": 14.7886, + "SIR": 17.7085, + "SAR": 17.3128, + "ISR": 22.9239 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 6.10597, + "SIR": 17.9811, + "SAR": 6.14729, + "ISR": 9.48078 + }, + "instrumental": { + "SDR": 14.0803, + "SIR": 17.4199, + "SAR": 16.9376, + "ISR": 27.7988 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 7.08939, + "SIR": 16.8874, + "SAR": 7.18521, + "ISR": 12.1316 + }, + "instrumental": { + "SDR": 13.0169, + "SIR": 16.8575, + "SAR": 14.306, + "ISR": 17.4292 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.43649, + "SIR": 19.1496, + "SAR": 8.24094, + "ISR": 10.3074 + }, + "instrumental": { + "SDR": 9.20312, + "SIR": 11.8684, + "SAR": 11.8405, + "ISR": 21.9732 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 4.55491, + "SIR": 12.6856, + "SAR": 3.93544, + "ISR": 7.43787 + }, + "instrumental": { + "SDR": 9.74664, + "SIR": 11.9224, + "SAR": 12.6348, + "ISR": 21.1574 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 7.53246, + "SIR": 22.3304, + "SAR": 9.25947, + "ISR": 11.758 + }, + "instrumental": { + "SDR": 12.5985, + "SIR": 16.2246, + "SAR": 15.9804, + "ISR": 18.0693 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 12.4681, + "SIR": 24.63, + "SAR": 10.5415, + "ISR": 13.0635 + }, + "instrumental": { + "SDR": 12.8558, + "SIR": 12.3995, + "SAR": 10.8567, + "ISR": 26.4926 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 8.6245, + "SIR": 20.9933, + "SAR": 9.96015, + "ISR": 12.3554 + }, + "instrumental": { + "SDR": 11.6471, + "SIR": 14.8636, + "SAR": 14.4255, + "ISR": 17.9366 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 9.85662, + "SIR": 28.7719, + "SAR": 10.523, + "ISR": 14.501 + }, + "instrumental": { + "SDR": 15.3752, + "SIR": 22.2987, + "SAR": 19.0341, + "ISR": 19.4875 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.9205, + "SIR": 11.3297, + "SAR": 7.30537, + "ISR": 9.20943 + }, + "instrumental": { + "SDR": 10.6013, + "SIR": 14.4046, + "SAR": 13.5113, + "ISR": 17.0101 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.7573, + "SIR": 28.7101, + "SAR": 14.3598, + "ISR": 19.8549 + }, + "instrumental": { + "SDR": 18.2899, + "SIR": 26.176, + "SAR": 19.9787, + "ISR": 24.6239 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.0834, + "SIR": 21.0256, + "SAR": 11.167, + "ISR": 15.8358 + }, + "instrumental": { + "SDR": 9.31446, + "SIR": 13.3623, + "SAR": 10.8209, + "ISR": 20.325 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 5.9831, + "SIR": 17.0047, + "SAR": 6.36112, + "ISR": 9.70996 + }, + "instrumental": { + "SDR": 11.1064, + "SIR": 14.7686, + "SAR": 13.8125, + "ISR": 24.4958 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.24717, + "SIR": 15.2307, + "SAR": 5.72997, + "ISR": 10.2738 + }, + "instrumental": { + "SDR": 14.5056, + "SIR": 19.3122, + "SAR": 17.8237, + "ISR": 18.9927 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.35463, + "SIR": 24.6351, + "SAR": 9.71368, + "ISR": 14.2319 + }, + "instrumental": { + "SDR": 15.5978, + "SIR": 20.2629, + "SAR": 17.6386, + "ISR": 30.9372 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 8.85196, + "SIR": 25.0897, + "SAR": 9.19933, + "ISR": 11.9327 + }, + "instrumental": { + "SDR": 16.2559, + "SIR": 20.3272, + "SAR": 18.3855, + "ISR": 24.2826 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 8.24832, + "SIR": 24.3849, + "SAR": 8.88159, + "ISR": 11.5826 + }, + "instrumental": { + "SDR": 11.9588, + "SIR": 15.1944, + "SAR": 14.4311, + "ISR": 22.3589 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.09862, + "SIR": 20.0806, + "SAR": 8.14292, + "ISR": 11.3661 + }, + "instrumental": { + "SDR": 14.0197, + "SIR": 17.7861, + "SAR": 16.5663, + "ISR": 26.9919 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 7.53246, + "SIR": 20.0806, + "SAR": 8.19655, + "ISR": 11.5826 + }, + "instrumental": { + "SDR": 13.1225, + "SIR": 16.8575, + "SAR": 15.73, + "ISR": 21.1574 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "16_SP-UVR-MID-44100-2.pth": { + "model_name": "VR Arch Single Model v5: 16_SP-UVR-MID-44100-2", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.05476, + "SIR": 14.7077, + "SAR": 3.82144, + "ISR": 7.84507 + }, + "instrumental": { + "SDR": 15.1911, + "SIR": 19.3774, + "SAR": 19.53, + "ISR": 18.7747 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 5.14488, + "SIR": 10.564, + "SAR": 5.30249, + "ISR": 12.2981 + }, + "instrumental": { + "SDR": 10.8672, + "SIR": 17.6631, + "SAR": 12.363, + "ISR": 14.2162 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 7.95012, + "SIR": 21.8536, + "SAR": 8.01042, + "ISR": 13.1692 + }, + "instrumental": { + "SDR": 14.7461, + "SIR": 19.7277, + "SAR": 16.6219, + "ISR": 19.9237 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.83639, + "SIR": 7.99277, + "SAR": 3.15233, + "ISR": 11.5308 + }, + "instrumental": { + "SDR": 12.4194, + "SIR": 19.6512, + "SAR": 14.0752, + "ISR": 19.1012 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 10.1361, + "SIR": 21.7287, + "SAR": 9.60373, + "ISR": 12.1769 + }, + "instrumental": { + "SDR": 13.0007, + "SIR": 14.2202, + "SAR": 13.8308, + "ISR": 24.3814 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.65064, + "SIR": 16.5965, + "SAR": 9.26727, + "ISR": 12.9055 + }, + "instrumental": { + "SDR": 10.9311, + "SIR": 15.0176, + "SAR": 12.9826, + "ISR": 20.5673 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.1991, + "SIR": 19.5123, + "SAR": 11.0645, + "ISR": 14.1953 + }, + "instrumental": { + "SDR": 14.6576, + "SIR": 18.2434, + "SAR": 16.6393, + "ISR": 25.3089 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.05712, + "SIR": 21.0804, + "SAR": 6.34704, + "ISR": 9.15949 + }, + "instrumental": { + "SDR": 17.5455, + "SIR": 21.0241, + "SAR": 21.91, + "ISR": 21.4503 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 8.82975, + "SIR": 26.5625, + "SAR": 10.0465, + "ISR": 12.1293 + }, + "instrumental": { + "SDR": 12.2174, + "SIR": 15.4893, + "SAR": 15.3898, + "ISR": 19.9156 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 8.97059, + "SIR": 19.3854, + "SAR": 7.792, + "ISR": 10.2318 + }, + "instrumental": { + "SDR": 13.091, + "SIR": 13.99, + "SAR": 14.2777, + "ISR": 25.6792 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 10.5424, + "SIR": 23.1182, + "SAR": 11.1848, + "ISR": 17.2389 + }, + "instrumental": { + "SDR": 13.3612, + "SIR": 20.5086, + "SAR": 15.0249, + "ISR": 21.9469 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.8928, + "SIR": 21.4305, + "SAR": 9.60206, + "ISR": 13.5589 + }, + "instrumental": { + "SDR": 14.6325, + "SIR": 19.6522, + "SAR": 16.3226, + "ISR": 28.0676 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 6.82749, + "SIR": 19.196, + "SAR": 6.84891, + "ISR": 11.0321 + }, + "instrumental": { + "SDR": 13.3009, + "SIR": 17.0932, + "SAR": 15.276, + "ISR": 26.1144 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 7.57525, + "SIR": 21.151, + "SAR": 8.08551, + "ISR": 11.508 + }, + "instrumental": { + "SDR": 15.2093, + "SIR": 18.4946, + "SAR": 17.9074, + "ISR": 19.2926 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.80268, + "SIR": 19.7704, + "SAR": 3.38626, + "ISR": 6.39995 + }, + "instrumental": { + "SDR": 13.3486, + "SIR": 15.3605, + "SAR": 17.7346, + "ISR": 28.9332 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 7.79887, + "SIR": 19.6485, + "SAR": 8.32583, + "ISR": 12.7485 + }, + "instrumental": { + "SDR": 12.9781, + "SIR": 17.4973, + "SAR": 15.0503, + "ISR": 19.2158 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.61559, + "SIR": 23.2557, + "SAR": 6.45193, + "ISR": 9.66374 + }, + "instrumental": { + "SDR": 13.3184, + "SIR": 16.0149, + "SAR": 15.547, + "ISR": 19.8151 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -0.13655, + "SIR": -29.1205, + "SAR": 0.12796, + "ISR": -1.16684 + }, + "instrumental": { + "SDR": 12.189, + "SIR": 44.4709, + "SAR": 13.5854, + "ISR": 18.2335 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 5.59345, + "SIR": 16.701, + "SAR": 4.99651, + "ISR": 7.80856 + }, + "instrumental": { + "SDR": 16.1007, + "SIR": 16.3044, + "SAR": 17.007, + "ISR": 28.6554 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 8.06904, + "SIR": 19.7876, + "SAR": 8.45608, + "ISR": 11.273 + }, + "instrumental": { + "SDR": 13.2783, + "SIR": 16.7505, + "SAR": 16.4972, + "ISR": 19.6366 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 6.77863, + "SIR": 21.174, + "SAR": 7.43477, + "ISR": 10.8253 + }, + "instrumental": { + "SDR": 16.6009, + "SIR": 19.2379, + "SAR": 19.5835, + "ISR": 30.3146 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 1.09053, + "SIR": 12.2171, + "SAR": 0.78871, + "ISR": 5.18396 + }, + "instrumental": { + "SDR": 15.8861, + "SIR": 20.4292, + "SAR": 20.5322, + "ISR": 19.2904 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.30994, + "SIR": 14.0454, + "SAR": 2.61719, + "ISR": 4.9673 + }, + "instrumental": { + "SDR": 10.3195, + "SIR": 11.7643, + "SAR": 15.6419, + "ISR": 18.9673 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.89648, + "SIR": 21.9296, + "SAR": 6.12896, + "ISR": 9.416 + }, + "instrumental": { + "SDR": 14.8766, + "SIR": 17.8881, + "SAR": 16.672, + "ISR": 22.8106 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 6.10146, + "SIR": 17.8299, + "SAR": 6.15102, + "ISR": 9.53275 + }, + "instrumental": { + "SDR": 14.1199, + "SIR": 17.4712, + "SAR": 16.9302, + "ISR": 27.6332 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 6.75647, + "SIR": 16.3752, + "SAR": 6.82834, + "ISR": 11.9032 + }, + "instrumental": { + "SDR": 13.4518, + "SIR": 17.4073, + "SAR": 14.624, + "ISR": 17.916 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.44674, + "SIR": 19.1068, + "SAR": 8.27371, + "ISR": 10.4903 + }, + "instrumental": { + "SDR": 9.19093, + "SIR": 12.132, + "SAR": 11.8309, + "ISR": 21.8651 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 4.42356, + "SIR": 13.2458, + "SAR": 3.53249, + "ISR": 7.23216 + }, + "instrumental": { + "SDR": 9.9736, + "SIR": 12.2865, + "SAR": 12.8762, + "ISR": 22.0655 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 7.42881, + "SIR": 22.7991, + "SAR": 9.16099, + "ISR": 11.7041 + }, + "instrumental": { + "SDR": 12.6543, + "SIR": 16.2558, + "SAR": 15.8203, + "ISR": 18.1911 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 12.1782, + "SIR": 24.2228, + "SAR": 10.5391, + "ISR": 13.2633 + }, + "instrumental": { + "SDR": 13.1408, + "SIR": 13.4121, + "SAR": 11.5786, + "ISR": 26.6025 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 8.62665, + "SIR": 21.2211, + "SAR": 9.89564, + "ISR": 12.3274 + }, + "instrumental": { + "SDR": 11.7063, + "SIR": 14.7338, + "SAR": 14.3065, + "ISR": 18.0481 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.1396, + "SIR": 29.0142, + "SAR": 10.6652, + "ISR": 14.592 + }, + "instrumental": { + "SDR": 15.3857, + "SIR": 22.1542, + "SAR": 19.1591, + "ISR": 19.5059 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.31727, + "SIR": 9.67953, + "SAR": 7.05032, + "ISR": 8.98947 + }, + "instrumental": { + "SDR": 10.4692, + "SIR": 14.6488, + "SAR": 13.5279, + "ISR": 15.6278 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.3509, + "SIR": 26.1803, + "SAR": 12.6763, + "ISR": 19.2711 + }, + "instrumental": { + "SDR": 19.8545, + "SIR": 27.0207, + "SAR": 21.5404, + "ISR": 24.1672 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 9.61872, + "SIR": 20.2478, + "SAR": 10.6861, + "ISR": 15.6562 + }, + "instrumental": { + "SDR": 9.60951, + "SIR": 13.866, + "SAR": 10.9383, + "ISR": 20.3149 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 5.97313, + "SIR": 16.1558, + "SAR": 6.32932, + "ISR": 9.75732 + }, + "instrumental": { + "SDR": 11.0828, + "SIR": 14.8188, + "SAR": 13.7095, + "ISR": 23.6688 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.38992, + "SIR": 15.7863, + "SAR": 6.01618, + "ISR": 10.4057 + }, + "instrumental": { + "SDR": 13.4765, + "SIR": 18.9054, + "SAR": 16.4919, + "ISR": 18.8983 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.07499, + "SIR": 24.3168, + "SAR": 9.47002, + "ISR": 14.0612 + }, + "instrumental": { + "SDR": 15.7923, + "SIR": 20.4386, + "SAR": 17.7775, + "ISR": 30.9416 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 8.55129, + "SIR": 24.6962, + "SAR": 8.80227, + "ISR": 11.7298 + }, + "instrumental": { + "SDR": 16.3715, + "SIR": 20.5855, + "SAR": 18.6586, + "ISR": 24.1959 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 8.26149, + "SIR": 24.3251, + "SAR": 8.9076, + "ISR": 11.7729 + }, + "instrumental": { + "SDR": 12.1055, + "SIR": 15.514, + "SAR": 14.5863, + "ISR": 22.3034 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.11251, + "SIR": 19.8879, + "SAR": 8.10484, + "ISR": 11.545 + }, + "instrumental": { + "SDR": 13.9713, + "SIR": 17.9623, + "SAR": 16.5374, + "ISR": 26.8822 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 7.42881, + "SIR": 19.7876, + "SAR": 8.01042, + "ISR": 11.5308 + }, + "instrumental": { + "SDR": 13.3184, + "SIR": 17.4712, + "SAR": 15.6419, + "ISR": 21.4503 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "17_HP-Wind_Inst-UVR.pth": { + "model_name": "VR Arch Single Model v5: 17_HP-Wind_Inst-UVR", + "track_scores": [], + "median_scores": {}, + "stems": [ + "no woodwinds", + "woodwinds" + ], + "target_stem": "no woodwinds" + }, + "UVR-De-Echo-Aggressive.pth": { + "model_name": "VR Arch Single Model v5: UVR-De-Echo-Aggressive by FoxJoy", + "track_scores": [], + "median_scores": {}, + "stems": [ + "no echo", + "echo" + ], + "target_stem": "no echo" + }, + "UVR-De-Echo-Normal.pth": { + "model_name": "VR Arch Single Model v5: UVR-De-Echo-Normal by FoxJoy", + "track_scores": [], + "median_scores": {}, + "stems": [ + "no echo", + "echo" + ], + "target_stem": "no echo" + }, + "UVR-DeEcho-DeReverb.pth": { + "model_name": "VR Arch Single Model v5: UVR-DeEcho-DeReverb by FoxJoy", + "track_scores": [], + "median_scores": {}, + "stems": [ + "no reverb", + "reverb" + ], + "target_stem": "no reverb" + }, + "UVR-DeNoise-Lite.pth": { + "model_name": "VR Arch Single Model v5: UVR-DeNoise-Lite by FoxJoy", + "track_scores": [], + "median_scores": {}, + "stems": [ + "noise", + "no noise" + ], + "target_stem": "noise" + }, + "UVR-DeNoise.pth": { + "model_name": "VR Arch Single Model v5: UVR-DeNoise by FoxJoy", + "track_scores": [], + "median_scores": {}, + "stems": [ + "noise", + "no noise" + ], + "target_stem": "noise" + }, + "UVR-BVE-4B_SN-44100-1.pth": { + "model_name": "VR Arch Single Model v5: UVR-BVE-4B_SN-44100-1", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 0.0143, + "SIR": 5.71885, + "SAR": 0.00389, + "ISR": 2.65473 + }, + "instrumental": { + "SDR": 12.0434, + "SIR": 13.2314, + "SAR": 20.3884, + "ISR": 18.1082 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 0.04364, + "SIR": -0.21064, + "SAR": 1.13731, + "ISR": 4.28305 + }, + "instrumental": { + "SDR": 5.134, + "SIR": 8.18763, + "SAR": 9.75106, + "ISR": 12.2035 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 0.32999, + "SIR": 13.4328, + "SAR": -0.091835, + "ISR": 1.66201 + }, + "instrumental": { + "SDR": 7.97396, + "SIR": 7.89168, + "SAR": 18.8239, + "ISR": 18.7354 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 0.312875, + "SIR": 8.2827, + "SAR": -1.47848, + "ISR": 1.55275 + }, + "instrumental": { + "SDR": 10.3618, + "SIR": 10.2596, + "SAR": 18.4705, + "ISR": 29.0072 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 1.42935, + "SIR": 13.9102, + "SAR": -0.415185, + "ISR": 2.28143 + }, + "instrumental": { + "SDR": 3.57475, + "SIR": 3.97382, + "SAR": 12.5341, + "ISR": 24.7033 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 5.64078, + "SIR": 12.5758, + "SAR": 4.83381, + "ISR": 9.15469 + }, + "instrumental": { + "SDR": 7.71278, + "SIR": 10.1979, + "SAR": 9.69012, + "ISR": 14.0837 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 5.77048, + "SIR": 13.0031, + "SAR": 4.32344, + "ISR": 8.96978 + }, + "instrumental": { + "SDR": 10.1011, + "SIR": 13.0064, + "SAR": 11.5667, + "ISR": 20.3358 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 0.01073, + "SIR": 17.9395, + "SAR": -0.01832, + "ISR": 0.35279 + }, + "instrumental": { + "SDR": 11.1041, + "SIR": 10.9717, + "SAR": 34.1422, + "ISR": 19.9389 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 0.00011, + "SIR": -13.1551, + "SAR": -0.03768, + "ISR": 0.094585 + }, + "instrumental": { + "SDR": 3.638, + "SIR": 2.8822, + "SAR": 27.305, + "ISR": 19.3149 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 0.028245, + "SIR": 3.83482, + "SAR": 0.010535, + "ISR": 1.60119 + }, + "instrumental": { + "SDR": 5.0306, + "SIR": 5.31947, + "SAR": 15.8014, + "ISR": 18.1645 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 0.000285, + "SIR": -7.34197, + "SAR": -0.599315, + "ISR": 0.027645 + }, + "instrumental": { + "SDR": 3.23884, + "SIR": 2.59164, + "SAR": 37.7021, + "ISR": 20.0797 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 2.40459, + "SIR": 18.0403, + "SAR": 0.02858, + "ISR": 4.25442 + }, + "instrumental": { + "SDR": 10.5983, + "SIR": 10.059, + "SAR": 13.1579, + "ISR": 23.167 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 0.40391, + "SIR": 13.7794, + "SAR": 0.06788, + "ISR": 4.86253 + }, + "instrumental": { + "SDR": 9.05201, + "SIR": 10.1529, + "SAR": 12.2732, + "ISR": 25.1146 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 0.01767, + "SIR": 5.09955, + "SAR": -0.62411, + "ISR": 0.75405 + }, + "instrumental": { + "SDR": 5.96105, + "SIR": 5.57252, + "SAR": 20.6007, + "ISR": 18.9997 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2e-05, + "SIR": -10.3795, + "SAR": 3e-05, + "ISR": 0.27913 + }, + "instrumental": { + "SDR": 10.8787, + "SIR": 10.8785, + "SAR": 25.7465, + "ISR": 20.2301 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 5.50267, + "SIR": 14.2358, + "SAR": 4.57239, + "ISR": 9.29933 + }, + "instrumental": { + "SDR": 11.0412, + "SIR": 13.7085, + "SAR": 12.4026, + "ISR": 17.3735 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 0.00618, + "SIR": 12.4248, + "SAR": 0.0, + "ISR": 1.16757 + }, + "instrumental": { + "SDR": 9.40412, + "SIR": 9.00934, + "SAR": 18.8258, + "ISR": 20.5897 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -47.1281, + "SIR": -39.8072, + "SAR": 4.62926, + "ISR": -5.92184 + }, + "instrumental": { + "SDR": 3.42626, + "SIR": 39.3782, + "SAR": 6.31446, + "ISR": 5.81093 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 3.55326, + "SIR": 13.0587, + "SAR": 2.02905, + "ISR": 6.54441 + }, + "instrumental": { + "SDR": 11.659, + "SIR": 14.2547, + "SAR": 14.7696, + "ISR": 25.6118 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 0.12547, + "SIR": 14.3363, + "SAR": 0.00047, + "ISR": 1.47323 + }, + "instrumental": { + "SDR": 8.4943, + "SIR": 7.86234, + "SAR": 19.0268, + "ISR": 19.1418 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 0.20213, + "SIR": 12.4245, + "SAR": 0.00065, + "ISR": 1.27989 + }, + "instrumental": { + "SDR": 9.07785, + "SIR": 7.58439, + "SAR": 21.1446, + "ISR": 19.3072 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -7e-05, + "SIR": -2.77665, + "SAR": -1.71684, + "ISR": 0.793235 + }, + "instrumental": { + "SDR": 7.13026, + "SIR": 8.34966, + "SAR": 18.3008, + "ISR": 16.238 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 0.02167, + "SIR": 7.93674, + "SAR": 0.00422, + "ISR": 0.73612 + }, + "instrumental": { + "SDR": 7.74501, + "SIR": 7.7283, + "SAR": 25.8832, + "ISR": 19.0584 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": -0.0, + "SIR": -2.13244, + "SAR": 0.00751, + "ISR": 1.33782 + }, + "instrumental": { + "SDR": 10.485, + "SIR": 14.1155, + "SAR": 16.39, + "ISR": 17.4384 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 0.246915, + "SIR": 10.8693, + "SAR": -0.023265, + "ISR": 1.55227 + }, + "instrumental": { + "SDR": 8.94452, + "SIR": 9.13386, + "SAR": 21.2897, + "ISR": 25.0864 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": -3.10508, + "SIR": -11.8376, + "SAR": 3.59199, + "ISR": 2.01564 + }, + "instrumental": { + "SDR": 2.21281, + "SIR": 4.74416, + "SAR": 7.33404, + "ISR": 6.02347 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 0.133265, + "SIR": 14.0034, + "SAR": -0.43571, + "ISR": 0.686895 + }, + "instrumental": { + "SDR": 3.09455, + "SIR": 2.40681, + "SAR": 19.4666, + "ISR": 18.499 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": -0.13102, + "SIR": -3.41465, + "SAR": 0.89258, + "ISR": 4.14013 + }, + "instrumental": { + "SDR": 5.59169, + "SIR": 6.8377, + "SAR": 8.52814, + "ISR": 10.6466 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 0.0369, + "SIR": 8.50288, + "SAR": 0.00042, + "ISR": 2.38309 + }, + "instrumental": { + "SDR": 6.4094, + "SIR": 6.89847, + "SAR": 15.2855, + "ISR": 18.8411 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 0.413795, + "SIR": 8.52527, + "SAR": -1.38646, + "ISR": 1.13693 + }, + "instrumental": { + "SDR": 0.043585, + "SIR": -0.77882, + "SAR": 9.44473, + "ISR": 16.5427 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 1.31805, + "SIR": 11.9867, + "SAR": -0.60957, + "ISR": 2.95772 + }, + "instrumental": { + "SDR": 5.00257, + "SIR": 5.61025, + "SAR": 11.1517, + "ISR": 15.8905 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 1.88393, + "SIR": 27.3909, + "SAR": 0.10713, + "ISR": 4.38105 + }, + "instrumental": { + "SDR": 11.0878, + "SIR": 11.938, + "SAR": 15.5121, + "ISR": 19.5204 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 0.100795, + "SIR": 0.387355, + "SAR": 0.027535, + "ISR": 1.75572 + }, + "instrumental": { + "SDR": 7.23206, + "SIR": 8.84448, + "SAR": 14.5591, + "ISR": 15.2786 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 1.38667, + "SIR": 18.2052, + "SAR": -0.26025, + "ISR": 3.36353 + }, + "instrumental": { + "SDR": 7.91075, + "SIR": 8.17666, + "SAR": 13.3232, + "ISR": 20.0839 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 0.46791, + "SIR": 17.882, + "SAR": 0.00119, + "ISR": 1.5489 + }, + "instrumental": { + "SDR": 0.16428, + "SIR": 0.32093, + "SAR": 15.8749, + "ISR": 29.4909 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 0.00815, + "SIR": -0.44809, + "SAR": -0.213905, + "ISR": 1.19004 + }, + "instrumental": { + "SDR": 6.70995, + "SIR": 6.15572, + "SAR": 14.9742, + "ISR": 14.7971 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": -0.32474, + "SIR": -14.1332, + "SAR": -2.14238, + "ISR": 0.25697 + }, + "instrumental": { + "SDR": 12.0616, + "SIR": 15.8927, + "SAR": 24.8659, + "ISR": 18.0995 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": -0.02668, + "SIR": -1.82824, + "SAR": -0.13726, + "ISR": 0.86444 + }, + "instrumental": { + "SDR": 7.65412, + "SIR": 7.41909, + "SAR": 22.2664, + "ISR": 19.358 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 0.00083, + "SIR": 14.3415, + "SAR": -0.2663, + "ISR": 1.00558 + }, + "instrumental": { + "SDR": 7.58665, + "SIR": 8.01065, + "SAR": 23.6744, + "ISR": 25.0603 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 0.007785, + "SIR": 4.49145, + "SAR": -0.53294, + "ISR": 0.54762 + }, + "instrumental": { + "SDR": 8.96662, + "SIR": 8.24758, + "SAR": 20.1794, + "ISR": 18.2859 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 0.0, + "SIR": -31.3216, + "SAR": -4e-05, + "ISR": 0.02305 + }, + "instrumental": { + "SDR": 6.71564, + "SIR": 6.73194, + "SAR": 22.1283, + "ISR": 17.061 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 0.0369, + "SIR": 8.50288, + "SAR": 3e-05, + "ISR": 1.5489 + }, + "instrumental": { + "SDR": 7.71278, + "SIR": 8.17666, + "SAR": 16.39, + "ISR": 18.9997 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "MGM_HIGHEND_v4.pth": { + "model_name": "VR Arch Single Model v4: MGM_HIGHEND_v4", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 3.90158, + "SIR": 15.9598, + "SAR": 3.37143, + "ISR": 6.56793 + }, + "instrumental": { + "SDR": 14.4628, + "SIR": 17.3509, + "SAR": 18.4845, + "ISR": 18.8014 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 4.14604, + "SIR": 10.0782, + "SAR": 3.92013, + "ISR": 9.93124 + }, + "instrumental": { + "SDR": 9.75011, + "SIR": 15.2216, + "SAR": 11.5548, + "ISR": 14.6244 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 7.93557, + "SIR": 19.3656, + "SAR": 7.81443, + "ISR": 13.1884 + }, + "instrumental": { + "SDR": 13.9156, + "SIR": 19.1792, + "SAR": 15.8666, + "ISR": 19.6767 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.33268, + "SIR": 6.77226, + "SAR": 3.65674, + "ISR": 11.5903 + }, + "instrumental": { + "SDR": 11.8171, + "SIR": 19.9583, + "SAR": 13.6783, + "ISR": 17.7355 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 8.94004, + "SIR": 20.0844, + "SAR": 8.4096, + "ISR": 11.376 + }, + "instrumental": { + "SDR": 11.5449, + "SIR": 13.329, + "SAR": 12.6816, + "ISR": 24.56 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.11557, + "SIR": 15.8005, + "SAR": 8.90774, + "ISR": 12.1068 + }, + "instrumental": { + "SDR": 10.3683, + "SIR": 13.8967, + "SAR": 12.8837, + "ISR": 19.4005 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 9.27646, + "SIR": 18.6354, + "SAR": 9.63718, + "ISR": 13.1704 + }, + "instrumental": { + "SDR": 13.6027, + "SIR": 17.3718, + "SAR": 15.5494, + "ISR": 25.0246 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.26177, + "SIR": 20.233, + "SAR": 6.11505, + "ISR": 9.82511 + }, + "instrumental": { + "SDR": 16.6445, + "SIR": 20.2902, + "SAR": 20.8222, + "ISR": 22.2319 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 7.5773, + "SIR": 21.8232, + "SAR": 8.52451, + "ISR": 11.2414 + }, + "instrumental": { + "SDR": 10.6901, + "SIR": 14.5104, + "SAR": 14.0378, + "ISR": 17.3448 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 7.4221, + "SIR": 16.8177, + "SAR": 5.93863, + "ISR": 8.81692 + }, + "instrumental": { + "SDR": 11.2707, + "SIR": 12.271, + "SAR": 12.696, + "ISR": 21.5427 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 8.93582, + "SIR": 19.9157, + "SAR": 9.31265, + "ISR": 15.5439 + }, + "instrumental": { + "SDR": 11.8457, + "SIR": 18.9899, + "SAR": 13.4012, + "ISR": 20.8239 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.17047, + "SIR": 20.7378, + "SAR": 8.61907, + "ISR": 13.4811 + }, + "instrumental": { + "SDR": 14.2668, + "SIR": 19.1495, + "SAR": 16.2434, + "ISR": 27.9942 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 6.02652, + "SIR": 17.354, + "SAR": 6.1273, + "ISR": 10.6004 + }, + "instrumental": { + "SDR": 12.9385, + "SIR": 16.7924, + "SAR": 14.934, + "ISR": 25.139 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 7.72002, + "SIR": 18.2223, + "SAR": 7.99737, + "ISR": 12.4747 + }, + "instrumental": { + "SDR": 13.9529, + "SIR": 17.9076, + "SAR": 15.2824, + "ISR": 20.6921 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.59072, + "SIR": 15.4127, + "SAR": 1.90344, + "ISR": 5.62525 + }, + "instrumental": { + "SDR": 13.0211, + "SIR": 15.3179, + "SAR": 18.0053, + "ISR": 27.8044 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 7.1424, + "SIR": 18.2684, + "SAR": 7.72987, + "ISR": 12.118 + }, + "instrumental": { + "SDR": 12.3263, + "SIR": 16.6244, + "SAR": 14.5395, + "ISR": 18.7469 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 5.79773, + "SIR": 22.8844, + "SAR": 4.22085, + "ISR": 7.32914 + }, + "instrumental": { + "SDR": 12.5991, + "SIR": 14.045, + "SAR": 15.1613, + "ISR": 19.8877 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -26.7485, + "SIR": -37.3465, + "SAR": 0.48318, + "ISR": -0.30463 + }, + "instrumental": { + "SDR": 10.5748, + "SIR": 46.0469, + "SAR": 11.4619, + "ISR": 14.6779 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 5.29641, + "SIR": 14.8692, + "SAR": 4.50374, + "ISR": 7.53302 + }, + "instrumental": { + "SDR": 15.4052, + "SIR": 16.1001, + "SAR": 16.8893, + "ISR": 27.3751 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 6.97189, + "SIR": 17.9441, + "SAR": 6.69787, + "ISR": 9.2965 + }, + "instrumental": { + "SDR": 12.0515, + "SIR": 14.3845, + "SAR": 15.2945, + "ISR": 18.984 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 8.24282, + "SIR": 20.9396, + "SAR": 9.75113, + "ISR": 12.7221 + }, + "instrumental": { + "SDR": 15.3228, + "SIR": 19.0966, + "SAR": 17.6149, + "ISR": 29.0029 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 5.38435, + "SIR": 18.8745, + "SAR": 5.34815, + "ISR": 8.91087 + }, + "instrumental": { + "SDR": 11.5739, + "SIR": 14.452, + "SAR": 15.5478, + "ISR": 18.0254 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.154, + "SIR": 13.3721, + "SAR": 2.65443, + "ISR": 5.07322 + }, + "instrumental": { + "SDR": 10.0838, + "SIR": 11.8062, + "SAR": 15.5527, + "ISR": 19.3115 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.5587, + "SIR": 20.8421, + "SAR": 5.74645, + "ISR": 9.17571 + }, + "instrumental": { + "SDR": 14.6373, + "SIR": 17.6326, + "SAR": 16.5896, + "ISR": 22.2738 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 5.27313, + "SIR": 18.1922, + "SAR": 5.09384, + "ISR": 8.00382 + }, + "instrumental": { + "SDR": 13.2735, + "SIR": 15.8607, + "SAR": 16.7631, + "ISR": 29.685 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 6.12591, + "SIR": 15.0247, + "SAR": 6.41316, + "ISR": 10.4564 + }, + "instrumental": { + "SDR": 12.6403, + "SIR": 15.4023, + "SAR": 13.8415, + "ISR": 19.0921 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.07211, + "SIR": 17.0282, + "SAR": 7.84004, + "ISR": 10.7319 + }, + "instrumental": { + "SDR": 8.89794, + "SIR": 11.7736, + "SAR": 11.3839, + "ISR": 20.5617 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 3.98271, + "SIR": 15.9526, + "SAR": 2.77588, + "ISR": 6.02627 + }, + "instrumental": { + "SDR": 8.85549, + "SIR": 9.76054, + "SAR": 12.551, + "ISR": 25.0718 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 6.0344, + "SIR": 18.4441, + "SAR": 7.52487, + "ISR": 9.83313 + }, + "instrumental": { + "SDR": 11.3866, + "SIR": 14.4887, + "SAR": 14.6639, + "ISR": 16.9712 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 9.79018, + "SIR": 19.7083, + "SAR": 9.00709, + "ISR": 11.7792 + }, + "instrumental": { + "SDR": 9.9061, + "SIR": 11.8059, + "SAR": 9.81472, + "ISR": 22.7282 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 7.86472, + "SIR": 19.3687, + "SAR": 9.44389, + "ISR": 11.5758 + }, + "instrumental": { + "SDR": 10.948, + "SIR": 13.9173, + "SAR": 13.8063, + "ISR": 18.3349 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 9.23432, + "SIR": 28.5103, + "SAR": 9.78841, + "ISR": 14.6058 + }, + "instrumental": { + "SDR": 15.2896, + "SIR": 21.6052, + "SAR": 18.9097, + "ISR": 19.4016 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 2.94688, + "SIR": 10.3811, + "SAR": 4.72496, + "ISR": 7.40895 + }, + "instrumental": { + "SDR": 10.096, + "SIR": 13.317, + "SAR": 12.7108, + "ISR": 16.6326 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 11.2862, + "SIR": 20.929, + "SAR": 11.9025, + "ISR": 19.6779 + }, + "instrumental": { + "SDR": 18.0346, + "SIR": 26.1253, + "SAR": 18.7194, + "ISR": 27.3093 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 7.83779, + "SIR": 14.4903, + "SAR": 9.05255, + "ISR": 14.8196 + }, + "instrumental": { + "SDR": 7.71921, + "SIR": 12.9827, + "SAR": 9.56297, + "ISR": 15.0955 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 4.76004, + "SIR": 15.1232, + "SAR": 5.01898, + "ISR": 8.43216 + }, + "instrumental": { + "SDR": 10.1513, + "SIR": 13.3561, + "SAR": 13.0138, + "ISR": 21.4655 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.24156, + "SIR": 15.9899, + "SAR": 5.29469, + "ISR": 11.2274 + }, + "instrumental": { + "SDR": 12.2661, + "SIR": 18.222, + "SAR": 14.9786, + "ISR": 18.2719 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 7.33451, + "SIR": 23.5481, + "SAR": 7.67851, + "ISR": 11.4429 + }, + "instrumental": { + "SDR": 13.7794, + "SIR": 17.3813, + "SAR": 16.1219, + "ISR": 31.4248 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 8.30791, + "SIR": 24.0661, + "SAR": 8.46494, + "ISR": 10.6745 + }, + "instrumental": { + "SDR": 15.2415, + "SIR": 17.9436, + "SAR": 17.2388, + "ISR": 23.9917 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 6.8583, + "SIR": 20.7505, + "SAR": 7.33039, + "ISR": 11.1598 + }, + "instrumental": { + "SDR": 10.9788, + "SIR": 14.4968, + "SAR": 13.0092, + "ISR": 20.7857 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 6.38656, + "SIR": 18.1913, + "SAR": 7.05589, + "ISR": 11.4799 + }, + "instrumental": { + "SDR": 12.9472, + "SIR": 17.5936, + "SAR": 15.3739, + "ISR": 26.3415 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 6.8583, + "SIR": 18.2223, + "SAR": 7.05589, + "ISR": 10.7319 + }, + "instrumental": { + "SDR": 12.2661, + "SIR": 15.8607, + "SAR": 14.9786, + "ISR": 20.6921 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "MGM_LOWEND_A_v4.pth": { + "model_name": "VR Arch Single Model v4: MGM_LOWEND_A_v4", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.13243, + "SIR": 17.8811, + "SAR": 3.52338, + "ISR": 6.90286 + }, + "instrumental": { + "SDR": 14.9123, + "SIR": 18.3341, + "SAR": 19.4275, + "ISR": 18.9589 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 5.01049, + "SIR": 11.6772, + "SAR": 4.99365, + "ISR": 11.1504 + }, + "instrumental": { + "SDR": 9.92313, + "SIR": 16.3978, + "SAR": 11.7922, + "ISR": 15.0924 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.28529, + "SIR": 20.1487, + "SAR": 8.40583, + "ISR": 13.7556 + }, + "instrumental": { + "SDR": 14.6941, + "SIR": 19.9227, + "SAR": 16.4249, + "ISR": 20.4547 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.01528, + "SIR": 6.60106, + "SAR": 2.9223, + "ISR": 10.8273 + }, + "instrumental": { + "SDR": 12.0584, + "SIR": 19.6768, + "SAR": 13.8999, + "ISR": 18.3289 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 9.57182, + "SIR": 21.8357, + "SAR": 8.67216, + "ISR": 11.3473 + }, + "instrumental": { + "SDR": 12.4535, + "SIR": 13.2453, + "SAR": 13.1476, + "ISR": 26.0736 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.53133, + "SIR": 17.2874, + "SAR": 9.25447, + "ISR": 12.4147 + }, + "instrumental": { + "SDR": 10.8303, + "SIR": 14.2099, + "SAR": 13.3712, + "ISR": 21.4583 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 9.56681, + "SIR": 19.7166, + "SAR": 10.0536, + "ISR": 13.2565 + }, + "instrumental": { + "SDR": 14.1335, + "SIR": 17.5529, + "SAR": 15.9987, + "ISR": 25.523 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.6425, + "SIR": 22.1486, + "SAR": 6.80209, + "ISR": 9.2464 + }, + "instrumental": { + "SDR": 16.4815, + "SIR": 19.8195, + "SAR": 21.4317, + "ISR": 21.3385 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 8.42826, + "SIR": 23.8723, + "SAR": 9.52058, + "ISR": 12.0575 + }, + "instrumental": { + "SDR": 11.7044, + "SIR": 15.4715, + "SAR": 14.7534, + "ISR": 19.1443 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 8.29394, + "SIR": 19.6272, + "SAR": 6.56581, + "ISR": 8.88188 + }, + "instrumental": { + "SDR": 11.8858, + "SIR": 12.2884, + "SAR": 13.2998, + "ISR": 24.1904 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 9.58396, + "SIR": 22.3749, + "SAR": 10.2593, + "ISR": 15.5784 + }, + "instrumental": { + "SDR": 12.7627, + "SIR": 19.129, + "SAR": 14.0214, + "ISR": 22.4446 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.54848, + "SIR": 22.158, + "SAR": 8.83647, + "ISR": 12.5536 + }, + "instrumental": { + "SDR": 14.6306, + "SIR": 18.4423, + "SAR": 16.3813, + "ISR": 28.774 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 6.09956, + "SIR": 18.5909, + "SAR": 6.58563, + "ISR": 10.455 + }, + "instrumental": { + "SDR": 14.4724, + "SIR": 18.4273, + "SAR": 16.0907, + "ISR": 26.9517 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 7.40484, + "SIR": 19.7856, + "SAR": 8.05628, + "ISR": 12.0102 + }, + "instrumental": { + "SDR": 15.1953, + "SIR": 18.3612, + "SAR": 16.7126, + "ISR": 19.7958 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.78262, + "SIR": 18.0492, + "SAR": 2.43916, + "ISR": 5.81773 + }, + "instrumental": { + "SDR": 13.3299, + "SIR": 15.4156, + "SAR": 18.2056, + "ISR": 29.0077 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 7.84857, + "SIR": 19.6716, + "SAR": 8.56902, + "ISR": 12.9029 + }, + "instrumental": { + "SDR": 13.0481, + "SIR": 17.496, + "SAR": 15.3852, + "ISR": 18.9905 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.02299, + "SIR": 23.418, + "SAR": 4.71773, + "ISR": 7.52461 + }, + "instrumental": { + "SDR": 12.6876, + "SIR": 14.3308, + "SAR": 14.9073, + "ISR": 18.3955 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -0.114985, + "SIR": -31.3486, + "SAR": 0.006975, + "ISR": 0.24724 + }, + "instrumental": { + "SDR": 11.2202, + "SIR": 43.1697, + "SAR": 11.8595, + "ISR": 16.5294 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 5.44268, + "SIR": 17.1482, + "SAR": 4.85671, + "ISR": 7.38147 + }, + "instrumental": { + "SDR": 15.5769, + "SIR": 15.7796, + "SAR": 16.8969, + "ISR": 29.5096 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 7.26728, + "SIR": 19.0854, + "SAR": 6.91409, + "ISR": 9.86828 + }, + "instrumental": { + "SDR": 13.2125, + "SIR": 15.781, + "SAR": 16.5457, + "ISR": 19.6908 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 7.03903, + "SIR": 20.7411, + "SAR": 7.77303, + "ISR": 11.2687 + }, + "instrumental": { + "SDR": 16.9634, + "SIR": 20.7001, + "SAR": 19.1418, + "ISR": 29.3158 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -0.00017, + "SIR": -1.63019, + "SAR": 0.00015, + "ISR": 2.87582 + }, + "instrumental": { + "SDR": 18.7711, + "SIR": 36.8654, + "SAR": 25.0648, + "ISR": 18.2668 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.30796, + "SIR": 13.8603, + "SAR": 2.96534, + "ISR": 5.16448 + }, + "instrumental": { + "SDR": 10.3269, + "SIR": 11.9477, + "SAR": 15.8934, + "ISR": 19.8466 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.48658, + "SIR": 26.0277, + "SAR": 5.80744, + "ISR": 8.25719 + }, + "instrumental": { + "SDR": 13.5514, + "SIR": 15.6632, + "SAR": 16.4748, + "ISR": 17.6172 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 5.73863, + "SIR": 18.2641, + "SAR": 5.61624, + "ISR": 8.5719 + }, + "instrumental": { + "SDR": 13.6125, + "SIR": 16.3909, + "SAR": 17.0085, + "ISR": 28.3021 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 6.09681, + "SIR": 13.5978, + "SAR": 6.03586, + "ISR": 11.2977 + }, + "instrumental": { + "SDR": 13.9772, + "SIR": 17.1869, + "SAR": 14.6038, + "ISR": 22.7453 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.49884, + "SIR": 18.3407, + "SAR": 7.96366, + "ISR": 10.9161 + }, + "instrumental": { + "SDR": 9.24692, + "SIR": 12.0869, + "SAR": 11.5976, + "ISR": 20.9149 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 4.00739, + "SIR": 15.0319, + "SAR": 3.45595, + "ISR": 6.72136 + }, + "instrumental": { + "SDR": 10.1741, + "SIR": 12.034, + "SAR": 13.4391, + "ISR": 24.6053 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 6.40607, + "SIR": 18.1357, + "SAR": 8.03135, + "ISR": 11.1484 + }, + "instrumental": { + "SDR": 11.6303, + "SIR": 15.6059, + "SAR": 15.0191, + "ISR": 16.6834 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 10.839, + "SIR": 23.5971, + "SAR": 9.11615, + "ISR": 11.1671 + }, + "instrumental": { + "SDR": 10.1629, + "SIR": 10.6336, + "SAR": 9.45999, + "ISR": 25.1319 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 8.35571, + "SIR": 21.0869, + "SAR": 9.66289, + "ISR": 11.9206 + }, + "instrumental": { + "SDR": 11.4371, + "SIR": 14.3517, + "SAR": 13.9543, + "ISR": 18.6089 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 9.96153, + "SIR": 30.4023, + "SAR": 10.5443, + "ISR": 14.4086 + }, + "instrumental": { + "SDR": 15.1541, + "SIR": 21.7402, + "SAR": 19.0166, + "ISR": 19.286 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.07542, + "SIR": 7.56306, + "SAR": 7.57733, + "ISR": 9.30151 + }, + "instrumental": { + "SDR": 10.0495, + "SIR": 15.1149, + "SAR": 13.4573, + "ISR": 14.5596 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 11.4041, + "SIR": 21.3838, + "SAR": 11.4042, + "ISR": 20.0992 + }, + "instrumental": { + "SDR": 19.3969, + "SIR": 26.9726, + "SAR": 19.9276, + "ISR": 27.2555 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 6.46751, + "SIR": 14.82, + "SAR": 7.83257, + "ISR": 14.2496 + }, + "instrumental": { + "SDR": 8.51406, + "SIR": 13.584, + "SAR": 9.24146, + "ISR": 15.7104 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 5.53377, + "SIR": 17.2831, + "SAR": 5.35722, + "ISR": 9.61377 + }, + "instrumental": { + "SDR": 10.7176, + "SIR": 14.3966, + "SAR": 13.4694, + "ISR": 25.2204 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.55968, + "SIR": 17.0061, + "SAR": 6.07319, + "ISR": 11.2038 + }, + "instrumental": { + "SDR": 12.3794, + "SIR": 18.0994, + "SAR": 15.3898, + "ISR": 18.3958 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 7.78558, + "SIR": 24.8375, + "SAR": 8.25331, + "ISR": 12.0214 + }, + "instrumental": { + "SDR": 14.4666, + "SIR": 18.1075, + "SAR": 16.8944, + "ISR": 32.6386 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 8.36498, + "SIR": 24.764, + "SAR": 8.80443, + "ISR": 11.1303 + }, + "instrumental": { + "SDR": 16.1173, + "SIR": 19.6311, + "SAR": 18.1249, + "ISR": 24.2693 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 7.51972, + "SIR": 23.2259, + "SAR": 8.06198, + "ISR": 11.1239 + }, + "instrumental": { + "SDR": 11.3152, + "SIR": 14.5681, + "SAR": 13.4831, + "ISR": 22.397 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 6.98197, + "SIR": 19.5055, + "SAR": 7.73423, + "ISR": 11.6913 + }, + "instrumental": { + "SDR": 13.8241, + "SIR": 18.0304, + "SAR": 16.1106, + "ISR": 25.7671 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 6.98197, + "SIR": 19.5055, + "SAR": 7.73423, + "ISR": 11.1484 + }, + "instrumental": { + "SDR": 13.0481, + "SIR": 16.3978, + "SAR": 15.3898, + "ISR": 21.3385 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "MGM_LOWEND_B_v4.pth": { + "model_name": "VR Arch Single Model v4: MGM_LOWEND_B_v4", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 3.9675, + "SIR": 15.4909, + "SAR": 2.98769, + "ISR": 8.2918 + }, + "instrumental": { + "SDR": 14.8575, + "SIR": 19.7225, + "SAR": 17.7783, + "ISR": 18.5521 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 4.18477, + "SIR": 8.98029, + "SAR": 5.10279, + "ISR": 14.4782 + }, + "instrumental": { + "SDR": 8.99737, + "SIR": 19.4874, + "SAR": 10.5674, + "ISR": 13.0905 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.19721, + "SIR": 19.6505, + "SAR": 8.16066, + "ISR": 14.7074 + }, + "instrumental": { + "SDR": 14.3895, + "SIR": 20.9081, + "SAR": 15.9993, + "ISR": 19.1861 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.03057, + "SIR": 5.97143, + "SAR": 3.79114, + "ISR": 13.176 + }, + "instrumental": { + "SDR": 11.4174, + "SIR": 21.4517, + "SAR": 12.9543, + "ISR": 16.5193 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 9.87721, + "SIR": 20.2411, + "SAR": 8.90107, + "ISR": 13.5076 + }, + "instrumental": { + "SDR": 12.3989, + "SIR": 15.3159, + "SAR": 12.5643, + "ISR": 23.9658 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.47155, + "SIR": 15.8875, + "SAR": 8.90151, + "ISR": 14.6205 + }, + "instrumental": { + "SDR": 10.6876, + "SIR": 16.5728, + "SAR": 12.0138, + "ISR": 19.8179 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 9.43083, + "SIR": 18.8175, + "SAR": 9.63775, + "ISR": 15.2819 + }, + "instrumental": { + "SDR": 13.8531, + "SIR": 19.3671, + "SAR": 15.0126, + "ISR": 24.4046 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.27594, + "SIR": 19.6452, + "SAR": 4.86124, + "ISR": 10.1817 + }, + "instrumental": { + "SDR": 17.8908, + "SIR": 22.5699, + "SAR": 21.5551, + "ISR": 21.1843 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 7.53377, + "SIR": 18.714, + "SAR": 8.39711, + "ISR": 14.2194 + }, + "instrumental": { + "SDR": 11.0415, + "SIR": 17.8973, + "SAR": 13.1423, + "ISR": 17.2306 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 8.0754, + "SIR": 17.3445, + "SAR": 6.49397, + "ISR": 9.85213 + }, + "instrumental": { + "SDR": 12.0414, + "SIR": 13.146, + "SAR": 12.5185, + "ISR": 22.9792 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 9.61233, + "SIR": 21.3121, + "SAR": 9.94979, + "ISR": 18.7393 + }, + "instrumental": { + "SDR": 12.6227, + "SIR": 22.3657, + "SAR": 13.4869, + "ISR": 21.2047 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 10.0013, + "SIR": 21.2563, + "SAR": 9.29221, + "ISR": 14.8023 + }, + "instrumental": { + "SDR": 14.6, + "SIR": 20.8971, + "SAR": 15.4985, + "ISR": 27.4692 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 5.86578, + "SIR": 16.7447, + "SAR": 6.12781, + "ISR": 12.138 + }, + "instrumental": { + "SDR": 14.7448, + "SIR": 20.9252, + "SAR": 15.6285, + "ISR": 24.7113 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.12226, + "SIR": 19.1395, + "SAR": 8.25136, + "ISR": 13.8451 + }, + "instrumental": { + "SDR": 15.2615, + "SIR": 20.8518, + "SAR": 16.6748, + "ISR": 19.3368 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 1.5266, + "SIR": 15.0029, + "SAR": 1.55637, + "ISR": 6.61714 + }, + "instrumental": { + "SDR": 14.2654, + "SIR": 17.2336, + "SAR": 18.2078, + "ISR": 27.7387 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 7.63607, + "SIR": 17.4365, + "SAR": 8.15807, + "ISR": 15.5045 + }, + "instrumental": { + "SDR": 13.1067, + "SIR": 19.9996, + "SAR": 14.3959, + "ISR": 19.7474 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.04977, + "SIR": 21.8256, + "SAR": 3.57315, + "ISR": 8.35393 + }, + "instrumental": { + "SDR": 12.7275, + "SIR": 15.5956, + "SAR": 14.375, + "ISR": 18.0402 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -27.2884, + "SIR": -38.3822, + "SAR": 0.09529, + "ISR": 2.00992 + }, + "instrumental": { + "SDR": 9.76453, + "SIR": 45.8066, + "SAR": 10.1319, + "ISR": 13.6418 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 5.17251, + "SIR": 14.8962, + "SAR": 4.38671, + "ISR": 8.5191 + }, + "instrumental": { + "SDR": 15.6384, + "SIR": 17.279, + "SAR": 16.2987, + "ISR": 27.1687 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 7.95101, + "SIR": 18.7905, + "SAR": 7.62096, + "ISR": 11.8259 + }, + "instrumental": { + "SDR": 12.9312, + "SIR": 17.3149, + "SAR": 15.1922, + "ISR": 19.374 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 9.37826, + "SIR": 20.6571, + "SAR": 10.0759, + "ISR": 15.7293 + }, + "instrumental": { + "SDR": 16.3204, + "SIR": 22.4937, + "SAR": 17.4025, + "ISR": 27.7919 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 0.057635, + "SIR": 6.61954, + "SAR": 0.013615, + "ISR": 5.32883 + }, + "instrumental": { + "SDR": 16.7593, + "SIR": 24.2327, + "SAR": 22.5662, + "ISR": 18.3651 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.41033, + "SIR": 14.2618, + "SAR": 2.79349, + "ISR": 5.5282 + }, + "instrumental": { + "SDR": 10.3692, + "SIR": 12.3214, + "SAR": 15.2233, + "ISR": 19.4368 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 0.40881, + "SIR": 22.0028, + "SAR": 0.55808, + "ISR": 7.29613 + }, + "instrumental": { + "SDR": 15.308, + "SIR": 19.6869, + "SAR": 17.0789, + "ISR": 22.01 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 5.71273, + "SIR": 17.7328, + "SAR": 5.24679, + "ISR": 9.34773 + }, + "instrumental": { + "SDR": 13.6351, + "SIR": 17.1453, + "SAR": 16.0849, + "ISR": 27.5017 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 6.0391, + "SIR": 14.0093, + "SAR": 5.92357, + "ISR": 13.8404 + }, + "instrumental": { + "SDR": 14.2006, + "SIR": 19.9166, + "SAR": 13.9145, + "ISR": 21.4495 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.97044, + "SIR": 17.3459, + "SAR": 8.20739, + "ISR": 13.0825 + }, + "instrumental": { + "SDR": 9.66595, + "SIR": 14.4362, + "SAR": 10.9794, + "ISR": 19.8647 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 3.66267, + "SIR": 12.2592, + "SAR": 2.98286, + "ISR": 8.7549 + }, + "instrumental": { + "SDR": 10.3507, + "SIR": 13.8424, + "SAR": 11.6756, + "ISR": 20.9727 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 6.2687, + "SIR": 18.0036, + "SAR": 7.73318, + "ISR": 11.5953 + }, + "instrumental": { + "SDR": 11.9078, + "SIR": 16.0322, + "SAR": 14.7308, + "ISR": 16.4761 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 10.4236, + "SIR": 21.0483, + "SAR": 9.07507, + "ISR": 12.3294 + }, + "instrumental": { + "SDR": 11.3963, + "SIR": 12.7783, + "SAR": 9.89462, + "ISR": 22.8778 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 8.2711, + "SIR": 18.9436, + "SAR": 9.15173, + "ISR": 12.8451 + }, + "instrumental": { + "SDR": 11.7588, + "SIR": 17.0153, + "SAR": 13.8067, + "ISR": 17.7302 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 9.40316, + "SIR": 27.7491, + "SAR": 9.81864, + "ISR": 15.1854 + }, + "instrumental": { + "SDR": 15.0068, + "SIR": 23.1889, + "SAR": 18.3981, + "ISR": 19.178 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 1.68018, + "SIR": 6.6671, + "SAR": 6.51245, + "ISR": 9.19247 + }, + "instrumental": { + "SDR": 9.51619, + "SIR": 15.1478, + "SAR": 11.8799, + "ISR": 14.3974 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 11.6671, + "SIR": 20.7408, + "SAR": 11.6936, + "ISR": 21.6505 + }, + "instrumental": { + "SDR": 19.9837, + "SIR": 29.7667, + "SAR": 20.4837, + "ISR": 26.127 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 8.45481, + "SIR": 13.4013, + "SAR": 9.46919, + "ISR": 18.6245 + }, + "instrumental": { + "SDR": 7.83593, + "SIR": 16.5367, + "SAR": 8.7138, + "ISR": 13.1285 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 5.11995, + "SIR": 15.5337, + "SAR": 4.99059, + "ISR": 11.1439 + }, + "instrumental": { + "SDR": 10.7257, + "SIR": 15.8819, + "SAR": 12.3394, + "ISR": 22.7387 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 4.63972, + "SIR": 12.162, + "SAR": 4.69649, + "ISR": 13.5619 + }, + "instrumental": { + "SDR": 14.8, + "SIR": 24.2831, + "SAR": 17.1415, + "ISR": 17.787 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 7.64777, + "SIR": 22.8761, + "SAR": 7.6792, + "ISR": 14.3182 + }, + "instrumental": { + "SDR": 15.5046, + "SIR": 21.6225, + "SAR": 16.5703, + "ISR": 30.4884 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 7.92042, + "SIR": 22.5185, + "SAR": 8.14133, + "ISR": 11.7341 + }, + "instrumental": { + "SDR": 16.9359, + "SIR": 21.5351, + "SAR": 17.9104, + "ISR": 23.6473 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 7.65147, + "SIR": 17.7581, + "SAR": 8.14693, + "ISR": 14.4044 + }, + "instrumental": { + "SDR": 11.5437, + "SIR": 18.1257, + "SAR": 12.7496, + "ISR": 18.9138 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 7.05077, + "SIR": 17.7585, + "SAR": 7.3985, + "ISR": 14.2439 + }, + "instrumental": { + "SDR": 13.7162, + "SIR": 20.4682, + "SAR": 15.4043, + "ISR": 24.2121 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 7.53377, + "SIR": 17.7581, + "SAR": 7.62096, + "ISR": 13.0825 + }, + "instrumental": { + "SDR": 13.1067, + "SIR": 19.4874, + "SAR": 15.0126, + "ISR": 19.8647 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "MGM_MAIN_v4.pth": { + "model_name": "VR Arch Single Model v4: MGM_MAIN_v4", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 3.72751, + "SIR": 19.3325, + "SAR": 3.02685, + "ISR": 5.7645 + }, + "instrumental": { + "SDR": 14.4502, + "SIR": 16.2785, + "SAR": 19.0347, + "ISR": 19.0905 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 4.93812, + "SIR": 11.2323, + "SAR": 4.85155, + "ISR": 11.141 + }, + "instrumental": { + "SDR": 10.0664, + "SIR": 16.3012, + "SAR": 11.9555, + "ISR": 14.8655 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.16094, + "SIR": 20.438, + "SAR": 8.07798, + "ISR": 13.3923 + }, + "instrumental": { + "SDR": 14.3901, + "SIR": 19.4143, + "SAR": 16.3201, + "ISR": 21.1946 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 1.52928, + "SIR": 6.37677, + "SAR": 2.83622, + "ISR": 11.7858 + }, + "instrumental": { + "SDR": 12.1292, + "SIR": 20.3967, + "SAR": 13.5529, + "ISR": 17.6903 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 8.76107, + "SIR": 21.6031, + "SAR": 7.86276, + "ISR": 10.1576 + }, + "instrumental": { + "SDR": 11.5998, + "SIR": 12.3408, + "SAR": 12.3839, + "ISR": 21.7458 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.00859, + "SIR": 16.1299, + "SAR": 8.60872, + "ISR": 11.5513 + }, + "instrumental": { + "SDR": 10.3294, + "SIR": 13.4008, + "SAR": 12.982, + "ISR": 19.5907 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 8.84357, + "SIR": 18.8094, + "SAR": 9.44955, + "ISR": 12.5665 + }, + "instrumental": { + "SDR": 13.5357, + "SIR": 16.7158, + "SAR": 15.5266, + "ISR": 24.008 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 3.16387, + "SIR": 17.5026, + "SAR": 2.68586, + "ISR": 6.48377 + }, + "instrumental": { + "SDR": 18.2006, + "SIR": 20.6321, + "SAR": 22.5002, + "ISR": 21.4237 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 7.59771, + "SIR": 21.2194, + "SAR": 9.04271, + "ISR": 11.3929 + }, + "instrumental": { + "SDR": 11.0731, + "SIR": 14.7194, + "SAR": 14.7213, + "ISR": 17.2514 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 7.25806, + "SIR": 17.4758, + "SAR": 5.81589, + "ISR": 8.32099 + }, + "instrumental": { + "SDR": 11.511, + "SIR": 11.8528, + "SAR": 13.1743, + "ISR": 24.432 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 9.13442, + "SIR": 21.143, + "SAR": 9.85519, + "ISR": 14.5355 + }, + "instrumental": { + "SDR": 12.3455, + "SIR": 18.0624, + "SAR": 13.9838, + "ISR": 21.6233 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.20097, + "SIR": 21.9655, + "SAR": 8.5321, + "ISR": 11.9622 + }, + "instrumental": { + "SDR": 14.5048, + "SIR": 17.8594, + "SAR": 16.2637, + "ISR": 29.3976 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 5.11146, + "SIR": 17.0105, + "SAR": 5.66823, + "ISR": 9.53944 + }, + "instrumental": { + "SDR": 14.2027, + "SIR": 17.8198, + "SAR": 16.1186, + "ISR": 26.0773 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 6.42413, + "SIR": 18.3399, + "SAR": 7.00236, + "ISR": 11.0991 + }, + "instrumental": { + "SDR": 16.3683, + "SIR": 19.6921, + "SAR": 18.3173, + "ISR": 20.5266 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.33923, + "SIR": 19.644, + "SAR": 2.58578, + "ISR": 5.05855 + }, + "instrumental": { + "SDR": 12.214, + "SIR": 13.4413, + "SAR": 17.8915, + "ISR": 29.7868 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 7.26483, + "SIR": 18.0463, + "SAR": 8.03526, + "ISR": 12.3866 + }, + "instrumental": { + "SDR": 12.6025, + "SIR": 17.0558, + "SAR": 14.8997, + "ISR": 18.6994 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 5.84903, + "SIR": 23.6097, + "SAR": 3.9548, + "ISR": 7.16666 + }, + "instrumental": { + "SDR": 12.7725, + "SIR": 13.8488, + "SAR": 15.413, + "ISR": 19.9839 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -1.92375, + "SIR": -31.4327, + "SAR": 0.041725, + "ISR": -3.61074 + }, + "instrumental": { + "SDR": 12.3915, + "SIR": 42.7212, + "SAR": 12.5109, + "ISR": 16.3128 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 5.34504, + "SIR": 15.6529, + "SAR": 4.47412, + "ISR": 7.24422 + }, + "instrumental": { + "SDR": 15.32, + "SIR": 15.824, + "SAR": 17.1089, + "ISR": 28.6607 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 6.21079, + "SIR": 17.9775, + "SAR": 5.92651, + "ISR": 8.64818 + }, + "instrumental": { + "SDR": 12.4077, + "SIR": 14.6662, + "SAR": 16.3658, + "ISR": 19.3588 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 6.46199, + "SIR": 18.9667, + "SAR": 7.11996, + "ISR": 10.8521 + }, + "instrumental": { + "SDR": 16.7341, + "SIR": 19.7769, + "SAR": 18.7759, + "ISR": 29.2885 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 4.00896, + "SIR": 18.5584, + "SAR": 4.45391, + "ISR": 7.63199 + }, + "instrumental": { + "SDR": 12.2802, + "SIR": 14.6967, + "SAR": 16.2287, + "ISR": 18.3484 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.21881, + "SIR": 14.5053, + "SAR": 2.58359, + "ISR": 4.80248 + }, + "instrumental": { + "SDR": 10.286, + "SIR": 11.5562, + "SAR": 15.9917, + "ISR": 20.3889 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 1.49386, + "SIR": 24.383, + "SAR": 1.46818, + "ISR": 6.15781 + }, + "instrumental": { + "SDR": 13.3489, + "SIR": 15.2595, + "SAR": 15.8608, + "ISR": 20.1041 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 5.49918, + "SIR": 17.8586, + "SAR": 5.20316, + "ISR": 8.21143 + }, + "instrumental": { + "SDR": 13.3516, + "SIR": 15.9547, + "SAR": 16.8832, + "ISR": 29.2472 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 6.22036, + "SIR": 16.3489, + "SAR": 6.45505, + "ISR": 9.94314 + }, + "instrumental": { + "SDR": 12.407, + "SIR": 14.8574, + "SAR": 14.09, + "ISR": 18.219 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.0678, + "SIR": 17.7307, + "SAR": 7.52551, + "ISR": 10.0548 + }, + "instrumental": { + "SDR": 8.76977, + "SIR": 11.297, + "SAR": 11.7032, + "ISR": 21.4769 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 3.44285, + "SIR": 16.5906, + "SAR": 2.22127, + "ISR": 5.59199 + }, + "instrumental": { + "SDR": 9.2545, + "SIR": 10.2319, + "SAR": 13.3096, + "ISR": 26.8723 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 6.10568, + "SIR": 19.2287, + "SAR": 7.50866, + "ISR": 9.68112 + }, + "instrumental": { + "SDR": 11.7628, + "SIR": 14.5098, + "SAR": 15.2705, + "ISR": 17.1468 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 9.52713, + "SIR": 21.2175, + "SAR": 8.31681, + "ISR": 10.2352 + }, + "instrumental": { + "SDR": 10.6359, + "SIR": 10.8487, + "SAR": 10.1175, + "ISR": 23.7012 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 7.7169, + "SIR": 19.945, + "SAR": 9.04383, + "ISR": 11.1351 + }, + "instrumental": { + "SDR": 11.2638, + "SIR": 14.0299, + "SAR": 14.1432, + "ISR": 18.1826 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 8.97752, + "SIR": 28.5569, + "SAR": 9.53626, + "ISR": 13.7075 + }, + "instrumental": { + "SDR": 15.598, + "SIR": 21.3313, + "SAR": 19.5473, + "ISR": 19.4505 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 1.49437, + "SIR": 7.96427, + "SAR": 4.70645, + "ISR": 7.82138 + }, + "instrumental": { + "SDR": 9.70192, + "SIR": 13.8198, + "SAR": 12.1401, + "ISR": 15.7106 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.6451, + "SIR": 22.6737, + "SAR": 12.9176, + "ISR": 20.3813 + }, + "instrumental": { + "SDR": 17.5965, + "SIR": 26.5817, + "SAR": 19.2761, + "ISR": 22.1355 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 5.91792, + "SIR": 14.6471, + "SAR": 6.29621, + "ISR": 11.9181 + }, + "instrumental": { + "SDR": 8.26272, + "SIR": 11.2704, + "SAR": 9.3395, + "ISR": 16.2706 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 5.0247, + "SIR": 16.1999, + "SAR": 5.22332, + "ISR": 8.58522 + }, + "instrumental": { + "SDR": 10.0845, + "SIR": 13.1151, + "SAR": 13.2975, + "ISR": 17.5689 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.02464, + "SIR": 15.6789, + "SAR": 5.49276, + "ISR": 10.7681 + }, + "instrumental": { + "SDR": 13.0376, + "SIR": 18.2861, + "SAR": 15.9109, + "ISR": 18.6434 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 7.05676, + "SIR": 23.5922, + "SAR": 7.31123, + "ISR": 10.7171 + }, + "instrumental": { + "SDR": 14.2453, + "SIR": 17.3097, + "SAR": 16.8613, + "ISR": 31.4261 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 7.55171, + "SIR": 24.4466, + "SAR": 8.02854, + "ISR": 10.3788 + }, + "instrumental": { + "SDR": 15.6177, + "SIR": 18.6118, + "SAR": 17.9461, + "ISR": 24.1905 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 6.68651, + "SIR": 21.0149, + "SAR": 7.10741, + "ISR": 10.286 + }, + "instrumental": { + "SDR": 11.0247, + "SIR": 13.8353, + "SAR": 13.196, + "ISR": 21.0399 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 6.41377, + "SIR": 19.0187, + "SAR": 7.49891, + "ISR": 10.5788 + }, + "instrumental": { + "SDR": 13.4717, + "SIR": 16.9355, + "SAR": 16.4662, + "ISR": 27.2967 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 6.22036, + "SIR": 18.5584, + "SAR": 6.45505, + "ISR": 10.2352 + }, + "instrumental": { + "SDR": 12.407, + "SIR": 15.824, + "SAR": 15.5266, + "ISR": 20.5266 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "UVR-De-Reverb-aufr33-jarredou.pth": { + "model_name": "VR Arch Single Model v4: UVR-De-Reverb by aufr33-jarredou", + "track_scores": [], + "median_scores": {}, + "stems": [ + "dry", + "no dry" + ], + "target_stem": "dry" + }, + "UVR-MDX-NET-Inst_HQ_1.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET Inst HQ 1", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.26685, + "SIR": 19.0489, + "SAR": 5.43294, + "ISR": 9.16527 + }, + "instrumental": { + "SDR": 16.5292, + "SIR": 23.6979, + "SAR": 19.953, + "ISR": 18.9037 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.86386, + "SIR": 13.8367, + "SAR": 7.1304, + "ISR": 12.6514 + }, + "instrumental": { + "SDR": 12.1846, + "SIR": 21.8827, + "SAR": 13.5634, + "ISR": 15.4953 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.1999, + "SIR": 23.0466, + "SAR": 10.8199, + "ISR": 15.0797 + }, + "instrumental": { + "SDR": 15.8466, + "SIR": 26.4202, + "SAR": 18.2384, + "ISR": 18.5543 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.95429, + "SIR": 7.6728, + "SAR": 3.88337, + "ISR": 12.6449 + }, + "instrumental": { + "SDR": 11.8948, + "SIR": 24.7515, + "SAR": 13.8385, + "ISR": 14.7255 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.0403, + "SIR": 23.9019, + "SAR": 12.8167, + "ISR": 15.3731 + }, + "instrumental": { + "SDR": 14.6085, + "SIR": 22.8054, + "SAR": 15.6456, + "ISR": 17.6908 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.0709, + "SIR": 18.4542, + "SAR": 10.8027, + "ISR": 14.7364 + }, + "instrumental": { + "SDR": 11.8133, + "SIR": 21.9553, + "SAR": 13.3612, + "ISR": 15.9441 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.5136, + "SIR": 20.4814, + "SAR": 12.7098, + "ISR": 15.0266 + }, + "instrumental": { + "SDR": 15.0808, + "SIR": 24.0066, + "SAR": 17.1985, + "ISR": 17.9199 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.18142, + "SIR": 20.0956, + "SAR": 5.77096, + "ISR": 8.66334 + }, + "instrumental": { + "SDR": 18.1059, + "SIR": 28.3377, + "SAR": 23.2815, + "ISR": 19.6012 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.3083, + "SIR": 30.5521, + "SAR": 13.0685, + "ISR": 16.7141 + }, + "instrumental": { + "SDR": 15.2996, + "SIR": 28.1532, + "SAR": 17.4646, + "ISR": 18.9256 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.7491, + "SIR": 23.8969, + "SAR": 9.72104, + "ISR": 11.5543 + }, + "instrumental": { + "SDR": 15.7543, + "SIR": 17.5154, + "SAR": 15.2486, + "ISR": 18.2727 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.6417, + "SIR": 34.6714, + "SAR": 16.3188, + "ISR": 18.0275 + }, + "instrumental": { + "SDR": 16.9108, + "SIR": 31.3944, + "SAR": 19.6994, + "ISR": 19.5486 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.2439, + "SIR": 22.8843, + "SAR": 11.4796, + "ISR": 15.1462 + }, + "instrumental": { + "SDR": 15.402, + "SIR": 26.161, + "SAR": 17.3659, + "ISR": 18.5137 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.62232, + "SIR": 20.2482, + "SAR": 7.98341, + "ISR": 12.8985 + }, + "instrumental": { + "SDR": 15.6625, + "SIR": 25.5025, + "SAR": 17.6297, + "ISR": 18.17 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.48818, + "SIR": 22.6401, + "SAR": 11.071, + "ISR": 11.7065 + }, + "instrumental": { + "SDR": 16.183, + "SIR": 23.0783, + "SAR": 20.5218, + "ISR": 18.5062 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.38401, + "SIR": 17.3352, + "SAR": 3.26781, + "ISR": 9.07339 + }, + "instrumental": { + "SDR": 15.2362, + "SIR": 22.1474, + "SAR": 18.6295, + "ISR": 18.7399 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 8.78618, + "SIR": 17.6177, + "SAR": 9.34869, + "ISR": 14.7436 + }, + "instrumental": { + "SDR": 12.9056, + "SIR": 24.387, + "SAR": 14.516, + "ISR": 16.5355 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.59081, + "SIR": 22.6088, + "SAR": 8.75701, + "ISR": 13.5122 + }, + "instrumental": { + "SDR": 14.8771, + "SIR": 24.6355, + "SAR": 17.2345, + "ISR": 18.7096 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -14.1935, + "SIR": -36.4567, + "SAR": 0.314075, + "ISR": 11.102 + }, + "instrumental": { + "SDR": 12.6646, + "SIR": 57.5533, + "SAR": 12.6339, + "ISR": 12.7074 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.01401, + "SIR": 15.9968, + "SAR": 6.57059, + "ISR": 10.5887 + }, + "instrumental": { + "SDR": 15.8938, + "SIR": 21.4246, + "SAR": 17.7676, + "ISR": 17.9455 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.9738, + "SIR": 24.5406, + "SAR": 11.1928, + "ISR": 14.9648 + }, + "instrumental": { + "SDR": 15.7663, + "SIR": 25.8849, + "SAR": 17.8359, + "ISR": 18.8504 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.1398, + "SIR": 22.6288, + "SAR": 10.7266, + "ISR": 15.6327 + }, + "instrumental": { + "SDR": 17.1908, + "SIR": 30.6531, + "SAR": 20.4712, + "ISR": 19.0078 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -10.6104, + "SIR": -7.99531, + "SAR": 0.11591, + "ISR": 8.1445 + }, + "instrumental": { + "SDR": 19.2292, + "SIR": 40.8291, + "SAR": 29.1592, + "ISR": 18.7721 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.02899, + "SIR": 15.6366, + "SAR": 3.74437, + "ISR": 6.1774 + }, + "instrumental": { + "SDR": 10.7603, + "SIR": 13.8704, + "SAR": 14.6637, + "ISR": 17.6305 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.50677, + "SIR": 17.7859, + "SAR": 5.96917, + "ISR": 12.0982 + }, + "instrumental": { + "SDR": 17.6279, + "SIR": 28.1053, + "SAR": 20.639, + "ISR": 19.0337 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.61954, + "SIR": 19.641, + "SAR": 7.83261, + "ISR": 11.2693 + }, + "instrumental": { + "SDR": 14.5554, + "SIR": 21.8735, + "SAR": 17.228, + "ISR": 18.5753 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.47519, + "SIR": 17.9245, + "SAR": 8.86247, + "ISR": 14.0049 + }, + "instrumental": { + "SDR": 15.4927, + "SIR": 25.3263, + "SAR": 16.9752, + "ISR": 17.7823 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.526, + "SIR": 25.3446, + "SAR": 12.1187, + "ISR": 14.5452 + }, + "instrumental": { + "SDR": 13.1298, + "SIR": 21.3466, + "SAR": 14.3429, + "ISR": 17.8006 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.34312, + "SIR": 15.5056, + "SAR": 6.22015, + "ISR": 10.7062 + }, + "instrumental": { + "SDR": 12.4187, + "SIR": 18.2033, + "SAR": 13.5888, + "ISR": 16.0094 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 6.33572, + "SIR": 6.25176, + "SAR": 7.65442, + "ISR": 14.8568 + }, + "instrumental": { + "SDR": 12.1484, + "SIR": 22.8804, + "SAR": 12.9362, + "ISR": 13.4223 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.5018, + "SIR": 30.7089, + "SAR": 14.2291, + "ISR": 15.8441 + }, + "instrumental": { + "SDR": 14.9845, + "SIR": 20.4726, + "SAR": 14.6665, + "ISR": 19.0178 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.093, + "SIR": 24.8229, + "SAR": 11.6782, + "ISR": 15.1569 + }, + "instrumental": { + "SDR": 14.2491, + "SIR": 23.4368, + "SAR": 15.6673, + "ISR": 17.9126 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.5012, + "SIR": 26.6218, + "SAR": 12.1428, + "ISR": 14.8729 + }, + "instrumental": { + "SDR": 17.2478, + "SIR": 27.3377, + "SAR": 21.4549, + "ISR": 18.9566 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 0.46905, + "SIR": 11.5357, + "SAR": 0.40599, + "ISR": 7.44792 + }, + "instrumental": { + "SDR": 10.4402, + "SIR": 14.5972, + "SAR": 11.2779, + "ISR": 16.9035 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.7932, + "SIR": 29.1664, + "SAR": 13.8629, + "ISR": 17.3101 + }, + "instrumental": { + "SDR": 18.8257, + "SIR": 34.4168, + "SAR": 24.75, + "ISR": 19.711 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.976, + "SIR": 21.0465, + "SAR": 12.048, + "ISR": 16.0109 + }, + "instrumental": { + "SDR": 11.5617, + "SIR": 22.1389, + "SAR": 12.4756, + "ISR": 15.6336 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.17875, + "SIR": 25.829, + "SAR": 8.23288, + "ISR": 12.9425 + }, + "instrumental": { + "SDR": 13.9527, + "SIR": 21.8677, + "SAR": 15.3017, + "ISR": 18.5297 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.94406, + "SIR": 7.7746, + "SAR": 1.98949, + "ISR": 9.89117 + }, + "instrumental": { + "SDR": 17.9691, + "SIR": 30.6376, + "SAR": 22.0327, + "ISR": 18.2674 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.1519, + "SIR": 27.509, + "SAR": 10.5958, + "ISR": 15.5151 + }, + "instrumental": { + "SDR": 17.126, + "SIR": 30.0009, + "SAR": 20.3964, + "ISR": 19.2701 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.1509, + "SIR": 30.7697, + "SAR": 11.6768, + "ISR": 15.3188 + }, + "instrumental": { + "SDR": 17.924, + "SIR": 29.885, + "SAR": 21.8401, + "ISR": 19.5461 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 13.217, + "SIR": 30.7074, + "SAR": 13.6792, + "ISR": 16.5262 + }, + "instrumental": { + "SDR": 15.629, + "SIR": 25.9143, + "SAR": 17.2054, + "ISR": 18.9425 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 10.7964, + "SIR": 23.8375, + "SAR": 11.249, + "ISR": 16.2143 + }, + "instrumental": { + "SDR": 16.1787, + "SIR": 29.1949, + "SAR": 18.98, + "ISR": 18.8066 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.78618, + "SIR": 21.0465, + "SAR": 9.72104, + "ISR": 14.5452 + }, + "instrumental": { + "SDR": 15.402, + "SIR": 24.6355, + "SAR": 17.2345, + "ISR": 18.5137 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "UVR-MDX-NET-Inst_HQ_2.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET Inst HQ 2", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.75013, + "SIR": 18.1092, + "SAR": 5.6745, + "ISR": 10.305 + }, + "instrumental": { + "SDR": 16.5295, + "SIR": 25.0494, + "SAR": 19.9577, + "ISR": 18.7263 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.25193, + "SIR": 10.5995, + "SAR": 6.92066, + "ISR": 13.4755 + }, + "instrumental": { + "SDR": 11.1988, + "SIR": 23.0424, + "SAR": 12.6725, + "ISR": 13.847 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.2148, + "SIR": 21.3804, + "SAR": 10.8151, + "ISR": 15.369 + }, + "instrumental": { + "SDR": 15.6513, + "SIR": 27.1273, + "SAR": 18.1712, + "ISR": 18.0733 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.22032, + "SIR": 5.78212, + "SAR": 4.25469, + "ISR": 13.5468 + }, + "instrumental": { + "SDR": 10.9118, + "SIR": 26.2213, + "SAR": 13.0931, + "ISR": 13.3895 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.2178, + "SIR": 22.3866, + "SAR": 13.3185, + "ISR": 16.2224 + }, + "instrumental": { + "SDR": 14.7686, + "SIR": 24.8618, + "SAR": 15.7859, + "ISR": 17.1019 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.0235, + "SIR": 17.9669, + "SAR": 10.9328, + "ISR": 14.9252 + }, + "instrumental": { + "SDR": 11.8309, + "SIR": 22.3207, + "SAR": 13.4408, + "ISR": 15.6294 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.592, + "SIR": 20.4494, + "SAR": 12.7341, + "ISR": 15.1387 + }, + "instrumental": { + "SDR": 15.0605, + "SIR": 24.1589, + "SAR": 17.1633, + "ISR": 17.7572 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.41811, + "SIR": 19.0141, + "SAR": 5.64387, + "ISR": 8.20029 + }, + "instrumental": { + "SDR": 17.8129, + "SIR": 28.1003, + "SAR": 23.531, + "ISR": 19.2944 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.3787, + "SIR": 30.0504, + "SAR": 13.1581, + "ISR": 16.795 + }, + "instrumental": { + "SDR": 15.3285, + "SIR": 28.4907, + "SAR": 17.5272, + "ISR": 18.8554 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.8534, + "SIR": 21.4323, + "SAR": 10.5037, + "ISR": 12.5056 + }, + "instrumental": { + "SDR": 15.5767, + "SIR": 19.1949, + "SAR": 15.7617, + "ISR": 17.6246 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.7439, + "SIR": 31.6311, + "SAR": 16.5139, + "ISR": 18.1119 + }, + "instrumental": { + "SDR": 16.5368, + "SIR": 31.9364, + "SAR": 19.5184, + "ISR": 19.0697 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.4341, + "SIR": 21.4683, + "SAR": 11.6368, + "ISR": 15.2359 + }, + "instrumental": { + "SDR": 15.2523, + "SIR": 25.9826, + "SAR": 17.4633, + "ISR": 18.0557 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.57684, + "SIR": 19.7919, + "SAR": 8.08266, + "ISR": 13.4371 + }, + "instrumental": { + "SDR": 15.5119, + "SIR": 26.3783, + "SAR": 17.7314, + "ISR": 17.8069 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.14174, + "SIR": 20.8594, + "SAR": 10.9994, + "ISR": 11.7026 + }, + "instrumental": { + "SDR": 15.8888, + "SIR": 23.4503, + "SAR": 19.4485, + "ISR": 17.8789 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.3453, + "SIR": 15.9079, + "SAR": 3.26428, + "ISR": 9.49522 + }, + "instrumental": { + "SDR": 14.8953, + "SIR": 22.7308, + "SAR": 18.2017, + "ISR": 18.3418 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 8.7616, + "SIR": 17.0676, + "SAR": 9.41335, + "ISR": 15.0365 + }, + "instrumental": { + "SDR": 12.7658, + "SIR": 25.0631, + "SAR": 14.5017, + "ISR": 16.255 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.64321, + "SIR": 21.5826, + "SAR": 8.85857, + "ISR": 13.7613 + }, + "instrumental": { + "SDR": 14.7159, + "SIR": 25.0438, + "SAR": 17.0628, + "ISR": 18.3133 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -12.9311, + "SIR": -34.6845, + "SAR": 0.44717, + "ISR": 11.6692 + }, + "instrumental": { + "SDR": 14.167, + "SIR": 57.9273, + "SAR": 15.0911, + "ISR": 14.0964 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.71139, + "SIR": 14.0424, + "SAR": 6.47662, + "ISR": 11.2724 + }, + "instrumental": { + "SDR": 15.7111, + "SIR": 22.3648, + "SAR": 17.6089, + "ISR": 17.0999 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.055, + "SIR": 23.6487, + "SAR": 11.3556, + "ISR": 15.038 + }, + "instrumental": { + "SDR": 15.7785, + "SIR": 26.0834, + "SAR": 18.1416, + "ISR": 18.6006 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.4457, + "SIR": 21.7137, + "SAR": 11.0581, + "ISR": 15.8732 + }, + "instrumental": { + "SDR": 17.0851, + "SIR": 30.946, + "SAR": 20.6105, + "ISR": 18.6987 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -8.89141, + "SIR": -6.61302, + "SAR": -0.53875, + "ISR": 6.34526 + }, + "instrumental": { + "SDR": 19.3864, + "SIR": 41.3587, + "SAR": 28.1256, + "ISR": 18.8042 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.13095, + "SIR": 14.4451, + "SAR": 3.91932, + "ISR": 6.58308 + }, + "instrumental": { + "SDR": 10.7107, + "SIR": 14.3284, + "SAR": 14.5143, + "ISR": 17.0436 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.35816, + "SIR": 16.4118, + "SAR": 6.44462, + "ISR": 12.7408 + }, + "instrumental": { + "SDR": 17.4328, + "SIR": 29.2, + "SAR": 20.3177, + "ISR": 18.6126 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.66077, + "SIR": 18.2472, + "SAR": 8.01908, + "ISR": 11.7037 + }, + "instrumental": { + "SDR": 14.4873, + "SIR": 22.4413, + "SAR": 17.3787, + "ISR": 18.0918 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.65901, + "SIR": 17.9711, + "SAR": 9.0448, + "ISR": 14.2412 + }, + "instrumental": { + "SDR": 15.1546, + "SIR": 25.6346, + "SAR": 16.7448, + "ISR": 17.5825 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.4329, + "SIR": 24.1807, + "SAR": 12.1309, + "ISR": 14.8873 + }, + "instrumental": { + "SDR": 13.1586, + "SIR": 21.9866, + "SAR": 14.3689, + "ISR": 17.4333 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.71024, + "SIR": 16.6967, + "SAR": 6.41049, + "ISR": 10.7304 + }, + "instrumental": { + "SDR": 12.9114, + "SIR": 18.192, + "SAR": 13.7687, + "ISR": 16.4708 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 6.35064, + "SIR": 6.27276, + "SAR": 7.74583, + "ISR": 15.2688 + }, + "instrumental": { + "SDR": 12.1029, + "SIR": 23.6844, + "SAR": 13.0589, + "ISR": 13.3144 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.5135, + "SIR": 29.3897, + "SAR": 14.199, + "ISR": 15.7632 + }, + "instrumental": { + "SDR": 14.8891, + "SIR": 20.6328, + "SAR": 14.7286, + "ISR": 18.5527 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.4348, + "SIR": 23.7673, + "SAR": 11.9227, + "ISR": 15.5388 + }, + "instrumental": { + "SDR": 14.2276, + "SIR": 24.1166, + "SAR": 15.9378, + "ISR": 17.5278 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.8745, + "SIR": 25.3945, + "SAR": 12.4421, + "ISR": 15.6904 + }, + "instrumental": { + "SDR": 17.3909, + "SIR": 28.9113, + "SAR": 21.647, + "ISR": 18.9789 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 1.70417, + "SIR": 10.4575, + "SAR": 1.68583, + "ISR": 8.37743 + }, + "instrumental": { + "SDR": 11.8265, + "SIR": 15.3969, + "SAR": 12.5611, + "ISR": 16.6539 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.1129, + "SIR": 27.289, + "SAR": 14.0116, + "ISR": 17.5973 + }, + "instrumental": { + "SDR": 18.6953, + "SIR": 35.3744, + "SAR": 24.7443, + "ISR": 19.3882 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.8359, + "SIR": 20.1393, + "SAR": 12.178, + "ISR": 16.4394 + }, + "instrumental": { + "SDR": 11.7308, + "SIR": 22.9517, + "SAR": 12.4309, + "ISR": 15.1176 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.25759, + "SIR": 24.3971, + "SAR": 8.56934, + "ISR": 13.2231 + }, + "instrumental": { + "SDR": 14.0296, + "SIR": 22.3451, + "SAR": 15.3987, + "ISR": 18.1758 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 4.52491, + "SIR": 6.42375, + "SAR": 2.18858, + "ISR": 10.7866 + }, + "instrumental": { + "SDR": 17.7642, + "SIR": 30.9915, + "SAR": 22.0214, + "ISR": 17.8616 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.0833, + "SIR": 25.1693, + "SAR": 10.6642, + "ISR": 15.6484 + }, + "instrumental": { + "SDR": 16.8894, + "SIR": 30.752, + "SAR": 20.563, + "ISR": 18.811 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.4449, + "SIR": 29.5342, + "SAR": 11.8947, + "ISR": 15.7077 + }, + "instrumental": { + "SDR": 17.8416, + "SIR": 31.0958, + "SAR": 21.9747, + "ISR": 19.3451 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 13.2274, + "SIR": 29.3935, + "SAR": 13.8195, + "ISR": 16.6271 + }, + "instrumental": { + "SDR": 15.5728, + "SIR": 26.1098, + "SAR": 17.4237, + "ISR": 18.6752 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 11.0053, + "SIR": 23.8065, + "SAR": 11.5084, + "ISR": 15.8519 + }, + "instrumental": { + "SDR": 16.1076, + "SIR": 28.411, + "SAR": 19.1462, + "ISR": 18.6863 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.7616, + "SIR": 20.4494, + "SAR": 10.5037, + "ISR": 14.8873 + }, + "instrumental": { + "SDR": 15.2523, + "SIR": 25.0631, + "SAR": 17.4237, + "ISR": 18.0557 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "UVR-MDX-NET-Inst_HQ_3.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET Inst HQ 3", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.62282, + "SIR": 18.7143, + "SAR": 5.72698, + "ISR": 9.80979 + }, + "instrumental": { + "SDR": 16.512, + "SIR": 24.6836, + "SAR": 19.931, + "ISR": 18.8168 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.9593, + "SIR": 11.6041, + "SAR": 7.30291, + "ISR": 13.0865 + }, + "instrumental": { + "SDR": 11.8454, + "SIR": 22.4631, + "SAR": 13.3694, + "ISR": 14.4199 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.2541, + "SIR": 21.9765, + "SAR": 10.8039, + "ISR": 15.3018 + }, + "instrumental": { + "SDR": 15.6539, + "SIR": 26.9562, + "SAR": 18.3161, + "ISR": 18.2363 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.64894, + "SIR": 6.66637, + "SAR": 4.03823, + "ISR": 13.2784 + }, + "instrumental": { + "SDR": 11.3023, + "SIR": 25.9891, + "SAR": 13.4442, + "ISR": 13.9262 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.196, + "SIR": 22.7971, + "SAR": 13.2357, + "ISR": 16.0105 + }, + "instrumental": { + "SDR": 14.6984, + "SIR": 24.3107, + "SAR": 15.8734, + "ISR": 17.2338 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.0571, + "SIR": 17.8196, + "SAR": 10.9203, + "ISR": 14.9919 + }, + "instrumental": { + "SDR": 11.8254, + "SIR": 22.4586, + "SAR": 13.4082, + "ISR": 15.5408 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.6457, + "SIR": 20.364, + "SAR": 12.6643, + "ISR": 15.1095 + }, + "instrumental": { + "SDR": 14.9823, + "SIR": 24.0987, + "SAR": 17.3399, + "ISR": 17.7673 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.09634, + "SIR": 18.929, + "SAR": 5.6633, + "ISR": 8.69877 + }, + "instrumental": { + "SDR": 17.9722, + "SIR": 28.8237, + "SAR": 23.2407, + "ISR": 19.3447 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.5304, + "SIR": 30.7205, + "SAR": 13.1792, + "ISR": 16.8838 + }, + "instrumental": { + "SDR": 15.421, + "SIR": 28.6888, + "SAR": 17.5145, + "ISR": 18.968 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.8973, + "SIR": 22.9421, + "SAR": 10.0193, + "ISR": 11.9112 + }, + "instrumental": { + "SDR": 15.7798, + "SIR": 18.045, + "SAR": 15.4133, + "ISR": 17.9321 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.8073, + "SIR": 33.1974, + "SAR": 16.5528, + "ISR": 18.1652 + }, + "instrumental": { + "SDR": 16.7075, + "SIR": 31.9164, + "SAR": 19.6389, + "ISR": 19.2246 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.4156, + "SIR": 20.7426, + "SAR": 11.7749, + "ISR": 15.7576 + }, + "instrumental": { + "SDR": 15.374, + "SIR": 27.5474, + "SAR": 17.5502, + "ISR": 17.8933 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.50874, + "SIR": 19.6127, + "SAR": 7.99139, + "ISR": 13.3774 + }, + "instrumental": { + "SDR": 15.4521, + "SIR": 26.1681, + "SAR": 17.5354, + "ISR": 17.8234 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.3718, + "SIR": 18.2818, + "SAR": 10.6386, + "ISR": 11.8815 + }, + "instrumental": { + "SDR": 15.9009, + "SIR": 23.6249, + "SAR": 19.2596, + "ISR": 17.6046 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.5255, + "SIR": 16.6584, + "SAR": 3.18452, + "ISR": 9.32841 + }, + "instrumental": { + "SDR": 15.1102, + "SIR": 22.438, + "SAR": 18.449, + "ISR": 18.5154 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 8.75365, + "SIR": 17.091, + "SAR": 9.25502, + "ISR": 15.1685 + }, + "instrumental": { + "SDR": 12.7034, + "SIR": 25.3411, + "SAR": 14.498, + "ISR": 16.2435 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.56603, + "SIR": 21.8152, + "SAR": 8.8896, + "ISR": 13.7838 + }, + "instrumental": { + "SDR": 14.7809, + "SIR": 25.0254, + "SAR": 17.011, + "ISR": 18.3994 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -14.5722, + "SIR": -36.5946, + "SAR": 0.593805, + "ISR": 11.7319 + }, + "instrumental": { + "SDR": 13.1159, + "SIR": 57.9643, + "SAR": 13.1717, + "ISR": 12.9007 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.88965, + "SIR": 14.9505, + "SAR": 6.61937, + "ISR": 10.9597 + }, + "instrumental": { + "SDR": 15.8256, + "SIR": 21.9682, + "SAR": 18.0635, + "ISR": 17.5503 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.1191, + "SIR": 23.6078, + "SAR": 11.3035, + "ISR": 15.071 + }, + "instrumental": { + "SDR": 15.6381, + "SIR": 26.1601, + "SAR": 17.9077, + "ISR": 18.6189 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.164, + "SIR": 22.422, + "SAR": 10.81, + "ISR": 15.2089 + }, + "instrumental": { + "SDR": 17.2398, + "SIR": 30.0995, + "SAR": 20.8514, + "ISR": 18.9213 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -8.70715, + "SIR": -5.95472, + "SAR": -0.59022, + "ISR": 5.95141 + }, + "instrumental": { + "SDR": 19.3823, + "SIR": 40.1941, + "SAR": 29.7609, + "ISR": 19.042 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.16956, + "SIR": 13.8463, + "SAR": 3.90974, + "ISR": 6.76324 + }, + "instrumental": { + "SDR": 10.6182, + "SIR": 14.5028, + "SAR": 14.1692, + "ISR": 16.7777 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.19084, + "SIR": 16.7965, + "SAR": 6.73845, + "ISR": 12.5383 + }, + "instrumental": { + "SDR": 17.522, + "SIR": 28.6215, + "SAR": 20.1242, + "ISR": 18.7572 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.79317, + "SIR": 18.5001, + "SAR": 8.07296, + "ISR": 11.7553 + }, + "instrumental": { + "SDR": 14.4986, + "SIR": 22.6228, + "SAR": 17.2989, + "ISR": 18.1715 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.80873, + "SIR": 17.9825, + "SAR": 9.12794, + "ISR": 14.3872 + }, + "instrumental": { + "SDR": 15.5337, + "SIR": 25.9077, + "SAR": 17.2248, + "ISR": 17.6591 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.7416, + "SIR": 24.4657, + "SAR": 12.3387, + "ISR": 14.8444 + }, + "instrumental": { + "SDR": 13.1758, + "SIR": 21.8779, + "SAR": 14.4976, + "ISR": 17.5441 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.51058, + "SIR": 12.0636, + "SAR": 6.22767, + "ISR": 11.7694 + }, + "instrumental": { + "SDR": 11.5307, + "SIR": 19.4025, + "SAR": 13.1216, + "ISR": 14.2804 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 6.35679, + "SIR": 6.33969, + "SAR": 7.70771, + "ISR": 15.365 + }, + "instrumental": { + "SDR": 12.322, + "SIR": 24.0991, + "SAR": 13.0649, + "ISR": 13.4821 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.5943, + "SIR": 29.7868, + "SAR": 14.1584, + "ISR": 15.7227 + }, + "instrumental": { + "SDR": 14.8858, + "SIR": 20.528, + "SAR": 14.6905, + "ISR": 18.6634 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.5352, + "SIR": 23.9252, + "SAR": 11.8444, + "ISR": 15.4427 + }, + "instrumental": { + "SDR": 14.2474, + "SIR": 23.8096, + "SAR": 15.8224, + "ISR": 17.6323 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.509, + "SIR": 27.5619, + "SAR": 12.1901, + "ISR": 14.8521 + }, + "instrumental": { + "SDR": 17.3269, + "SIR": 27.0156, + "SAR": 21.4601, + "ISR": 19.1336 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.67762, + "SIR": 10.2249, + "SAR": 4.86761, + "ISR": 10.3537 + }, + "instrumental": { + "SDR": 11.8714, + "SIR": 19.4776, + "SAR": 12.4648, + "ISR": 15.9558 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.1793, + "SIR": 27.2447, + "SAR": 14.1908, + "ISR": 17.7531 + }, + "instrumental": { + "SDR": 18.7921, + "SIR": 35.9954, + "SAR": 24.9087, + "ISR": 19.4532 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.9152, + "SIR": 20.5906, + "SAR": 12.3009, + "ISR": 16.1932 + }, + "instrumental": { + "SDR": 11.493, + "SIR": 22.5364, + "SAR": 12.4442, + "ISR": 15.316 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.42637, + "SIR": 23.7342, + "SAR": 8.6461, + "ISR": 13.6363 + }, + "instrumental": { + "SDR": 13.9191, + "SIR": 22.7885, + "SAR": 15.5622, + "ISR": 18.0473 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.87444, + "SIR": 6.34672, + "SAR": 2.03677, + "ISR": 11.0709 + }, + "instrumental": { + "SDR": 17.8324, + "SIR": 31.4563, + "SAR": 21.8144, + "ISR": 17.8679 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.1128, + "SIR": 25.0662, + "SAR": 10.7028, + "ISR": 15.7958 + }, + "instrumental": { + "SDR": 16.9072, + "SIR": 30.993, + "SAR": 20.512, + "ISR": 18.8226 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.4564, + "SIR": 29.7134, + "SAR": 11.8202, + "ISR": 15.539 + }, + "instrumental": { + "SDR": 17.9628, + "SIR": 30.8865, + "SAR": 22.0774, + "ISR": 19.4061 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 13.4108, + "SIR": 28.9683, + "SAR": 13.9727, + "ISR": 16.737 + }, + "instrumental": { + "SDR": 15.5141, + "SIR": 26.9344, + "SAR": 17.3492, + "ISR": 18.5732 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 10.9662, + "SIR": 24.1744, + "SAR": 11.5705, + "ISR": 15.9568 + }, + "instrumental": { + "SDR": 16.1899, + "SIR": 28.5621, + "SAR": 19.2757, + "ISR": 18.7745 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.80873, + "SIR": 20.364, + "SAR": 10.0193, + "ISR": 14.8444 + }, + "instrumental": { + "SDR": 15.421, + "SIR": 25.3411, + "SAR": 17.3492, + "ISR": 17.9321 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "UVR-MDX-NET-Inst_HQ_4.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET Inst HQ 4", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.85686, + "SIR": 19.2837, + "SAR": 5.7082, + "ISR": 10.1135 + }, + "instrumental": { + "SDR": 16.7591, + "SIR": 25.0221, + "SAR": 20.0476, + "ISR": 19.0067 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 7.03511, + "SIR": 12.8602, + "SAR": 7.41324, + "ISR": 12.7271 + }, + "instrumental": { + "SDR": 11.8894, + "SIR": 21.7858, + "SAR": 13.4914, + "ISR": 14.9551 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.3066, + "SIR": 22.53, + "SAR": 10.9632, + "ISR": 15.2201 + }, + "instrumental": { + "SDR": 15.666, + "SIR": 26.8045, + "SAR": 18.1745, + "ISR": 18.3658 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 1.57858, + "SIR": 5.93343, + "SAR": 3.30803, + "ISR": 12.5209 + }, + "instrumental": { + "SDR": 11.0782, + "SIR": 25.2529, + "SAR": 12.8854, + "ISR": 13.6342 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.3815, + "SIR": 22.8234, + "SAR": 13.389, + "ISR": 16.2417 + }, + "instrumental": { + "SDR": 14.8139, + "SIR": 24.9417, + "SAR": 15.9235, + "ISR": 17.2634 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.2109, + "SIR": 18.4123, + "SAR": 11.0992, + "ISR": 15.0204 + }, + "instrumental": { + "SDR": 12.0299, + "SIR": 22.5333, + "SAR": 13.5259, + "ISR": 15.8907 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.6508, + "SIR": 20.5902, + "SAR": 12.8044, + "ISR": 15.184 + }, + "instrumental": { + "SDR": 15.2053, + "SIR": 24.4884, + "SAR": 17.3929, + "ISR": 17.866 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.0413, + "SIR": 19.1728, + "SAR": 4.99867, + "ISR": 8.67852 + }, + "instrumental": { + "SDR": 18.1427, + "SIR": 29.0412, + "SAR": 23.3745, + "ISR": 19.5464 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.6886, + "SIR": 29.7956, + "SAR": 13.432, + "ISR": 16.8817 + }, + "instrumental": { + "SDR": 15.5514, + "SIR": 28.4638, + "SAR": 17.5942, + "ISR": 18.8752 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.8416, + "SIR": 21.9069, + "SAR": 10.4475, + "ISR": 12.2967 + }, + "instrumental": { + "SDR": 15.918, + "SIR": 19.0178, + "SAR": 15.7752, + "ISR": 17.7321 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.9312, + "SIR": 33.2777, + "SAR": 16.7505, + "ISR": 18.3166 + }, + "instrumental": { + "SDR": 16.7249, + "SIR": 32.6605, + "SAR": 19.9528, + "ISR": 19.2149 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.4675, + "SIR": 22.8829, + "SAR": 11.6808, + "ISR": 15.2476 + }, + "instrumental": { + "SDR": 15.2594, + "SIR": 25.7904, + "SAR": 17.577, + "ISR": 18.384 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.53051, + "SIR": 19.3342, + "SAR": 7.98742, + "ISR": 13.3761 + }, + "instrumental": { + "SDR": 15.6174, + "SIR": 26.0881, + "SAR": 17.6295, + "ISR": 17.8043 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.61938, + "SIR": 20.1069, + "SAR": 11.4551, + "ISR": 11.8547 + }, + "instrumental": { + "SDR": 16.0898, + "SIR": 23.5332, + "SAR": 20.3613, + "ISR": 18.1577 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.63943, + "SIR": 18.9571, + "SAR": 3.73242, + "ISR": 9.01454 + }, + "instrumental": { + "SDR": 15.401, + "SIR": 22.1897, + "SAR": 19.0159, + "ISR": 18.9372 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 7.49789, + "SIR": 13.6184, + "SAR": 8.35197, + "ISR": 15.1273 + }, + "instrumental": { + "SDR": 11.4018, + "SIR": 24.9895, + "SAR": 13.1216, + "ISR": 14.7764 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.72041, + "SIR": 21.4088, + "SAR": 8.84061, + "ISR": 13.9091 + }, + "instrumental": { + "SDR": 14.6974, + "SIR": 25.3201, + "SAR": 16.9959, + "ISR": 18.4489 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -18.0316, + "SIR": -37.3143, + "SAR": 0.81574, + "ISR": 12.4039 + }, + "instrumental": { + "SDR": 13.2523, + "SIR": 58.2215, + "SAR": 12.8487, + "ISR": 12.4706 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.7133, + "SIR": 14.6428, + "SAR": 6.34567, + "ISR": 11.0777 + }, + "instrumental": { + "SDR": 16.077, + "SIR": 22.2259, + "SAR": 17.8465, + "ISR": 17.4422 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.8521, + "SIR": 24.0705, + "SAR": 10.8754, + "ISR": 14.408 + }, + "instrumental": { + "SDR": 15.5122, + "SIR": 24.8167, + "SAR": 17.4231, + "ISR": 18.794 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.5317, + "SIR": 22.2285, + "SAR": 10.785, + "ISR": 15.7561 + }, + "instrumental": { + "SDR": 17.2213, + "SIR": 31.8874, + "SAR": 20.5787, + "ISR": 18.9164 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -11.5216, + "SIR": -8.95723, + "SAR": 0.7458, + "ISR": 11.0521 + }, + "instrumental": { + "SDR": 18.8969, + "SIR": 41.4806, + "SAR": 29.4105, + "ISR": 18.7697 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.12438, + "SIR": 14.8239, + "SAR": 3.80795, + "ISR": 6.61489 + }, + "instrumental": { + "SDR": 10.7753, + "SIR": 14.3432, + "SAR": 14.2971, + "ISR": 17.1639 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.63987, + "SIR": 14.0156, + "SAR": 6.36177, + "ISR": 12.6105 + }, + "instrumental": { + "SDR": 16.9589, + "SIR": 28.1824, + "SAR": 19.4677, + "ISR": 18.3777 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.74941, + "SIR": 18.7546, + "SAR": 8.12369, + "ISR": 11.8337 + }, + "instrumental": { + "SDR": 14.5977, + "SIR": 22.7382, + "SAR": 17.3793, + "ISR": 18.3114 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.83195, + "SIR": 18.2937, + "SAR": 9.0916, + "ISR": 14.4444 + }, + "instrumental": { + "SDR": 15.6847, + "SIR": 26.0526, + "SAR": 17.2799, + "ISR": 17.7546 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.2303, + "SIR": 25.9265, + "SAR": 11.9281, + "ISR": 13.8312 + }, + "instrumental": { + "SDR": 13.4551, + "SIR": 20.1209, + "SAR": 14.7372, + "ISR": 17.9224 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.99514, + "SIR": 15.9885, + "SAR": 6.8435, + "ISR": 11.2652 + }, + "instrumental": { + "SDR": 13.0878, + "SIR": 18.9621, + "SAR": 14.139, + "ISR": 16.0843 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 6.33752, + "SIR": 5.78628, + "SAR": 7.50576, + "ISR": 15.4087 + }, + "instrumental": { + "SDR": 12.0919, + "SIR": 24.0181, + "SAR": 12.7461, + "ISR": 13.2081 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.4786, + "SIR": 29.1951, + "SAR": 14.8428, + "ISR": 16.5428 + }, + "instrumental": { + "SDR": 14.7934, + "SIR": 21.9521, + "SAR": 15.1376, + "ISR": 18.2209 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.3325, + "SIR": 24.7288, + "SAR": 12.0267, + "ISR": 15.33 + }, + "instrumental": { + "SDR": 14.3362, + "SIR": 23.976, + "SAR": 15.7722, + "ISR": 17.889 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.5539, + "SIR": 26.8458, + "SAR": 10.1353, + "ISR": 11.8043 + }, + "instrumental": { + "SDR": 17.4648, + "SIR": 22.5868, + "SAR": 20.3121, + "ISR": 19.2231 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 5.42588, + "SIR": 9.06719, + "SAR": 7.24233, + "ISR": 13.5398 + }, + "instrumental": { + "SDR": 12.4037, + "SIR": 23.0744, + "SAR": 14.3059, + "ISR": 14.8809 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.3501, + "SIR": 26.547, + "SAR": 14.239, + "ISR": 17.9401 + }, + "instrumental": { + "SDR": 18.8806, + "SIR": 36.7738, + "SAR": 25.0537, + "ISR": 19.539 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.1366, + "SIR": 20.3999, + "SAR": 12.428, + "ISR": 16.8285 + }, + "instrumental": { + "SDR": 11.9251, + "SIR": 23.7458, + "SAR": 12.6606, + "ISR": 15.2826 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.57828, + "SIR": 24.6253, + "SAR": 8.77917, + "ISR": 13.9686 + }, + "instrumental": { + "SDR": 14.2182, + "SIR": 23.2434, + "SAR": 15.632, + "ISR": 18.3182 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 2.92139, + "SIR": 5.81725, + "SAR": 2.06675, + "ISR": 10.8761 + }, + "instrumental": { + "SDR": 16.808, + "SIR": 31.3864, + "SAR": 20.9209, + "ISR": 17.8701 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.2232, + "SIR": 24.5532, + "SAR": 10.8848, + "ISR": 15.8251 + }, + "instrumental": { + "SDR": 17.0122, + "SIR": 30.9548, + "SAR": 20.7214, + "ISR": 18.7644 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.9001, + "SIR": 30.4242, + "SAR": 12.2469, + "ISR": 15.7596 + }, + "instrumental": { + "SDR": 18.1434, + "SIR": 31.4276, + "SAR": 22.3572, + "ISR": 19.5462 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 13.9875, + "SIR": 29.7121, + "SAR": 14.0536, + "ISR": 16.4766 + }, + "instrumental": { + "SDR": 15.728, + "SIR": 25.7527, + "SAR": 17.5914, + "ISR": 18.9239 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 11.2761, + "SIR": 22.9858, + "SAR": 11.991, + "ISR": 16.9225 + }, + "instrumental": { + "SDR": 16.2658, + "SIR": 30.6573, + "SAR": 19.3022, + "ISR": 18.6899 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.83195, + "SIR": 20.3999, + "SAR": 10.1353, + "ISR": 13.9686 + }, + "instrumental": { + "SDR": 15.5122, + "SIR": 24.9895, + "SAR": 17.4231, + "ISR": 18.2209 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "UVR_MDXNET_Main.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET Main", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.63812, + "SIR": 17.4406, + "SAR": 5.78804, + "ISR": 10.1273 + }, + "instrumental": { + "SDR": 16.5084, + "SIR": 24.7649, + "SAR": 19.8021, + "ISR": 18.7235 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 5.78169, + "SIR": 8.41188, + "SAR": 6.9639, + "ISR": 14.1907 + }, + "instrumental": { + "SDR": 10.2124, + "SIR": 24.1852, + "SAR": 12.1118, + "ISR": 12.495 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.5073, + "SIR": 22.5596, + "SAR": 11.1205, + "ISR": 15.3204 + }, + "instrumental": { + "SDR": 15.8829, + "SIR": 26.9528, + "SAR": 18.5398, + "ISR": 18.3642 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 1.71298, + "SIR": 4.55526, + "SAR": 4.41841, + "ISR": 13.5779 + }, + "instrumental": { + "SDR": 10.2904, + "SIR": 28.2159, + "SAR": 12.7908, + "ISR": 12.5596 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.9046, + "SIR": 23.3772, + "SAR": 13.9639, + "ISR": 16.5199 + }, + "instrumental": { + "SDR": 14.7488, + "SIR": 25.3611, + "SAR": 16.1389, + "ISR": 17.3698 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.265, + "SIR": 18.319, + "SAR": 11.1117, + "ISR": 15.2755 + }, + "instrumental": { + "SDR": 12.0067, + "SIR": 22.8264, + "SAR": 13.539, + "ISR": 15.7601 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.9164, + "SIR": 21.0729, + "SAR": 12.941, + "ISR": 15.6019 + }, + "instrumental": { + "SDR": 15.1779, + "SIR": 25.012, + "SAR": 17.2753, + "ISR": 17.9222 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.56513, + "SIR": 19.403, + "SAR": 5.66866, + "ISR": 8.73723 + }, + "instrumental": { + "SDR": 18.1455, + "SIR": 28.4962, + "SAR": 23.888, + "ISR": 19.4103 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.6332, + "SIR": 33.0259, + "SAR": 13.572, + "ISR": 16.4998 + }, + "instrumental": { + "SDR": 15.7138, + "SIR": 26.9176, + "SAR": 18.0663, + "ISR": 19.1853 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.5077, + "SIR": 21.3703, + "SAR": 11.0324, + "ISR": 12.7267 + }, + "instrumental": { + "SDR": 16.0667, + "SIR": 20.108, + "SAR": 16.2678, + "ISR": 17.8215 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.6795, + "SIR": 29.4574, + "SAR": 16.584, + "ISR": 18.067 + }, + "instrumental": { + "SDR": 16.5213, + "SIR": 30.0026, + "SAR": 19.558, + "ISR": 18.9745 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.5185, + "SIR": 21.8661, + "SAR": 11.8857, + "ISR": 15.3888 + }, + "instrumental": { + "SDR": 15.46, + "SIR": 26.1003, + "SAR": 17.7594, + "ISR": 18.21 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.02388, + "SIR": 15.9155, + "SAR": 7.54485, + "ISR": 13.6946 + }, + "instrumental": { + "SDR": 15.3277, + "SIR": 26.8306, + "SAR": 17.273, + "ISR": 17.1336 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.64116, + "SIR": 14.8488, + "SAR": 9.28946, + "ISR": 13.3597 + }, + "instrumental": { + "SDR": 16.9489, + "SIR": 25.3607, + "SAR": 19.6784, + "ISR": 17.5423 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.69813, + "SIR": 14.914, + "SAR": 3.4676, + "ISR": 9.62061 + }, + "instrumental": { + "SDR": 14.9204, + "SIR": 22.9414, + "SAR": 17.844, + "ISR": 18.2578 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.0159, + "SIR": 21.2854, + "SAR": 10.7858, + "ISR": 15.3422 + }, + "instrumental": { + "SDR": 14.5904, + "SIR": 25.8051, + "SAR": 16.6506, + "ISR": 17.8355 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 9.19827, + "SIR": 25.6044, + "SAR": 9.59577, + "ISR": 13.9902 + }, + "instrumental": { + "SDR": 15.4164, + "SIR": 25.4591, + "SAR": 17.8248, + "ISR": 18.869 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -27.8978, + "SIR": -41.8016, + "SAR": 0.566545, + "ISR": 11.1463 + }, + "instrumental": { + "SDR": 11.1163, + "SIR": 56.4843, + "SAR": 9.96975, + "ISR": 10.2864 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.27639, + "SIR": 15.3395, + "SAR": 7.21208, + "ISR": 11.3865 + }, + "instrumental": { + "SDR": 16.4489, + "SIR": 22.5843, + "SAR": 18.7069, + "ISR": 17.6203 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.2641, + "SIR": 24.0605, + "SAR": 11.4962, + "ISR": 15.0843 + }, + "instrumental": { + "SDR": 15.8652, + "SIR": 26.0981, + "SAR": 17.7729, + "ISR": 18.606 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.4867, + "SIR": 21.5034, + "SAR": 11.5393, + "ISR": 15.8784 + }, + "instrumental": { + "SDR": 17.6973, + "SIR": 32.061, + "SAR": 21.0973, + "ISR": 18.8315 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -2.64666, + "SIR": 2.38322, + "SAR": -0.12859, + "ISR": 3.48881 + }, + "instrumental": { + "SDR": 19.799, + "SIR": 40.2857, + "SAR": 33.1708, + "ISR": 19.3255 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.10689, + "SIR": 13.9211, + "SAR": 4.0246, + "ISR": 6.82979 + }, + "instrumental": { + "SDR": 10.7049, + "SIR": 14.6111, + "SAR": 14.3182, + "ISR": 16.8809 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.44271, + "SIR": 16.4442, + "SAR": 6.53233, + "ISR": 12.9763 + }, + "instrumental": { + "SDR": 17.42, + "SIR": 29.5251, + "SAR": 20.5387, + "ISR": 18.6357 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.75382, + "SIR": 18.4517, + "SAR": 8.14677, + "ISR": 11.9735 + }, + "instrumental": { + "SDR": 14.5384, + "SIR": 22.877, + "SAR": 17.2659, + "ISR": 18.1892 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.89459, + "SIR": 16.6335, + "SAR": 9.11425, + "ISR": 14.871 + }, + "instrumental": { + "SDR": 15.4098, + "SIR": 26.6714, + "SAR": 16.9654, + "ISR": 17.1709 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.4097, + "SIR": 23.1646, + "SAR": 12.1292, + "ISR": 15.1546 + }, + "instrumental": { + "SDR": 12.6668, + "SIR": 22.5248, + "SAR": 14.1071, + "ISR": 17.1133 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 5.78855, + "SIR": 8.85361, + "SAR": 6.28691, + "ISR": 13.269 + }, + "instrumental": { + "SDR": 10.4153, + "SIR": 21.2661, + "SAR": 11.9407, + "ISR": 12.4188 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 10.6384, + "SIR": 24.7938, + "SAR": 11.3375, + "ISR": 15.375 + }, + "instrumental": { + "SDR": 14.718, + "SIR": 24.871, + "SAR": 17.1602, + "ISR": 17.7614 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.9538, + "SIR": 30.8104, + "SAR": 14.7963, + "ISR": 16.1084 + }, + "instrumental": { + "SDR": 15.2409, + "SIR": 20.8077, + "SAR": 15.0561, + "ISR": 18.8809 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.6015, + "SIR": 24.172, + "SAR": 12.2026, + "ISR": 15.511 + }, + "instrumental": { + "SDR": 14.5572, + "SIR": 23.9537, + "SAR": 15.9465, + "ISR": 17.6982 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.989, + "SIR": 27.7185, + "SAR": 12.1442, + "ISR": 14.3559 + }, + "instrumental": { + "SDR": 17.5362, + "SIR": 25.9949, + "SAR": 21.6727, + "ISR": 19.4336 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.50263, + "SIR": 11.4276, + "SAR": 6.23284, + "ISR": 8.55276 + }, + "instrumental": { + "SDR": 11.593, + "SIR": 16.1367, + "SAR": 14.2317, + "ISR": 16.4947 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.2171, + "SIR": 27.224, + "SAR": 14.2712, + "ISR": 18.0377 + }, + "instrumental": { + "SDR": 18.694, + "SIR": 36.9321, + "SAR": 24.915, + "ISR": 19.367 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.0518, + "SIR": 19.9184, + "SAR": 12.486, + "ISR": 17.0362 + }, + "instrumental": { + "SDR": 11.9608, + "SIR": 23.5955, + "SAR": 12.6314, + "ISR": 14.8994 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.43834, + "SIR": 17.9349, + "SAR": 8.69114, + "ISR": 13.8892 + }, + "instrumental": { + "SDR": 13.3286, + "SIR": 22.8714, + "SAR": 14.7663, + "ISR": 16.5784 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 2.65212, + "SIR": 5.92334, + "SAR": 2.19368, + "ISR": 11.6722 + }, + "instrumental": { + "SDR": 17.2181, + "SIR": 31.5719, + "SAR": 20.9956, + "ISR": 17.8368 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.1737, + "SIR": 24.64, + "SAR": 10.9486, + "ISR": 15.794 + }, + "instrumental": { + "SDR": 16.9259, + "SIR": 31.0506, + "SAR": 20.5252, + "ISR": 18.8426 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.7848, + "SIR": 29.6406, + "SAR": 12.5111, + "ISR": 15.8471 + }, + "instrumental": { + "SDR": 17.989, + "SIR": 32.2081, + "SAR": 22.5874, + "ISR": 19.3716 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 11.6205, + "SIR": 27.9609, + "SAR": 13.8643, + "ISR": 14.975 + }, + "instrumental": { + "SDR": 15.1636, + "SIR": 22.729, + "SAR": 17.4276, + "ISR": 18.4887 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 11.191, + "SIR": 28.8054, + "SAR": 12.1663, + "ISR": 14.8448 + }, + "instrumental": { + "SDR": 16.5545, + "SIR": 25.6316, + "SAR": 20.3024, + "ISR": 19.1274 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.1737, + "SIR": 21.0729, + "SAR": 10.9486, + "ISR": 14.8448 + }, + "instrumental": { + "SDR": 15.4098, + "SIR": 25.4591, + "SAR": 17.4276, + "ISR": 17.9222 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "UVR-MDX-NET-Inst_Main.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET Inst Main", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.94817, + "SIR": 18.4295, + "SAR": 5.567, + "ISR": 9.73235 + }, + "instrumental": { + "SDR": 16.4933, + "SIR": 24.3046, + "SAR": 19.8225, + "ISR": 18.7949 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.44254, + "SIR": 11.307, + "SAR": 7.01952, + "ISR": 12.9618 + }, + "instrumental": { + "SDR": 11.3824, + "SIR": 22.155, + "SAR": 13.1415, + "ISR": 14.1184 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 9.83751, + "SIR": 21.7799, + "SAR": 10.5705, + "ISR": 14.8474 + }, + "instrumental": { + "SDR": 15.4183, + "SIR": 26.1371, + "SAR": 17.9677, + "ISR": 18.159 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 3.13838, + "SIR": 6.23754, + "SAR": 4.39782, + "ISR": 13.4657 + }, + "instrumental": { + "SDR": 11.0344, + "SIR": 26.3402, + "SAR": 13.2529, + "ISR": 13.5952 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.0052, + "SIR": 22.5176, + "SAR": 13.0016, + "ISR": 15.9124 + }, + "instrumental": { + "SDR": 14.293, + "SIR": 23.9437, + "SAR": 15.6473, + "ISR": 17.1701 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.93694, + "SIR": 17.7793, + "SAR": 10.8321, + "ISR": 14.6172 + }, + "instrumental": { + "SDR": 11.783, + "SIR": 21.7133, + "SAR": 13.3151, + "ISR": 15.6105 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.1951, + "SIR": 20.0372, + "SAR": 12.4587, + "ISR": 14.8614 + }, + "instrumental": { + "SDR": 14.8485, + "SIR": 23.6532, + "SAR": 16.9541, + "ISR": 17.6318 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 4.98997, + "SIR": 18.0469, + "SAR": 5.36005, + "ISR": 7.63234 + }, + "instrumental": { + "SDR": 17.872, + "SIR": 27.8452, + "SAR": 23.1905, + "ISR": 19.3623 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.0163, + "SIR": 28.9332, + "SAR": 12.7255, + "ISR": 16.5519 + }, + "instrumental": { + "SDR": 15.1754, + "SIR": 27.7116, + "SAR": 17.1829, + "ISR": 18.8185 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.2611, + "SIR": 21.165, + "SAR": 9.96126, + "ISR": 12.0396 + }, + "instrumental": { + "SDR": 15.5034, + "SIR": 18.4535, + "SAR": 15.2435, + "ISR": 17.6421 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.0137, + "SIR": 30.5619, + "SAR": 15.4912, + "ISR": 17.8524 + }, + "instrumental": { + "SDR": 16.3475, + "SIR": 31.2408, + "SAR": 18.919, + "ISR": 18.957 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 10.9797, + "SIR": 21.5805, + "SAR": 11.0086, + "ISR": 14.4182 + }, + "instrumental": { + "SDR": 15.0596, + "SIR": 24.236, + "SAR": 17.2517, + "ISR": 18.1161 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.51026, + "SIR": 18.7185, + "SAR": 7.9299, + "ISR": 13.2187 + }, + "instrumental": { + "SDR": 15.2734, + "SIR": 25.8918, + "SAR": 17.3458, + "ISR": 17.5253 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.6218, + "SIR": 21.2985, + "SAR": 11.1056, + "ISR": 11.8519 + }, + "instrumental": { + "SDR": 16.0302, + "SIR": 23.4826, + "SAR": 20.3927, + "ISR": 18.1433 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.29868, + "SIR": 16.3626, + "SAR": 3.11345, + "ISR": 9.16623 + }, + "instrumental": { + "SDR": 15.0742, + "SIR": 22.1344, + "SAR": 18.501, + "ISR": 18.5361 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 7.60394, + "SIR": 13.5139, + "SAR": 8.35486, + "ISR": 14.8775 + }, + "instrumental": { + "SDR": 11.3918, + "SIR": 24.5422, + "SAR": 13.1835, + "ISR": 14.7393 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.11683, + "SIR": 14.1441, + "SAR": 7.58347, + "ISR": 13.3017 + }, + "instrumental": { + "SDR": 14.1561, + "SIR": 24.1872, + "SAR": 15.811, + "ISR": 17.3148 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -13.8464, + "SIR": -37.1858, + "SAR": 0.398175, + "ISR": 11.1309 + }, + "instrumental": { + "SDR": 12.3575, + "SIR": 57.2828, + "SAR": 12.3725, + "ISR": 12.3642 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.56878, + "SIR": 12.8498, + "SAR": 6.47542, + "ISR": 11.022 + }, + "instrumental": { + "SDR": 15.7124, + "SIR": 22.042, + "SAR": 17.6579, + "ISR": 16.7143 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.5075, + "SIR": 23.2769, + "SAR": 10.979, + "ISR": 14.6454 + }, + "instrumental": { + "SDR": 15.4744, + "SIR": 25.1678, + "SAR": 17.468, + "ISR": 18.5844 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 9.82938, + "SIR": 20.7475, + "SAR": 10.0275, + "ISR": 15.4137 + }, + "instrumental": { + "SDR": 16.7736, + "SIR": 31.0207, + "SAR": 19.9806, + "ISR": 18.5768 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -12.0613, + "SIR": -10.0315, + "SAR": 0.54093, + "ISR": 12.6948 + }, + "instrumental": { + "SDR": 19.0215, + "SIR": 43.3561, + "SAR": 28.0075, + "ISR": 18.7734 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.96575, + "SIR": 14.002, + "SAR": 3.85457, + "ISR": 6.55322 + }, + "instrumental": { + "SDR": 10.622, + "SIR": 14.1964, + "SAR": 14.4012, + "ISR": 16.903 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.79443, + "SIR": 13.1626, + "SAR": 6.19672, + "ISR": 12.5102 + }, + "instrumental": { + "SDR": 15.9476, + "SIR": 27.5731, + "SAR": 18.1376, + "ISR": 17.9342 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.5173, + "SIR": 18.5142, + "SAR": 7.95809, + "ISR": 11.4949 + }, + "instrumental": { + "SDR": 14.4291, + "SIR": 22.0731, + "SAR": 17.249, + "ISR": 18.1816 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.38432, + "SIR": 16.2402, + "SAR": 8.84748, + "ISR": 14.0807 + }, + "instrumental": { + "SDR": 15.3516, + "SIR": 25.3745, + "SAR": 16.6057, + "ISR": 17.2088 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.3867, + "SIR": 23.1903, + "SAR": 11.8005, + "ISR": 14.4095 + }, + "instrumental": { + "SDR": 13.1207, + "SIR": 21.1422, + "SAR": 14.3661, + "ISR": 17.2945 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.37351, + "SIR": 14.9461, + "SAR": 6.3616, + "ISR": 10.737 + }, + "instrumental": { + "SDR": 12.5155, + "SIR": 18.2638, + "SAR": 13.6869, + "ISR": 15.9633 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 5.32822, + "SIR": 5.71922, + "SAR": 7.41367, + "ISR": 15.1822 + }, + "instrumental": { + "SDR": 11.5277, + "SIR": 23.6525, + "SAR": 12.5809, + "ISR": 12.9325 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.3455, + "SIR": 28.0889, + "SAR": 14.3366, + "ISR": 15.8705 + }, + "instrumental": { + "SDR": 14.6575, + "SIR": 21.0296, + "SAR": 14.7077, + "ISR": 18.3151 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.1501, + "SIR": 22.6225, + "SAR": 11.4753, + "ISR": 15.102 + }, + "instrumental": { + "SDR": 13.949, + "SIR": 23.1857, + "SAR": 15.5571, + "ISR": 17.3748 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.8236, + "SIR": 22.4511, + "SAR": 10.372, + "ISR": 13.1647 + }, + "instrumental": { + "SDR": 16.5036, + "SIR": 24.1054, + "SAR": 19.9808, + "ISR": 18.825 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.55278, + "SIR": 8.52573, + "SAR": 4.5857, + "ISR": 11.3608 + }, + "instrumental": { + "SDR": 11.4593, + "SIR": 18.7148, + "SAR": 11.9618, + "ISR": 15.1649 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.7013, + "SIR": 26.9096, + "SAR": 13.8912, + "ISR": 17.6875 + }, + "instrumental": { + "SDR": 18.6811, + "SIR": 35.6342, + "SAR": 24.4198, + "ISR": 19.3739 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.8194, + "SIR": 19.6726, + "SAR": 12.0739, + "ISR": 16.3173 + }, + "instrumental": { + "SDR": 11.4961, + "SIR": 22.7819, + "SAR": 12.195, + "ISR": 14.8435 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.04211, + "SIR": 21.9067, + "SAR": 8.29973, + "ISR": 13.4076 + }, + "instrumental": { + "SDR": 13.7242, + "SIR": 22.2973, + "SAR": 14.9778, + "ISR": 17.6368 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.36317, + "SIR": 1.63646, + "SAR": 1.95397, + "ISR": 10.4013 + }, + "instrumental": { + "SDR": 17.5638, + "SIR": 30.6576, + "SAR": 21.5886, + "ISR": 17.902 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.0111, + "SIR": 25.8673, + "SAR": 10.5544, + "ISR": 15.3824 + }, + "instrumental": { + "SDR": 16.9712, + "SIR": 29.9745, + "SAR": 20.4231, + "ISR": 18.9464 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.1207, + "SIR": 28.6679, + "SAR": 11.38, + "ISR": 15.5418 + }, + "instrumental": { + "SDR": 17.7887, + "SIR": 30.805, + "SAR": 21.7902, + "ISR": 19.2728 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 12.9362, + "SIR": 27.6798, + "SAR": 13.2721, + "ISR": 16.2644 + }, + "instrumental": { + "SDR": 15.4658, + "SIR": 25.3853, + "SAR": 17.2575, + "ISR": 18.4928 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.50306, + "SIR": 19.1955, + "SAR": 9.40437, + "ISR": 13.7732 + }, + "instrumental": { + "SDR": 15.1248, + "SIR": 24.2116, + "SAR": 17.2159, + "ISR": 17.7721 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "UVR_MDXNET_1_9703.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET 1", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.5934, + "SIR": 17.0409, + "SAR": 5.26672, + "ISR": 10.3872 + }, + "instrumental": { + "SDR": 16.4668, + "SIR": 24.9046, + "SAR": 19.569, + "ISR": 18.5774 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.22266, + "SIR": 10.9764, + "SAR": 6.91905, + "ISR": 13.215 + }, + "instrumental": { + "SDR": 10.8234, + "SIR": 22.5692, + "SAR": 12.482, + "ISR": 13.8857 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 9.95372, + "SIR": 20.6799, + "SAR": 10.4783, + "ISR": 14.9469 + }, + "instrumental": { + "SDR": 15.4007, + "SIR": 25.9509, + "SAR": 17.9162, + "ISR": 18.0109 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 1.9839, + "SIR": 5.33878, + "SAR": 4.41261, + "ISR": 12.9296 + }, + "instrumental": { + "SDR": 10.6865, + "SIR": 26.9074, + "SAR": 13.0336, + "ISR": 13.1403 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.2387, + "SIR": 21.8043, + "SAR": 13.1484, + "ISR": 16.3089 + }, + "instrumental": { + "SDR": 14.0073, + "SIR": 24.1939, + "SAR": 15.3916, + "ISR": 16.8745 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.86591, + "SIR": 17.0423, + "SAR": 10.7696, + "ISR": 15.0679 + }, + "instrumental": { + "SDR": 11.4418, + "SIR": 22.4582, + "SAR": 13.0084, + "ISR": 15.2095 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.1776, + "SIR": 19.629, + "SAR": 12.3615, + "ISR": 14.9202 + }, + "instrumental": { + "SDR": 14.6558, + "SIR": 23.3615, + "SAR": 16.9709, + "ISR": 17.5965 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 4.89478, + "SIR": 18.4425, + "SAR": 5.77097, + "ISR": 7.99601 + }, + "instrumental": { + "SDR": 17.9592, + "SIR": 28.4961, + "SAR": 23.8189, + "ISR": 19.3995 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.0085, + "SIR": 30.7608, + "SAR": 12.7072, + "ISR": 16.5786 + }, + "instrumental": { + "SDR": 15.0111, + "SIR": 26.8237, + "SAR": 17.0764, + "ISR": 18.9015 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.7102, + "SIR": 21.1019, + "SAR": 9.93077, + "ISR": 12.2174 + }, + "instrumental": { + "SDR": 15.2329, + "SIR": 19.0691, + "SAR": 15.0804, + "ISR": 17.7091 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.2312, + "SIR": 29.9449, + "SAR": 15.3861, + "ISR": 18.2236 + }, + "instrumental": { + "SDR": 16.0657, + "SIR": 29.5551, + "SAR": 18.3979, + "ISR": 18.9734 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.4058, + "SIR": 20.6741, + "SAR": 11.4405, + "ISR": 15.4073 + }, + "instrumental": { + "SDR": 15.1063, + "SIR": 26.2659, + "SAR": 17.4505, + "ISR": 17.9396 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.43656, + "SIR": 18.4789, + "SAR": 7.89525, + "ISR": 13.5155 + }, + "instrumental": { + "SDR": 15.0072, + "SIR": 26.4376, + "SAR": 17.115, + "ISR": 17.4657 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 7.50133, + "SIR": 14.5742, + "SAR": 7.65376, + "ISR": 12.5377 + }, + "instrumental": { + "SDR": 16.2975, + "SIR": 24.688, + "SAR": 18.5047, + "ISR": 17.3685 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.86693, + "SIR": 14.7055, + "SAR": 2.87049, + "ISR": 9.49421 + }, + "instrumental": { + "SDR": 14.7684, + "SIR": 22.6585, + "SAR": 17.8551, + "ISR": 18.1329 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.56312, + "SIR": 19.8559, + "SAR": 10.1818, + "ISR": 15.221 + }, + "instrumental": { + "SDR": 13.8904, + "SIR": 25.4695, + "SAR": 15.8216, + "ISR": 17.3503 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.44802, + "SIR": 24.1273, + "SAR": 8.76505, + "ISR": 13.2209 + }, + "instrumental": { + "SDR": 14.9115, + "SIR": 24.0172, + "SAR": 17.327, + "ISR": 18.6788 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -11.84, + "SIR": -36.8657, + "SAR": 0.59314, + "ISR": 6.84835 + }, + "instrumental": { + "SDR": 12.1057, + "SIR": 55.9667, + "SAR": 12.286, + "ISR": 12.3295 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.05944, + "SIR": 15.1203, + "SAR": 6.57126, + "ISR": 10.6478 + }, + "instrumental": { + "SDR": 16.1087, + "SIR": 21.6227, + "SAR": 17.8489, + "ISR": 17.6373 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.6845, + "SIR": 22.558, + "SAR": 10.5986, + "ISR": 14.6012 + }, + "instrumental": { + "SDR": 15.1599, + "SIR": 25.2379, + "SAR": 17.0471, + "ISR": 18.4966 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.4205, + "SIR": 22.0125, + "SAR": 11.1156, + "ISR": 16.0842 + }, + "instrumental": { + "SDR": 17.3912, + "SIR": 31.7735, + "SAR": 20.7251, + "ISR": 18.859 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -7.72346, + "SIR": -2.07454, + "SAR": -0.24123, + "ISR": 3.27877 + }, + "instrumental": { + "SDR": 19.6486, + "SIR": 40.0979, + "SAR": 28.9246, + "ISR": 18.7723 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.09011, + "SIR": 14.5775, + "SAR": 3.86788, + "ISR": 6.45496 + }, + "instrumental": { + "SDR": 10.6832, + "SIR": 14.1482, + "SAR": 14.3912, + "ISR": 17.1427 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.99333, + "SIR": 16.3305, + "SAR": 6.49331, + "ISR": 12.3837 + }, + "instrumental": { + "SDR": 17.2959, + "SIR": 28.9575, + "SAR": 20.1172, + "ISR": 18.6111 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.49893, + "SIR": 17.7827, + "SAR": 7.80719, + "ISR": 11.6089 + }, + "instrumental": { + "SDR": 14.3092, + "SIR": 22.2661, + "SAR": 16.9712, + "ISR": 18.0339 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.26891, + "SIR": 15.2998, + "SAR": 8.06571, + "ISR": 14.6527 + }, + "instrumental": { + "SDR": 15.1306, + "SIR": 25.9669, + "SAR": 16.2078, + "ISR": 16.8153 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 10.3262, + "SIR": 23.0929, + "SAR": 11.5833, + "ISR": 14.2597 + }, + "instrumental": { + "SDR": 12.6203, + "SIR": 20.5347, + "SAR": 13.7306, + "ISR": 17.0843 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.02312, + "SIR": 12.6744, + "SAR": 6.03027, + "ISR": 11.9248 + }, + "instrumental": { + "SDR": 11.7363, + "SIR": 19.9188, + "SAR": 13.0685, + "ISR": 14.5742 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 9.57363, + "SIR": 22.0864, + "SAR": 10.2347, + "ISR": 14.888 + }, + "instrumental": { + "SDR": 14.4283, + "SIR": 23.9455, + "SAR": 16.4424, + "ISR": 17.5327 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.6595, + "SIR": 28.888, + "SAR": 13.8634, + "ISR": 15.8432 + }, + "instrumental": { + "SDR": 14.4831, + "SIR": 20.0349, + "SAR": 14.3985, + "ISR": 18.5502 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.1304, + "SIR": 22.6742, + "SAR": 11.3828, + "ISR": 15.4408 + }, + "instrumental": { + "SDR": 13.99, + "SIR": 23.216, + "SAR": 15.3781, + "ISR": 17.2512 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.5453, + "SIR": 30.8469, + "SAR": 11.9946, + "ISR": 14.0146 + }, + "instrumental": { + "SDR": 17.0591, + "SIR": 25.028, + "SAR": 21.0303, + "ISR": 19.5824 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 4.73583, + "SIR": 9.23844, + "SAR": 8.12944, + "ISR": 9.82866 + }, + "instrumental": { + "SDR": 11.9026, + "SIR": 17.1661, + "SAR": 15.3949, + "ISR": 15.1906 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.4777, + "SIR": 25.5473, + "SAR": 13.1611, + "ISR": 18.1669 + }, + "instrumental": { + "SDR": 18.4218, + "SIR": 36.6375, + "SAR": 23.7677, + "ISR": 19.2077 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.7988, + "SIR": 19.27, + "SAR": 12.0695, + "ISR": 17.2874 + }, + "instrumental": { + "SDR": 11.4229, + "SIR": 24.3946, + "SAR": 12.033, + "ISR": 14.5602 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.11099, + "SIR": 20.0078, + "SAR": 8.18194, + "ISR": 13.66 + }, + "instrumental": { + "SDR": 13.1556, + "SIR": 22.6396, + "SAR": 14.4493, + "ISR": 17.1903 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 2.93495, + "SIR": 7.37853, + "SAR": 1.60049, + "ISR": 9.89124 + }, + "instrumental": { + "SDR": 17.4946, + "SIR": 31.2868, + "SAR": 21.2932, + "ISR": 17.637 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.88147, + "SIR": 24.5079, + "SAR": 10.3901, + "ISR": 15.9481 + }, + "instrumental": { + "SDR": 16.8393, + "SIR": 31.5393, + "SAR": 20.1513, + "ISR": 18.8433 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.0664, + "SIR": 27.3351, + "SAR": 11.0669, + "ISR": 15.6981 + }, + "instrumental": { + "SDR": 17.5943, + "SIR": 31.4723, + "SAR": 21.3877, + "ISR": 19.1606 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 11.087, + "SIR": 28.4364, + "SAR": 12.4375, + "ISR": 13.7448 + }, + "instrumental": { + "SDR": 14.1102, + "SIR": 20.1301, + "SAR": 16.0361, + "ISR": 18.5372 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.56837, + "SIR": 19.7424, + "SAR": 10.0563, + "ISR": 13.8797 + }, + "instrumental": { + "SDR": 14.9594, + "SIR": 24.7963, + "SAR": 17.0091, + "ISR": 17.6732 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "UVR_MDXNET_2_9682.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET 2", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.46453, + "SIR": 17.675, + "SAR": 4.99802, + "ISR": 9.81412 + }, + "instrumental": { + "SDR": 16.3486, + "SIR": 24.0614, + "SAR": 19.3918, + "ISR": 18.7301 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.40079, + "SIR": 12.6505, + "SAR": 6.87446, + "ISR": 12.1831 + }, + "instrumental": { + "SDR": 11.0032, + "SIR": 20.9133, + "SAR": 12.8517, + "ISR": 14.9143 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 9.60884, + "SIR": 21.165, + "SAR": 10.2813, + "ISR": 14.3951 + }, + "instrumental": { + "SDR": 15.2635, + "SIR": 25.1061, + "SAR": 17.8489, + "ISR": 18.1594 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 1.90264, + "SIR": 6.28893, + "SAR": 3.11339, + "ISR": 11.3278 + }, + "instrumental": { + "SDR": 11.244, + "SIR": 23.536, + "SAR": 13.3677, + "ISR": 14.0506 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.0659, + "SIR": 21.9569, + "SAR": 12.9948, + "ISR": 15.9682 + }, + "instrumental": { + "SDR": 14.0174, + "SIR": 23.7215, + "SAR": 15.3182, + "ISR": 16.9475 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.75154, + "SIR": 17.4055, + "SAR": 10.6096, + "ISR": 14.5785 + }, + "instrumental": { + "SDR": 11.4085, + "SIR": 21.4284, + "SAR": 12.955, + "ISR": 15.4553 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.1477, + "SIR": 19.6268, + "SAR": 12.2948, + "ISR": 14.8033 + }, + "instrumental": { + "SDR": 14.6056, + "SIR": 23.2574, + "SAR": 16.6226, + "ISR": 17.5846 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 4.67488, + "SIR": 18.4063, + "SAR": 5.36033, + "ISR": 7.55526 + }, + "instrumental": { + "SDR": 17.8995, + "SIR": 27.7493, + "SAR": 23.7172, + "ISR": 19.4267 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.7657, + "SIR": 30.9358, + "SAR": 12.432, + "ISR": 16.0457 + }, + "instrumental": { + "SDR": 15.089, + "SIR": 26.0163, + "SAR": 16.9656, + "ISR": 18.9324 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.2912, + "SIR": 21.634, + "SAR": 9.50986, + "ISR": 11.7108 + }, + "instrumental": { + "SDR": 15.0294, + "SIR": 18.2526, + "SAR": 14.9823, + "ISR": 17.8543 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 13.7488, + "SIR": 33.2106, + "SAR": 15.0597, + "ISR": 17.4611 + }, + "instrumental": { + "SDR": 16.1127, + "SIR": 28.2339, + "SAR": 18.4692, + "ISR": 19.2661 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.1442, + "SIR": 22.284, + "SAR": 11.57, + "ISR": 15.3503 + }, + "instrumental": { + "SDR": 15.196, + "SIR": 26.5929, + "SAR": 17.6819, + "ISR": 18.3769 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.38685, + "SIR": 18.5005, + "SAR": 7.50454, + "ISR": 12.8723 + }, + "instrumental": { + "SDR": 15.0623, + "SIR": 25.4058, + "SAR": 16.9194, + "ISR": 17.551 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.054, + "SIR": 17.0651, + "SAR": 8.54909, + "ISR": 12.103 + }, + "instrumental": { + "SDR": 17.1765, + "SIR": 24.3283, + "SAR": 20.4193, + "ISR": 18.1681 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.55396, + "SIR": 15.8365, + "SAR": 2.44444, + "ISR": 8.43451 + }, + "instrumental": { + "SDR": 14.9341, + "SIR": 21.3146, + "SAR": 18.3836, + "ISR": 18.5507 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.46262, + "SIR": 20.6013, + "SAR": 10.063, + "ISR": 14.745 + }, + "instrumental": { + "SDR": 14.0998, + "SIR": 24.4914, + "SAR": 15.9391, + "ISR": 17.5833 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.47292, + "SIR": 25.2321, + "SAR": 8.76002, + "ISR": 12.701 + }, + "instrumental": { + "SDR": 15.012, + "SIR": 23.2608, + "SAR": 17.525, + "ISR": 18.8558 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -13.5477, + "SIR": -39.1106, + "SAR": 0.574875, + "ISR": 7.92234 + }, + "instrumental": { + "SDR": 11.6151, + "SIR": 55.7281, + "SAR": 10.7725, + "ISR": 11.0453 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.65338, + "SIR": 16.2848, + "SAR": 6.5295, + "ISR": 9.77501 + }, + "instrumental": { + "SDR": 16.2414, + "SIR": 20.4103, + "SAR": 17.8276, + "ISR": 18.0219 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.2847, + "SIR": 22.8679, + "SAR": 10.0144, + "ISR": 13.0653 + }, + "instrumental": { + "SDR": 15.1428, + "SIR": 22.67, + "SAR": 17.2206, + "ISR": 18.6223 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.3432, + "SIR": 21.6254, + "SAR": 11.1767, + "ISR": 15.64 + }, + "instrumental": { + "SDR": 17.1878, + "SIR": 31.7235, + "SAR": 20.3718, + "ISR": 18.8224 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -10.6232, + "SIR": -2.82688, + "SAR": -0.54609, + "ISR": 3.24121 + }, + "instrumental": { + "SDR": 19.3804, + "SIR": 40.0579, + "SAR": 26.7598, + "ISR": 18.7482 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.00698, + "SIR": 14.508, + "SAR": 3.74174, + "ISR": 6.30936 + }, + "instrumental": { + "SDR": 10.6716, + "SIR": 13.9879, + "SAR": 14.4902, + "ISR": 17.1602 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.95819, + "SIR": 17.8621, + "SAR": 6.65397, + "ISR": 12.1497 + }, + "instrumental": { + "SDR": 17.3317, + "SIR": 28.1173, + "SAR": 20.52, + "ISR": 18.8462 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.32109, + "SIR": 18.7145, + "SAR": 7.37439, + "ISR": 10.5163 + }, + "instrumental": { + "SDR": 14.2612, + "SIR": 20.7908, + "SAR": 17.0235, + "ISR": 18.3184 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.04443, + "SIR": 15.5489, + "SAR": 8.24409, + "ISR": 14.1029 + }, + "instrumental": { + "SDR": 14.967, + "SIR": 25.1598, + "SAR": 15.887, + "ISR": 16.9169 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 10.7759, + "SIR": 22.8069, + "SAR": 11.5565, + "ISR": 14.3773 + }, + "instrumental": { + "SDR": 12.5197, + "SIR": 21.0681, + "SAR": 13.7147, + "ISR": 17.0303 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 5.9586, + "SIR": 13.1811, + "SAR": 5.64439, + "ISR": 11.0181 + }, + "instrumental": { + "SDR": 11.8985, + "SIR": 18.6698, + "SAR": 13.0894, + "ISR": 15.1756 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 9.28915, + "SIR": 22.2863, + "SAR": 9.89436, + "ISR": 14.4417 + }, + "instrumental": { + "SDR": 14.301, + "SIR": 22.9174, + "SAR": 16.4738, + "ISR": 17.6156 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.4937, + "SIR": 29.2387, + "SAR": 13.7039, + "ISR": 15.5505 + }, + "instrumental": { + "SDR": 14.4408, + "SIR": 19.4256, + "SAR": 14.1141, + "ISR": 18.6565 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.0405, + "SIR": 22.8459, + "SAR": 11.1872, + "ISR": 14.972 + }, + "instrumental": { + "SDR": 14.05, + "SIR": 22.5815, + "SAR": 15.3561, + "ISR": 17.3568 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.4453, + "SIR": 31.9477, + "SAR": 10.9486, + "ISR": 13.1744 + }, + "instrumental": { + "SDR": 17.0355, + "SIR": 24.1731, + "SAR": 20.5753, + "ISR": 19.6338 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 5.08407, + "SIR": 8.46666, + "SAR": 9.3276, + "ISR": 11.4642 + }, + "instrumental": { + "SDR": 11.6975, + "SIR": 18.1439, + "SAR": 15.5879, + "ISR": 14.6746 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.3457, + "SIR": 26.4682, + "SAR": 13.1293, + "ISR": 17.8 + }, + "instrumental": { + "SDR": 18.3587, + "SIR": 35.6293, + "SAR": 23.4796, + "ISR": 19.2539 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.7189, + "SIR": 19.0807, + "SAR": 11.997, + "ISR": 17.0414 + }, + "instrumental": { + "SDR": 11.3517, + "SIR": 23.7983, + "SAR": 11.89, + "ISR": 14.4862 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 7.89625, + "SIR": 21.1288, + "SAR": 7.86716, + "ISR": 12.9952 + }, + "instrumental": { + "SDR": 13.0086, + "SIR": 21.553, + "SAR": 14.396, + "ISR": 17.5262 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.14999, + "SIR": 7.29956, + "SAR": 1.73523, + "ISR": 9.65562 + }, + "instrumental": { + "SDR": 17.5368, + "SIR": 30.3149, + "SAR": 21.456, + "ISR": 17.6565 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.71596, + "SIR": 24.9536, + "SAR": 10.2683, + "ISR": 15.4547 + }, + "instrumental": { + "SDR": 16.762, + "SIR": 30.2496, + "SAR": 19.9945, + "ISR": 18.9098 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 10.7554, + "SIR": 27.5346, + "SAR": 10.7463, + "ISR": 15.0081 + }, + "instrumental": { + "SDR": 17.6448, + "SIR": 29.5343, + "SAR": 21.0699, + "ISR": 19.1887 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 10.7841, + "SIR": 29.4205, + "SAR": 11.9041, + "ISR": 13.1682 + }, + "instrumental": { + "SDR": 13.9315, + "SIR": 19.1659, + "SAR": 15.4771, + "ISR": 18.6308 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.37589, + "SIR": 20.114, + "SAR": 9.70211, + "ISR": 13.1167 + }, + "instrumental": { + "SDR": 14.9895, + "SIR": 23.7599, + "SAR": 16.9425, + "ISR": 18.0907 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "UVR_MDXNET_3_9662.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET 3", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.42437, + "SIR": 18.0352, + "SAR": 4.82973, + "ISR": 9.64703 + }, + "instrumental": { + "SDR": 16.4386, + "SIR": 24.5125, + "SAR": 19.4329, + "ISR": 18.7654 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.1878, + "SIR": 10.7021, + "SAR": 6.85693, + "ISR": 12.771 + }, + "instrumental": { + "SDR": 10.7318, + "SIR": 21.7972, + "SAR": 12.39, + "ISR": 13.7819 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 9.79669, + "SIR": 21.3539, + "SAR": 10.3349, + "ISR": 15.051 + }, + "instrumental": { + "SDR": 15.3426, + "SIR": 25.9844, + "SAR": 17.8024, + "ISR": 18.1867 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.02459, + "SIR": 6.35295, + "SAR": 4.14652, + "ISR": 12.2428 + }, + "instrumental": { + "SDR": 11.016, + "SIR": 25.1965, + "SAR": 13.4494, + "ISR": 13.8091 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.3189, + "SIR": 21.9519, + "SAR": 13.1978, + "ISR": 16.7153 + }, + "instrumental": { + "SDR": 14.0662, + "SIR": 24.923, + "SAR": 15.2796, + "ISR": 16.9025 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.85264, + "SIR": 17.3519, + "SAR": 10.7483, + "ISR": 15.2878 + }, + "instrumental": { + "SDR": 11.4036, + "SIR": 22.4904, + "SAR": 12.7851, + "ISR": 15.3741 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.3476, + "SIR": 19.4962, + "SAR": 12.3371, + "ISR": 15.5705 + }, + "instrumental": { + "SDR": 14.6022, + "SIR": 24.26, + "SAR": 16.721, + "ISR": 17.4832 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 4.74615, + "SIR": 18.4544, + "SAR": 4.71315, + "ISR": 8.64891 + }, + "instrumental": { + "SDR": 17.9891, + "SIR": 29.0545, + "SAR": 23.6419, + "ISR": 19.3618 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.9366, + "SIR": 31.2944, + "SAR": 12.575, + "ISR": 16.889 + }, + "instrumental": { + "SDR": 15.1399, + "SIR": 27.4436, + "SAR": 16.9471, + "ISR": 18.9532 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.6574, + "SIR": 21.5501, + "SAR": 9.96162, + "ISR": 12.527 + }, + "instrumental": { + "SDR": 15.1333, + "SIR": 19.1527, + "SAR": 15.0154, + "ISR": 17.7383 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 13.9829, + "SIR": 33.2907, + "SAR": 15.0955, + "ISR": 18.1661 + }, + "instrumental": { + "SDR": 16.0739, + "SIR": 29.1211, + "SAR": 18.3166, + "ISR": 19.2621 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.3782, + "SIR": 20.6799, + "SAR": 11.6328, + "ISR": 15.896 + }, + "instrumental": { + "SDR": 15.148, + "SIR": 26.753, + "SAR": 17.1879, + "ISR": 17.9421 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.34252, + "SIR": 18.8131, + "SAR": 7.53487, + "ISR": 13.3628 + }, + "instrumental": { + "SDR": 15.1386, + "SIR": 26.1589, + "SAR": 17.0481, + "ISR": 17.5584 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 7.22404, + "SIR": 14.8422, + "SAR": 7.59886, + "ISR": 12.8958 + }, + "instrumental": { + "SDR": 17.4483, + "SIR": 25.2, + "SAR": 19.3591, + "ISR": 17.59 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.92619, + "SIR": 15.9804, + "SAR": 2.72476, + "ISR": 9.41203 + }, + "instrumental": { + "SDR": 15.046, + "SIR": 22.6649, + "SAR": 18.3608, + "ISR": 18.4297 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.61468, + "SIR": 20.4557, + "SAR": 10.2076, + "ISR": 15.4281 + }, + "instrumental": { + "SDR": 13.9901, + "SIR": 25.7908, + "SAR": 15.78, + "ISR": 17.5149 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.5201, + "SIR": 25.0314, + "SAR": 8.75421, + "ISR": 13.1375 + }, + "instrumental": { + "SDR": 14.9306, + "SIR": 23.9525, + "SAR": 17.1972, + "ISR": 18.796 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -10.8954, + "SIR": -35.6572, + "SAR": 0.381915, + "ISR": 6.83652 + }, + "instrumental": { + "SDR": 12.8081, + "SIR": 55.9319, + "SAR": 12.8086, + "ISR": 13.0739 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.98865, + "SIR": 15.5812, + "SAR": 6.81185, + "ISR": 10.6987 + }, + "instrumental": { + "SDR": 16.2352, + "SIR": 21.8351, + "SAR": 17.971, + "ISR": 17.7113 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.6847, + "SIR": 22.8997, + "SAR": 10.8723, + "ISR": 14.8885 + }, + "instrumental": { + "SDR": 15.2196, + "SIR": 25.8273, + "SAR": 17.286, + "ISR": 18.5261 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.6468, + "SIR": 21.6175, + "SAR": 11.4004, + "ISR": 16.8164 + }, + "instrumental": { + "SDR": 17.165, + "SIR": 32.3308, + "SAR": 20.4557, + "ISR": 18.7655 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -6.77998, + "SIR": -2.3792, + "SAR": -0.14437, + "ISR": 3.29199 + }, + "instrumental": { + "SDR": 19.5861, + "SIR": 40.1276, + "SAR": 28.5117, + "ISR": 18.7367 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.05636, + "SIR": 14.1204, + "SAR": 3.91988, + "ISR": 6.57386 + }, + "instrumental": { + "SDR": 10.6256, + "SIR": 14.2504, + "SAR": 14.2993, + "ISR": 16.9377 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.9036, + "SIR": 16.1735, + "SAR": 6.39386, + "ISR": 13.5548 + }, + "instrumental": { + "SDR": 17.2797, + "SIR": 29.6737, + "SAR": 20.1652, + "ISR": 18.5442 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.44527, + "SIR": 18.378, + "SAR": 7.67087, + "ISR": 11.4873 + }, + "instrumental": { + "SDR": 14.2948, + "SIR": 22.0472, + "SAR": 16.8807, + "ISR": 18.114 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.24201, + "SIR": 15.5535, + "SAR": 8.26726, + "ISR": 14.8712 + }, + "instrumental": { + "SDR": 14.958, + "SIR": 26.355, + "SAR": 16.1321, + "ISR": 16.9138 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 10.7835, + "SIR": 23.1093, + "SAR": 11.5871, + "ISR": 14.8158 + }, + "instrumental": { + "SDR": 12.5905, + "SIR": 21.3343, + "SAR": 13.7621, + "ISR": 17.0638 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 5.51273, + "SIR": 11.2932, + "SAR": 5.62732, + "ISR": 12.4254 + }, + "instrumental": { + "SDR": 11.4883, + "SIR": 20.414, + "SAR": 12.6054, + "ISR": 13.8191 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 9.79265, + "SIR": 22.7855, + "SAR": 10.2925, + "ISR": 15.2721 + }, + "instrumental": { + "SDR": 14.4588, + "SIR": 24.2498, + "SAR": 16.3099, + "ISR": 17.6874 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.7526, + "SIR": 29.3443, + "SAR": 14.0836, + "ISR": 16.3733 + }, + "instrumental": { + "SDR": 14.4794, + "SIR": 20.6142, + "SAR": 14.2455, + "ISR": 18.6445 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.202, + "SIR": 22.9917, + "SAR": 11.3418, + "ISR": 15.6489 + }, + "instrumental": { + "SDR": 13.9037, + "SIR": 23.363, + "SAR": 15.2358, + "ISR": 17.3448 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.4552, + "SIR": 30.8639, + "SAR": 11.3646, + "ISR": 14.0787 + }, + "instrumental": { + "SDR": 17.0503, + "SIR": 25.1412, + "SAR": 20.8957, + "ISR": 19.5683 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.26357, + "SIR": 11.3464, + "SAR": 4.50709, + "ISR": 7.68187 + }, + "instrumental": { + "SDR": 11.3854, + "SIR": 15.1802, + "SAR": 13.3382, + "ISR": 17.083 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.6545, + "SIR": 27.2025, + "SAR": 13.3271, + "ISR": 18.3637 + }, + "instrumental": { + "SDR": 18.4151, + "SIR": 37.13, + "SAR": 23.6582, + "ISR": 19.3399 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.6609, + "SIR": 18.8866, + "SAR": 11.9621, + "ISR": 17.7706 + }, + "instrumental": { + "SDR": 11.3611, + "SIR": 26.058, + "SAR": 11.6222, + "ISR": 14.3553 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.0171, + "SIR": 20.6619, + "SAR": 7.98461, + "ISR": 13.5249 + }, + "instrumental": { + "SDR": 13.0022, + "SIR": 22.9276, + "SAR": 14.4146, + "ISR": 17.2664 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.17187, + "SIR": 7.66708, + "SAR": 2.08921, + "ISR": 9.77958 + }, + "instrumental": { + "SDR": 17.2533, + "SIR": 30.5264, + "SAR": 20.9702, + "ISR": 17.7179 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.83565, + "SIR": 25.0138, + "SAR": 10.3837, + "ISR": 16.1516 + }, + "instrumental": { + "SDR": 16.7805, + "SIR": 31.9866, + "SAR": 20.0389, + "ISR": 18.893 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.1021, + "SIR": 27.9211, + "SAR": 11.0349, + "ISR": 16.0174 + }, + "instrumental": { + "SDR": 17.7, + "SIR": 31.7467, + "SAR": 21.3614, + "ISR": 19.2058 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 11.2404, + "SIR": 28.6754, + "SAR": 12.3794, + "ISR": 14.2521 + }, + "instrumental": { + "SDR": 14.1266, + "SIR": 21.0291, + "SAR": 15.9185, + "ISR": 18.5261 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.70367, + "SIR": 19.976, + "SAR": 10.0846, + "ISR": 14.1654 + }, + "instrumental": { + "SDR": 15.002, + "SIR": 25.1688, + "SAR": 16.9139, + "ISR": 17.7281 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "UVR-MDX-NET-Inst_1.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET Inst 1", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.82133, + "SIR": 18.827, + "SAR": 5.68742, + "ISR": 9.93487 + }, + "instrumental": { + "SDR": 16.4818, + "SIR": 24.78, + "SAR": 19.7198, + "ISR": 18.7803 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.01205, + "SIR": 10.2907, + "SAR": 6.74881, + "ISR": 13.327 + }, + "instrumental": { + "SDR": 10.7604, + "SIR": 22.6716, + "SAR": 12.6458, + "ISR": 13.4699 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.3391, + "SIR": 20.8459, + "SAR": 10.9266, + "ISR": 15.4296 + }, + "instrumental": { + "SDR": 15.5183, + "SIR": 27.185, + "SAR": 18.1243, + "ISR": 17.9021 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.40693, + "SIR": 5.84656, + "SAR": 4.74525, + "ISR": 12.9332 + }, + "instrumental": { + "SDR": 11.1516, + "SIR": 25.5977, + "SAR": 13.5577, + "ISR": 13.456 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.0761, + "SIR": 22.3341, + "SAR": 13.3786, + "ISR": 16.2584 + }, + "instrumental": { + "SDR": 14.5241, + "SIR": 24.5901, + "SAR": 15.7514, + "ISR": 17.0892 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.0768, + "SIR": 17.8248, + "SAR": 10.9961, + "ISR": 14.9913 + }, + "instrumental": { + "SDR": 11.9039, + "SIR": 22.2719, + "SAR": 13.4026, + "ISR": 15.5459 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.6162, + "SIR": 20.5145, + "SAR": 12.7942, + "ISR": 15.097 + }, + "instrumental": { + "SDR": 14.9626, + "SIR": 24.206, + "SAR": 17.4561, + "ISR": 17.6882 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.03948, + "SIR": 17.5927, + "SAR": 5.81181, + "ISR": 8.08107 + }, + "instrumental": { + "SDR": 17.8406, + "SIR": 28.8281, + "SAR": 23.283, + "ISR": 19.248 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.5163, + "SIR": 28.6815, + "SAR": 13.2582, + "ISR": 16.775 + }, + "instrumental": { + "SDR": 15.2711, + "SIR": 28.1908, + "SAR": 17.7063, + "ISR": 18.6993 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.0333, + "SIR": 21.8075, + "SAR": 10.4498, + "ISR": 12.1428 + }, + "instrumental": { + "SDR": 15.7148, + "SIR": 18.2247, + "SAR": 15.6633, + "ISR": 17.7562 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.683, + "SIR": 31.6124, + "SAR": 16.4119, + "ISR": 18.1814 + }, + "instrumental": { + "SDR": 16.7295, + "SIR": 32.1348, + "SAR": 19.7392, + "ISR": 19.1319 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.2629, + "SIR": 21.2314, + "SAR": 11.511, + "ISR": 14.6865 + }, + "instrumental": { + "SDR": 15.172, + "SIR": 24.4783, + "SAR": 17.5185, + "ISR": 18.0282 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.36114, + "SIR": 19.3901, + "SAR": 7.89158, + "ISR": 13.4168 + }, + "instrumental": { + "SDR": 15.374, + "SIR": 26.2494, + "SAR": 17.5166, + "ISR": 17.7353 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.17133, + "SIR": 17.3938, + "SAR": 10.5581, + "ISR": 11.822 + }, + "instrumental": { + "SDR": 15.8198, + "SIR": 23.5432, + "SAR": 19.1527, + "ISR": 17.2943 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.45864, + "SIR": 16.7948, + "SAR": 3.45432, + "ISR": 9.16653 + }, + "instrumental": { + "SDR": 15.0818, + "SIR": 22.2247, + "SAR": 18.6655, + "ISR": 18.5209 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.67323, + "SIR": 20.1956, + "SAR": 10.3826, + "ISR": 15.0287 + }, + "instrumental": { + "SDR": 14.0093, + "SIR": 25.2223, + "SAR": 16.0314, + "ISR": 17.2692 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.46733, + "SIR": 14.4289, + "SAR": 8.26317, + "ISR": 13.8089 + }, + "instrumental": { + "SDR": 14.4638, + "SIR": 24.8882, + "SAR": 16.3475, + "ISR": 17.329 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -13.9087, + "SIR": -36.2914, + "SAR": 0.65834, + "ISR": 11.4568 + }, + "instrumental": { + "SDR": 13.6261, + "SIR": 57.9599, + "SAR": 13.2085, + "ISR": 13.0549 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.95456, + "SIR": 14.2596, + "SAR": 6.75791, + "ISR": 11.4243 + }, + "instrumental": { + "SDR": 15.7651, + "SIR": 22.4289, + "SAR": 17.9914, + "ISR": 17.1906 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.9847, + "SIR": 23.6265, + "SAR": 11.0551, + "ISR": 13.7479 + }, + "instrumental": { + "SDR": 15.5553, + "SIR": 24.1099, + "SAR": 17.5546, + "ISR": 18.5386 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 9.87595, + "SIR": 22.2421, + "SAR": 10.56, + "ISR": 15.4275 + }, + "instrumental": { + "SDR": 17.0812, + "SIR": 29.784, + "SAR": 20.5828, + "ISR": 18.7624 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -11.9397, + "SIR": -9.84927, + "SAR": -0.27485, + "ISR": 11.9883 + }, + "instrumental": { + "SDR": 19.3108, + "SIR": 42.4161, + "SAR": 30.6085, + "ISR": 19.3062 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.03531, + "SIR": 12.9645, + "SAR": 4.00333, + "ISR": 6.88912 + }, + "instrumental": { + "SDR": 10.565, + "SIR": 14.5892, + "SAR": 14.1943, + "ISR": 16.4317 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.1253, + "SIR": 14.9457, + "SAR": 7.07191, + "ISR": 13.9011 + }, + "instrumental": { + "SDR": 17.3149, + "SIR": 31.5911, + "SAR": 20.4903, + "ISR": 18.4403 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.67665, + "SIR": 18.1184, + "SAR": 8.08483, + "ISR": 11.709 + }, + "instrumental": { + "SDR": 14.5468, + "SIR": 22.421, + "SAR": 17.3646, + "ISR": 18.0213 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.76755, + "SIR": 17.0665, + "SAR": 9.24872, + "ISR": 14.4635 + }, + "instrumental": { + "SDR": 15.4349, + "SIR": 26.0756, + "SAR": 17.3962, + "ISR": 17.2898 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.4375, + "SIR": 22.9006, + "SAR": 11.8205, + "ISR": 14.441 + }, + "instrumental": { + "SDR": 12.8928, + "SIR": 21.1601, + "SAR": 14.2726, + "ISR": 17.157 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.74507, + "SIR": 16.9879, + "SAR": 6.50989, + "ISR": 10.7511 + }, + "instrumental": { + "SDR": 12.9893, + "SIR": 18.3637, + "SAR": 14.0045, + "ISR": 16.4332 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 7.03989, + "SIR": 8.53777, + "SAR": 8.42248, + "ISR": 15.6855 + }, + "instrumental": { + "SDR": 12.5511, + "SIR": 25.0212, + "SAR": 13.6745, + "ISR": 14.4074 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.7286, + "SIR": 29.0251, + "SAR": 15.0579, + "ISR": 16.4205 + }, + "instrumental": { + "SDR": 15.021, + "SIR": 21.9776, + "SAR": 15.3902, + "ISR": 18.5802 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.1669, + "SIR": 22.542, + "SAR": 11.7124, + "ISR": 15.4658 + }, + "instrumental": { + "SDR": 14.1597, + "SIR": 24.0232, + "SAR": 15.857, + "ISR": 17.2722 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.1201, + "SIR": 23.5612, + "SAR": 11.8078, + "ISR": 15.1698 + }, + "instrumental": { + "SDR": 16.7692, + "SIR": 28.1321, + "SAR": 21.0145, + "ISR": 18.986 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 4.08622, + "SIR": 8.53725, + "SAR": 6.44304, + "ISR": 11.1278 + }, + "instrumental": { + "SDR": 11.6671, + "SIR": 18.6134, + "SAR": 13.3115, + "ISR": 14.8267 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.6786, + "SIR": 26.7599, + "SAR": 13.251, + "ISR": 17.786 + }, + "instrumental": { + "SDR": 18.5981, + "SIR": 36.1545, + "SAR": 24.5599, + "ISR": 19.2087 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.0023, + "SIR": 19.8247, + "SAR": 12.3262, + "ISR": 16.8419 + }, + "instrumental": { + "SDR": 11.725, + "SIR": 23.7767, + "SAR": 12.5155, + "ISR": 14.8395 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.50035, + "SIR": 21.2886, + "SAR": 8.54565, + "ISR": 13.6276 + }, + "instrumental": { + "SDR": 13.6602, + "SIR": 22.6474, + "SAR": 15.2035, + "ISR": 17.5195 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 2.21839, + "SIR": 0.91338, + "SAR": 2.08767, + "ISR": 11.102 + }, + "instrumental": { + "SDR": 17.7142, + "SIR": 31.576, + "SAR": 21.3691, + "ISR": 17.4536 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.0856, + "SIR": 25.0043, + "SAR": 10.6565, + "ISR": 15.5804 + }, + "instrumental": { + "SDR": 16.9831, + "SIR": 30.4962, + "SAR": 20.5973, + "ISR": 18.9054 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.3863, + "SIR": 27.4513, + "SAR": 11.884, + "ISR": 15.9665 + }, + "instrumental": { + "SDR": 17.6539, + "SIR": 31.9858, + "SAR": 22.2182, + "ISR": 19.0893 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 12.873, + "SIR": 28.4651, + "SAR": 13.5462, + "ISR": 15.7344 + }, + "instrumental": { + "SDR": 15.303, + "SIR": 23.6916, + "SAR": 17.2506, + "ISR": 18.5393 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.22039, + "SIR": 19.6074, + "SAR": 10.4162, + "ISR": 14.1711 + }, + "instrumental": { + "SDR": 15.2216, + "SIR": 24.6851, + "SAR": 17.4261, + "ISR": 17.7117 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "UVR-MDX-NET-Inst_2.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET Inst 2", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.81251, + "SIR": 18.688, + "SAR": 5.91282, + "ISR": 10.5675 + }, + "instrumental": { + "SDR": 16.6667, + "SIR": 25.3572, + "SAR": 19.8788, + "ISR": 18.9157 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 7.03507, + "SIR": 13.2679, + "SAR": 7.40571, + "ISR": 12.5667 + }, + "instrumental": { + "SDR": 12.0218, + "SIR": 21.7743, + "SAR": 13.7749, + "ISR": 15.3119 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.2217, + "SIR": 21.8449, + "SAR": 10.7796, + "ISR": 15.1951 + }, + "instrumental": { + "SDR": 15.7542, + "SIR": 26.7667, + "SAR": 18.2101, + "ISR": 18.3445 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.63046, + "SIR": 6.79876, + "SAR": 4.04389, + "ISR": 12.7712 + }, + "instrumental": { + "SDR": 11.5335, + "SIR": 25.3537, + "SAR": 13.7167, + "ISR": 14.1187 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.1162, + "SIR": 23.1182, + "SAR": 13.224, + "ISR": 16.1107 + }, + "instrumental": { + "SDR": 14.7827, + "SIR": 24.2252, + "SAR": 15.8059, + "ISR": 17.4097 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.0125, + "SIR": 17.9988, + "SAR": 10.9954, + "ISR": 14.861 + }, + "instrumental": { + "SDR": 11.822, + "SIR": 21.9985, + "SAR": 13.4256, + "ISR": 15.6867 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.5837, + "SIR": 20.9345, + "SAR": 12.8295, + "ISR": 14.9077 + }, + "instrumental": { + "SDR": 15.0979, + "SIR": 24.146, + "SAR": 17.3049, + "ISR": 17.9542 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.17399, + "SIR": 18.5685, + "SAR": 5.59429, + "ISR": 8.04308 + }, + "instrumental": { + "SDR": 18.0321, + "SIR": 28.563, + "SAR": 23.5452, + "ISR": 19.5554 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.4912, + "SIR": 30.1042, + "SAR": 13.0478, + "ISR": 16.7307 + }, + "instrumental": { + "SDR": 15.3563, + "SIR": 28.3106, + "SAR": 17.6737, + "ISR": 19.0399 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.9501, + "SIR": 23.1963, + "SAR": 9.99365, + "ISR": 11.7486 + }, + "instrumental": { + "SDR": 15.8061, + "SIR": 17.732, + "SAR": 15.4562, + "ISR": 18.2028 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.7007, + "SIR": 32.2617, + "SAR": 16.3188, + "ISR": 18.1995 + }, + "instrumental": { + "SDR": 16.7778, + "SIR": 32.0005, + "SAR": 19.7468, + "ISR": 19.3556 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.3223, + "SIR": 22.0072, + "SAR": 11.7495, + "ISR": 14.9387 + }, + "instrumental": { + "SDR": 15.3016, + "SIR": 25.4108, + "SAR": 17.6072, + "ISR": 18.3561 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.31498, + "SIR": 19.5799, + "SAR": 7.7927, + "ISR": 13.256 + }, + "instrumental": { + "SDR": 15.3945, + "SIR": 26.171, + "SAR": 17.3545, + "ISR": 17.8872 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.27584, + "SIR": 19.2853, + "SAR": 10.7407, + "ISR": 11.7779 + }, + "instrumental": { + "SDR": 15.9625, + "SIR": 23.3491, + "SAR": 19.243, + "ISR": 17.7851 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.3567, + "SIR": 17.079, + "SAR": 3.28756, + "ISR": 9.18334 + }, + "instrumental": { + "SDR": 14.9156, + "SIR": 22.2411, + "SAR": 18.2914, + "ISR": 18.7129 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.63878, + "SIR": 20.7125, + "SAR": 10.3642, + "ISR": 14.9467 + }, + "instrumental": { + "SDR": 14.0722, + "SIR": 24.9552, + "SAR": 16.0758, + "ISR": 17.5367 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.2708, + "SIR": 14.4636, + "SAR": 7.96466, + "ISR": 13.7637 + }, + "instrumental": { + "SDR": 14.4284, + "SIR": 24.9753, + "SAR": 16.1224, + "ISR": 17.4161 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -12.5855, + "SIR": -35.3358, + "SAR": 0.11232, + "ISR": 11.6229 + }, + "instrumental": { + "SDR": 13.4063, + "SIR": 58.0105, + "SAR": 13.4108, + "ISR": 13.597 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.97203, + "SIR": 15.295, + "SAR": 6.33644, + "ISR": 10.9168 + }, + "instrumental": { + "SDR": 16.0535, + "SIR": 22.0756, + "SAR": 18.1735, + "ISR": 17.681 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.9766, + "SIR": 24.6515, + "SAR": 11.6324, + "ISR": 14.9982 + }, + "instrumental": { + "SDR": 15.8716, + "SIR": 26.0192, + "SAR": 18.0409, + "ISR": 18.8528 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.3924, + "SIR": 20.9976, + "SAR": 10.6197, + "ISR": 15.6971 + }, + "instrumental": { + "SDR": 17.3955, + "SIR": 31.3053, + "SAR": 20.5625, + "ISR": 18.7567 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -11.8627, + "SIR": -9.78477, + "SAR": 1.06071, + "ISR": 12.2823 + }, + "instrumental": { + "SDR": 19.1344, + "SIR": 42.4571, + "SAR": 30.3242, + "ISR": 18.8636 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.10058, + "SIR": 15.0494, + "SAR": 3.81815, + "ISR": 6.38847 + }, + "instrumental": { + "SDR": 10.7286, + "SIR": 14.1052, + "SAR": 14.5272, + "ISR": 17.3538 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.08509, + "SIR": 15.5865, + "SAR": 6.63364, + "ISR": 12.6521 + }, + "instrumental": { + "SDR": 17.6379, + "SIR": 28.6127, + "SAR": 20.7278, + "ISR": 18.8141 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.66062, + "SIR": 19.107, + "SAR": 7.74373, + "ISR": 11.2347 + }, + "instrumental": { + "SDR": 14.5588, + "SIR": 21.7933, + "SAR": 17.3106, + "ISR": 18.4283 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.7153, + "SIR": 16.7471, + "SAR": 8.96247, + "ISR": 14.5521 + }, + "instrumental": { + "SDR": 15.5425, + "SIR": 26.1372, + "SAR": 17.0841, + "ISR": 17.3688 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.0092, + "SIR": 23.7219, + "SAR": 11.8801, + "ISR": 14.1161 + }, + "instrumental": { + "SDR": 13.1992, + "SIR": 20.4075, + "SAR": 14.4947, + "ISR": 17.5465 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.6549, + "SIR": 17.0236, + "SAR": 6.30547, + "ISR": 11.0584 + }, + "instrumental": { + "SDR": 12.9959, + "SIR": 18.7037, + "SAR": 14.0408, + "ISR": 16.4825 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 6.97192, + "SIR": 8.53821, + "SAR": 8.4687, + "ISR": 15.3588 + }, + "instrumental": { + "SDR": 12.5946, + "SIR": 24.0052, + "SAR": 13.616, + "ISR": 14.4385 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.6432, + "SIR": 29.9424, + "SAR": 14.5316, + "ISR": 16.0745 + }, + "instrumental": { + "SDR": 15.0517, + "SIR": 20.8096, + "SAR": 14.995, + "ISR": 18.8446 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.4802, + "SIR": 23.5743, + "SAR": 11.7385, + "ISR": 15.3427 + }, + "instrumental": { + "SDR": 14.2596, + "SIR": 23.7544, + "SAR": 15.8844, + "ISR": 17.7275 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.0342, + "SIR": 23.6754, + "SAR": 12.0753, + "ISR": 15.1376 + }, + "instrumental": { + "SDR": 16.7604, + "SIR": 27.8391, + "SAR": 21.0371, + "ISR": 18.9115 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 4.28036, + "SIR": 8.85196, + "SAR": 6.18763, + "ISR": 10.6371 + }, + "instrumental": { + "SDR": 11.626, + "SIR": 18.5579, + "SAR": 12.7936, + "ISR": 15.3765 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.7333, + "SIR": 27.92, + "SAR": 13.3968, + "ISR": 17.6507 + }, + "instrumental": { + "SDR": 18.8562, + "SIR": 35.5962, + "SAR": 24.6942, + "ISR": 19.5919 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.9815, + "SIR": 20.5084, + "SAR": 12.2548, + "ISR": 16.6395 + }, + "instrumental": { + "SDR": 11.8528, + "SIR": 23.1744, + "SAR": 12.4432, + "ISR": 15.2815 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.27707, + "SIR": 22.7964, + "SAR": 8.51968, + "ISR": 13.3434 + }, + "instrumental": { + "SDR": 13.8097, + "SIR": 22.3462, + "SAR": 15.1678, + "ISR": 17.992 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 2.89108, + "SIR": 1.22211, + "SAR": 2.09401, + "ISR": 10.5277 + }, + "instrumental": { + "SDR": 17.9056, + "SIR": 31.19, + "SAR": 21.7378, + "ISR": 17.8806 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.88317, + "SIR": 25.9374, + "SAR": 10.5835, + "ISR": 15.707 + }, + "instrumental": { + "SDR": 17.0924, + "SIR": 30.6882, + "SAR": 20.5221, + "ISR": 19.1085 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.397, + "SIR": 29.8071, + "SAR": 11.8379, + "ISR": 15.666 + }, + "instrumental": { + "SDR": 17.9739, + "SIR": 31.2668, + "SAR": 22.1716, + "ISR": 19.4989 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 13.0323, + "SIR": 26.8458, + "SAR": 13.6038, + "ISR": 16.1593 + }, + "instrumental": { + "SDR": 15.3098, + "SIR": 24.8406, + "SAR": 16.8251, + "ISR": 18.4072 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.17704, + "SIR": 20.0442, + "SAR": 10.1789, + "ISR": 14.3341 + }, + "instrumental": { + "SDR": 15.3057, + "SIR": 24.9653, + "SAR": 17.3077, + "ISR": 17.9731 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "UVR-MDX-NET-Inst_3.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET Inst 3", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.77412, + "SIR": 16.6923, + "SAR": 5.69646, + "ISR": 9.88816 + }, + "instrumental": { + "SDR": 16.5002, + "SIR": 24.725, + "SAR": 19.8214, + "ISR": 18.6737 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.6432, + "SIR": 12.2482, + "SAR": 7.11848, + "ISR": 12.8001 + }, + "instrumental": { + "SDR": 11.7117, + "SIR": 22.0246, + "SAR": 13.5846, + "ISR": 14.7927 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.1246, + "SIR": 21.0051, + "SAR": 10.7916, + "ISR": 15.3012 + }, + "instrumental": { + "SDR": 15.6591, + "SIR": 26.9529, + "SAR": 18.25, + "ISR": 18.066 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.35652, + "SIR": 5.33454, + "SAR": 4.18202, + "ISR": 13.0928 + }, + "instrumental": { + "SDR": 10.9739, + "SIR": 26.0468, + "SAR": 13.1927, + "ISR": 13.1829 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.1438, + "SIR": 23.0382, + "SAR": 13.1487, + "ISR": 15.6307 + }, + "instrumental": { + "SDR": 14.6786, + "SIR": 23.0214, + "SAR": 15.7438, + "ISR": 17.3644 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.0864, + "SIR": 17.9835, + "SAR": 11.0516, + "ISR": 14.8473 + }, + "instrumental": { + "SDR": 11.9327, + "SIR": 22.0759, + "SAR": 13.5035, + "ISR": 15.6389 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.6754, + "SIR": 20.3464, + "SAR": 12.8819, + "ISR": 15.0967 + }, + "instrumental": { + "SDR": 15.0212, + "SIR": 24.3924, + "SAR": 17.3601, + "ISR": 17.749 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.2107, + "SIR": 18.2829, + "SAR": 5.40131, + "ISR": 8.26437 + }, + "instrumental": { + "SDR": 17.9332, + "SIR": 28.4715, + "SAR": 23.4861, + "ISR": 19.3926 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.4826, + "SIR": 29.5294, + "SAR": 13.2369, + "ISR": 16.8931 + }, + "instrumental": { + "SDR": 15.443, + "SIR": 28.6977, + "SAR": 17.6316, + "ISR": 18.8707 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.0404, + "SIR": 22.1815, + "SAR": 10.4648, + "ISR": 12.0875 + }, + "instrumental": { + "SDR": 15.7184, + "SIR": 17.6872, + "SAR": 15.6322, + "ISR": 17.8432 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.7543, + "SIR": 31.5931, + "SAR": 16.372, + "ISR": 18.2426 + }, + "instrumental": { + "SDR": 16.5709, + "SIR": 32.1309, + "SAR": 19.5579, + "ISR": 19.1107 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.382, + "SIR": 21.2525, + "SAR": 11.7638, + "ISR": 15.0526 + }, + "instrumental": { + "SDR": 15.3147, + "SIR": 25.443, + "SAR": 17.736, + "ISR": 18.0958 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.5724, + "SIR": 19.3888, + "SAR": 7.79543, + "ISR": 13.1371 + }, + "instrumental": { + "SDR": 15.4097, + "SIR": 25.8265, + "SAR": 17.4231, + "ISR": 17.8031 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.73592, + "SIR": 17.3382, + "SAR": 10.7469, + "ISR": 11.9492 + }, + "instrumental": { + "SDR": 15.915, + "SIR": 23.6542, + "SAR": 19.4073, + "ISR": 17.4486 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.42874, + "SIR": 16.5161, + "SAR": 3.26707, + "ISR": 9.28924 + }, + "instrumental": { + "SDR": 15.2586, + "SIR": 22.4019, + "SAR": 18.6682, + "ISR": 18.5654 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.73493, + "SIR": 20.3035, + "SAR": 10.3893, + "ISR": 15.0234 + }, + "instrumental": { + "SDR": 14.1035, + "SIR": 25.2992, + "SAR": 16.2181, + "ISR": 17.4163 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.27787, + "SIR": 14.3533, + "SAR": 8.00501, + "ISR": 13.6838 + }, + "instrumental": { + "SDR": 14.4864, + "SIR": 24.9136, + "SAR": 16.275, + "ISR": 17.3378 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -16.264, + "SIR": -35.0388, + "SAR": 0.564215, + "ISR": 11.1744 + }, + "instrumental": { + "SDR": 13.7218, + "SIR": 57.8283, + "SAR": 14.3418, + "ISR": 13.9544 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.0136, + "SIR": 13.9806, + "SAR": 6.93255, + "ISR": 11.3927 + }, + "instrumental": { + "SDR": 15.9361, + "SIR": 22.7253, + "SAR": 18.1929, + "ISR": 17.1884 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.9558, + "SIR": 23.735, + "SAR": 11.5231, + "ISR": 14.8201 + }, + "instrumental": { + "SDR": 15.6384, + "SIR": 25.9013, + "SAR": 18.0755, + "ISR": 18.6616 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.7621, + "SIR": 21.5123, + "SAR": 11.5013, + "ISR": 15.7124 + }, + "instrumental": { + "SDR": 17.2562, + "SIR": 30.9834, + "SAR": 20.9351, + "ISR": 18.767 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -11.9306, + "SIR": -9.79013, + "SAR": -0.79942, + "ISR": 11.6277 + }, + "instrumental": { + "SDR": 19.4271, + "SIR": 41.7745, + "SAR": 29.8428, + "ISR": 19.1896 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.00125, + "SIR": 13.5107, + "SAR": 3.90179, + "ISR": 6.47348 + }, + "instrumental": { + "SDR": 10.5122, + "SIR": 14.1438, + "SAR": 14.2941, + "ISR": 16.7864 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.38178, + "SIR": 15.6241, + "SAR": 6.94665, + "ISR": 12.8522 + }, + "instrumental": { + "SDR": 17.3635, + "SIR": 28.9353, + "SAR": 20.5629, + "ISR": 18.6211 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.70257, + "SIR": 18.1048, + "SAR": 8.07648, + "ISR": 11.6728 + }, + "instrumental": { + "SDR": 14.5529, + "SIR": 22.4592, + "SAR": 17.4272, + "ISR": 18.1521 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.40232, + "SIR": 16.5069, + "SAR": 8.71018, + "ISR": 14.3452 + }, + "instrumental": { + "SDR": 15.4161, + "SIR": 25.7865, + "SAR": 17.1866, + "ISR": 17.2058 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.428, + "SIR": 23.3453, + "SAR": 11.8697, + "ISR": 14.1061 + }, + "instrumental": { + "SDR": 12.9237, + "SIR": 20.452, + "SAR": 14.3812, + "ISR": 17.3982 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.51638, + "SIR": 15.9289, + "SAR": 6.18442, + "ISR": 10.6903 + }, + "instrumental": { + "SDR": 12.7455, + "SIR": 18.0861, + "SAR": 13.8035, + "ISR": 15.9961 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 7.15579, + "SIR": 8.54681, + "SAR": 8.55723, + "ISR": 15.4401 + }, + "instrumental": { + "SDR": 12.5769, + "SIR": 24.2447, + "SAR": 13.784, + "ISR": 14.4954 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.6892, + "SIR": 29.3146, + "SAR": 14.955, + "ISR": 16.2879 + }, + "instrumental": { + "SDR": 14.9736, + "SIR": 21.9336, + "SAR": 15.411, + "ISR": 18.6156 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.1469, + "SIR": 22.6559, + "SAR": 11.5175, + "ISR": 15.5156 + }, + "instrumental": { + "SDR": 14.1849, + "SIR": 24.3213, + "SAR": 15.8428, + "ISR": 17.369 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.2579, + "SIR": 23.7354, + "SAR": 12.0039, + "ISR": 15.6007 + }, + "instrumental": { + "SDR": 16.936, + "SIR": 28.954, + "SAR": 21.1182, + "ISR": 19.1507 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 4.33279, + "SIR": 9.47367, + "SAR": 6.30509, + "ISR": 10.6033 + }, + "instrumental": { + "SDR": 11.9254, + "SIR": 18.8455, + "SAR": 13.2567, + "ISR": 15.6338 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.5684, + "SIR": 27.0175, + "SAR": 13.4392, + "ISR": 17.6309 + }, + "instrumental": { + "SDR": 18.7265, + "SIR": 35.5074, + "SAR": 24.6931, + "ISR": 19.4144 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.879, + "SIR": 20.8992, + "SAR": 12.2585, + "ISR": 16.2141 + }, + "instrumental": { + "SDR": 11.6991, + "SIR": 21.9277, + "SAR": 12.6751, + "ISR": 15.4842 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.21066, + "SIR": 21.9736, + "SAR": 8.32494, + "ISR": 13.4856 + }, + "instrumental": { + "SDR": 13.8897, + "SIR": 22.3811, + "SAR": 15.2035, + "ISR": 17.7277 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 2.27717, + "SIR": 1.10583, + "SAR": 1.99922, + "ISR": 10.8617 + }, + "instrumental": { + "SDR": 17.8766, + "SIR": 31.135, + "SAR": 21.5214, + "ISR": 17.7908 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.1355, + "SIR": 24.331, + "SAR": 10.7942, + "ISR": 15.6704 + }, + "instrumental": { + "SDR": 16.8695, + "SIR": 30.7303, + "SAR": 20.4932, + "ISR": 18.7683 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.4206, + "SIR": 28.1421, + "SAR": 12.0984, + "ISR": 15.8227 + }, + "instrumental": { + "SDR": 17.9059, + "SIR": 31.6985, + "SAR": 22.2949, + "ISR": 19.344 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 12.8826, + "SIR": 28.5669, + "SAR": 13.7229, + "ISR": 15.697 + }, + "instrumental": { + "SDR": 15.32, + "SIR": 23.6641, + "SAR": 17.2697, + "ISR": 18.6702 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.23542, + "SIR": 19.8462, + "SAR": 10.4271, + "ISR": 14.2256 + }, + "instrumental": { + "SDR": 15.3174, + "SIR": 24.8193, + "SAR": 17.3916, + "ISR": 17.797 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "UVR_MDXNET_KARA.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET Karaoke", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 2.5289, + "SIR": 11.2152, + "SAR": 2.35093, + "ISR": 5.35324 + }, + "instrumental": { + "SDR": 15.417, + "SIR": 19.1696, + "SAR": 18.0835, + "ISR": 18.3171 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 5.0564, + "SIR": 20.8422, + "SAR": 3.04063, + "ISR": 5.94235 + }, + "instrumental": { + "SDR": 11.0574, + "SIR": 12.3998, + "SAR": 13.613, + "ISR": 18.6982 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.42771, + "SIR": 21.4445, + "SAR": 7.27498, + "ISR": 9.48009 + }, + "instrumental": { + "SDR": 14.2172, + "SIR": 17.0912, + "SAR": 15.8817, + "ISR": 18.4665 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": -0.2417, + "SIR": 4.58352, + "SAR": 0.58045, + "ISR": 7.36285 + }, + "instrumental": { + "SDR": 10.8566, + "SIR": 17.7441, + "SAR": 12.9671, + "ISR": 14.3204 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 7.05704, + "SIR": 25.0258, + "SAR": 6.52112, + "ISR": 8.94029 + }, + "instrumental": { + "SDR": 12.7104, + "SIR": 12.4674, + "SAR": 11.6818, + "ISR": 18.4151 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 4.22703, + "SIR": 16.9934, + "SAR": 3.32207, + "ISR": 5.83474 + }, + "instrumental": { + "SDR": 6.8695, + "SIR": 8.37493, + "SAR": 10.1326, + "ISR": 16.744 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 0.00129, + "SIR": 19.8825, + "SAR": -0.00767, + "ISR": 0.28846 + }, + "instrumental": { + "SDR": 5.40708, + "SIR": 4.76193, + "SAR": 26.5519, + "ISR": 19.7353 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 2.11186, + "SIR": 18.2667, + "SAR": 1.48356, + "ISR": 5.73909 + }, + "instrumental": { + "SDR": 17.6823, + "SIR": 23.9893, + "SAR": 22.9554, + "ISR": 19.4904 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.797, + "SIR": 31.2002, + "SAR": 12.566, + "ISR": 15.543 + }, + "instrumental": { + "SDR": 15.0166, + "SIR": 24.901, + "SAR": 17.0767, + "ISR": 18.9879 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 10.9809, + "SIR": 26.5403, + "SAR": 5.89875, + "ISR": 8.22557 + }, + "instrumental": { + "SDR": 14.935, + "SIR": 12.1093, + "SAR": 12.8441, + "ISR": 18.8993 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 13.5143, + "SIR": 32.4218, + "SAR": 15.1878, + "ISR": 16.9864 + }, + "instrumental": { + "SDR": 16.0623, + "SIR": 27.3009, + "SAR": 18.555, + "ISR": 19.2452 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.85284, + "SIR": 24.3374, + "SAR": 8.20191, + "ISR": 10.2457 + }, + "instrumental": { + "SDR": 13.7617, + "SIR": 16.2322, + "SAR": 15.6337, + "ISR": 18.9877 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 0.90552, + "SIR": 20.4224, + "SAR": 1.03737, + "ISR": 4.32479 + }, + "instrumental": { + "SDR": 14.8752, + "SIR": 13.851, + "SAR": 14.6467, + "ISR": 18.7664 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 4.50783, + "SIR": 20.7911, + "SAR": 5.41322, + "ISR": 8.66734 + }, + "instrumental": { + "SDR": 16.8127, + "SIR": 21.8516, + "SAR": 18.7515, + "ISR": 19.1797 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 1.65378, + "SIR": 17.9674, + "SAR": 1.90169, + "ISR": 7.14682 + }, + "instrumental": { + "SDR": 14.7536, + "SIR": 19.723, + "SAR": 18.36, + "ISR": 18.8948 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 6.67484, + "SIR": 20.7702, + "SAR": 6.83407, + "ISR": 8.76928 + }, + "instrumental": { + "SDR": 12.3704, + "SIR": 15.2497, + "SAR": 14.0335, + "ISR": 18.155 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 6.22372, + "SIR": 25.288, + "SAR": 5.07355, + "ISR": 8.02649 + }, + "instrumental": { + "SDR": 13.8656, + "SIR": 16.5137, + "SAR": 15.2239, + "ISR": 19.1731 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -7.45822, + "SIR": -21.5837, + "SAR": 0.136965, + "ISR": 2.6042 + }, + "instrumental": { + "SDR": 19.9325, + "SIR": 49.8401, + "SAR": 31.6203, + "ISR": 18.7976 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 0.01196, + "SIR": 19.1251, + "SAR": -0.41595, + "ISR": 1.09576 + }, + "instrumental": { + "SDR": 15.8854, + "SIR": 10.4612, + "SAR": 22.2658, + "ISR": 19.704 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 8.09551, + "SIR": 24.5233, + "SAR": 7.80483, + "ISR": 9.33324 + }, + "instrumental": { + "SDR": 13.9395, + "SIR": 16.8294, + "SAR": 15.563, + "ISR": 18.9361 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 6.5556, + "SIR": 23.7006, + "SAR": 7.94631, + "ISR": 10.6868 + }, + "instrumental": { + "SDR": 16.3188, + "SIR": 21.3961, + "SAR": 19.2505, + "ISR": 19.2721 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -7.62319, + "SIR": 1.91057, + "SAR": -0.56588, + "ISR": 3.09224 + }, + "instrumental": { + "SDR": 19.7168, + "SIR": 38.9092, + "SAR": 30.8064, + "ISR": 19.2763 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.54567, + "SIR": 15.3412, + "SAR": 2.60552, + "ISR": 5.09136 + }, + "instrumental": { + "SDR": 10.5507, + "SIR": 12.6737, + "SAR": 14.7341, + "ISR": 17.7351 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 0.002335, + "SIR": 19.0673, + "SAR": 0.491215, + "ISR": 3.59767 + }, + "instrumental": { + "SDR": 15.4957, + "SIR": 16.2419, + "SAR": 17.5179, + "ISR": 19.493 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 6.58333, + "SIR": 20.5853, + "SAR": 5.18569, + "ISR": 7.65773 + }, + "instrumental": { + "SDR": 13.8154, + "SIR": 16.7797, + "SAR": 16.1842, + "ISR": 18.8164 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 4.52231, + "SIR": 20.8251, + "SAR": 5.04768, + "ISR": 7.58749 + }, + "instrumental": { + "SDR": 14.8273, + "SIR": 17.189, + "SAR": 15.6916, + "ISR": 18.6621 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.31775, + "SIR": 25.9117, + "SAR": 8.49792, + "ISR": 9.32783 + }, + "instrumental": { + "SDR": 9.74533, + "SIR": 12.3206, + "SAR": 11.7556, + "ISR": 18.3058 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 3.33631, + "SIR": 22.5779, + "SAR": 2.94582, + "ISR": 5.59719 + }, + "instrumental": { + "SDR": 11.7145, + "SIR": 11.6574, + "SAR": 13.528, + "ISR": 18.4936 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 5.65104, + "SIR": 21.2336, + "SAR": 4.28864, + "ISR": 7.10642 + }, + "instrumental": { + "SDR": 13.2511, + "SIR": 13.8117, + "SAR": 14.0231, + "ISR": 18.0858 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 12.1986, + "SIR": 28.509, + "SAR": 10.741, + "ISR": 12.354 + }, + "instrumental": { + "SDR": 13.6971, + "SIR": 15.8368, + "SAR": 12.7692, + "ISR": 18.6517 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 6.57878, + "SIR": 24.4588, + "SAR": 6.62173, + "ISR": 8.29279 + }, + "instrumental": { + "SDR": 12.4588, + "SIR": 13.0202, + "SAR": 12.5844, + "ISR": 18.3553 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 7.0198, + "SIR": 32.5431, + "SAR": 0.6603, + "ISR": 3.93775 + }, + "instrumental": { + "SDR": 15.6696, + "SIR": 13.3786, + "SAR": 15.1539, + "ISR": 19.7558 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 0.00014, + "SIR": -20.6212, + "SAR": -0.45702, + "ISR": 0.01726 + }, + "instrumental": { + "SDR": 6.57204, + "SIR": 5.8997, + "SAR": 35.7573, + "ISR": 19.3374 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 8.41611, + "SIR": 20.7799, + "SAR": 9.15099, + "ISR": 13.4741 + }, + "instrumental": { + "SDR": 17.591, + "SIR": 25.573, + "SAR": 20.5776, + "ISR": 18.8046 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 7.85247, + "SIR": 20.7196, + "SAR": 8.5456, + "ISR": 11.3854 + }, + "instrumental": { + "SDR": 9.95266, + "SIR": 14.2309, + "SAR": 10.9413, + "ISR": 15.8568 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 4.64485, + "SIR": 25.3723, + "SAR": 4.9917, + "ISR": 9.26667 + }, + "instrumental": { + "SDR": 12.7043, + "SIR": 16.7264, + "SAR": 13.8338, + "ISR": 18.5124 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.47455, + "SIR": 7.92686, + "SAR": 2.24785, + "ISR": 9.32628 + }, + "instrumental": { + "SDR": 17.4367, + "SIR": 29.5998, + "SAR": 21.6625, + "ISR": 17.9467 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 8.55973, + "SIR": 24.4062, + "SAR": 9.26289, + "ISR": 13.9007 + }, + "instrumental": { + "SDR": 16.7302, + "SIR": 26.6979, + "SAR": 20.0271, + "ISR": 19.0294 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 5.51993, + "SIR": 28.8807, + "SAR": 5.99657, + "ISR": 9.43659 + }, + "instrumental": { + "SDR": 17.3484, + "SIR": 19.858, + "SAR": 18.2318, + "ISR": 19.3998 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 10.1749, + "SIR": 31.3892, + "SAR": 11.1233, + "ISR": 11.9124 + }, + "instrumental": { + "SDR": 13.652, + "SIR": 17.0774, + "SAR": 15.6846, + "ISR": 19.0312 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 5.58549, + "SIR": 20.8336, + "SAR": 5.06062, + "ISR": 8.12603 + }, + "instrumental": { + "SDR": 14.0784, + "SIR": 16.62, + "SAR": 15.6881, + "ISR": 18.8105 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "UVR_MDXNET_KARA_2.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET Karaoke 2", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.00209, + "SIR": 14.6178, + "SAR": 4.02018, + "ISR": 6.89909 + }, + "instrumental": { + "SDR": 16.0738, + "SIR": 21.7738, + "SAR": 19.382, + "ISR": 18.5912 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 5.61701, + "SIR": 15.9976, + "SAR": 3.58878, + "ISR": 7.10318 + }, + "instrumental": { + "SDR": 11.1291, + "SIR": 13.1536, + "SAR": 12.9738, + "ISR": 17.3359 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.4403, + "SIR": 20.9256, + "SAR": 6.77748, + "ISR": 9.65391 + }, + "instrumental": { + "SDR": 14.4604, + "SIR": 17.2931, + "SAR": 15.5827, + "ISR": 18.4917 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": -0.05866, + "SIR": 6.64083, + "SAR": 0.42683, + "ISR": 8.25522 + }, + "instrumental": { + "SDR": 11.1908, + "SIR": 18.6576, + "SAR": 13.2026, + "ISR": 15.1118 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 7.74512, + "SIR": 23.034, + "SAR": 6.60947, + "ISR": 9.47989 + }, + "instrumental": { + "SDR": 13.0425, + "SIR": 13.0028, + "SAR": 11.5975, + "ISR": 18.0243 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 3.85386, + "SIR": 17.1679, + "SAR": 3.48227, + "ISR": 5.91749 + }, + "instrumental": { + "SDR": 6.70028, + "SIR": 8.54596, + "SAR": 10.0753, + "ISR": 16.7695 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 0.23268, + "SIR": 9.92286, + "SAR": -0.03788, + "ISR": 0.49938 + }, + "instrumental": { + "SDR": 5.60307, + "SIR": 5.0142, + "SAR": 25.1527, + "ISR": 19.4889 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 0.13846, + "SIR": 15.7682, + "SAR": 0.2034, + "ISR": 5.63615 + }, + "instrumental": { + "SDR": 17.601, + "SIR": 23.7892, + "SAR": 21.2591, + "ISR": 19.6766 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.1373, + "SIR": 27.2753, + "SAR": 12.886, + "ISR": 16.4542 + }, + "instrumental": { + "SDR": 15.0802, + "SIR": 27.6426, + "SAR": 17.2078, + "ISR": 18.7498 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.0084, + "SIR": 22.9223, + "SAR": 5.92398, + "ISR": 8.46033 + }, + "instrumental": { + "SDR": 15.1456, + "SIR": 12.3467, + "SAR": 12.6568, + "ISR": 18.3492 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.328, + "SIR": 27.8906, + "SAR": 16.108, + "ISR": 18.0169 + }, + "instrumental": { + "SDR": 16.2058, + "SIR": 31.5902, + "SAR": 19.2708, + "ISR": 18.7522 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.32362, + "SIR": 21.663, + "SAR": 7.618, + "ISR": 10.1983 + }, + "instrumental": { + "SDR": 13.5594, + "SIR": 15.9231, + "SAR": 15.037, + "ISR": 18.656 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 2.17281, + "SIR": 19.7962, + "SAR": 2.65205, + "ISR": 5.91568 + }, + "instrumental": { + "SDR": 15.314, + "SIR": 15.6859, + "SAR": 14.8395, + "ISR": 18.6209 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 3.37859, + "SIR": 22.4801, + "SAR": 7.87591, + "ISR": 8.1133 + }, + "instrumental": { + "SDR": 15.1582, + "SIR": 19.3483, + "SAR": 17.7539, + "ISR": 18.6317 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.80189, + "SIR": 17.9656, + "SAR": 2.43705, + "ISR": 7.29403 + }, + "instrumental": { + "SDR": 15.1775, + "SIR": 20.1025, + "SAR": 18.9576, + "ISR": 19.0825 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 4.71807, + "SIR": 11.2673, + "SAR": 4.22871, + "ISR": 8.25058 + }, + "instrumental": { + "SDR": 10.511, + "SIR": 14.375, + "SAR": 11.6415, + "ISR": 14.8821 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 5.41812, + "SIR": 11.8352, + "SAR": 3.96709, + "ISR": 8.75844 + }, + "instrumental": { + "SDR": 13.4304, + "SIR": 17.374, + "SAR": 14.3986, + "ISR": 17.683 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -23.1605, + "SIR": -28.9331, + "SAR": 3.25109, + "ISR": 3.44229 + }, + "instrumental": { + "SDR": 18.6102, + "SIR": 51.8458, + "SAR": 26.2953, + "ISR": 17.5994 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 0.02973, + "SIR": 8.93427, + "SAR": -2.39192, + "ISR": 1.21133 + }, + "instrumental": { + "SDR": 15.4176, + "SIR": 10.5108, + "SAR": 21.0039, + "ISR": 19.1387 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 8.55331, + "SIR": 22.6488, + "SAR": 8.06089, + "ISR": 10.1118 + }, + "instrumental": { + "SDR": 14.292, + "SIR": 17.3233, + "SAR": 15.6319, + "ISR": 19.0169 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 6.55592, + "SIR": 20.5024, + "SAR": 7.03764, + "ISR": 11.308 + }, + "instrumental": { + "SDR": 16.0765, + "SIR": 22.1445, + "SAR": 18.6733, + "ISR": 19.0655 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -12.3401, + "SIR": -10.285, + "SAR": 2.02631, + "ISR": 13.1445 + }, + "instrumental": { + "SDR": 18.5384, + "SIR": 44.2884, + "SAR": 27.7559, + "ISR": 18.5052 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.60041, + "SIR": 13.9902, + "SAR": 2.79028, + "ISR": 5.53478 + }, + "instrumental": { + "SDR": 10.5275, + "SIR": 13.1438, + "SAR": 14.2331, + "ISR": 17.2593 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 0.06378, + "SIR": 14.0861, + "SAR": 2.22556, + "ISR": 3.74632 + }, + "instrumental": { + "SDR": 15.6304, + "SIR": 17.1904, + "SAR": 17.7502, + "ISR": 18.9147 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 6.90428, + "SIR": 18.6378, + "SAR": 5.25325, + "ISR": 7.95948 + }, + "instrumental": { + "SDR": 13.9243, + "SIR": 17.2284, + "SAR": 16.0703, + "ISR": 18.7996 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 4.9228, + "SIR": 20.4127, + "SAR": 5.21735, + "ISR": 8.13422 + }, + "instrumental": { + "SDR": 15.1717, + "SIR": 17.8859, + "SAR": 15.7567, + "ISR": 18.7401 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.53657, + "SIR": 24.2046, + "SAR": 8.55696, + "ISR": 9.67778 + }, + "instrumental": { + "SDR": 9.88331, + "SIR": 12.7892, + "SAR": 11.6531, + "ISR": 18.2938 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 4.02634, + "SIR": 18.2885, + "SAR": 3.03615, + "ISR": 6.154 + }, + "instrumental": { + "SDR": 12.1282, + "SIR": 12.3596, + "SAR": 13.3898, + "ISR": 17.6122 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 1.97955, + "SIR": 3.029, + "SAR": 3.86532, + "ISR": 7.06799 + }, + "instrumental": { + "SDR": 9.17006, + "SIR": 12.6082, + "SAR": 9.8683, + "ISR": 13.2213 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 12.895, + "SIR": 25.8397, + "SAR": 12.9456, + "ISR": 14.951 + }, + "instrumental": { + "SDR": 13.4513, + "SIR": 18.7673, + "SAR": 13.6884, + "ISR": 17.4373 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 6.73761, + "SIR": 22.2739, + "SAR": 6.93508, + "ISR": 8.94096 + }, + "instrumental": { + "SDR": 12.3558, + "SIR": 14.0053, + "SAR": 12.5062, + "ISR": 18.0781 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 7.24876, + "SIR": 15.1884, + "SAR": -0.06719, + "ISR": 3.41222 + }, + "instrumental": { + "SDR": 15.939, + "SIR": 12.4749, + "SAR": 14.844, + "ISR": 19.4028 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 0.4164, + "SIR": 2.98322, + "SAR": 2.62964, + "ISR": 0.79752 + }, + "instrumental": { + "SDR": 7.02398, + "SIR": 6.94421, + "SAR": 21.624, + "ISR": 16.9634 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 9.0089, + "SIR": 19.5793, + "SAR": 9.74325, + "ISR": 15.2366 + }, + "instrumental": { + "SDR": 18.0604, + "SIR": 28.919, + "SAR": 21.2845, + "ISR": 18.9835 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 8.71089, + "SIR": 19.7459, + "SAR": 9.98765, + "ISR": 13.4251 + }, + "instrumental": { + "SDR": 10.6064, + "SIR": 17.4769, + "SAR": 11.4112, + "ISR": 15.0596 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 5.44735, + "SIR": 23.9016, + "SAR": 6.00637, + "ISR": 10.073 + }, + "instrumental": { + "SDR": 13.0476, + "SIR": 18.3528, + "SAR": 14.0672, + "ISR": 18.5943 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.28806, + "SIR": 1.58512, + "SAR": 2.15331, + "ISR": 10.1362 + }, + "instrumental": { + "SDR": 17.2467, + "SIR": 30.7199, + "SAR": 21.4521, + "ISR": 17.9494 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.06921, + "SIR": 21.0888, + "SAR": 9.64567, + "ISR": 14.8451 + }, + "instrumental": { + "SDR": 16.4757, + "SIR": 28.7963, + "SAR": 20.1996, + "ISR": 18.3311 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 6.71127, + "SIR": 28.61, + "SAR": 7.06729, + "ISR": 10.4639 + }, + "instrumental": { + "SDR": 17.9043, + "SIR": 21.4157, + "SAR": 19.0342, + "ISR": 19.7535 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 12.6962, + "SIR": 26.9905, + "SAR": 12.4498, + "ISR": 14.6145 + }, + "instrumental": { + "SDR": 15.0861, + "SIR": 20.8174, + "SAR": 16.1717, + "ISR": 19.0106 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 5.43274, + "SIR": 19.1086, + "SAR": 4.72303, + "ISR": 8.35778 + }, + "instrumental": { + "SDR": 14.7703, + "SIR": 17.3486, + "SAR": 15.6943, + "ISR": 18.5482 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "UVR_MDXNET_9482.onnx": { + "model_name": "MDX-Net Model: UVR_MDXNET_9482", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.70393, + "SIR": 15.5526, + "SAR": 4.81548, + "ISR": 9.38948 + }, + "instrumental": { + "SDR": 16.1586, + "SIR": 23.716, + "SAR": 19.3851, + "ISR": 18.5291 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.07234, + "SIR": 11.5188, + "SAR": 6.46524, + "ISR": 12.3028 + }, + "instrumental": { + "SDR": 11.0337, + "SIR": 21.0694, + "SAR": 12.6453, + "ISR": 14.3454 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 9.57444, + "SIR": 20.8463, + "SAR": 10.1759, + "ISR": 14.1441 + }, + "instrumental": { + "SDR": 15.3294, + "SIR": 24.6644, + "SAR": 17.8505, + "ISR": 18.0982 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.61298, + "SIR": 6.81609, + "SAR": 4.26762, + "ISR": 11.5903 + }, + "instrumental": { + "SDR": 11.5345, + "SIR": 24.1792, + "SAR": 13.814, + "ISR": 14.2408 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 11.7806, + "SIR": 22.7088, + "SAR": 12.4303, + "ISR": 14.4563 + }, + "instrumental": { + "SDR": 13.9472, + "SIR": 20.8437, + "SAR": 14.8862, + "ISR": 17.3182 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.61124, + "SIR": 17.1145, + "SAR": 10.6343, + "ISR": 14.5098 + }, + "instrumental": { + "SDR": 11.3793, + "SIR": 21.2875, + "SAR": 12.9182, + "ISR": 15.3201 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.0505, + "SIR": 19.4148, + "SAR": 12.0564, + "ISR": 14.782 + }, + "instrumental": { + "SDR": 14.514, + "SIR": 22.9755, + "SAR": 16.5918, + "ISR": 17.5083 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 4.81049, + "SIR": 18.6439, + "SAR": 5.42254, + "ISR": 7.35925 + }, + "instrumental": { + "SDR": 17.9928, + "SIR": 27.498, + "SAR": 23.8777, + "ISR": 19.4397 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.593, + "SIR": 30.4032, + "SAR": 12.274, + "ISR": 15.7601 + }, + "instrumental": { + "SDR": 14.9079, + "SIR": 25.407, + "SAR": 16.8949, + "ISR": 18.8801 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.0795, + "SIR": 22.2326, + "SAR": 9.17702, + "ISR": 11.1506 + }, + "instrumental": { + "SDR": 14.9824, + "SIR": 17.1881, + "SAR": 14.7807, + "ISR": 18.0436 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 13.7058, + "SIR": 31.0123, + "SAR": 15.1995, + "ISR": 17.2948 + }, + "instrumental": { + "SDR": 15.9551, + "SIR": 28.0224, + "SAR": 18.3023, + "ISR": 19.094 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.075, + "SIR": 20.6309, + "SAR": 11.4508, + "ISR": 14.7976 + }, + "instrumental": { + "SDR": 15.1607, + "SIR": 25.3332, + "SAR": 17.4097, + "ISR": 18.0006 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.27385, + "SIR": 19.1073, + "SAR": 7.71731, + "ISR": 12.466 + }, + "instrumental": { + "SDR": 15.2578, + "SIR": 24.758, + "SAR": 17.3261, + "ISR": 17.7504 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.07183, + "SIR": 15.6675, + "SAR": 8.38538, + "ISR": 12.2443 + }, + "instrumental": { + "SDR": 16.9784, + "SIR": 24.0664, + "SAR": 19.6213, + "ISR": 17.8618 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.85222, + "SIR": 16.1512, + "SAR": 2.51033, + "ISR": 8.36815 + }, + "instrumental": { + "SDR": 14.9263, + "SIR": 21.5584, + "SAR": 18.2906, + "ISR": 18.5949 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.34075, + "SIR": 20.4862, + "SAR": 10.0069, + "ISR": 14.4871 + }, + "instrumental": { + "SDR": 14.0295, + "SIR": 24.0439, + "SAR": 15.9236, + "ISR": 17.6072 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.03683, + "SIR": 25.3606, + "SAR": 8.27512, + "ISR": 11.7679 + }, + "instrumental": { + "SDR": 14.5411, + "SIR": 21.6575, + "SAR": 17.0623, + "ISR": 18.9216 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -10.3898, + "SIR": -34.4487, + "SAR": 0.35722, + "ISR": 5.99467 + }, + "instrumental": { + "SDR": 12.8776, + "SIR": 55.2309, + "SAR": 13.3314, + "ISR": 13.8653 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.84294, + "SIR": 15.1574, + "SAR": 6.63296, + "ISR": 10.3164 + }, + "instrumental": { + "SDR": 16.1842, + "SIR": 21.1175, + "SAR": 17.9219, + "ISR": 17.6173 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.2859, + "SIR": 22.9345, + "SAR": 10.2, + "ISR": 13.6116 + }, + "instrumental": { + "SDR": 15.1128, + "SIR": 23.2923, + "SAR": 17.0267, + "ISR": 18.5958 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.2154, + "SIR": 21.7924, + "SAR": 10.8697, + "ISR": 15.1649 + }, + "instrumental": { + "SDR": 17.2812, + "SIR": 30.4496, + "SAR": 20.6088, + "ISR": 18.8924 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -6.82274, + "SIR": -0.63483, + "SAR": -0.25581, + "ISR": 3.20113 + }, + "instrumental": { + "SDR": 19.7076, + "SIR": 39.9579, + "SAR": 29.8587, + "ISR": 18.9095 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.90095, + "SIR": 14.4138, + "SAR": 3.6033, + "ISR": 6.06761 + }, + "instrumental": { + "SDR": 10.5705, + "SIR": 13.7069, + "SAR": 14.531, + "ISR": 17.2314 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.33652, + "SIR": 16.4959, + "SAR": 5.90402, + "ISR": 12.0358 + }, + "instrumental": { + "SDR": 17.0529, + "SIR": 28.1791, + "SAR": 19.4823, + "ISR": 18.6711 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.28505, + "SIR": 18.7056, + "SAR": 7.40894, + "ISR": 10.6887 + }, + "instrumental": { + "SDR": 14.2056, + "SIR": 20.9492, + "SAR": 17.0286, + "ISR": 18.3318 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 7.95278, + "SIR": 15.3467, + "SAR": 8.00745, + "ISR": 13.8601 + }, + "instrumental": { + "SDR": 15.0814, + "SIR": 24.6767, + "SAR": 16.214, + "ISR": 17.0421 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 10.0594, + "SIR": 23.5381, + "SAR": 11.2134, + "ISR": 13.524 + }, + "instrumental": { + "SDR": 12.5717, + "SIR": 19.4589, + "SAR": 13.7668, + "ISR": 17.2927 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.19798, + "SIR": 13.9414, + "SAR": 5.74761, + "ISR": 10.9749 + }, + "instrumental": { + "SDR": 12.4426, + "SIR": 18.7032, + "SAR": 13.481, + "ISR": 15.7538 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 9.22553, + "SIR": 21.7759, + "SAR": 9.85403, + "ISR": 14.1877 + }, + "instrumental": { + "SDR": 14.3882, + "SIR": 22.6655, + "SAR": 16.4587, + "ISR": 17.5904 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 13.9983, + "SIR": 28.7298, + "SAR": 13.6195, + "ISR": 15.1819 + }, + "instrumental": { + "SDR": 14.3429, + "SIR": 19.4762, + "SAR": 14.2158, + "ISR": 18.6116 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 10.6462, + "SIR": 23.0367, + "SAR": 11.1154, + "ISR": 14.5782 + }, + "instrumental": { + "SDR": 13.8868, + "SIR": 22.0221, + "SAR": 15.4119, + "ISR": 17.4377 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 9.80325, + "SIR": 30.5478, + "SAR": 10.7027, + "ISR": 12.4313 + }, + "instrumental": { + "SDR": 16.9112, + "SIR": 23.2796, + "SAR": 20.2875, + "ISR": 19.5943 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.50833, + "SIR": 9.98863, + "SAR": 6.62481, + "ISR": 9.32092 + }, + "instrumental": { + "SDR": 11.1524, + "SIR": 16.4919, + "SAR": 13.8134, + "ISR": 16.0344 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 11.8572, + "SIR": 25.6005, + "SAR": 12.9112, + "ISR": 17.098 + }, + "instrumental": { + "SDR": 18.313, + "SIR": 33.4432, + "SAR": 23.3386, + "ISR": 19.2252 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.6872, + "SIR": 19.2425, + "SAR": 11.8296, + "ISR": 16.353 + }, + "instrumental": { + "SDR": 11.2338, + "SIR": 22.4637, + "SAR": 11.8464, + "ISR": 14.5815 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 7.66394, + "SIR": 22.5477, + "SAR": 7.65051, + "ISR": 12.2621 + }, + "instrumental": { + "SDR": 13.1064, + "SIR": 20.8688, + "SAR": 14.572, + "ISR": 17.8358 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 2.79162, + "SIR": 7.26558, + "SAR": 1.97903, + "ISR": 9.30672 + }, + "instrumental": { + "SDR": 17.4457, + "SIR": 29.8962, + "SAR": 21.4895, + "ISR": 17.7156 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.64099, + "SIR": 24.9404, + "SAR": 10.27, + "ISR": 15.2421 + }, + "instrumental": { + "SDR": 16.7311, + "SIR": 29.6512, + "SAR": 20.1109, + "ISR": 18.9025 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 10.5596, + "SIR": 27.3402, + "SAR": 10.8957, + "ISR": 14.6915 + }, + "instrumental": { + "SDR": 17.6392, + "SIR": 29.0337, + "SAR": 21.2428, + "ISR": 19.1831 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 10.8846, + "SIR": 28.7445, + "SAR": 11.8919, + "ISR": 13.1481 + }, + "instrumental": { + "SDR": 13.93, + "SIR": 19.2918, + "SAR": 15.7187, + "ISR": 18.5865 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.28314, + "SIR": 19.9505, + "SAR": 9.51553, + "ISR": 12.8071 + }, + "instrumental": { + "SDR": 14.9171, + "SIR": 23.2859, + "SAR": 16.9608, + "ISR": 17.9312 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "UVR-MDX-NET-Voc_FT.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET Voc FT", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.85247, + "SIR": 18.6162, + "SAR": 5.85353, + "ISR": 9.82122 + }, + "instrumental": { + "SDR": 16.5346, + "SIR": 24.6446, + "SAR": 19.9257, + "ISR": 18.9024 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 7.96594, + "SIR": 17.5106, + "SAR": 8.00501, + "ISR": 12.1838 + }, + "instrumental": { + "SDR": 13.2981, + "SIR": 21.2883, + "SAR": 15.182, + "ISR": 17.0256 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.6445, + "SIR": 23.8935, + "SAR": 11.2081, + "ISR": 15.0075 + }, + "instrumental": { + "SDR": 16.0164, + "SIR": 26.5424, + "SAR": 18.7357, + "ISR": 18.5959 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.58071, + "SIR": 6.48431, + "SAR": 4.27237, + "ISR": 12.6095 + }, + "instrumental": { + "SDR": 11.17, + "SIR": 26.3101, + "SAR": 13.6593, + "ISR": 13.8797 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.8469, + "SIR": 23.7856, + "SAR": 13.9115, + "ISR": 16.3771 + }, + "instrumental": { + "SDR": 14.8464, + "SIR": 24.8091, + "SAR": 16.2189, + "ISR": 17.499 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.269, + "SIR": 18.9392, + "SAR": 11.0698, + "ISR": 14.838 + }, + "instrumental": { + "SDR": 12.134, + "SIR": 22.0301, + "SAR": 13.578, + "ISR": 16.1432 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.7642, + "SIR": 21.2362, + "SAR": 12.8601, + "ISR": 15.3088 + }, + "instrumental": { + "SDR": 15.1891, + "SIR": 24.2813, + "SAR": 17.2975, + "ISR": 18.0099 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.70382, + "SIR": 20.1665, + "SAR": 5.35759, + "ISR": 9.07049 + }, + "instrumental": { + "SDR": 18.2045, + "SIR": 29.2438, + "SAR": 24.3075, + "ISR": 19.4682 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.8063, + "SIR": 33.684, + "SAR": 13.7955, + "ISR": 16.5452 + }, + "instrumental": { + "SDR": 15.7797, + "SIR": 26.942, + "SAR": 18.1452, + "ISR": 19.2421 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.6163, + "SIR": 23.9791, + "SAR": 10.8092, + "ISR": 12.2521 + }, + "instrumental": { + "SDR": 16.2699, + "SIR": 18.8515, + "SAR": 16.0674, + "ISR": 18.3353 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.7031, + "SIR": 36.3939, + "SAR": 16.9067, + "ISR": 18.0324 + }, + "instrumental": { + "SDR": 16.8544, + "SIR": 29.9331, + "SAR": 20.0558, + "ISR": 19.479 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.7748, + "SIR": 22.6663, + "SAR": 12.1794, + "ISR": 15.498 + }, + "instrumental": { + "SDR": 15.7036, + "SIR": 26.7618, + "SAR": 17.9489, + "ISR": 18.3876 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.79256, + "SIR": 19.3248, + "SAR": 8.42329, + "ISR": 13.4326 + }, + "instrumental": { + "SDR": 15.3574, + "SIR": 26.2987, + "SAR": 17.5672, + "ISR": 17.6025 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 9.02421, + "SIR": 18.1668, + "SAR": 9.81481, + "ISR": 13.2326 + }, + "instrumental": { + "SDR": 17.9897, + "SIR": 25.1985, + "SAR": 22.189, + "ISR": 18.4285 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.75123, + "SIR": 16.3072, + "SAR": 3.78565, + "ISR": 9.39513 + }, + "instrumental": { + "SDR": 14.9584, + "SIR": 22.6741, + "SAR": 18.184, + "ISR": 18.5465 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.0409, + "SIR": 21.9385, + "SAR": 10.8427, + "ISR": 15.0522 + }, + "instrumental": { + "SDR": 14.7408, + "SIR": 25.2352, + "SAR": 16.7092, + "ISR": 18.0604 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 9.16098, + "SIR": 26.3273, + "SAR": 9.517, + "ISR": 13.7031 + }, + "instrumental": { + "SDR": 15.4281, + "SIR": 24.9875, + "SAR": 17.9108, + "ISR": 18.9762 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -5.16032, + "SIR": -33.5111, + "SAR": 0.18526, + "ISR": 10.7655 + }, + "instrumental": { + "SDR": 14.3143, + "SIR": 57.3696, + "SAR": 15.3099, + "ISR": 15.1747 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.40511, + "SIR": 16.6976, + "SAR": 7.30403, + "ISR": 10.9417 + }, + "instrumental": { + "SDR": 16.4242, + "SIR": 22.1563, + "SAR": 18.7711, + "ISR": 18.0463 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.0178, + "SIR": 24.8346, + "SAR": 11.2068, + "ISR": 14.8051 + }, + "instrumental": { + "SDR": 15.6918, + "SIR": 25.6284, + "SAR": 17.9008, + "ISR": 18.8346 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 11.1381, + "SIR": 24.3847, + "SAR": 12.0468, + "ISR": 15.701 + }, + "instrumental": { + "SDR": 17.7625, + "SIR": 32.2718, + "SAR": 22.2098, + "ISR": 19.159 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -2.33647, + "SIR": 1.85708, + "SAR": -0.10501, + "ISR": 3.53402 + }, + "instrumental": { + "SDR": 19.7916, + "SIR": 40.1614, + "SAR": 33.0704, + "ISR": 19.3178 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.17661, + "SIR": 14.7964, + "SAR": 4.01796, + "ISR": 6.64208 + }, + "instrumental": { + "SDR": 10.8177, + "SIR": 14.4024, + "SAR": 14.6059, + "ISR": 17.2214 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.78965, + "SIR": 17.8963, + "SAR": 7.29069, + "ISR": 12.9973 + }, + "instrumental": { + "SDR": 17.6829, + "SIR": 29.2335, + "SAR": 20.8738, + "ISR": 18.886 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.76178, + "SIR": 19.1443, + "SAR": 8.14042, + "ISR": 11.734 + }, + "instrumental": { + "SDR": 14.6389, + "SIR": 22.6177, + "SAR": 17.3795, + "ISR": 18.3685 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.80396, + "SIR": 18.0042, + "SAR": 9.31483, + "ISR": 14.4906 + }, + "instrumental": { + "SDR": 15.6034, + "SIR": 26.18, + "SAR": 17.5161, + "ISR": 17.5853 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.4557, + "SIR": 25.8265, + "SAR": 12.1438, + "ISR": 14.2183 + }, + "instrumental": { + "SDR": 13.6163, + "SIR": 20.5352, + "SAR": 14.8004, + "ISR": 17.8439 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.47755, + "SIR": 13.8203, + "SAR": 6.51348, + "ISR": 11.9656 + }, + "instrumental": { + "SDR": 12.312, + "SIR": 20.0225, + "SAR": 13.7489, + "ISR": 15.0913 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 10.7897, + "SIR": 25.4714, + "SAR": 11.2195, + "ISR": 15.6618 + }, + "instrumental": { + "SDR": 14.8927, + "SIR": 25.869, + "SAR": 17.2579, + "ISR": 17.8019 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 15.0109, + "SIR": 31.465, + "SAR": 14.6727, + "ISR": 15.9151 + }, + "instrumental": { + "SDR": 15.4396, + "SIR": 20.6849, + "SAR": 15.0187, + "ISR": 18.9824 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.3948, + "SIR": 25.0985, + "SAR": 12.1072, + "ISR": 15.4371 + }, + "instrumental": { + "SDR": 14.5233, + "SIR": 23.886, + "SAR": 16.0168, + "ISR": 17.9571 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.0623, + "SIR": 29.4646, + "SAR": 12.3561, + "ISR": 14.13 + }, + "instrumental": { + "SDR": 17.6522, + "SIR": 25.6851, + "SAR": 21.8034, + "ISR": 19.5396 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.12546, + "SIR": 10.2078, + "SAR": 5.63472, + "ISR": 8.10285 + }, + "instrumental": { + "SDR": 11.0255, + "SIR": 15.7903, + "SAR": 13.9319, + "ISR": 16.1243 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.2019, + "SIR": 26.8411, + "SAR": 14.4558, + "ISR": 17.7664 + }, + "instrumental": { + "SDR": 18.7103, + "SIR": 36.0611, + "SAR": 24.9146, + "ISR": 19.3984 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.6305, + "SIR": 21.4772, + "SAR": 11.8067, + "ISR": 15.6618 + }, + "instrumental": { + "SDR": 11.8029, + "SIR": 21.4342, + "SAR": 12.4832, + "ISR": 15.7957 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.59622, + "SIR": 21.5607, + "SAR": 8.76544, + "ISR": 13.634 + }, + "instrumental": { + "SDR": 14.0218, + "SIR": 22.9615, + "SAR": 15.4146, + "ISR": 17.6536 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.58659, + "SIR": 5.70285, + "SAR": 2.34938, + "ISR": 11.1776 + }, + "instrumental": { + "SDR": 17.2975, + "SIR": 31.1511, + "SAR": 21.33, + "ISR": 17.9352 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.2741, + "SIR": 25.9903, + "SAR": 10.9464, + "ISR": 15.5489 + }, + "instrumental": { + "SDR": 17.1617, + "SIR": 30.4592, + "SAR": 20.6779, + "ISR": 19.0455 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.9382, + "SIR": 30.5499, + "SAR": 12.7034, + "ISR": 15.9186 + }, + "instrumental": { + "SDR": 18.1179, + "SIR": 32.4492, + "SAR": 22.9616, + "ISR": 19.4414 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 12.1645, + "SIR": 30.7798, + "SAR": 14.2288, + "ISR": 14.6103 + }, + "instrumental": { + "SDR": 15.2234, + "SIR": 21.7717, + "SAR": 17.5695, + "ISR": 18.9104 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.1549, + "SIR": 21.519, + "SAR": 10.826, + "ISR": 14.1742 + }, + "instrumental": { + "SDR": 15.4338, + "SIR": 25.2169, + "SAR": 17.5684, + "ISR": 18.3519 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "Kim_Vocal_1.onnx": { + "model_name": "MDX-Net Model: Kim Vocal 1", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.7787, + "SIR": 19.3037, + "SAR": 5.83443, + "ISR": 9.62516 + }, + "instrumental": { + "SDR": 16.6193, + "SIR": 24.5137, + "SAR": 19.9734, + "ISR": 18.9958 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 7.72532, + "SIR": 16.6197, + "SAR": 7.91073, + "ISR": 11.9734 + }, + "instrumental": { + "SDR": 13.1701, + "SIR": 20.8569, + "SAR": 15.0532, + "ISR": 16.7519 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.5123, + "SIR": 24.3538, + "SAR": 11.0592, + "ISR": 14.8854 + }, + "instrumental": { + "SDR": 15.9999, + "SIR": 26.1584, + "SAR": 18.6098, + "ISR": 18.6795 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.3479, + "SIR": 6.26056, + "SAR": 4.23228, + "ISR": 12.5585 + }, + "instrumental": { + "SDR": 11.2788, + "SIR": 26.2322, + "SAR": 13.6273, + "ISR": 13.7472 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.8776, + "SIR": 24.3981, + "SAR": 13.4949, + "ISR": 15.7198 + }, + "instrumental": { + "SDR": 14.863, + "SIR": 23.2041, + "SAR": 15.9946, + "ISR": 17.7149 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.2076, + "SIR": 19.1108, + "SAR": 11.0353, + "ISR": 14.8802 + }, + "instrumental": { + "SDR": 12.1313, + "SIR": 22.1319, + "SAR": 13.5355, + "ISR": 16.1979 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.8044, + "SIR": 21.2777, + "SAR": 12.7373, + "ISR": 15.3939 + }, + "instrumental": { + "SDR": 15.1199, + "SIR": 24.2453, + "SAR": 17.1488, + "ISR": 18.0283 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.53386, + "SIR": 20.4466, + "SAR": 5.48217, + "ISR": 9.04914 + }, + "instrumental": { + "SDR": 18.1696, + "SIR": 28.9068, + "SAR": 24.204, + "ISR": 19.4861 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.7225, + "SIR": 34.019, + "SAR": 13.7318, + "ISR": 16.4829 + }, + "instrumental": { + "SDR": 15.7506, + "SIR": 26.8203, + "SAR": 17.9955, + "ISR": 19.2422 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.6082, + "SIR": 24.6136, + "SAR": 10.4236, + "ISR": 11.8828 + }, + "instrumental": { + "SDR": 16.2434, + "SIR": 18.1343, + "SAR": 15.5907, + "ISR": 18.4772 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.7653, + "SIR": 37.0024, + "SAR": 16.72, + "ISR": 18.0918 + }, + "instrumental": { + "SDR": 16.8061, + "SIR": 30.0302, + "SAR": 19.9635, + "ISR": 19.5142 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.6722, + "SIR": 23.7029, + "SAR": 12.1194, + "ISR": 15.2511 + }, + "instrumental": { + "SDR": 15.7233, + "SIR": 26.1193, + "SAR": 17.9673, + "ISR": 18.61 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.81356, + "SIR": 19.7831, + "SAR": 8.39421, + "ISR": 13.3889 + }, + "instrumental": { + "SDR": 15.4745, + "SIR": 26.3038, + "SAR": 17.7676, + "ISR": 17.8354 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.8218, + "SIR": 18.7611, + "SAR": 9.515, + "ISR": 13.2065 + }, + "instrumental": { + "SDR": 18.211, + "SIR": 25.1118, + "SAR": 22.173, + "ISR": 18.5333 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.88415, + "SIR": 18.0369, + "SAR": 4.06765, + "ISR": 9.15582 + }, + "instrumental": { + "SDR": 15.1837, + "SIR": 22.4004, + "SAR": 18.4696, + "ISR": 18.7867 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.0277, + "SIR": 21.9748, + "SAR": 10.7622, + "ISR": 15.1361 + }, + "instrumental": { + "SDR": 14.7132, + "SIR": 25.3496, + "SAR": 16.6553, + "ISR": 18.0576 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 9.12554, + "SIR": 26.566, + "SAR": 9.46116, + "ISR": 13.6395 + }, + "instrumental": { + "SDR": 15.484, + "SIR": 24.8508, + "SAR": 18.0095, + "ISR": 18.9962 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -5.90419, + "SIR": -33.1553, + "SAR": 0.318885, + "ISR": 9.98123 + }, + "instrumental": { + "SDR": 14.6152, + "SIR": 56.8769, + "SAR": 15.6243, + "ISR": 15.3254 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.34323, + "SIR": 16.9046, + "SAR": 7.19502, + "ISR": 10.8001 + }, + "instrumental": { + "SDR": 16.4855, + "SIR": 21.9075, + "SAR": 18.4947, + "ISR": 18.1059 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.0283, + "SIR": 25.1683, + "SAR": 11.1416, + "ISR": 14.676 + }, + "instrumental": { + "SDR": 15.5838, + "SIR": 25.7431, + "SAR": 17.7343, + "ISR": 18.8768 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.8575, + "SIR": 24.4099, + "SAR": 11.7502, + "ISR": 15.632 + }, + "instrumental": { + "SDR": 17.6651, + "SIR": 32.0456, + "SAR": 21.6783, + "ISR": 19.1703 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -2.62992, + "SIR": 1.47867, + "SAR": -0.12885, + "ISR": 3.53572 + }, + "instrumental": { + "SDR": 19.7668, + "SIR": 40.5453, + "SAR": 32.6216, + "ISR": 19.293 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.12934, + "SIR": 14.6188, + "SAR": 3.96225, + "ISR": 6.55847 + }, + "instrumental": { + "SDR": 10.8107, + "SIR": 14.2916, + "SAR": 14.66, + "ISR": 17.1994 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.48564, + "SIR": 17.1307, + "SAR": 6.91522, + "ISR": 13.4063 + }, + "instrumental": { + "SDR": 17.6587, + "SIR": 29.5261, + "SAR": 20.6854, + "ISR": 18.7757 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.68942, + "SIR": 19.4542, + "SAR": 8.09418, + "ISR": 11.6124 + }, + "instrumental": { + "SDR": 14.6184, + "SIR": 22.4699, + "SAR": 17.2804, + "ISR": 18.4301 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.6663, + "SIR": 18.6032, + "SAR": 9.33868, + "ISR": 14.3162 + }, + "instrumental": { + "SDR": 15.5574, + "SIR": 25.9722, + "SAR": 17.2718, + "ISR": 17.7623 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.3979, + "SIR": 26.3154, + "SAR": 11.9998, + "ISR": 14.2104 + }, + "instrumental": { + "SDR": 13.6197, + "SIR": 20.5099, + "SAR": 14.7268, + "ISR": 17.9731 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.72467, + "SIR": 16.3565, + "SAR": 6.43715, + "ISR": 11.2926 + }, + "instrumental": { + "SDR": 12.8279, + "SIR": 19.1357, + "SAR": 14.1054, + "ISR": 16.1796 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 10.682, + "SIR": 25.6488, + "SAR": 11.2064, + "ISR": 15.7281 + }, + "instrumental": { + "SDR": 14.9126, + "SIR": 25.8945, + "SAR": 17.1637, + "ISR": 17.7615 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 15.0262, + "SIR": 31.8946, + "SAR": 14.5439, + "ISR": 15.885 + }, + "instrumental": { + "SDR": 15.3924, + "SIR": 20.5674, + "SAR": 14.8726, + "ISR": 19.0238 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.4785, + "SIR": 25.2074, + "SAR": 12.1125, + "ISR": 15.435 + }, + "instrumental": { + "SDR": 14.5186, + "SIR": 23.9035, + "SAR": 16.0137, + "ISR": 17.9791 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.8562, + "SIR": 29.5296, + "SAR": 12.0968, + "ISR": 14.2107 + }, + "instrumental": { + "SDR": 17.5601, + "SIR": 25.6694, + "SAR": 21.7747, + "ISR": 19.5271 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.12053, + "SIR": 9.82821, + "SAR": 6.35754, + "ISR": 9.48596 + }, + "instrumental": { + "SDR": 10.9955, + "SIR": 16.6271, + "SAR": 13.7444, + "ISR": 15.8035 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.1288, + "SIR": 26.5795, + "SAR": 14.2956, + "ISR": 17.8476 + }, + "instrumental": { + "SDR": 18.7061, + "SIR": 36.3053, + "SAR": 24.6828, + "ISR": 19.3872 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.1856, + "SIR": 22.2052, + "SAR": 11.3637, + "ISR": 14.8685 + }, + "instrumental": { + "SDR": 11.4526, + "SIR": 19.9352, + "SAR": 12.3851, + "ISR": 16.0649 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.3438, + "SIR": 21.7652, + "SAR": 8.52415, + "ISR": 13.4414 + }, + "instrumental": { + "SDR": 13.8409, + "SIR": 22.5935, + "SAR": 15.243, + "ISR": 17.7323 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.63183, + "SIR": 5.93662, + "SAR": 2.39649, + "ISR": 11.1103 + }, + "instrumental": { + "SDR": 17.329, + "SIR": 30.7894, + "SAR": 21.3316, + "ISR": 17.9891 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.2666, + "SIR": 26.4786, + "SAR": 10.8872, + "ISR": 15.5374 + }, + "instrumental": { + "SDR": 17.1934, + "SIR": 30.4887, + "SAR": 20.5983, + "ISR": 19.0959 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.9033, + "SIR": 30.7985, + "SAR": 12.6202, + "ISR": 16.0502 + }, + "instrumental": { + "SDR": 18.1294, + "SIR": 32.5599, + "SAR": 22.7484, + "ISR": 19.452 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 12.0683, + "SIR": 30.8377, + "SAR": 14.0395, + "ISR": 14.3655 + }, + "instrumental": { + "SDR": 14.9496, + "SIR": 21.0722, + "SAR": 17.4033, + "ISR": 18.921 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.1067, + "SIR": 21.87, + "SAR": 10.5929, + "ISR": 14.2105 + }, + "instrumental": { + "SDR": 15.4793, + "SIR": 25.2307, + "SAR": 17.5688, + "ISR": 18.4536 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "Kim_Vocal_2.onnx": { + "model_name": "MDX-Net Model: Kim Vocal 2", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.78748, + "SIR": 18.1983, + "SAR": 5.91704, + "ISR": 10.1435 + }, + "instrumental": { + "SDR": 16.5766, + "SIR": 24.9934, + "SAR": 19.8726, + "ISR": 18.7919 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 8.03279, + "SIR": 17.5348, + "SAR": 8.07367, + "ISR": 12.4061 + }, + "instrumental": { + "SDR": 13.2508, + "SIR": 21.5817, + "SAR": 15.168, + "ISR": 16.9983 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.6233, + "SIR": 23.2434, + "SAR": 11.1794, + "ISR": 15.2452 + }, + "instrumental": { + "SDR": 15.9744, + "SIR": 26.8562, + "SAR": 18.6375, + "ISR": 18.4786 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.30705, + "SIR": 6.44751, + "SAR": 4.3895, + "ISR": 12.6803 + }, + "instrumental": { + "SDR": 11.2415, + "SIR": 26.6465, + "SAR": 13.586, + "ISR": 13.8498 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.8263, + "SIR": 23.5513, + "SAR": 14.1046, + "ISR": 16.6691 + }, + "instrumental": { + "SDR": 14.8004, + "SIR": 25.2006, + "SAR": 16.2002, + "ISR": 17.3963 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.2559, + "SIR": 18.7186, + "SAR": 11.1054, + "ISR": 14.9016 + }, + "instrumental": { + "SDR": 12.0543, + "SIR": 22.1427, + "SAR": 13.5384, + "ISR": 16.0391 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.7289, + "SIR": 21.057, + "SAR": 12.8999, + "ISR": 15.2477 + }, + "instrumental": { + "SDR": 15.2356, + "SIR": 24.3255, + "SAR": 17.3425, + "ISR": 17.9555 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.54312, + "SIR": 19.8927, + "SAR": 5.29757, + "ISR": 9.15676 + }, + "instrumental": { + "SDR": 18.1248, + "SIR": 29.5977, + "SAR": 24.2145, + "ISR": 19.441 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.9178, + "SIR": 33.076, + "SAR": 13.778, + "ISR": 16.8409 + }, + "instrumental": { + "SDR": 15.6294, + "SIR": 27.5723, + "SAR": 18.1363, + "ISR": 19.1667 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.6482, + "SIR": 23.1401, + "SAR": 10.9009, + "ISR": 12.5658 + }, + "instrumental": { + "SDR": 16.2588, + "SIR": 19.4777, + "SAR": 16.268, + "ISR": 18.138 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.7466, + "SIR": 35.6205, + "SAR": 16.9331, + "ISR": 18.2321 + }, + "instrumental": { + "SDR": 16.8514, + "SIR": 30.4856, + "SAR": 20.2734, + "ISR": 19.4275 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.7835, + "SIR": 21.6868, + "SAR": 12.2327, + "ISR": 15.9921 + }, + "instrumental": { + "SDR": 15.5987, + "SIR": 28.1843, + "SAR": 17.7422, + "ISR": 18.1653 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.78312, + "SIR": 16.2525, + "SAR": 8.30285, + "ISR": 13.6426 + }, + "instrumental": { + "SDR": 14.5191, + "SIR": 26.6244, + "SAR": 16.7724, + "ISR": 16.9445 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 9.03621, + "SIR": 17.1699, + "SAR": 9.78009, + "ISR": 13.3789 + }, + "instrumental": { + "SDR": 17.5654, + "SIR": 25.3953, + "SAR": 21.2052, + "ISR": 18.2209 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.62285, + "SIR": 15.4851, + "SAR": 3.48634, + "ISR": 9.60032 + }, + "instrumental": { + "SDR": 14.9442, + "SIR": 22.9515, + "SAR": 18.184, + "ISR": 18.397 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.1029, + "SIR": 21.6369, + "SAR": 10.8482, + "ISR": 15.1901 + }, + "instrumental": { + "SDR": 14.6988, + "SIR": 25.5247, + "SAR": 16.7924, + "ISR": 17.9737 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 9.22076, + "SIR": 25.928, + "SAR": 9.53879, + "ISR": 13.8432 + }, + "instrumental": { + "SDR": 15.3079, + "SIR": 25.2327, + "SAR": 17.8101, + "ISR": 18.9256 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -7.82072, + "SIR": -34.0399, + "SAR": 0.271745, + "ISR": 11.184 + }, + "instrumental": { + "SDR": 14.0513, + "SIR": 57.7268, + "SAR": 14.9775, + "ISR": 14.7599 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.32928, + "SIR": 16.3347, + "SAR": 7.1888, + "ISR": 11.0469 + }, + "instrumental": { + "SDR": 16.3661, + "SIR": 22.2271, + "SAR": 18.7206, + "ISR": 17.9562 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.1147, + "SIR": 24.3264, + "SAR": 11.3121, + "ISR": 14.9408 + }, + "instrumental": { + "SDR": 15.8885, + "SIR": 25.9411, + "SAR": 18.1125, + "ISR": 18.7605 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 11.0218, + "SIR": 21.9526, + "SAR": 12.0348, + "ISR": 16.3209 + }, + "instrumental": { + "SDR": 17.7501, + "SIR": 33.344, + "SAR": 21.7712, + "ISR": 18.8814 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -2.12617, + "SIR": 1.41337, + "SAR": -0.07959, + "ISR": 3.5151 + }, + "instrumental": { + "SDR": 19.7915, + "SIR": 40.0327, + "SAR": 32.9356, + "ISR": 19.3013 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.21663, + "SIR": 14.4897, + "SAR": 4.0762, + "ISR": 6.78415 + }, + "instrumental": { + "SDR": 10.7745, + "SIR": 14.5625, + "SAR": 14.415, + "ISR": 17.0671 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.43246, + "SIR": 19.2882, + "SAR": 7.11181, + "ISR": 12.7918 + }, + "instrumental": { + "SDR": 17.617, + "SIR": 28.6754, + "SAR": 20.4346, + "ISR": 18.9706 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.80663, + "SIR": 18.6989, + "SAR": 8.16437, + "ISR": 11.9199 + }, + "instrumental": { + "SDR": 14.6036, + "SIR": 22.8508, + "SAR": 17.3628, + "ISR": 18.2662 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.68653, + "SIR": 16.4102, + "SAR": 8.77651, + "ISR": 14.8132 + }, + "instrumental": { + "SDR": 15.6596, + "SIR": 26.7008, + "SAR": 17.2505, + "ISR": 17.1268 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.531, + "SIR": 24.9249, + "SAR": 12.2922, + "ISR": 14.5638 + }, + "instrumental": { + "SDR": 13.2538, + "SIR": 21.2963, + "SAR": 14.6618, + "ISR": 17.5915 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.21945, + "SIR": 11.5096, + "SAR": 6.22666, + "ISR": 12.6766 + }, + "instrumental": { + "SDR": 11.5724, + "SIR": 20.7357, + "SAR": 13.0614, + "ISR": 13.9142 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 10.8238, + "SIR": 25.0172, + "SAR": 11.2914, + "ISR": 15.8788 + }, + "instrumental": { + "SDR": 14.9404, + "SIR": 26.4337, + "SAR": 17.2136, + "ISR": 17.7954 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 15.0445, + "SIR": 30.6778, + "SAR": 14.4596, + "ISR": 15.7824 + }, + "instrumental": { + "SDR": 15.4118, + "SIR": 20.3336, + "SAR": 15.0035, + "ISR": 18.8308 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.4697, + "SIR": 24.7364, + "SAR": 12.0661, + "ISR": 15.5975 + }, + "instrumental": { + "SDR": 14.4492, + "SIR": 24.1199, + "SAR": 15.9711, + "ISR": 17.8576 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.1373, + "SIR": 29.079, + "SAR": 12.2703, + "ISR": 14.0694 + }, + "instrumental": { + "SDR": 17.5817, + "SIR": 25.559, + "SAR": 21.7436, + "ISR": 19.4994 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 2.68875, + "SIR": 9.88833, + "SAR": 3.91378, + "ISR": 6.62887 + }, + "instrumental": { + "SDR": 10.5589, + "SIR": 14.5512, + "SAR": 14.0416, + "ISR": 16.4449 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.1823, + "SIR": 26.6126, + "SAR": 14.2855, + "ISR": 17.9611 + }, + "instrumental": { + "SDR": 18.6893, + "SIR": 36.7055, + "SAR": 24.7931, + "ISR": 19.3679 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.027, + "SIR": 20.2644, + "SAR": 12.4025, + "ISR": 16.5225 + }, + "instrumental": { + "SDR": 11.7852, + "SIR": 22.7434, + "SAR": 12.4544, + "ISR": 15.2133 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.58457, + "SIR": 21.0019, + "SAR": 8.81202, + "ISR": 13.8718 + }, + "instrumental": { + "SDR": 13.9735, + "SIR": 23.3021, + "SAR": 15.4052, + "ISR": 17.4838 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.21154, + "SIR": 5.45196, + "SAR": 2.2815, + "ISR": 11.2524 + }, + "instrumental": { + "SDR": 16.8901, + "SIR": 31.5901, + "SAR": 20.9381, + "ISR": 17.8407 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.2706, + "SIR": 25.4344, + "SAR": 10.9862, + "ISR": 15.8282 + }, + "instrumental": { + "SDR": 17.0911, + "SIR": 31.0946, + "SAR": 20.6592, + "ISR": 18.9748 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.9377, + "SIR": 30.1603, + "SAR": 12.7632, + "ISR": 15.9392 + }, + "instrumental": { + "SDR": 18.037, + "SIR": 32.3938, + "SAR": 22.8888, + "ISR": 19.4167 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 12.2278, + "SIR": 30.3828, + "SAR": 14.2931, + "ISR": 14.9457 + }, + "instrumental": { + "SDR": 15.2429, + "SIR": 22.5973, + "SAR": 17.6381, + "ISR": 18.7928 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.1794, + "SIR": 21.0294, + "SAR": 10.8745, + "ISR": 14.3166 + }, + "instrumental": { + "SDR": 15.3598, + "SIR": 25.46, + "SAR": 17.5005, + "ISR": 18.1517 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "Kim_Inst.onnx": { + "model_name": "MDX-Net Model: Kim Inst", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.26277, + "SIR": 19.5259, + "SAR": 4.96245, + "ISR": 8.62868 + }, + "instrumental": { + "SDR": 16.55, + "SIR": 23.7871, + "SAR": 19.7671, + "ISR": 18.9284 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.11105, + "SIR": 12.189, + "SAR": 6.56294, + "ISR": 12.4095 + }, + "instrumental": { + "SDR": 11.3977, + "SIR": 21.3127, + "SAR": 12.8984, + "ISR": 14.6754 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.0759, + "SIR": 22.0085, + "SAR": 10.7607, + "ISR": 15.149 + }, + "instrumental": { + "SDR": 15.7018, + "SIR": 26.6682, + "SAR": 18.2456, + "ISR": 18.2541 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 3.01943, + "SIR": 9.38702, + "SAR": 3.55312, + "ISR": 11.7268 + }, + "instrumental": { + "SDR": 12.045, + "SIR": 23.5869, + "SAR": 14.0357, + "ISR": 15.6441 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.1252, + "SIR": 23.3204, + "SAR": 13.2023, + "ISR": 15.8791 + }, + "instrumental": { + "SDR": 14.6767, + "SIR": 23.8644, + "SAR": 15.7025, + "ISR": 17.4144 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.98956, + "SIR": 18.245, + "SAR": 10.8498, + "ISR": 14.6787 + }, + "instrumental": { + "SDR": 11.8149, + "SIR": 21.671, + "SAR": 13.3198, + "ISR": 15.7917 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.5222, + "SIR": 20.7305, + "SAR": 12.7164, + "ISR": 14.8499 + }, + "instrumental": { + "SDR": 15.0181, + "SIR": 23.7438, + "SAR": 17.3564, + "ISR": 17.8586 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.55708, + "SIR": 18.6162, + "SAR": 5.538, + "ISR": 9.08567 + }, + "instrumental": { + "SDR": 17.8733, + "SIR": 29.2467, + "SAR": 23.5318, + "ISR": 19.289 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.5041, + "SIR": 30.2399, + "SAR": 13.2887, + "ISR": 16.8311 + }, + "instrumental": { + "SDR": 15.5184, + "SIR": 28.5678, + "SAR": 17.6463, + "ISR": 18.9643 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.1289, + "SIR": 22.9826, + "SAR": 10.0506, + "ISR": 11.8367 + }, + "instrumental": { + "SDR": 15.8138, + "SIR": 17.152, + "SAR": 15.2558, + "ISR": 17.9899 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.7009, + "SIR": 35.0287, + "SAR": 16.5611, + "ISR": 18.2066 + }, + "instrumental": { + "SDR": 16.7921, + "SIR": 31.6557, + "SAR": 19.7944, + "ISR": 19.327 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.4857, + "SIR": 22.4695, + "SAR": 12.0572, + "ISR": 15.6258 + }, + "instrumental": { + "SDR": 15.3689, + "SIR": 27.2182, + "SAR": 17.8018, + "ISR": 18.3432 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.44753, + "SIR": 19.2903, + "SAR": 7.78604, + "ISR": 13.4492 + }, + "instrumental": { + "SDR": 15.4279, + "SIR": 26.3707, + "SAR": 17.4098, + "ISR": 17.7376 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.5805, + "SIR": 17.472, + "SAR": 10.8827, + "ISR": 12.0734 + }, + "instrumental": { + "SDR": 16.0654, + "SIR": 24.0787, + "SAR": 19.8907, + "ISR": 17.676 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.559, + "SIR": 19.6837, + "SAR": 3.81748, + "ISR": 8.79254 + }, + "instrumental": { + "SDR": 15.4527, + "SIR": 21.7783, + "SAR": 19.1474, + "ISR": 18.9617 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.63147, + "SIR": 20.5054, + "SAR": 10.368, + "ISR": 14.9922 + }, + "instrumental": { + "SDR": 14.0653, + "SIR": 25.0996, + "SAR": 16.1256, + "ISR": 17.4226 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.46004, + "SIR": 14.5425, + "SAR": 8.18075, + "ISR": 13.6921 + }, + "instrumental": { + "SDR": 14.6892, + "SIR": 24.9309, + "SAR": 16.3479, + "ISR": 17.5871 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -13.5222, + "SIR": -31.6784, + "SAR": 0.457015, + "ISR": 11.4212 + }, + "instrumental": { + "SDR": 18.2507, + "SIR": 58.4133, + "SAR": 16.6646, + "ISR": 15.4292 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.04199, + "SIR": 15.8402, + "SAR": 6.84512, + "ISR": 10.8884 + }, + "instrumental": { + "SDR": 15.9707, + "SIR": 22.021, + "SAR": 18.0063, + "ISR": 17.866 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.0904, + "SIR": 24.4226, + "SAR": 11.5114, + "ISR": 15.2134 + }, + "instrumental": { + "SDR": 15.6601, + "SIR": 26.7623, + "SAR": 18.0982, + "ISR": 18.7246 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.52, + "SIR": 22.1288, + "SAR": 11.0857, + "ISR": 15.8421 + }, + "instrumental": { + "SDR": 17.2587, + "SIR": 31.3245, + "SAR": 21.0856, + "ISR": 18.7977 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -11.496, + "SIR": -9.62789, + "SAR": 0.5246, + "ISR": 11.303 + }, + "instrumental": { + "SDR": 19.295, + "SIR": 40.9617, + "SAR": 29.5361, + "ISR": 19.0167 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.9009, + "SIR": 14.5612, + "SAR": 3.35668, + "ISR": 6.01042 + }, + "instrumental": { + "SDR": 10.6492, + "SIR": 13.5777, + "SAR": 14.525, + "ISR": 17.2589 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 4.3612, + "SIR": 17.7706, + "SAR": 5.36505, + "ISR": 10.1516 + }, + "instrumental": { + "SDR": 17.5383, + "SIR": 25.132, + "SAR": 20.5485, + "ISR": 19.1151 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.58855, + "SIR": 18.7821, + "SAR": 7.72783, + "ISR": 11.0853 + }, + "instrumental": { + "SDR": 14.5183, + "SIR": 21.6345, + "SAR": 17.271, + "ISR": 18.2507 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.65464, + "SIR": 15.9043, + "SAR": 8.70431, + "ISR": 14.5067 + }, + "instrumental": { + "SDR": 15.5429, + "SIR": 25.9075, + "SAR": 17.0502, + "ISR": 17.1881 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.4087, + "SIR": 23.622, + "SAR": 12.1198, + "ISR": 14.4197 + }, + "instrumental": { + "SDR": 13.4511, + "SIR": 20.8778, + "SAR": 14.6288, + "ISR": 17.4228 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.53221, + "SIR": 15.5778, + "SAR": 6.18376, + "ISR": 11.4715 + }, + "instrumental": { + "SDR": 12.9354, + "SIR": 19.3045, + "SAR": 13.8164, + "ISR": 15.8692 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 7.1846, + "SIR": 8.49418, + "SAR": 8.53703, + "ISR": 15.979 + }, + "instrumental": { + "SDR": 12.6274, + "SIR": 25.8583, + "SAR": 13.6298, + "ISR": 14.3399 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.7406, + "SIR": 29.7598, + "SAR": 14.8589, + "ISR": 16.4227 + }, + "instrumental": { + "SDR": 15.0167, + "SIR": 21.856, + "SAR": 15.2401, + "ISR": 18.6284 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.395, + "SIR": 23.4172, + "SAR": 11.9037, + "ISR": 15.5138 + }, + "instrumental": { + "SDR": 14.309, + "SIR": 24.0715, + "SAR": 15.9119, + "ISR": 17.5826 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.224, + "SIR": 23.6275, + "SAR": 12.1848, + "ISR": 15.7146 + }, + "instrumental": { + "SDR": 16.7548, + "SIR": 29.1013, + "SAR": 21.0587, + "ISR": 18.9483 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 5.11952, + "SIR": 7.85644, + "SAR": 8.428, + "ISR": 13.1743 + }, + "instrumental": { + "SDR": 11.9198, + "SIR": 21.2196, + "SAR": 14.4782, + "ISR": 14.4159 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.7367, + "SIR": 27.1822, + "SAR": 13.4723, + "ISR": 17.6164 + }, + "instrumental": { + "SDR": 18.6489, + "SIR": 35.3411, + "SAR": 24.4767, + "ISR": 19.3661 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.3861, + "SIR": 21.3924, + "SAR": 11.227, + "ISR": 13.6416 + }, + "instrumental": { + "SDR": 11.4481, + "SIR": 18.0478, + "SAR": 12.2151, + "ISR": 15.8016 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.06744, + "SIR": 23.3958, + "SAR": 8.29173, + "ISR": 13.4451 + }, + "instrumental": { + "SDR": 13.9644, + "SIR": 22.9701, + "SAR": 15.397, + "ISR": 17.9973 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 2.70047, + "SIR": 1.66527, + "SAR": 2.16292, + "ISR": 10.2113 + }, + "instrumental": { + "SDR": 17.8065, + "SIR": 30.336, + "SAR": 21.7829, + "ISR": 17.9469 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.1107, + "SIR": 25.7741, + "SAR": 10.7008, + "ISR": 15.7567 + }, + "instrumental": { + "SDR": 16.9696, + "SIR": 30.6441, + "SAR": 20.4904, + "ISR": 18.8756 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.619, + "SIR": 29.2429, + "SAR": 11.9158, + "ISR": 15.8813 + }, + "instrumental": { + "SDR": 17.896, + "SIR": 31.7735, + "SAR": 22.3261, + "ISR": 19.3388 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 13.2398, + "SIR": 29.0538, + "SAR": 13.7428, + "ISR": 15.9896 + }, + "instrumental": { + "SDR": 15.4585, + "SIR": 24.0575, + "SAR": 17.4053, + "ISR": 18.7139 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.14306, + "SIR": 20.0946, + "SAR": 10.2093, + "ISR": 14.0559 + }, + "instrumental": { + "SDR": 15.4556, + "SIR": 24.5048, + "SAR": 17.3809, + "ISR": 17.9684 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "Reverb_HQ_By_FoxJoy.onnx": { + "model_name": "MDX-Net Model: Reverb HQ By FoxJoy", + "track_scores": [], + "median_scores": {}, + "stems": [ + "reverb", + "no reverb" + ], + "target_stem": "reverb" + }, + "UVR-MDX-NET_Crowd_HQ_1.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET Crowd HQ 1 By Aufr33", + "track_scores": [], + "median_scores": {}, + "stems": [ + "no crowd", + "crowd" + ], + "target_stem": "no crowd" + }, + "kuielab_a_vocals.onnx": { + "model_name": "MDX-Net Model: kuielab_a_vocals", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 6.03051, + "SIR": 19.0287, + "SAR": 6.30829, + "ISR": 10.7322 + }, + "instrumental": { + "SDR": 16.4026, + "SIR": 25.2452, + "SAR": 20.0441, + "ISR": 18.8 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 7.79108, + "SIR": 19.5485, + "SAR": 8.18339, + "ISR": 12.0497 + }, + "instrumental": { + "SDR": 13.1751, + "SIR": 21.2396, + "SAR": 15.3596, + "ISR": 17.6468 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.0706, + "SIR": 20.7343, + "SAR": 10.8404, + "ISR": 14.2627 + }, + "instrumental": { + "SDR": 15.3395, + "SIR": 24.9303, + "SAR": 18.147, + "ISR": 18.0621 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 6.3808, + "SIR": 14.5351, + "SAR": 6.81839, + "ISR": 12.0365 + }, + "instrumental": { + "SDR": 15.2029, + "SIR": 24.1477, + "SAR": 17.9478, + "ISR": 17.4357 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.0981, + "SIR": 22.6637, + "SAR": 13.4578, + "ISR": 15.4502 + }, + "instrumental": { + "SDR": 14.0664, + "SIR": 23.0025, + "SAR": 15.9212, + "ISR": 17.1644 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.75249, + "SIR": 17.5292, + "SAR": 10.8363, + "ISR": 14.0858 + }, + "instrumental": { + "SDR": 11.6948, + "SIR": 20.532, + "SAR": 13.419, + "ISR": 15.6081 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.3404, + "SIR": 19.7158, + "SAR": 12.6517, + "ISR": 14.8139 + }, + "instrumental": { + "SDR": 14.8315, + "SIR": 23.9257, + "SAR": 17.2894, + "ISR": 17.6543 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.43439, + "SIR": 18.4447, + "SAR": 5.70884, + "ISR": 8.44233 + }, + "instrumental": { + "SDR": 18.2111, + "SIR": 29.1751, + "SAR": 24.2738, + "ISR": 19.3949 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.7921, + "SIR": 31.2858, + "SAR": 12.9965, + "ISR": 15.1122 + }, + "instrumental": { + "SDR": 15.1792, + "SIR": 24.1135, + "SAR": 17.7085, + "ISR": 19.0217 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.4438, + "SIR": 18.6393, + "SAR": 11.2144, + "ISR": 12.8695 + }, + "instrumental": { + "SDR": 15.5006, + "SIR": 20.3331, + "SAR": 16.451, + "ISR": 16.8977 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 13.7353, + "SIR": 34.862, + "SAR": 15.9299, + "ISR": 16.1708 + }, + "instrumental": { + "SDR": 16.2984, + "SIR": 25.7474, + "SAR": 19.4356, + "ISR": 19.3742 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.0085, + "SIR": 21.773, + "SAR": 11.7101, + "ISR": 14.7899 + }, + "instrumental": { + "SDR": 15.2654, + "SIR": 25.6076, + "SAR": 17.9433, + "ISR": 18.335 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.52816, + "SIR": 18.5755, + "SAR": 7.56713, + "ISR": 12.9584 + }, + "instrumental": { + "SDR": 15.3151, + "SIR": 25.4701, + "SAR": 17.5584, + "ISR": 17.5639 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 9.29306, + "SIR": 19.0025, + "SAR": 10.2181, + "ISR": 12.819 + }, + "instrumental": { + "SDR": 17.8453, + "SIR": 24.5982, + "SAR": 22.5411, + "ISR": 18.5911 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 4.2525, + "SIR": 16.6621, + "SAR": 4.67262, + "ISR": 10.2596 + }, + "instrumental": { + "SDR": 15.8254, + "SIR": 23.9096, + "SAR": 19.5432, + "ISR": 18.4999 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.58318, + "SIR": 19.7898, + "SAR": 10.2908, + "ISR": 14.4709 + }, + "instrumental": { + "SDR": 14.1312, + "SIR": 24.1626, + "SAR": 16.3298, + "ISR": 17.4778 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.75829, + "SIR": 25.3512, + "SAR": 9.23667, + "ISR": 12.7865 + }, + "instrumental": { + "SDR": 15.1954, + "SIR": 23.5701, + "SAR": 17.8758, + "ISR": 18.8842 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -2.79323, + "SIR": -20.6862, + "SAR": 0.13322, + "ISR": 5.71155 + }, + "instrumental": { + "SDR": 19.9488, + "SIR": 55.6836, + "SAR": 32.0945, + "ISR": 18.7377 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.64835, + "SIR": 15.4573, + "SAR": 7.82235, + "ISR": 11.4052 + }, + "instrumental": { + "SDR": 16.5112, + "SIR": 22.7866, + "SAR": 19.0485, + "ISR": 17.8047 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.6602, + "SIR": 22.8814, + "SAR": 11.2883, + "ISR": 14.5295 + }, + "instrumental": { + "SDR": 15.4315, + "SIR": 25.42, + "SAR": 18.1247, + "ISR": 18.4917 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.8027, + "SIR": 21.3173, + "SAR": 11.8299, + "ISR": 15.3935 + }, + "instrumental": { + "SDR": 17.2968, + "SIR": 30.851, + "SAR": 20.9412, + "ISR": 18.7896 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -1.46489, + "SIR": -0.29017, + "SAR": -0.01044, + "ISR": 3.3685 + }, + "instrumental": { + "SDR": 19.7483, + "SIR": 40.1666, + "SAR": 31.2469, + "ISR": 19.0765 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.43716, + "SIR": 14.2186, + "SAR": 4.24093, + "ISR": 7.61527 + }, + "instrumental": { + "SDR": 10.7555, + "SIR": 15.557, + "SAR": 14.2806, + "ISR": 16.6573 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.98534, + "SIR": 18.464, + "SAR": 6.95737, + "ISR": 13.5799 + }, + "instrumental": { + "SDR": 17.1728, + "SIR": 31.099, + "SAR": 20.9328, + "ISR": 18.796 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.45018, + "SIR": 16.9634, + "SAR": 7.89225, + "ISR": 11.6913 + }, + "instrumental": { + "SDR": 14.2052, + "SIR": 22.4137, + "SAR": 17.09, + "ISR": 17.8771 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.45454, + "SIR": 17.7008, + "SAR": 9.08884, + "ISR": 13.6135 + }, + "instrumental": { + "SDR": 15.3463, + "SIR": 24.6442, + "SAR": 17.3824, + "ISR": 17.5351 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.7096, + "SIR": 23.1149, + "SAR": 12.5639, + "ISR": 15.2631 + }, + "instrumental": { + "SDR": 13.0782, + "SIR": 22.643, + "SAR": 14.6624, + "ISR": 17.1022 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 7.0811, + "SIR": 18.6792, + "SAR": 6.92075, + "ISR": 11.0878 + }, + "instrumental": { + "SDR": 13.2517, + "SIR": 18.87, + "SAR": 14.6445, + "ISR": 17.0008 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 10.0479, + "SIR": 24.0152, + "SAR": 10.809, + "ISR": 14.5945 + }, + "instrumental": { + "SDR": 15.0018, + "SIR": 24.5053, + "SAR": 17.1403, + "ISR": 18.0614 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 13.9579, + "SIR": 28.2774, + "SAR": 14.6901, + "ISR": 15.2356 + }, + "instrumental": { + "SDR": 14.4458, + "SIR": 20.4421, + "SAR": 15.2414, + "ISR": 18.5656 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.0729, + "SIR": 23.1717, + "SAR": 11.6019, + "ISR": 14.5734 + }, + "instrumental": { + "SDR": 14.2532, + "SIR": 22.0329, + "SAR": 15.8748, + "ISR": 17.5089 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.4038, + "SIR": 31.8697, + "SAR": 12.1474, + "ISR": 13.7618 + }, + "instrumental": { + "SDR": 17.1564, + "SIR": 25.0477, + "SAR": 21.3983, + "ISR": 19.6156 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 5.37318, + "SIR": 11.789, + "SAR": 8.43184, + "ISR": 11.1446 + }, + "instrumental": { + "SDR": 12.8799, + "SIR": 18.1667, + "SAR": 15.418, + "ISR": 16.803 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.4004, + "SIR": 26.2568, + "SAR": 13.908, + "ISR": 16.2541 + }, + "instrumental": { + "SDR": 18.3974, + "SIR": 31.3873, + "SAR": 24.1561, + "ISR": 19.2368 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.0247, + "SIR": 19.5053, + "SAR": 12.531, + "ISR": 16.2811 + }, + "instrumental": { + "SDR": 11.5551, + "SIR": 22.5694, + "SAR": 12.6582, + "ISR": 14.8534 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.33481, + "SIR": 22.1772, + "SAR": 8.55771, + "ISR": 13.4603 + }, + "instrumental": { + "SDR": 13.551, + "SIR": 22.5918, + "SAR": 15.4703, + "ISR": 17.6572 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 4.37702, + "SIR": 7.8154, + "SAR": 2.33474, + "ISR": 9.81231 + }, + "instrumental": { + "SDR": 17.71, + "SIR": 30.6302, + "SAR": 22.2112, + "ISR": 18.0183 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.56022, + "SIR": 24.2622, + "SAR": 10.3906, + "ISR": 14.4689 + }, + "instrumental": { + "SDR": 16.8912, + "SIR": 27.8564, + "SAR": 20.677, + "ISR": 18.8667 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.1507, + "SIR": 27.8262, + "SAR": 11.9373, + "ISR": 14.8946 + }, + "instrumental": { + "SDR": 17.7739, + "SIR": 29.4481, + "SAR": 22.1916, + "ISR": 19.2363 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 11.5462, + "SIR": 27.662, + "SAR": 13.3142, + "ISR": 14.3879 + }, + "instrumental": { + "SDR": 14.9565, + "SIR": 22.388, + "SAR": 17.7091, + "ISR": 18.4978 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.5717, + "SIR": 19.6322, + "SAR": 10.3407, + "ISR": 13.6876 + }, + "instrumental": { + "SDR": 15.2903, + "SIR": 24.1551, + "SAR": 17.7925, + "ISR": 18.0617 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "kuielab_a_other.onnx": { + "model_name": "MDX-Net Model: kuielab_a_other", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "other": { + "SDR": 10.2985, + "SIR": 23.2364, + "SAR": 10.8844, + "ISR": 15.4433 + }, + "instrumental": { + "SDR": 5.0566, + "SIR": 13.1137, + "SAR": 10.1327, + "ISR": 6.35631 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "other": { + "SDR": 7.61851, + "SIR": 15.8185, + "SAR": 8.05757, + "ISR": 13.0745 + }, + "instrumental": { + "SDR": 2.76622, + "SIR": 10.1729, + "SAR": 3.73319, + "ISR": 5.413 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "other": { + "SDR": 5.49128, + "SIR": 14.4941, + "SAR": 4.77523, + "ISR": 10.9684 + }, + "instrumental": { + "SDR": 3.74514, + "SIR": 8.76704, + "SAR": 3.87568, + "ISR": 9.0393 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "other": { + "SDR": 4.50656, + "SIR": 12.7829, + "SAR": 3.94946, + "ISR": 10.6515 + }, + "instrumental": { + "SDR": 6.48677, + "SIR": 14.9738, + "SAR": 10.1263, + "ISR": 10.4038 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "other": { + "SDR": 8.14388, + "SIR": 16.9658, + "SAR": 8.37129, + "ISR": 12.216 + }, + "instrumental": { + "SDR": 1.18375, + "SIR": 8.94635, + "SAR": 0.019145, + "ISR": 5.60027 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "other": { + "SDR": 7.4545, + "SIR": 16.4952, + "SAR": 7.75036, + "ISR": 11.9116 + }, + "instrumental": { + "SDR": 0.47187, + "SIR": 7.23714, + "SAR": -1.49364, + "ISR": 4.59639 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "other": { + "SDR": 7.78665, + "SIR": 17.3403, + "SAR": 8.25838, + "ISR": 12.1739 + }, + "instrumental": { + "SDR": 2.79513, + "SIR": 10.4054, + "SAR": 2.56792, + "ISR": 7.6092 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "other": { + "SDR": 7.6235, + "SIR": 16.3783, + "SAR": 7.86388, + "ISR": 12.2587 + }, + "instrumental": { + "SDR": 7.38504, + "SIR": 13.2484, + "SAR": 12.3593, + "ISR": 10.5543 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "other": { + "SDR": 10.9138, + "SIR": 17.6851, + "SAR": 12.1946, + "ISR": 16.0613 + }, + "instrumental": { + "SDR": 1.02427, + "SIR": 4.48848, + "SAR": 5.51297, + "ISR": 2.07418 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "other": { + "SDR": 10.7856, + "SIR": 17.8252, + "SAR": 10.8393, + "ISR": 13.8617 + }, + "instrumental": { + "SDR": 1.38582, + "SIR": 7.33442, + "SAR": 0.59428, + "ISR": 4.54566 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "other": { + "SDR": 10.1912, + "SIR": 16.5443, + "SAR": 11.2273, + "ISR": 15.5455 + }, + "instrumental": { + "SDR": 1.61645, + "SIR": 6.12899, + "SAR": 3.15946, + "ISR": 3.88359 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "other": { + "SDR": 5.65245, + "SIR": 13.2616, + "SAR": 5.88494, + "ISR": 9.37478 + }, + "instrumental": { + "SDR": 4.05419, + "SIR": 11.3487, + "SAR": 4.16195, + "ISR": 8.64173 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "other": { + "SDR": 9.56849, + "SIR": 20.5174, + "SAR": 8.86627, + "ISR": 13.2972 + }, + "instrumental": { + "SDR": 3.06098, + "SIR": 9.66555, + "SAR": 3.64654, + "ISR": 5.78672 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "other": { + "SDR": 7.01072, + "SIR": 17.1826, + "SAR": 7.19506, + "ISR": 11.3628 + }, + "instrumental": { + "SDR": 4.14377, + "SIR": 12.5413, + "SAR": 5.04966, + "ISR": 8.30788 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "other": { + "SDR": 8.48973, + "SIR": 17.8002, + "SAR": 9.12187, + "ISR": 14.1446 + }, + "instrumental": { + "SDR": 5.32877, + "SIR": 12.6329, + "SAR": 10.8281, + "ISR": 7.18892 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "other": { + "SDR": 8.77581, + "SIR": 17.1362, + "SAR": 9.10962, + "ISR": 13.579 + }, + "instrumental": { + "SDR": 0.866335, + "SIR": 5.60169, + "SAR": -0.348145, + "ISR": 4.42851 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "other": { + "SDR": 8.69857, + "SIR": 18.6912, + "SAR": 8.97592, + "ISR": 13.5084 + }, + "instrumental": { + "SDR": 4.4767, + "SIR": 11.7458, + "SAR": 8.81959, + "ISR": 7.15279 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "other": { + "SDR": 15.7999, + "SIR": 27.0755, + "SAR": 18.1, + "ISR": 17.3565 + }, + "instrumental": { + "SDR": 1.53496, + "SIR": 8.88451, + "SAR": 15.9003, + "ISR": 2.61132 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "other": { + "SDR": 6.84939, + "SIR": 12.5711, + "SAR": 6.71769, + "ISR": 10.8188 + }, + "instrumental": { + "SDR": 4.89066, + "SIR": 8.75295, + "SAR": 7.49685, + "ISR": 6.0601 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "other": { + "SDR": 8.00353, + "SIR": 19.6584, + "SAR": 8.80098, + "ISR": 12.3314 + }, + "instrumental": { + "SDR": 3.32798, + "SIR": 10.5997, + "SAR": 2.7358, + "ISR": 7.64894 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "other": { + "SDR": 7.30968, + "SIR": 16.9177, + "SAR": 7.62686, + "ISR": 11.4196 + }, + "instrumental": { + "SDR": 5.60845, + "SIR": 14.7983, + "SAR": 6.53752, + "ISR": 10.2596 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "other": { + "SDR": 14.0685, + "SIR": 21.6993, + "SAR": 15.715, + "ISR": 18.4531 + }, + "instrumental": { + "SDR": 0.80932, + "SIR": 3.89792, + "SAR": 7.87141, + "ISR": 1.66903 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "other": { + "SDR": 5.86678, + "SIR": 11.5179, + "SAR": 6.38553, + "ISR": 10.4474 + }, + "instrumental": { + "SDR": 4.60198, + "SIR": 10.4515, + "SAR": 6.37081, + "ISR": 6.21048 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "other": { + "SDR": 6.84029, + "SIR": 13.6954, + "SAR": 7.5487, + "ISR": 11.2578 + }, + "instrumental": { + "SDR": 4.30509, + "SIR": 13.7435, + "SAR": 9.24794, + "ISR": 8.15643 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "other": { + "SDR": 4.59759, + "SIR": 9.55487, + "SAR": 5.2649, + "ISR": 9.49235 + }, + "instrumental": { + "SDR": 6.06816, + "SIR": 16.8876, + "SAR": 6.83275, + "ISR": 9.42662 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "other": { + "SDR": 13.6861, + "SIR": 28.1709, + "SAR": 14.6368, + "ISR": 16.7043 + }, + "instrumental": { + "SDR": 0.623135, + "SIR": 9.19617, + "SAR": -0.19074, + "ISR": 2.6002 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "other": { + "SDR": 7.59078, + "SIR": 19.8978, + "SAR": 7.9918, + "ISR": 13.0866 + }, + "instrumental": { + "SDR": 0.47774, + "SIR": 8.01838, + "SAR": -0.81359, + "ISR": 4.63586 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "other": { + "SDR": 11.8791, + "SIR": 23.4795, + "SAR": 12.433, + "ISR": 16.2657 + }, + "instrumental": { + "SDR": -0.02304, + "SIR": 3.81006, + "SAR": -5.00733, + "ISR": 0.97585 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "other": { + "SDR": 4.91592, + "SIR": 15.6572, + "SAR": 4.71229, + "ISR": 7.94667 + }, + "instrumental": { + "SDR": 4.80295, + "SIR": 16.5897, + "SAR": 4.56007, + "ISR": 12.1643 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "other": { + "SDR": 11.6946, + "SIR": 22.2304, + "SAR": 12.5556, + "ISR": 15.0223 + }, + "instrumental": { + "SDR": -0.10172, + "SIR": 6.20824, + "SAR": -1.8584, + "ISR": 3.35012 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "other": { + "SDR": 7.32112, + "SIR": 11.2157, + "SAR": 8.51001, + "ISR": 13.4655 + }, + "instrumental": { + "SDR": 0.23892, + "SIR": 5.01115, + "SAR": -2.93014, + "ISR": 3.07836 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "other": { + "SDR": 3.2767, + "SIR": 12.641, + "SAR": 2.06731, + "ISR": 5.88696 + }, + "instrumental": { + "SDR": 10.5314, + "SIR": 19.9448, + "SAR": 14.8501, + "ISR": 16.4615 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "other": { + "SDR": 7.19205, + "SIR": 21.3224, + "SAR": 7.25572, + "ISR": 10.7759 + }, + "instrumental": { + "SDR": 1.34502, + "SIR": 7.19421, + "SAR": 0.986595, + "ISR": 5.66761 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "other": { + "SDR": 5.29795, + "SIR": 19.7123, + "SAR": 4.92955, + "ISR": 13.8048 + }, + "instrumental": { + "SDR": 5.94046, + "SIR": 12.3227, + "SAR": 5.77602, + "ISR": 10.8548 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "other": { + "SDR": 4.89376, + "SIR": 18.0495, + "SAR": 4.30901, + "ISR": 9.86718 + }, + "instrumental": { + "SDR": -0.04307, + "SIR": 14.8438, + "SAR": -1.44964, + "ISR": 11.0345 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "other": { + "SDR": 10.3818, + "SIR": 19.5252, + "SAR": 10.8809, + "ISR": 15.5455 + }, + "instrumental": { + "SDR": 0.87812, + "SIR": 6.53023, + "SAR": 0.28347, + "ISR": 2.71706 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "other": { + "SDR": 5.25805, + "SIR": 9.44667, + "SAR": 6.65279, + "ISR": 10.3286 + }, + "instrumental": { + "SDR": 3.86658, + "SIR": 10.9645, + "SAR": 6.21744, + "ISR": 6.06446 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "other": { + "SDR": 9.36939, + "SIR": 14.2856, + "SAR": 11.1927, + "ISR": 14.0695 + }, + "instrumental": { + "SDR": 2.18852, + "SIR": 10.0559, + "SAR": 3.11571, + "ISR": 3.73256 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "other": { + "SDR": 8.63463, + "SIR": 17.4556, + "SAR": 7.86379, + "ISR": 13.5296 + }, + "instrumental": { + "SDR": 5.39697, + "SIR": 14.6953, + "SAR": 6.30495, + "ISR": 11.3929 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "other": { + "SDR": 7.81779, + "SIR": 18.4801, + "SAR": 7.6782, + "ISR": 11.9292 + }, + "instrumental": { + "SDR": 1.70499, + "SIR": 8.65265, + "SAR": 2.78163, + "ISR": 6.66371 + } + } + } + ], + "median_scores": { + "instrumental": { + "SDR": 2.92805, + "SIR": 10.1144, + "SAR": 4.01882, + "ISR": 6.13747 + } + }, + "stems": [ + "other", + "no other" + ], + "target_stem": "other" + }, + "kuielab_a_bass.onnx": { + "model_name": "MDX-Net Model: kuielab_a_bass", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "bass": { + "SDR": 16.0732, + "SIR": 23.7351, + "SAR": 18.5785, + "ISR": 18.8732 + }, + "instrumental": { + "SDR": 0.77436, + "SIR": 6.81879, + "SAR": 4.43829, + "ISR": 1.74334 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "bass": { + "SDR": 10.4234, + "SIR": 21.1994, + "SAR": 12.4414, + "ISR": 13.555 + }, + "instrumental": { + "SDR": 2.16512, + "SIR": 5.57842, + "SAR": 2.94353, + "ISR": 3.86083 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "bass": { + "SDR": 9.56121, + "SIR": 17.6101, + "SAR": 8.99326, + "ISR": 11.8569 + }, + "instrumental": { + "SDR": 2.66124, + "SIR": 6.03571, + "SAR": 3.04769, + "ISR": 6.3789 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "bass": { + "SDR": 10.4728, + "SIR": 20.4749, + "SAR": 11.6721, + "ISR": 13.8727 + }, + "instrumental": { + "SDR": 2.04131, + "SIR": 4.08179, + "SAR": 3.77969, + "ISR": 4.65636 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "bass": { + "SDR": 10.3345, + "SIR": 21.1304, + "SAR": 10.5167, + "ISR": 14.1136 + }, + "instrumental": { + "SDR": 1.36093, + "SIR": 7.13739, + "SAR": 0.76338, + "ISR": 7.76997 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "bass": { + "SDR": 8.02994, + "SIR": 15.4654, + "SAR": 6.98974, + "ISR": 12.0058 + }, + "instrumental": { + "SDR": 2.12083, + "SIR": 12.1217, + "SAR": 1.22223, + "ISR": 12.6578 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "bass": { + "SDR": 14.8816, + "SIR": 24.8207, + "SAR": 14.1756, + "ISR": 15.9029 + }, + "instrumental": { + "SDR": 0.914555, + "SIR": 4.78908, + "SAR": 0.974005, + "ISR": 3.62381 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "bass": { + "SDR": 13.7034, + "SIR": 24.6163, + "SAR": 14.436, + "ISR": 16.2823 + }, + "instrumental": { + "SDR": 1.5507, + "SIR": 2.32283, + "SAR": 5.43508, + "ISR": 2.79115 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "bass": { + "SDR": 8.69524, + "SIR": 20.9984, + "SAR": 8.73451, + "ISR": 11.4699 + }, + "instrumental": { + "SDR": 7.89635, + "SIR": 11.1789, + "SAR": 16.1208, + "ISR": 12.125 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "bass": { + "SDR": 10.9338, + "SIR": 20.8366, + "SAR": 11.0176, + "ISR": 13.4131 + }, + "instrumental": { + "SDR": 3.07882, + "SIR": 7.71596, + "SAR": 3.94259, + "ISR": 9.66354 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "bass": { + "SDR": 10.2932, + "SIR": 22.0512, + "SAR": 7.5089, + "ISR": 9.02483 + }, + "instrumental": { + "SDR": 5.33401, + "SIR": 8.1387, + "SAR": 4.32716, + "ISR": 10.3974 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "bass": { + "SDR": 9.23296, + "SIR": 19.0919, + "SAR": 9.80712, + "ISR": 14.1654 + }, + "instrumental": { + "SDR": 3.55055, + "SIR": 7.82103, + "SAR": 4.57447, + "ISR": 9.43293 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "bass": { + "SDR": 12.2386, + "SIR": 21.113, + "SAR": 13.6184, + "ISR": 17.0982 + }, + "instrumental": { + "SDR": 1.81564, + "SIR": 5.93183, + "SAR": 3.1888, + "ISR": 3.77541 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "bass": { + "SDR": 9.84294, + "SIR": 19.1712, + "SAR": 10.6262, + "ISR": 14.9867 + }, + "instrumental": { + "SDR": 2.73447, + "SIR": 4.60121, + "SAR": 5.46088, + "ISR": 5.66416 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "bass": { + "SDR": 13.637, + "SIR": 22.6788, + "SAR": 14.923, + "ISR": 17.2898 + }, + "instrumental": { + "SDR": 1.48216, + "SIR": 4.07368, + "SAR": 5.69331, + "ISR": 2.5765 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "bass": { + "SDR": 6.76663, + "SIR": 11.9132, + "SAR": 2.57693, + "ISR": 2.15574 + }, + "instrumental": { + "SDR": 3.63085, + "SIR": 5.80337, + "SAR": 2.23456, + "ISR": 10.5938 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "bass": { + "SDR": 8.5897, + "SIR": 16.4196, + "SAR": 8.55788, + "ISR": 12.8794 + }, + "instrumental": { + "SDR": 5.77935, + "SIR": 9.62361, + "SAR": 10.3646, + "ISR": 10.4156 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "bass": { + "SDR": 13.7619, + "SIR": 20.9739, + "SAR": 15.1435, + "ISR": 16.5327 + }, + "instrumental": { + "SDR": 3.34718, + "SIR": 10.9225, + "SAR": 16.2328, + "ISR": 4.80444 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "bass": { + "SDR": 13.2467, + "SIR": 22.2041, + "SAR": 13.9468, + "ISR": 15.8338 + }, + "instrumental": { + "SDR": 2.47201, + "SIR": 7.27829, + "SAR": 6.67825, + "ISR": 4.46604 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "bass": { + "SDR": 10.6764, + "SIR": 20.5468, + "SAR": 11.5618, + "ISR": 15.7534 + }, + "instrumental": { + "SDR": 1.37206, + "SIR": 2.91497, + "SAR": 2.12287, + "ISR": 4.2682 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "bass": { + "SDR": 14.5687, + "SIR": 22.5036, + "SAR": 15.5006, + "ISR": 17.2629 + }, + "instrumental": { + "SDR": 0.46533, + "SIR": 1.29338, + "SAR": 0.56047, + "ISR": 1.74435 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "bass": { + "SDR": 11.0284, + "SIR": 24.4635, + "SAR": 11.94, + "ISR": 14.4842 + }, + "instrumental": { + "SDR": 6.59616, + "SIR": 9.50216, + "SAR": 15.2833, + "ISR": 9.3666 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "bass": { + "SDR": 4.41786, + "SIR": 12.8054, + "SAR": 4.12871, + "ISR": 7.29088 + }, + "instrumental": { + "SDR": 6.99912, + "SIR": 13.3873, + "SAR": 8.82188, + "ISR": 11.9956 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "bass": { + "SDR": 10.206, + "SIR": 13.0449, + "SAR": 10.1204, + "ISR": 12.5577 + }, + "instrumental": { + "SDR": 1.70888, + "SIR": 4.51149, + "SAR": 3.62472, + "ISR": 3.40736 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "bass": { + "SDR": 8.31776, + "SIR": 15.8755, + "SAR": 8.77232, + "ISR": 12.411 + }, + "instrumental": { + "SDR": 4.06327, + "SIR": 9.55606, + "SAR": 5.51186, + "ISR": 7.25932 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "bass": { + "SDR": 7.55078, + "SIR": 22.3229, + "SAR": 8.43863, + "ISR": 13.9534 + }, + "instrumental": { + "SDR": 5.34112, + "SIR": 10.3105, + "SAR": 6.56292, + "ISR": 10.5833 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "bass": { + "SDR": 11.3498, + "SIR": 20.3274, + "SAR": 12.8324, + "ISR": 15.2372 + }, + "instrumental": { + "SDR": 0.51499, + "SIR": 7.12556, + "SAR": -0.36919, + "ISR": 4.43316 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "bass": { + "SDR": 10.6693, + "SIR": 23.9978, + "SAR": 10.4741, + "ISR": 13.2995 + }, + "instrumental": { + "SDR": 5.38955, + "SIR": 17.6591, + "SAR": 5.16155, + "ISR": 14.0096 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "bass": { + "SDR": 11.3858, + "SIR": 23.034, + "SAR": 12.2837, + "ISR": 16.3577 + }, + "instrumental": { + "SDR": 2.70918, + "SIR": 5.02455, + "SAR": 3.89302, + "ISR": 6.93987 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "bass": { + "SDR": 9.31564, + "SIR": 22.3612, + "SAR": 8.39025, + "ISR": 11.9301 + }, + "instrumental": { + "SDR": 1.75347, + "SIR": 10.2886, + "SAR": 0.91249, + "ISR": 11.9752 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "bass": { + "SDR": 4.06815, + "SIR": 13.8011, + "SAR": 2.23144, + "ISR": 5.98818 + }, + "instrumental": { + "SDR": 3.0792, + "SIR": 14.3801, + "SAR": 2.26075, + "ISR": 12.6147 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "bass": { + "SDR": 10.036, + "SIR": 25.3242, + "SAR": 1.71184, + "ISR": -0.28736 + }, + "instrumental": { + "SDR": 5.7284, + "SIR": 4.49601, + "SAR": 4.01895, + "ISR": 12.3067 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "bass": { + "SDR": 14.3982, + "SIR": 29.8156, + "SAR": 11.7944, + "ISR": 14.1614 + }, + "instrumental": { + "SDR": 3.00312, + "SIR": 7.01646, + "SAR": 5.97162, + "ISR": 7.55067 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "bass": { + "SDR": 15.1121, + "SIR": 29.4922, + "SAR": 17.2961, + "ISR": 18.2611 + }, + "instrumental": { + "SDR": 0.4544, + "SIR": 2.09194, + "SAR": 0.969195, + "ISR": 3.11978 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "bass": { + "SDR": 10.9887, + "SIR": 22.3777, + "SAR": 11.9519, + "ISR": 15.9469 + }, + "instrumental": { + "SDR": -1.89782, + "SIR": 1.2986, + "SAR": -6.09063, + "ISR": 2.9936 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "bass": { + "SDR": 9.05815, + "SIR": 18.1841, + "SAR": 9.15806, + "ISR": 13.3938 + }, + "instrumental": { + "SDR": 3.70975, + "SIR": 10.6943, + "SAR": 3.84451, + "ISR": 10.0631 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "bass": { + "SDR": 8.93678, + "SIR": 11.8764, + "SAR": 0.5732, + "ISR": -4.58055 + }, + "instrumental": { + "SDR": 3.03604, + "SIR": -3.3435, + "SAR": 1.05938, + "ISR": 5.61012 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "bass": { + "SDR": 12.2636, + "SIR": 20.7013, + "SAR": 6.50702, + "ISR": 6.90626 + }, + "instrumental": { + "SDR": 2.49143, + "SIR": 3.84323, + "SAR": 2.59421, + "ISR": 4.77818 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "bass": { + "SDR": 11.3077, + "SIR": 15.372, + "SAR": 13.4569, + "ISR": 17.2716 + }, + "instrumental": { + "SDR": 0.45525, + "SIR": 1.8495, + "SAR": -0.921975, + "ISR": 1.78777 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "bass": { + "SDR": 8.99375, + "SIR": 20.7437, + "SAR": 2.10514, + "ISR": 0.89566 + }, + "instrumental": { + "SDR": 2.68674, + "SIR": -0.00767, + "SAR": 0.97192, + "ISR": 7.95314 + } + } + } + ], + "median_scores": { + "bass": { + "SDR": 10.4481, + "SIR": 20.9862, + "SAR": 10.5715, + "ISR": 13.9131 + }, + "instrumental": { + "SDR": 2.67399, + "SIR": 6.42725, + "SAR": 3.8121, + "ISR": 6.65939 + } + }, + "stems": [ + "bass", + "no bass" + ], + "target_stem": "bass" + }, + "kuielab_a_drums.onnx": { + "model_name": "MDX-Net Model: kuielab_a_drums", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "drums": { + "SDR": 2.18069, + "SIR": 12.4405, + "SAR": 0.482, + "ISR": 3.95218 + }, + "instrumental": { + "SDR": 10.5281, + "SIR": 24.8726, + "SAR": 10.707, + "ISR": 18.0658 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "drums": { + "SDR": 6.09482, + "SIR": 15.3373, + "SAR": 5.69309, + "ISR": 9.71032 + }, + "instrumental": { + "SDR": 5.95259, + "SIR": 12.4937, + "SAR": 6.345, + "ISR": 13.3849 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "drums": { + "SDR": 7.65583, + "SIR": 13.2083, + "SAR": 8.22115, + "ISR": 15.202 + }, + "instrumental": { + "SDR": 1.96653, + "SIR": 4.93443, + "SAR": 1.95511, + "ISR": 5.13672 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "drums": { + "SDR": 7.74451, + "SIR": 16.8515, + "SAR": 8.00592, + "ISR": 11.9181 + }, + "instrumental": { + "SDR": 3.37901, + "SIR": 5.6739, + "SAR": 5.9064, + "ISR": 6.87746 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "drums": { + "SDR": 8.3774, + "SIR": 17.358, + "SAR": 8.9703, + "ISR": 13.4097 + }, + "instrumental": { + "SDR": 1.13225, + "SIR": 5.78609, + "SAR": -0.02352, + "ISR": 7.20048 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "drums": { + "SDR": 8.92681, + "SIR": 17.9665, + "SAR": 9.83928, + "ISR": 13.4112 + }, + "instrumental": { + "SDR": 0.60597, + "SIR": 6.57224, + "SAR": -0.71987, + "ISR": 5.69672 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "drums": { + "SDR": 8.79356, + "SIR": 18.9857, + "SAR": 9.26457, + "ISR": 14.0863 + }, + "instrumental": { + "SDR": 3.21713, + "SIR": 9.42799, + "SAR": 3.47756, + "ISR": 8.76188 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "drums": { + "SDR": 6.5485, + "SIR": 14.2432, + "SAR": 7.06405, + "ISR": 11.4376 + }, + "instrumental": { + "SDR": 6.09861, + "SIR": 8.81919, + "SAR": 8.56361, + "ISR": 9.31477 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "drums": { + "SDR": 5.91834, + "SIR": 13.4484, + "SAR": 5.95597, + "ISR": 11.5345 + }, + "instrumental": { + "SDR": 5.67263, + "SIR": 11.0306, + "SAR": 10.8119, + "ISR": 9.83723 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "drums": { + "SDR": 7.0039, + "SIR": 12.054, + "SAR": 6.81685, + "ISR": 13.0093 + }, + "instrumental": { + "SDR": 3.0156, + "SIR": 6.44809, + "SAR": 3.29406, + "ISR": 6.11917 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "drums": { + "SDR": 9.15806, + "SIR": 15.13, + "SAR": 10.096, + "ISR": 15.7347 + }, + "instrumental": { + "SDR": 2.78024, + "SIR": 7.20549, + "SAR": 5.52393, + "ISR": 6.07613 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "drums": { + "SDR": 9.31067, + "SIR": 17.63, + "SAR": 10.2502, + "ISR": 13.9311 + }, + "instrumental": { + "SDR": 1.75991, + "SIR": 3.09722, + "SAR": 2.26884, + "ISR": 4.17393 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "drums": { + "SDR": 4.83538, + "SIR": 13.4238, + "SAR": 4.36491, + "ISR": 10.2342 + }, + "instrumental": { + "SDR": 5.97447, + "SIR": 12.2097, + "SAR": 5.75242, + "ISR": 12.1273 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "drums": { + "SDR": 7.28863, + "SIR": 14.0002, + "SAR": 7.68004, + "ISR": 13.8658 + }, + "instrumental": { + "SDR": 2.74748, + "SIR": 5.41681, + "SAR": 3.99022, + "ISR": 6.19914 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "drums": { + "SDR": 5.78078, + "SIR": 14.9289, + "SAR": 5.43252, + "ISR": 10.7921 + }, + "instrumental": { + "SDR": 7.69169, + "SIR": 11.3176, + "SAR": 9.49023, + "ISR": 12.6742 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "drums": { + "SDR": 5.24303, + "SIR": 19.0052, + "SAR": 5.74591, + "ISR": 7.47942 + }, + "instrumental": { + "SDR": 2.78144, + "SIR": 8.07551, + "SAR": 2.13371, + "ISR": 8.10865 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "drums": { + "SDR": 10.6149, + "SIR": 19.3239, + "SAR": 11.4845, + "ISR": 16.2255 + }, + "instrumental": { + "SDR": 1.56215, + "SIR": 3.60926, + "SAR": 4.0495, + "ISR": 3.04256 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "drums": { + "SDR": 1.03858, + "SIR": 9.65585, + "SAR": -1.85758, + "ISR": 2.59726 + }, + "instrumental": { + "SDR": 16.7024, + "SIR": 29.8033, + "SAR": 22.5688, + "ISR": 18.8863 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "drums": { + "SDR": 6.99062, + "SIR": 12.4202, + "SAR": 6.89015, + "ISR": 11.2594 + }, + "instrumental": { + "SDR": 4.55727, + "SIR": 10.2386, + "SAR": 6.65771, + "ISR": 8.4532 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "drums": { + "SDR": 5.62737, + "SIR": 12.3577, + "SAR": 6.15831, + "ISR": 12.8649 + }, + "instrumental": { + "SDR": 3.41299, + "SIR": 7.60883, + "SAR": 3.7214, + "ISR": 8.48702 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "drums": { + "SDR": 5.11632, + "SIR": 15.3467, + "SAR": 4.99825, + "ISR": 10.9375 + }, + "instrumental": { + "SDR": 6.29898, + "SIR": 12.667, + "SAR": 7.13854, + "ISR": 13.4354 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "drums": { + "SDR": 3.57077, + "SIR": 11.2833, + "SAR": 3.1214, + "ISR": 9.30502 + }, + "instrumental": { + "SDR": 10.1914, + "SIR": 15.2058, + "SAR": 16.1805, + "ISR": 14.0507 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "drums": { + "SDR": 6.93091, + "SIR": 11.5098, + "SAR": 8.36715, + "ISR": 12.9866 + }, + "instrumental": { + "SDR": 2.57479, + "SIR": 6.441, + "SAR": 5.0244, + "ISR": 3.94392 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "drums": { + "SDR": 4.96706, + "SIR": 10.6288, + "SAR": 4.86976, + "ISR": 11.0817 + }, + "instrumental": { + "SDR": 4.94332, + "SIR": 9.20077, + "SAR": 6.34731, + "ISR": 8.51785 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "drums": { + "SDR": 9.73033, + "SIR": 15.4582, + "SAR": 11.0858, + "ISR": 15.3206 + }, + "instrumental": { + "SDR": 1.63607, + "SIR": 5.84164, + "SAR": 3.04934, + "ISR": 3.18988 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "drums": { + "SDR": 8.76085, + "SIR": 18.638, + "SAR": 9.21645, + "ISR": 15.8884 + }, + "instrumental": { + "SDR": 2.69699, + "SIR": 9.48389, + "SAR": 5.05059, + "ISR": 7.81328 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "drums": { + "SDR": 6.20553, + "SIR": 15.6011, + "SAR": 5.58087, + "ISR": 10.4822 + }, + "instrumental": { + "SDR": 2.12568, + "SIR": 10.77, + "SAR": 1.21319, + "ISR": 10.8006 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "drums": { + "SDR": 4.8125, + "SIR": 15.4991, + "SAR": 5.55885, + "ISR": 7.61156 + }, + "instrumental": { + "SDR": 5.71126, + "SIR": 16.0341, + "SAR": 5.10574, + "ISR": 14.3044 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "drums": { + "SDR": 7.64094, + "SIR": 19.0624, + "SAR": 7.86968, + "ISR": 10.2876 + }, + "instrumental": { + "SDR": 1.55153, + "SIR": 4.16771, + "SAR": 1.05764, + "ISR": 5.15522 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "drums": { + "SDR": 8.85053, + "SIR": 17.5839, + "SAR": 9.36337, + "ISR": 14.1257 + }, + "instrumental": { + "SDR": 0.38816, + "SIR": 6.15087, + "SAR": -0.90502, + "ISR": 5.6844 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "drums": { + "SDR": 7.00775, + "SIR": 15.0546, + "SAR": 7.24981, + "ISR": 11.6443 + }, + "instrumental": { + "SDR": 2.00295, + "SIR": 8.67782, + "SAR": 1.303, + "ISR": 8.34425 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "drums": { + "SDR": 14.2848, + "SIR": 21.1582, + "SAR": 15.7269, + "ISR": 20.1131 + }, + "instrumental": { + "SDR": -0.08024, + "SIR": -0.94982, + "SAR": -0.27963, + "ISR": 0.84907 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "drums": { + "SDR": 10.3476, + "SIR": 22.8908, + "SAR": 10.7892, + "ISR": 15.3912 + }, + "instrumental": { + "SDR": 2.17779, + "SIR": 5.26827, + "SAR": 3.96689, + "ISR": 6.6059 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "drums": { + "SDR": 11.1725, + "SIR": 25.784, + "SAR": 11.1362, + "ISR": 16.7703 + }, + "instrumental": { + "SDR": 3.75723, + "SIR": 8.86305, + "SAR": 4.90081, + "ISR": 9.77396 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "drums": { + "SDR": 4.34164, + "SIR": 12.5832, + "SAR": 4.34374, + "ISR": 9.81655 + }, + "instrumental": { + "SDR": -0.04514, + "SIR": 10.6225, + "SAR": -1.59781, + "ISR": 10.5392 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "drums": { + "SDR": 7.46053, + "SIR": 18.3525, + "SAR": 7.97954, + "ISR": 11.9513 + }, + "instrumental": { + "SDR": 3.82152, + "SIR": 10.0609, + "SAR": 3.93938, + "ISR": 9.25875 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "drums": { + "SDR": 5.57404, + "SIR": 11.7291, + "SAR": 5.93683, + "ISR": 10.71 + }, + "instrumental": { + "SDR": 4.46425, + "SIR": 9.35077, + "SAR": 7.31786, + "ISR": 7.47718 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "drums": { + "SDR": 3.47832, + "SIR": 9.67822, + "SAR": 2.87043, + "ISR": 7.64742 + }, + "instrumental": { + "SDR": 6.24888, + "SIR": 14.4736, + "SAR": 5.97047, + "ISR": 13.5767 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "drums": { + "SDR": 5.91571, + "SIR": 16.725, + "SAR": 5.15543, + "ISR": 10.7169 + }, + "instrumental": { + "SDR": 5.68382, + "SIR": 10.4048, + "SAR": 6.52787, + "ISR": 11.3673 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "drums": { + "SDR": 10.6703, + "SIR": 20.4944, + "SAR": 10.7375, + "ISR": 15.5134 + }, + "instrumental": { + "SDR": 1.96625, + "SIR": 5.47078, + "SAR": 3.88715, + "ISR": 6.46382 + } + } + } + ], + "median_scores": { + "drums": { + "SDR": 6.99726, + "SIR": 15.342, + "SAR": 7.15693, + "ISR": 11.7812 + }, + "instrumental": { + "SDR": 3.11637, + "SIR": 8.84112, + "SAR": 4.47515, + "ISR": 8.39873 + } + }, + "stems": [ + "drums", + "no drums" + ], + "target_stem": "drums" + }, + "kuielab_b_vocals.onnx": { + "model_name": "MDX-Net Model: kuielab_b_vocals", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.30456, + "SIR": 21.1354, + "SAR": 4.92979, + "ISR": 8.8335 + }, + "instrumental": { + "SDR": 16.2972, + "SIR": 23.2941, + "SAR": 19.5481, + "ISR": 19.0885 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 7.5451, + "SIR": 19.2118, + "SAR": 7.6691, + "ISR": 11.8577 + }, + "instrumental": { + "SDR": 12.8641, + "SIR": 20.8663, + "SAR": 14.6975, + "ISR": 17.5673 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 9.57259, + "SIR": 20.0866, + "SAR": 10.3754, + "ISR": 14.5497 + }, + "instrumental": { + "SDR": 15.0904, + "SIR": 25.4261, + "SAR": 17.5226, + "ISR": 17.8968 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.16702, + "SIR": 5.81915, + "SAR": 4.30808, + "ISR": 12.0934 + }, + "instrumental": { + "SDR": 10.9453, + "SIR": 25.1263, + "SAR": 13.5379, + "ISR": 13.5175 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.0609, + "SIR": 22.2485, + "SAR": 13.2409, + "ISR": 15.8491 + }, + "instrumental": { + "SDR": 13.8384, + "SIR": 23.4062, + "SAR": 15.3105, + "ISR": 17.0161 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.72609, + "SIR": 17.9826, + "SAR": 9.516, + "ISR": 12.4338 + }, + "instrumental": { + "SDR": 10.9397, + "SIR": 17.4942, + "SAR": 12.5101, + "ISR": 15.8853 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.8537, + "SIR": 19.7906, + "SAR": 11.9351, + "ISR": 14.259 + }, + "instrumental": { + "SDR": 14.508, + "SIR": 22.9531, + "SAR": 16.7366, + "ISR": 17.6048 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.30976, + "SIR": 17.827, + "SAR": 6.19641, + "ISR": 10.3881 + }, + "instrumental": { + "SDR": 18.2253, + "SIR": 29.9346, + "SAR": 23.9521, + "ISR": 19.3701 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.5207, + "SIR": 29.5724, + "SAR": 12.1356, + "ISR": 15.5681 + }, + "instrumental": { + "SDR": 14.7669, + "SIR": 25.0363, + "SAR": 16.6717, + "ISR": 18.7621 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.2081, + "SIR": 19.685, + "SAR": 9.90594, + "ISR": 12.1775 + }, + "instrumental": { + "SDR": 15.188, + "SIR": 18.9637, + "SAR": 15.3158, + "ISR": 17.3308 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 13.7991, + "SIR": 33.1809, + "SAR": 15.2835, + "ISR": 17.1035 + }, + "instrumental": { + "SDR": 16.1131, + "SIR": 27.4016, + "SAR": 18.6377, + "ISR": 19.297 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 10.8648, + "SIR": 21.542, + "SAR": 11.5209, + "ISR": 14.9481 + }, + "instrumental": { + "SDR": 15.0247, + "SIR": 25.8077, + "SAR": 17.4885, + "ISR": 18.2814 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.07043, + "SIR": 18.7006, + "SAR": 7.42649, + "ISR": 12.8412 + }, + "instrumental": { + "SDR": 15.3272, + "SIR": 25.0967, + "SAR": 17.139, + "ISR": 17.6419 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.13561, + "SIR": 19.2962, + "SAR": 9.17369, + "ISR": 12.3769 + }, + "instrumental": { + "SDR": 17.7564, + "SIR": 24.1918, + "SAR": 22.189, + "ISR": 18.7132 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.58865, + "SIR": 17.1991, + "SAR": 3.28129, + "ISR": 9.40123 + }, + "instrumental": { + "SDR": 15.5546, + "SIR": 22.6272, + "SAR": 19.1176, + "ISR": 18.607 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.21084, + "SIR": 19.9805, + "SAR": 9.84155, + "ISR": 14.2361 + }, + "instrumental": { + "SDR": 13.9441, + "SIR": 23.4221, + "SAR": 15.9075, + "ISR": 17.5219 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.43341, + "SIR": 25.4898, + "SAR": 8.79153, + "ISR": 12.646 + }, + "instrumental": { + "SDR": 14.9751, + "SIR": 23.1067, + "SAR": 17.4988, + "ISR": 18.9181 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -3.9442, + "SIR": -19.9831, + "SAR": 0.177055, + "ISR": 5.69437 + }, + "instrumental": { + "SDR": 19.9266, + "SIR": 54.9052, + "SAR": 32.5103, + "ISR": 18.7894 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.12483, + "SIR": 15.5136, + "SAR": 7.31829, + "ISR": 11.298 + }, + "instrumental": { + "SDR": 16.2242, + "SIR": 22.4601, + "SAR": 18.4828, + "ISR": 17.7294 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.2207, + "SIR": 22.5102, + "SAR": 10.638, + "ISR": 14.2634 + }, + "instrumental": { + "SDR": 15.1849, + "SIR": 24.797, + "SAR": 17.2016, + "ISR": 18.4404 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.5309, + "SIR": 22.6299, + "SAR": 10.9705, + "ISR": 14.919 + }, + "instrumental": { + "SDR": 17.2178, + "SIR": 29.3981, + "SAR": 21.1577, + "ISR": 18.9597 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -2.32653, + "SIR": -0.30444, + "SAR": -0.08732, + "ISR": 3.13562 + }, + "instrumental": { + "SDR": 19.7604, + "SIR": 39.3107, + "SAR": 31.6501, + "ISR": 19.1183 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.18968, + "SIR": 15.2985, + "SAR": 3.81692, + "ISR": 6.51706 + }, + "instrumental": { + "SDR": 10.8661, + "SIR": 14.3243, + "SAR": 14.6505, + "ISR": 17.2804 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.04885, + "SIR": 17.7424, + "SAR": 6.3453, + "ISR": 13.2417 + }, + "instrumental": { + "SDR": 17.1538, + "SIR": 28.759, + "SAR": 20.3809, + "ISR": 18.7932 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.11171, + "SIR": 17.8422, + "SAR": 7.33663, + "ISR": 10.8895 + }, + "instrumental": { + "SDR": 14.0838, + "SIR": 21.0175, + "SAR": 16.9227, + "ISR": 18.1265 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.13028, + "SIR": 18.1819, + "SAR": 8.53843, + "ISR": 13.5881 + }, + "instrumental": { + "SDR": 15.1421, + "SIR": 24.3556, + "SAR": 16.987, + "ISR": 17.7103 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.3791, + "SIR": 23.101, + "SAR": 12.2295, + "ISR": 14.8481 + }, + "instrumental": { + "SDR": 12.7279, + "SIR": 21.7571, + "SAR": 14.1367, + "ISR": 17.0832 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.60102, + "SIR": 19.4187, + "SAR": 6.18339, + "ISR": 10.1852 + }, + "instrumental": { + "SDR": 13.086, + "SIR": 17.5006, + "SAR": 14.2845, + "ISR": 17.3025 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 9.73211, + "SIR": 23.2544, + "SAR": 9.96806, + "ISR": 14.911 + }, + "instrumental": { + "SDR": 14.5184, + "SIR": 24.6816, + "SAR": 16.6041, + "ISR": 17.9132 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 13.7085, + "SIR": 27.9944, + "SAR": 12.9552, + "ISR": 14.6582 + }, + "instrumental": { + "SDR": 14.1468, + "SIR": 18.97, + "SAR": 13.8095, + "ISR": 18.5127 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 10.9392, + "SIR": 23.0397, + "SAR": 11.094, + "ISR": 14.6053 + }, + "instrumental": { + "SDR": 13.9582, + "SIR": 21.9524, + "SAR": 15.2822, + "ISR": 17.4525 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.4632, + "SIR": 32.1246, + "SAR": 11.758, + "ISR": 13.806 + }, + "instrumental": { + "SDR": 16.9755, + "SIR": 24.8777, + "SAR": 21.054, + "ISR": 19.6166 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 4.81324, + "SIR": 12.9986, + "SAR": 6.44942, + "ISR": 9.75713 + }, + "instrumental": { + "SDR": 12.0588, + "SIR": 17.2469, + "SAR": 14.0433, + "ISR": 17.3272 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.0319, + "SIR": 25.9071, + "SAR": 13.1343, + "ISR": 16.9845 + }, + "instrumental": { + "SDR": 18.2416, + "SIR": 33.2648, + "SAR": 23.3783, + "ISR": 19.1745 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.9654, + "SIR": 19.0299, + "SAR": 12.2731, + "ISR": 17.1389 + }, + "instrumental": { + "SDR": 11.4665, + "SIR": 23.8385, + "SAR": 12.02, + "ISR": 14.5321 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 7.89718, + "SIR": 22.9178, + "SAR": 8.12822, + "ISR": 12.7305 + }, + "instrumental": { + "SDR": 13.3542, + "SIR": 21.5011, + "SAR": 14.9012, + "ISR": 17.8808 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.49519, + "SIR": 7.84096, + "SAR": 2.31508, + "ISR": 9.60146 + }, + "instrumental": { + "SDR": 17.4841, + "SIR": 30.6488, + "SAR": 21.8172, + "ISR": 17.9845 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.46895, + "SIR": 24.8831, + "SAR": 10.2708, + "ISR": 14.8141 + }, + "instrumental": { + "SDR": 16.7038, + "SIR": 28.8329, + "SAR": 19.9919, + "ISR": 18.9152 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 10.7288, + "SIR": 26.9895, + "SAR": 10.9454, + "ISR": 15.3945 + }, + "instrumental": { + "SDR": 17.5598, + "SIR": 30.5208, + "SAR": 21.2514, + "ISR": 19.1324 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 10.8685, + "SIR": 27.7549, + "SAR": 12.5085, + "ISR": 13.9922 + }, + "instrumental": { + "SDR": 14.2331, + "SIR": 21.0278, + "SAR": 16.4572, + "ISR": 18.4063 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.96846, + "SIR": 19.8856, + "SAR": 9.67877, + "ISR": 13.4149 + }, + "instrumental": { + "SDR": 15.0575, + "SIR": 24.0151, + "SAR": 17.063, + "ISR": 18.0555 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "kuielab_b_other.onnx": { + "model_name": "MDX-Net Model: kuielab_b_other", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "other": { + "SDR": 9.64939, + "SIR": 22.6796, + "SAR": 10.5282, + "ISR": 13.6929 + }, + "instrumental": { + "SDR": 5.30899, + "SIR": 13.7586, + "SAR": 10.6078, + "ISR": 6.64791 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "other": { + "SDR": 7.2477, + "SIR": 15.4396, + "SAR": 7.63335, + "ISR": 11.639 + }, + "instrumental": { + "SDR": 3.03107, + "SIR": 10.8778, + "SAR": 4.0042, + "ISR": 5.69864 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "other": { + "SDR": 4.62974, + "SIR": 12.6399, + "SAR": 3.78679, + "ISR": 9.55436 + }, + "instrumental": { + "SDR": 4.20871, + "SIR": 9.70324, + "SAR": 4.30325, + "ISR": 9.23504 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "other": { + "SDR": 0.4693, + "SIR": 0.85681, + "SAR": -1.61364, + "ISR": 2.07061 + }, + "instrumental": { + "SDR": 8.0243, + "SIR": 27.0428, + "SAR": 8.50187, + "ISR": 13.9945 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "other": { + "SDR": 7.54582, + "SIR": 16.0865, + "SAR": 7.94442, + "ISR": 10.7807 + }, + "instrumental": { + "SDR": 1.41065, + "SIR": 9.83694, + "SAR": 0.046955, + "ISR": 5.96283 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "other": { + "SDR": 5.94498, + "SIR": 15.6722, + "SAR": 5.37025, + "ISR": 8.2591 + }, + "instrumental": { + "SDR": 0.95701, + "SIR": 10.5176, + "SAR": -0.81633, + "ISR": 5.7793 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "other": { + "SDR": 7.03697, + "SIR": 15.627, + "SAR": 7.49614, + "ISR": 10.7276 + }, + "instrumental": { + "SDR": 3.03031, + "SIR": 11.1621, + "SAR": 2.57803, + "ISR": 7.89506 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "other": { + "SDR": 6.99408, + "SIR": 15.0626, + "SAR": 7.01234, + "ISR": 11.1562 + }, + "instrumental": { + "SDR": 7.57224, + "SIR": 13.75, + "SAR": 12.5566, + "ISR": 10.7771 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "other": { + "SDR": 8.65245, + "SIR": 17.3684, + "SAR": 9.95854, + "ISR": 11.2087 + }, + "instrumental": { + "SDR": 1.7757, + "SIR": 7.2058, + "SAR": 5.30094, + "ISR": 3.13038 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "other": { + "SDR": 9.64301, + "SIR": 16.7565, + "SAR": 9.93033, + "ISR": 11.6496 + }, + "instrumental": { + "SDR": 1.7586, + "SIR": 8.82671, + "SAR": 1.64525, + "ISR": 4.98343 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "other": { + "SDR": 9.22624, + "SIR": 16.3695, + "SAR": 10.7097, + "ISR": 13.1194 + }, + "instrumental": { + "SDR": 1.96556, + "SIR": 7.01307, + "SAR": 3.22011, + "ISR": 4.33743 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "other": { + "SDR": 5.41656, + "SIR": 12.4231, + "SAR": 5.63976, + "ISR": 8.89898 + }, + "instrumental": { + "SDR": 4.07683, + "SIR": 11.7097, + "SAR": 4.2601, + "ISR": 8.76732 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "other": { + "SDR": 8.92765, + "SIR": 19.5166, + "SAR": 8.54674, + "ISR": 11.6073 + }, + "instrumental": { + "SDR": 3.4921, + "SIR": 10.4253, + "SAR": 3.85245, + "ISR": 6.17409 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "other": { + "SDR": 6.19542, + "SIR": 17.363, + "SAR": 6.61771, + "ISR": 9.61574 + }, + "instrumental": { + "SDR": 4.35067, + "SIR": 13.7201, + "SAR": 4.96223, + "ISR": 8.76094 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "other": { + "SDR": 8.09068, + "SIR": 17.6092, + "SAR": 8.98422, + "ISR": 12.3712 + }, + "instrumental": { + "SDR": 5.59829, + "SIR": 13.2661, + "SAR": 11.1781, + "ISR": 7.56892 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "other": { + "SDR": 8.31856, + "SIR": 16.4479, + "SAR": 8.85628, + "ISR": 12.1086 + }, + "instrumental": { + "SDR": 1.09208, + "SIR": 6.40031, + "SAR": 1.4028, + "ISR": 4.74192 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "other": { + "SDR": 7.92887, + "SIR": 17.3064, + "SAR": 8.32305, + "ISR": 12.2517 + }, + "instrumental": { + "SDR": 4.65095, + "SIR": 12.1399, + "SAR": 7.77261, + "ISR": 7.42832 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "other": { + "SDR": 14.7176, + "SIR": 26.3088, + "SAR": 18.1685, + "ISR": 15.5724 + }, + "instrumental": { + "SDR": 1.81029, + "SIR": 9.50112, + "SAR": 16.0224, + "ISR": 2.87091 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "other": { + "SDR": 6.11759, + "SIR": 11.4394, + "SAR": 6.11227, + "ISR": 9.88093 + }, + "instrumental": { + "SDR": 5.39452, + "SIR": 9.51154, + "SAR": 7.74441, + "ISR": 6.25688 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "other": { + "SDR": 7.35569, + "SIR": 18.0482, + "SAR": 8.00892, + "ISR": 11.0704 + }, + "instrumental": { + "SDR": 3.34213, + "SIR": 11.1823, + "SAR": 2.85, + "ISR": 7.93734 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "other": { + "SDR": 6.51418, + "SIR": 15.8501, + "SAR": 6.8566, + "ISR": 9.71067 + }, + "instrumental": { + "SDR": 5.60238, + "SIR": 15.7301, + "SAR": 6.51614, + "ISR": 10.6595 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "other": { + "SDR": 11.8816, + "SIR": 22.2792, + "SAR": 14.7422, + "ISR": 14.3541 + }, + "instrumental": { + "SDR": 1.25678, + "SIR": 5.84482, + "SAR": 7.69005, + "ISR": 2.15879 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "other": { + "SDR": 5.13684, + "SIR": 9.7413, + "SAR": 5.93986, + "ISR": 9.53541 + }, + "instrumental": { + "SDR": 4.71079, + "SIR": 11.1188, + "SAR": 6.19342, + "ISR": 6.3735 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "other": { + "SDR": 5.86376, + "SIR": 12.5694, + "SAR": 6.73528, + "ISR": 10.0457 + }, + "instrumental": { + "SDR": 4.55425, + "SIR": 14.1528, + "SAR": 9.23272, + "ISR": 8.42971 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "other": { + "SDR": 4.0522, + "SIR": 7.53218, + "SAR": 4.68118, + "ISR": 9.03075 + }, + "instrumental": { + "SDR": 5.9781, + "SIR": 17.3417, + "SAR": 6.62162, + "ISR": 9.33317 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "other": { + "SDR": 12.6976, + "SIR": 27.5416, + "SAR": 14.0998, + "ISR": 14.8159 + }, + "instrumental": { + "SDR": 0.91939, + "SIR": 9.68124, + "SAR": 0.85521, + "ISR": 2.94146 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "other": { + "SDR": 6.8383, + "SIR": 18.6822, + "SAR": 7.26491, + "ISR": 11.4248 + }, + "instrumental": { + "SDR": 0.67544, + "SIR": 8.92284, + "SAR": -0.93616, + "ISR": 5.03267 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "other": { + "SDR": 11.1212, + "SIR": 21.7538, + "SAR": 12.0377, + "ISR": 14.7442 + }, + "instrumental": { + "SDR": 0.26136, + "SIR": 5.31244, + "SAR": -4.16131, + "ISR": 1.22848 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "other": { + "SDR": 3.0719, + "SIR": 5.51981, + "SAR": 2.40327, + "ISR": 7.20397 + }, + "instrumental": { + "SDR": 4.59113, + "SIR": 17.0407, + "SAR": 3.84494, + "ISR": 11.16 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "other": { + "SDR": 10.3447, + "SIR": 20.6822, + "SAR": 11.2742, + "ISR": 12.9132 + }, + "instrumental": { + "SDR": 0.23595, + "SIR": 7.00732, + "SAR": -1.69078, + "ISR": 3.77278 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "other": { + "SDR": 6.5955, + "SIR": 9.80763, + "SAR": 8.03074, + "ISR": 12.1842 + }, + "instrumental": { + "SDR": 0.3194, + "SIR": 6.1072, + "SAR": -3.28883, + "ISR": 3.25316 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "other": { + "SDR": 2.40989, + "SIR": 11.5116, + "SAR": 1.3879, + "ISR": 4.99395 + }, + "instrumental": { + "SDR": 11.1713, + "SIR": 20.8102, + "SAR": 14.7704, + "ISR": 16.5908 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "other": { + "SDR": 6.41997, + "SIR": 18.8085, + "SAR": 6.83169, + "ISR": 10.6595 + }, + "instrumental": { + "SDR": 1.63646, + "SIR": 7.35046, + "SAR": 1.3573, + "ISR": 5.55991 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "other": { + "SDR": 4.53491, + "SIR": 19.7521, + "SAR": 3.94093, + "ISR": 12.4326 + }, + "instrumental": { + "SDR": 5.95565, + "SIR": 12.5336, + "SAR": 5.7771, + "ISR": 10.9417 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "other": { + "SDR": 5.07085, + "SIR": 18.6145, + "SAR": 4.35329, + "ISR": 8.53857 + }, + "instrumental": { + "SDR": 0.21596, + "SIR": 15.6609, + "SAR": -1.28946, + "ISR": 11.5589 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "other": { + "SDR": 9.11662, + "SIR": 17.3152, + "SAR": 9.60333, + "ISR": 13.0907 + }, + "instrumental": { + "SDR": 1.21533, + "SIR": 7.37947, + "SAR": -0.01784, + "ISR": 3.12771 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "other": { + "SDR": 4.65643, + "SIR": 8.08793, + "SAR": 6.06734, + "ISR": 9.4626 + }, + "instrumental": { + "SDR": 4.0963, + "SIR": 11.9099, + "SAR": 6.42775, + "ISR": 6.33339 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "other": { + "SDR": 8.7823, + "SIR": 13.5396, + "SAR": 10.9588, + "ISR": 12.4886 + }, + "instrumental": { + "SDR": 2.48424, + "SIR": 10.9439, + "SAR": 3.17304, + "ISR": 4.04116 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "other": { + "SDR": 7.74916, + "SIR": 15.7468, + "SAR": 6.68936, + "ISR": 11.8915 + }, + "instrumental": { + "SDR": 5.65419, + "SIR": 15.2447, + "SAR": 6.35984, + "ISR": 11.7118 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "other": { + "SDR": 7.09594, + "SIR": 16.9553, + "SAR": 7.40809, + "ISR": 10.836 + }, + "instrumental": { + "SDR": 1.8609, + "SIR": 9.34897, + "SAR": 2.79366, + "ISR": 6.88979 + } + } + } + ], + "median_scores": { + "instrumental": { + "SDR": 3.1866, + "SIR": 10.9108, + "SAR": 4.13215, + "ISR": 6.35344 + } + }, + "stems": [ + "other", + "no other" + ], + "target_stem": "other" + }, + "kuielab_b_bass.onnx": { + "model_name": "MDX-Net Model: kuielab_b_bass", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "bass": { + "SDR": 15.7548, + "SIR": 23.7323, + "SAR": 18.4123, + "ISR": 18.2626 + }, + "instrumental": { + "SDR": 0.81314, + "SIR": 6.97275, + "SAR": 4.42315, + "ISR": 1.81282 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "bass": { + "SDR": 10.2335, + "SIR": 21.1984, + "SAR": 12.3839, + "ISR": 13.3543 + }, + "instrumental": { + "SDR": 2.2203, + "SIR": 5.75124, + "SAR": 2.93622, + "ISR": 3.89337 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "bass": { + "SDR": 9.61002, + "SIR": 18.8263, + "SAR": 8.78097, + "ISR": 11.4529 + }, + "instrumental": { + "SDR": 2.7386, + "SIR": 6.12097, + "SAR": 3.13034, + "ISR": 6.54165 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "bass": { + "SDR": 3.08289, + "SIR": 25.5082, + "SAR": 3.01361, + "ISR": 4.23416 + }, + "instrumental": { + "SDR": 4.89626, + "SIR": 12.1984, + "SAR": 4.40366, + "ISR": 9.55751 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "bass": { + "SDR": 9.8357, + "SIR": 20.3337, + "SAR": 10.1956, + "ISR": 13.4856 + }, + "instrumental": { + "SDR": 1.42536, + "SIR": 7.40689, + "SAR": 0.7136, + "ISR": 7.82504 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "bass": { + "SDR": 5.61949, + "SIR": 9.35277, + "SAR": 5.27928, + "ISR": 10.6836 + }, + "instrumental": { + "SDR": 2.07579, + "SIR": 12.7337, + "SAR": 0.95736, + "ISR": 11.9567 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "bass": { + "SDR": 14.2638, + "SIR": 23.7722, + "SAR": 13.8163, + "ISR": 15.413 + }, + "instrumental": { + "SDR": 0.94812, + "SIR": 4.98609, + "SAR": 0.919005, + "ISR": 3.65536 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "bass": { + "SDR": 13.4702, + "SIR": 23.2104, + "SAR": 14.2076, + "ISR": 16.4926 + }, + "instrumental": { + "SDR": 1.55335, + "SIR": 2.39983, + "SAR": 5.29428, + "ISR": 2.76656 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "bass": { + "SDR": 7.70288, + "SIR": 20.2693, + "SAR": 7.73998, + "ISR": 10.0089 + }, + "instrumental": { + "SDR": 8.12446, + "SIR": 11.7788, + "SAR": 15.7118, + "ISR": 12.3598 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "bass": { + "SDR": 10.2519, + "SIR": 19.9879, + "SAR": 10.3312, + "ISR": 12.7349 + }, + "instrumental": { + "SDR": 3.09573, + "SIR": 7.95487, + "SAR": 3.87341, + "ISR": 9.70361 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "bass": { + "SDR": 9.74868, + "SIR": 21.1154, + "SAR": 7.09004, + "ISR": 8.64697 + }, + "instrumental": { + "SDR": 5.17796, + "SIR": 8.194, + "SAR": 4.2851, + "ISR": 10.403 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "bass": { + "SDR": 8.41547, + "SIR": 18.8555, + "SAR": 8.9441, + "ISR": 12.7429 + }, + "instrumental": { + "SDR": 3.71434, + "SIR": 8.18723, + "SAR": 4.59536, + "ISR": 9.64957 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "bass": { + "SDR": 11.793, + "SIR": 20.8977, + "SAR": 13.1418, + "ISR": 16.3052 + }, + "instrumental": { + "SDR": 2.00303, + "SIR": 6.23416, + "SAR": 3.07668, + "ISR": 3.88179 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "bass": { + "SDR": 8.92261, + "SIR": 18.6214, + "SAR": 9.8512, + "ISR": 13.9627 + }, + "instrumental": { + "SDR": 2.73232, + "SIR": 4.95466, + "SAR": 4.76885, + "ISR": 5.78991 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "bass": { + "SDR": 13.3993, + "SIR": 24.0591, + "SAR": 14.7255, + "ISR": 16.4459 + }, + "instrumental": { + "SDR": 1.62143, + "SIR": 4.18037, + "SAR": 5.74988, + "ISR": 2.73077 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "bass": { + "SDR": 6.20341, + "SIR": 10.7066, + "SAR": 3.18892, + "ISR": 3.95547 + }, + "instrumental": { + "SDR": 3.76185, + "SIR": 7.26743, + "SAR": 2.55489, + "ISR": 10.6071 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "bass": { + "SDR": 8.21082, + "SIR": 17.0031, + "SAR": 7.67154, + "ISR": 11.3789 + }, + "instrumental": { + "SDR": 5.98539, + "SIR": 10.1891, + "SAR": 10.3468, + "ISR": 10.869 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "bass": { + "SDR": 13.601, + "SIR": 21.0477, + "SAR": 15.0617, + "ISR": 16.0498 + }, + "instrumental": { + "SDR": 3.43685, + "SIR": 11.0703, + "SAR": 16.0928, + "ISR": 4.84765 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "bass": { + "SDR": 13.3268, + "SIR": 21.4642, + "SAR": 13.7382, + "ISR": 16.673 + }, + "instrumental": { + "SDR": 2.35495, + "SIR": 7.20103, + "SAR": 6.58162, + "ISR": 4.26424 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "bass": { + "SDR": 10.4218, + "SIR": 19.9021, + "SAR": 11.0927, + "ISR": 14.9817 + }, + "instrumental": { + "SDR": 1.42512, + "SIR": 3.21367, + "SAR": 2.1126, + "ISR": 4.37602 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "bass": { + "SDR": 14.2073, + "SIR": 21.8536, + "SAR": 15.4168, + "ISR": 17.2479 + }, + "instrumental": { + "SDR": 0.44343, + "SIR": 1.27262, + "SAR": 0.23863, + "ISR": 1.71844 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "bass": { + "SDR": 10.5464, + "SIR": 22.2233, + "SAR": 11.318, + "ISR": 13.8509 + }, + "instrumental": { + "SDR": 6.46552, + "SIR": 9.57089, + "SAR": 15.1044, + "ISR": 9.30445 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "bass": { + "SDR": 3.21515, + "SIR": 13.3912, + "SAR": 1.26532, + "ISR": 4.40634 + }, + "instrumental": { + "SDR": 7.77384, + "SIR": 16.7379, + "SAR": 8.42431, + "ISR": 13.9576 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "bass": { + "SDR": 9.98494, + "SIR": 14.1989, + "SAR": 9.7302, + "ISR": 11.6097 + }, + "instrumental": { + "SDR": 1.90551, + "SIR": 4.7302, + "SAR": 3.87369, + "ISR": 3.64729 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "bass": { + "SDR": 7.84134, + "SIR": 16.0192, + "SAR": 8.57408, + "ISR": 11.4806 + }, + "instrumental": { + "SDR": 4.29513, + "SIR": 9.94399, + "SAR": 5.52655, + "ISR": 7.5392 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "bass": { + "SDR": 5.38987, + "SIR": 21.7443, + "SAR": 6.15124, + "ISR": 13.3924 + }, + "instrumental": { + "SDR": 5.36153, + "SIR": 10.4647, + "SAR": 6.58048, + "ISR": 10.6227 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "bass": { + "SDR": 10.5593, + "SIR": 19.1382, + "SAR": 12.3122, + "ISR": 14.6797 + }, + "instrumental": { + "SDR": 0.47325, + "SIR": 7.47173, + "SAR": -0.43683, + "ISR": 4.4767 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "bass": { + "SDR": 8.9461, + "SIR": 19.7225, + "SAR": 8.8104, + "ISR": 12.9769 + }, + "instrumental": { + "SDR": 5.32202, + "SIR": 17.9164, + "SAR": 5.10667, + "ISR": 14.0013 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "bass": { + "SDR": 11.2725, + "SIR": 23.0555, + "SAR": 11.9542, + "ISR": 15.3665 + }, + "instrumental": { + "SDR": 2.82989, + "SIR": 5.18172, + "SAR": 3.90687, + "ISR": 7.06041 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "bass": { + "SDR": 8.39465, + "SIR": 20.2563, + "SAR": 7.90997, + "ISR": 11.4464 + }, + "instrumental": { + "SDR": 1.75367, + "SIR": 10.3253, + "SAR": 0.830015, + "ISR": 11.9748 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "bass": { + "SDR": 3.7596, + "SIR": 13.1369, + "SAR": 1.92571, + "ISR": 5.65045 + }, + "instrumental": { + "SDR": 3.18183, + "SIR": 14.8768, + "SAR": 1.87619, + "ISR": 12.772 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "bass": { + "SDR": 9.31692, + "SIR": 27.2579, + "SAR": 0.75021, + "ISR": -4.33117 + }, + "instrumental": { + "SDR": 5.62643, + "SIR": 2.76063, + "SAR": 3.00181, + "ISR": 12.2923 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "bass": { + "SDR": 13.0351, + "SIR": 26.1968, + "SAR": 10.7765, + "ISR": 13.2642 + }, + "instrumental": { + "SDR": 3.22029, + "SIR": 7.44384, + "SAR": 5.7559, + "ISR": 7.75851 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "bass": { + "SDR": 14.7969, + "SIR": 26.6912, + "SAR": 16.9395, + "ISR": 17.9366 + }, + "instrumental": { + "SDR": 0.484755, + "SIR": 2.37826, + "SAR": 0.83404, + "ISR": 3.05398 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "bass": { + "SDR": 10.7409, + "SIR": 22.12, + "SAR": 11.5083, + "ISR": 15.4611 + }, + "instrumental": { + "SDR": -1.86122, + "SIR": 1.53389, + "SAR": -6.10625, + "ISR": 3.03968 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "bass": { + "SDR": 8.90883, + "SIR": 16.9371, + "SAR": 9.06707, + "ISR": 13.4879 + }, + "instrumental": { + "SDR": 3.68763, + "SIR": 10.6277, + "SAR": 3.85806, + "ISR": 10.0287 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "bass": { + "SDR": 8.44492, + "SIR": 12.3766, + "SAR": 0.42707, + "ISR": -5.51573 + }, + "instrumental": { + "SDR": 3.2009, + "SIR": -4.69864, + "SAR": 0.80892, + "ISR": 5.93919 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "bass": { + "SDR": 11.8977, + "SIR": 21.4119, + "SAR": 4.74189, + "ISR": 4.5358 + }, + "instrumental": { + "SDR": 2.56857, + "SIR": 2.73476, + "SAR": 2.2893, + "ISR": 4.96208 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "bass": { + "SDR": 11.7981, + "SIR": 17.4025, + "SAR": 13.7179, + "ISR": 16.5175 + }, + "instrumental": { + "SDR": 0.6164, + "SIR": 2.0046, + "SAR": -0.39888, + "ISR": 1.97171 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "bass": { + "SDR": 8.63686, + "SIR": 18.5065, + "SAR": 3.06041, + "ISR": 3.07377 + }, + "instrumental": { + "SDR": 2.57565, + "SIR": 0.80275, + "SAR": 1.14688, + "ISR": 7.67727 + } + } + } + ], + "median_scores": { + "bass": { + "SDR": 9.91032, + "SIR": 20.3015, + "SAR": 9.7907, + "ISR": 13.3093 + }, + "instrumental": { + "SDR": 2.73546, + "SIR": 7.23423, + "SAR": 3.86573, + "ISR": 7.29981 + } + }, + "stems": [ + "bass", + "no bass" + ], + "target_stem": "bass" + }, + "kuielab_b_drums.onnx": { + "model_name": "MDX-Net Model: kuielab_b_drums", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "drums": { + "SDR": 2.5684, + "SIR": 15.1012, + "SAR": 0.54169, + "ISR": 3.75755 + }, + "instrumental": { + "SDR": 10.5504, + "SIR": 25.3366, + "SAR": 10.7179, + "ISR": 18.4031 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "drums": { + "SDR": 6.2011, + "SIR": 19.1452, + "SAR": 5.91363, + "ISR": 9.29231 + }, + "instrumental": { + "SDR": 6.00811, + "SIR": 12.5654, + "SAR": 6.30249, + "ISR": 14.0578 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "drums": { + "SDR": 8.19709, + "SIR": 14.5978, + "SAR": 8.67332, + "ISR": 14.11 + }, + "instrumental": { + "SDR": 2.25324, + "SIR": 5.2431, + "SAR": 2.28704, + "ISR": 5.50651 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "drums": { + "SDR": 7.10067, + "SIR": 16.2967, + "SAR": 7.89512, + "ISR": 10.2504 + }, + "instrumental": { + "SDR": 3.56954, + "SIR": 6.40193, + "SAR": 5.72985, + "ISR": 7.30478 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "drums": { + "SDR": 8.63067, + "SIR": 18.6, + "SAR": 9.37125, + "ISR": 12.8421 + }, + "instrumental": { + "SDR": 1.17916, + "SIR": 5.92972, + "SAR": 0.17392, + "ISR": 7.40509 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "drums": { + "SDR": 8.49692, + "SIR": 18.744, + "SAR": 9.72448, + "ISR": 11.6189 + }, + "instrumental": { + "SDR": 0.76547, + "SIR": 7.22604, + "SAR": -0.55118, + "ISR": 6.21183 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "drums": { + "SDR": 8.75381, + "SIR": 19.6976, + "SAR": 9.48677, + "ISR": 13.153 + }, + "instrumental": { + "SDR": 3.27906, + "SIR": 9.50116, + "SAR": 3.46903, + "ISR": 8.97561 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "drums": { + "SDR": 6.91812, + "SIR": 15.559, + "SAR": 7.41762, + "ISR": 11.2848 + }, + "instrumental": { + "SDR": 6.16064, + "SIR": 8.82203, + "SAR": 8.57605, + "ISR": 9.51061 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "drums": { + "SDR": 5.84413, + "SIR": 15.0591, + "SAR": 5.80223, + "ISR": 9.94096 + }, + "instrumental": { + "SDR": 5.82193, + "SIR": 11.3604, + "SAR": 10.9842, + "ISR": 10.4279 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "drums": { + "SDR": 7.06685, + "SIR": 13.2933, + "SAR": 7.03635, + "ISR": 12.0527 + }, + "instrumental": { + "SDR": 3.0867, + "SIR": 6.60793, + "SAR": 3.4161, + "ISR": 6.36216 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "drums": { + "SDR": 9.58602, + "SIR": 16.7514, + "SAR": 10.5066, + "ISR": 14.8305 + }, + "instrumental": { + "SDR": 2.9283, + "SIR": 7.34443, + "SAR": 5.63948, + "ISR": 6.3464 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "drums": { + "SDR": 9.68661, + "SIR": 19.8937, + "SAR": 10.6275, + "ISR": 13.8978 + }, + "instrumental": { + "SDR": 1.67553, + "SIR": 2.99451, + "SAR": 2.43189, + "ISR": 4.20413 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "drums": { + "SDR": 4.95161, + "SIR": 14.8377, + "SAR": 4.58704, + "ISR": 9.44919 + }, + "instrumental": { + "SDR": 6.00352, + "SIR": 12.5359, + "SAR": 5.78378, + "ISR": 12.5975 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "drums": { + "SDR": 8.12964, + "SIR": 15.8945, + "SAR": 8.43014, + "ISR": 12.9855 + }, + "instrumental": { + "SDR": 2.90031, + "SIR": 5.78233, + "SAR": 4.61964, + "ISR": 6.59501 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "drums": { + "SDR": 6.12447, + "SIR": 15.6269, + "SAR": 5.94624, + "ISR": 9.98507 + }, + "instrumental": { + "SDR": 7.84515, + "SIR": 11.7485, + "SAR": 9.56791, + "ISR": 13.0054 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "drums": { + "SDR": 5.13615, + "SIR": 20.2134, + "SAR": 5.83405, + "ISR": 7.15399 + }, + "instrumental": { + "SDR": 2.88148, + "SIR": 8.20722, + "SAR": 2.22197, + "ISR": 8.34761 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "drums": { + "SDR": 10.6933, + "SIR": 20.478, + "SAR": 11.7371, + "ISR": 15.3026 + }, + "instrumental": { + "SDR": 1.69627, + "SIR": 3.94051, + "SAR": 4.28544, + "ISR": 3.24043 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "drums": { + "SDR": 1.47191, + "SIR": 9.95266, + "SAR": -1.52858, + "ISR": 3.29303 + }, + "instrumental": { + "SDR": 16.6898, + "SIR": 28.0153, + "SAR": 22.898, + "ISR": 18.7676 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "drums": { + "SDR": 6.95376, + "SIR": 12.495, + "SAR": 7.27907, + "ISR": 11.1508 + }, + "instrumental": { + "SDR": 4.53461, + "SIR": 10.2303, + "SAR": 6.73113, + "ISR": 8.50964 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "drums": { + "SDR": 5.97956, + "SIR": 14.9381, + "SAR": 6.38333, + "ISR": 12.0979 + }, + "instrumental": { + "SDR": 3.54066, + "SIR": 7.78204, + "SAR": 3.96349, + "ISR": 8.92341 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "drums": { + "SDR": 5.00642, + "SIR": 17.4592, + "SAR": 4.79745, + "ISR": 10.9245 + }, + "instrumental": { + "SDR": 6.15955, + "SIR": 12.7043, + "SAR": 7.43093, + "ISR": 13.594 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "drums": { + "SDR": 2.60555, + "SIR": 10.215, + "SAR": 2.16607, + "ISR": 8.54691 + }, + "instrumental": { + "SDR": 9.77316, + "SIR": 15.6496, + "SAR": 15.6572, + "ISR": 14.2025 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "drums": { + "SDR": 7.1572, + "SIR": 14.3231, + "SAR": 8.26936, + "ISR": 11.2281 + }, + "instrumental": { + "SDR": 3.04591, + "SIR": 6.86055, + "SAR": 5.6269, + "ISR": 4.71269 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "drums": { + "SDR": 5.2755, + "SIR": 11.665, + "SAR": 5.11633, + "ISR": 9.90275 + }, + "instrumental": { + "SDR": 5.41017, + "SIR": 9.84848, + "SAR": 6.9734, + "ISR": 9.11239 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "drums": { + "SDR": 10.2365, + "SIR": 17.8736, + "SAR": 11.6629, + "ISR": 14.0066 + }, + "instrumental": { + "SDR": 1.81437, + "SIR": 6.20197, + "SAR": 3.37121, + "ISR": 3.46865 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "drums": { + "SDR": 9.18064, + "SIR": 19.4174, + "SAR": 9.81886, + "ISR": 15.2134 + }, + "instrumental": { + "SDR": 2.73682, + "SIR": 9.58862, + "SAR": 5.68188, + "ISR": 7.96164 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "drums": { + "SDR": 6.73973, + "SIR": 16.9175, + "SAR": 6.59046, + "ISR": 11.0466 + }, + "instrumental": { + "SDR": 2.11844, + "SIR": 10.6467, + "SAR": 1.28349, + "ISR": 10.8954 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "drums": { + "SDR": 4.76715, + "SIR": 13.867, + "SAR": 5.5621, + "ISR": 7.68594 + }, + "instrumental": { + "SDR": 5.63864, + "SIR": 16.103, + "SAR": 5.01904, + "ISR": 14.2624 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "drums": { + "SDR": 7.81418, + "SIR": 21.1299, + "SAR": 8.06179, + "ISR": 10.0182 + }, + "instrumental": { + "SDR": 1.72096, + "SIR": 4.33378, + "SAR": 1.26953, + "ISR": 5.43391 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "drums": { + "SDR": 8.46906, + "SIR": 19.6227, + "SAR": 8.81233, + "ISR": 12.7851 + }, + "instrumental": { + "SDR": 0.599795, + "SIR": 6.38856, + "SAR": -0.752025, + "ISR": 6.15902 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "drums": { + "SDR": 7.2038, + "SIR": 16.1349, + "SAR": 7.35825, + "ISR": 11.4774 + }, + "instrumental": { + "SDR": 2.16539, + "SIR": 8.64191, + "SAR": 1.35815, + "ISR": 8.51987 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "drums": { + "SDR": 14.4814, + "SIR": 22.7441, + "SAR": 16.0829, + "ISR": 19.0982 + }, + "instrumental": { + "SDR": 0.02236, + "SIR": -0.68008, + "SAR": -0.05878, + "ISR": 0.97669 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "drums": { + "SDR": 10.7839, + "SIR": 24.1476, + "SAR": 11.7829, + "ISR": 14.7781 + }, + "instrumental": { + "SDR": 2.26446, + "SIR": 5.40597, + "SAR": 4.09761, + "ISR": 6.73183 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "drums": { + "SDR": 11.3648, + "SIR": 26.6375, + "SAR": 11.5932, + "ISR": 15.7057 + }, + "instrumental": { + "SDR": 3.93787, + "SIR": 9.09541, + "SAR": 4.92127, + "ISR": 9.93224 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "drums": { + "SDR": 4.07266, + "SIR": 10.9354, + "SAR": 4.32409, + "ISR": 9.951 + }, + "instrumental": { + "SDR": -0.09054, + "SIR": 10.5061, + "SAR": -1.76441, + "ISR": 10.232 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "drums": { + "SDR": 7.61546, + "SIR": 20.9245, + "SAR": 8.2853, + "ISR": 11.09 + }, + "instrumental": { + "SDR": 3.77759, + "SIR": 10.3551, + "SAR": 3.92625, + "ISR": 9.61456 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "drums": { + "SDR": 5.90095, + "SIR": 14.3915, + "SAR": 6.44924, + "ISR": 9.37 + }, + "instrumental": { + "SDR": 4.79998, + "SIR": 9.9591, + "SAR": 7.99268, + "ISR": 8.1511 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "drums": { + "SDR": 3.68085, + "SIR": 11.6621, + "SAR": 3.02148, + "ISR": 7.01052 + }, + "instrumental": { + "SDR": 6.35439, + "SIR": 14.9113, + "SAR": 6.02898, + "ISR": 14.1714 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "drums": { + "SDR": 6.29074, + "SIR": 17.3678, + "SAR": 5.75812, + "ISR": 11.1898 + }, + "instrumental": { + "SDR": 5.41089, + "SIR": 10.0938, + "SAR": 6.39544, + "ISR": 11.4617 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "drums": { + "SDR": 10.6079, + "SIR": 21.1037, + "SAR": 11.1041, + "ISR": 14.5222 + }, + "instrumental": { + "SDR": 2.03495, + "SIR": 5.70979, + "SAR": 3.96897, + "ISR": 6.62577 + } + } + } + ], + "median_scores": { + "drums": { + "SDR": 7.08376, + "SIR": 16.5241, + "SAR": 7.38794, + "ISR": 11.2089 + }, + "instrumental": { + "SDR": 3.18288, + "SIR": 8.95872, + "SAR": 4.77046, + "ISR": 8.51475 + } + }, + "stems": [ + "drums", + "no drums" + ], + "target_stem": "drums" + }, + "UVR-MDX-NET_Main_340.onnx": { + "model_name": "MDX-Net Model VIP: UVR-MDX-NET_Main_340", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.59047, + "SIR": 19.3254, + "SAR": 5.54795, + "ISR": 9.92554 + }, + "instrumental": { + "SDR": 16.5772, + "SIR": 24.8953, + "SAR": 19.8876, + "ISR": 18.9964 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.54666, + "SIR": 11.9182, + "SAR": 7.21952, + "ISR": 13.6981 + }, + "instrumental": { + "SDR": 11.8166, + "SIR": 23.4527, + "SAR": 13.2295, + "ISR": 14.4353 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.4048, + "SIR": 23.0031, + "SAR": 10.8814, + "ISR": 15.7745 + }, + "instrumental": { + "SDR": 15.8797, + "SIR": 27.5331, + "SAR": 18.3232, + "ISR": 18.4226 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.39553, + "SIR": 5.95349, + "SAR": 4.57037, + "ISR": 13.2196 + }, + "instrumental": { + "SDR": 10.8805, + "SIR": 27.9049, + "SAR": 13.207, + "ISR": 13.3993 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.879, + "SIR": 23.8183, + "SAR": 13.7653, + "ISR": 16.8547 + }, + "instrumental": { + "SDR": 14.7291, + "SIR": 25.3035, + "SAR": 15.8782, + "ISR": 17.4843 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.3303, + "SIR": 19.1643, + "SAR": 11.0204, + "ISR": 15.3374 + }, + "instrumental": { + "SDR": 12.0085, + "SIR": 22.9093, + "SAR": 13.3492, + "ISR": 16.1573 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.921, + "SIR": 21.2136, + "SAR": 12.7544, + "ISR": 16.0009 + }, + "instrumental": { + "SDR": 15.08, + "SIR": 25.275, + "SAR": 17.0213, + "ISR": 17.9508 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.40857, + "SIR": 20.0864, + "SAR": 5.57557, + "ISR": 9.19211 + }, + "instrumental": { + "SDR": 18.0019, + "SIR": 28.5227, + "SAR": 24.0548, + "ISR": 19.4788 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.8817, + "SIR": 32.9888, + "SAR": 13.5102, + "ISR": 17.6065 + }, + "instrumental": { + "SDR": 15.5718, + "SIR": 28.593, + "SAR": 17.6771, + "ISR": 19.1346 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.7265, + "SIR": 23.5946, + "SAR": 10.3781, + "ISR": 12.5704 + }, + "instrumental": { + "SDR": 15.8452, + "SIR": 19.218, + "SAR": 15.4081, + "ISR": 18.2195 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 15.2035, + "SIR": 32.4611, + "SAR": 16.6814, + "ISR": 19.2902 + }, + "instrumental": { + "SDR": 16.6764, + "SIR": 31.1089, + "SAR": 19.5272, + "ISR": 19.2673 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.8368, + "SIR": 23.9672, + "SAR": 11.9723, + "ISR": 15.4875 + }, + "instrumental": { + "SDR": 15.6607, + "SIR": 25.7476, + "SAR": 17.8226, + "ISR": 18.6773 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.24528, + "SIR": 19.8362, + "SAR": 7.67928, + "ISR": 13.626 + }, + "instrumental": { + "SDR": 15.6018, + "SIR": 26.728, + "SAR": 17.6935, + "ISR": 17.8728 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.40925, + "SIR": 19.8111, + "SAR": 9.28753, + "ISR": 13.4965 + }, + "instrumental": { + "SDR": 18.0223, + "SIR": 25.8298, + "SAR": 21.8279, + "ISR": 18.6861 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.53122, + "SIR": 19.1035, + "SAR": 3.71645, + "ISR": 9.26805 + }, + "instrumental": { + "SDR": 15.3034, + "SIR": 22.444, + "SAR": 18.6108, + "ISR": 18.8866 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.0275, + "SIR": 21.7959, + "SAR": 10.6982, + "ISR": 15.5935 + }, + "instrumental": { + "SDR": 14.5324, + "SIR": 26.1843, + "SAR": 16.4632, + "ISR": 17.9692 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 9.07272, + "SIR": 25.9994, + "SAR": 9.29185, + "ISR": 14.2574 + }, + "instrumental": { + "SDR": 15.3648, + "SIR": 25.7787, + "SAR": 17.676, + "ISR": 18.9055 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -5.84287, + "SIR": -36.995, + "SAR": 0.355675, + "ISR": 10.3781 + }, + "instrumental": { + "SDR": 12.6599, + "SIR": 57.4676, + "SAR": 12.5332, + "ISR": 12.5977 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.24907, + "SIR": 16.7769, + "SAR": 6.99725, + "ISR": 10.9783 + }, + "instrumental": { + "SDR": 16.4862, + "SIR": 21.9252, + "SAR": 18.2315, + "ISR": 18.015 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.2983, + "SIR": 24.5958, + "SAR": 11.0713, + "ISR": 14.5942 + }, + "instrumental": { + "SDR": 15.5101, + "SIR": 25.0115, + "SAR": 17.4846, + "ISR": 18.8203 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.9704, + "SIR": 24.0405, + "SAR": 11.6902, + "ISR": 16.1945 + }, + "instrumental": { + "SDR": 17.5229, + "SIR": 32.6163, + "SAR": 21.5149, + "ISR": 19.1371 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -2.86038, + "SIR": 2.39004, + "SAR": -0.09909, + "ISR": 3.6875 + }, + "instrumental": { + "SDR": 19.7922, + "SIR": 40.3354, + "SAR": 32.3835, + "ISR": 19.2675 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.20095, + "SIR": 14.6732, + "SAR": 4.03773, + "ISR": 6.83048 + }, + "instrumental": { + "SDR": 10.7884, + "SIR": 14.6335, + "SAR": 14.3113, + "ISR": 17.1369 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.91478, + "SIR": 17.751, + "SAR": 6.40324, + "ISR": 13.1966 + }, + "instrumental": { + "SDR": 17.5248, + "SIR": 29.5362, + "SAR": 20.2376, + "ISR": 18.8478 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.78787, + "SIR": 19.4971, + "SAR": 8.06298, + "ISR": 11.8468 + }, + "instrumental": { + "SDR": 14.5291, + "SIR": 22.5169, + "SAR": 17.1153, + "ISR": 18.4195 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.86539, + "SIR": 17.5331, + "SAR": 9.29978, + "ISR": 15.2815 + }, + "instrumental": { + "SDR": 15.4407, + "SIR": 27.2567, + "SAR": 16.9712, + "ISR": 17.4028 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.1748, + "SIR": 25.1553, + "SAR": 11.9515, + "ISR": 14.7653 + }, + "instrumental": { + "SDR": 13.1729, + "SIR": 21.3009, + "SAR": 14.1761, + "ISR": 17.6395 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.59262, + "SIR": 14.0947, + "SAR": 6.45711, + "ISR": 12.3968 + }, + "instrumental": { + "SDR": 12.2318, + "SIR": 20.5671, + "SAR": 13.4724, + "ISR": 15.1727 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 10.5502, + "SIR": 25.3408, + "SAR": 11.1519, + "ISR": 16.221 + }, + "instrumental": { + "SDR": 14.6137, + "SIR": 26.2834, + "SAR": 17.0856, + "ISR": 17.5627 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 15.3102, + "SIR": 31.1403, + "SAR": 14.7674, + "ISR": 16.8947 + }, + "instrumental": { + "SDR": 15.1248, + "SIR": 21.258, + "SAR": 14.7674, + "ISR": 18.901 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.2346, + "SIR": 24.6397, + "SAR": 11.7021, + "ISR": 15.9209 + }, + "instrumental": { + "SDR": 14.2231, + "SIR": 24.0241, + "SAR": 15.5871, + "ISR": 17.7846 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.6508, + "SIR": 33.3165, + "SAR": 9.21143, + "ISR": 10.2997 + }, + "instrumental": { + "SDR": 17.5079, + "SIR": 21.4968, + "SAR": 19.6272, + "ISR": 19.6975 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 4.22097, + "SIR": 11.5764, + "SAR": 6.82513, + "ISR": 10.3243 + }, + "instrumental": { + "SDR": 11.7208, + "SIR": 17.2716, + "SAR": 14.1359, + "ISR": 16.408 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.2105, + "SIR": 28.0098, + "SAR": 13.9937, + "ISR": 18.9055 + }, + "instrumental": { + "SDR": 18.6625, + "SIR": 38.7813, + "SAR": 24.4699, + "ISR": 19.3791 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.327, + "SIR": 20.6429, + "SAR": 12.526, + "ISR": 17.7893 + }, + "instrumental": { + "SDR": 11.7535, + "SIR": 25.5315, + "SAR": 12.476, + "ISR": 15.1966 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.54308, + "SIR": 22.4156, + "SAR": 8.61041, + "ISR": 14.1128 + }, + "instrumental": { + "SDR": 13.7766, + "SIR": 23.6513, + "SAR": 15.1867, + "ISR": 17.8067 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 2.8775, + "SIR": 6.24075, + "SAR": 2.0346, + "ISR": 11.7342 + }, + "instrumental": { + "SDR": 17.7803, + "SIR": 32.2031, + "SAR": 21.6552, + "ISR": 17.7895 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.3215, + "SIR": 26.0265, + "SAR": 10.7873, + "ISR": 16.5515 + }, + "instrumental": { + "SDR": 17.0727, + "SIR": 33.0414, + "SAR": 20.3793, + "ISR": 19.0383 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.8412, + "SIR": 30.2713, + "SAR": 12.2894, + "ISR": 16.7455 + }, + "instrumental": { + "SDR": 17.9839, + "SIR": 33.6239, + "SAR": 22.1693, + "ISR": 19.4058 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 11.7992, + "SIR": 31.4797, + "SAR": 13.4691, + "ISR": 14.8236 + }, + "instrumental": { + "SDR": 14.7789, + "SIR": 22.2598, + "SAR": 17.0289, + "ISR": 18.8969 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.1745, + "SIR": 21.5048, + "SAR": 9.83894, + "ISR": 14.4258 + }, + "instrumental": { + "SDR": 15.4028, + "SIR": 25.6395, + "SAR": 17.3, + "ISR": 18.3195 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "UVR-MDX-NET_Main_390.onnx": { + "model_name": "MDX-Net Model VIP: UVR-MDX-NET_Main_390", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 3.20541, + "SIR": 16.7913, + "SAR": 5.91045, + "ISR": 9.75897 + }, + "instrumental": { + "SDR": 12.3509, + "SIR": 18.2773, + "SAR": 15.1963, + "ISR": 17.5234 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 2.78109, + "SIR": 13.0325, + "SAR": 7.55413, + "ISR": 9.30404 + }, + "instrumental": { + "SDR": 6.75573, + "SIR": 10.8264, + "SAR": 9.24601, + "ISR": 12.5868 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 4.73706, + "SIR": 22.6711, + "SAR": 11.0354, + "ISR": 7.1558 + }, + "instrumental": { + "SDR": 9.32083, + "SIR": 10.4807, + "SAR": 14.2313, + "ISR": 17.0003 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": -1.14132, + "SIR": 5.385, + "SAR": 4.08277, + "ISR": 9.07427 + }, + "instrumental": { + "SDR": 6.62126, + "SIR": 14.4152, + "SAR": 8.91041, + "ISR": 10.2967 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 7.51178, + "SIR": 23.0842, + "SAR": 13.928, + "ISR": 9.99188 + }, + "instrumental": { + "SDR": 7.55177, + "SIR": 8.35106, + "SAR": 13.3653, + "ISR": 15.9889 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 4.44664, + "SIR": 18.507, + "SAR": 11.1041, + "ISR": 7.47867 + }, + "instrumental": { + "SDR": 5.01169, + "SIR": 5.90006, + "SAR": 9.60692, + "ISR": 13.5728 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 4.97685, + "SIR": 20.8348, + "SAR": 12.9264, + "ISR": 7.23117 + }, + "instrumental": { + "SDR": 7.48743, + "SIR": 8.45608, + "SAR": 13.4337, + "ISR": 16.3188 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 2.64126, + "SIR": 20.3077, + "SAR": 5.74439, + "ISR": 7.24166 + }, + "instrumental": { + "SDR": 14.7226, + "SIR": 19.1607, + "SAR": 19.5924, + "ISR": 19.1367 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 4.85057, + "SIR": 32.7318, + "SAR": 13.652, + "ISR": 6.38448 + }, + "instrumental": { + "SDR": 6.47859, + "SIR": 7.01326, + "SAR": 14.1868, + "ISR": 18.5835 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 4.97743, + "SIR": 22.3569, + "SAR": 10.9353, + "ISR": 9.21187 + }, + "instrumental": { + "SDR": 7.29254, + "SIR": 9.85028, + "SAR": 11.898, + "ISR": 16.7331 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 5.28759, + "SIR": 31.9377, + "SAR": 16.6604, + "ISR": 6.00972 + }, + "instrumental": { + "SDR": 6.20834, + "SIR": 6.00502, + "SAR": 16.0185, + "ISR": 18.6868 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 4.8586, + "SIR": 22.3043, + "SAR": 12.0324, + "ISR": 7.05104 + }, + "instrumental": { + "SDR": 8.44329, + "SIR": 10.2969, + "SAR": 13.6717, + "ISR": 17.1684 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 6.29407, + "SIR": 17.9866, + "SAR": 7.63681, + "ISR": 16.6722 + }, + "instrumental": { + "SDR": 12.5799, + "SIR": 19.1996, + "SAR": 15.0056, + "ISR": 16.8145 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 4.02635, + "SIR": 17.5912, + "SAR": 9.54704, + "ISR": 6.47959 + }, + "instrumental": { + "SDR": 10.3714, + "SIR": 11.6303, + "SAR": 16.1434, + "ISR": 16.7441 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 1.99104, + "SIR": 18.3385, + "SAR": 3.55722, + "ISR": 10.0413 + }, + "instrumental": { + "SDR": 12.8436, + "SIR": 19.2623, + "SAR": 14.3082, + "ISR": 17.9463 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 4.52258, + "SIR": 21.3506, + "SAR": 10.7605, + "ISR": 7.41085 + }, + "instrumental": { + "SDR": 7.60552, + "SIR": 9.12738, + "SAR": 12.3912, + "ISR": 16.3596 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 4.33745, + "SIR": 25.7323, + "SAR": 9.52587, + "ISR": 8.2687 + }, + "instrumental": { + "SDR": 9.72218, + "SIR": 12.2565, + "SAR": 13.2566, + "ISR": 18.163 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -9.69914, + "SIR": -35.7775, + "SAR": 0.193735, + "ISR": 11.1668 + }, + "instrumental": { + "SDR": 10.6326, + "SIR": 52.659, + "SAR": 11.2901, + "ISR": 12.4895 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 4.38655, + "SIR": 15.4574, + "SAR": 7.04866, + "ISR": 11.0792 + }, + "instrumental": { + "SDR": 11.4229, + "SIR": 17.1729, + "SAR": 14.3861, + "ISR": 16.2388 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 4.50584, + "SIR": 24.1687, + "SAR": 11.139, + "ISR": 7.11991 + }, + "instrumental": { + "SDR": 9.17302, + "SIR": 11.6277, + "SAR": 14.092, + "ISR": 17.9407 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 4.70898, + "SIR": 23.8028, + "SAR": 12.076, + "ISR": 6.15867 + }, + "instrumental": { + "SDR": 11.2055, + "SIR": 12.765, + "SAR": 18.0373, + "ISR": 18.3785 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -6.21867, + "SIR": 1.38433, + "SAR": -0.13684, + "ISR": 3.27683 + }, + "instrumental": { + "SDR": 19.7692, + "SIR": 36.7626, + "SAR": 27.6018, + "ISR": 18.8359 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 2.19115, + "SIR": 14.0899, + "SAR": 4.05779, + "ISR": 11.3656 + }, + "instrumental": { + "SDR": 8.43892, + "SIR": 16.6608, + "SAR": 9.45778, + "ISR": 15.0596 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 2.81349, + "SIR": 16.3556, + "SAR": 6.57123, + "ISR": 7.26133 + }, + "instrumental": { + "SDR": 12.6754, + "SIR": 17.0337, + "SAR": 16.2936, + "ISR": 17.6028 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 4.07193, + "SIR": 18.6844, + "SAR": 8.10956, + "ISR": 9.97511 + }, + "instrumental": { + "SDR": 10.0706, + "SIR": 14.2036, + "SAR": 12.6793, + "ISR": 16.9427 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 7.19343, + "SIR": 17.6906, + "SAR": 9.15414, + "ISR": 14.2397 + }, + "instrumental": { + "SDR": 11.996, + "SIR": 16.8618, + "SAR": 14.4066, + "ISR": 16.5471 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 7.7088, + "SIR": 24.3518, + "SAR": 11.8705, + "ISR": 11.2351 + }, + "instrumental": { + "SDR": 7.4305, + "SIR": 9.23594, + "SAR": 11.3759, + "ISR": 16.359 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 2.00809, + "SIR": 11.441, + "SAR": 6.14318, + "ISR": 8.95125 + }, + "instrumental": { + "SDR": 6.06875, + "SIR": 10.1106, + "SAR": 8.1383, + "ISR": 11.1587 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 4.63523, + "SIR": 24.5942, + "SAR": 11.1104, + "ISR": 6.72897 + }, + "instrumental": { + "SDR": 8.22452, + "SIR": 9.4809, + "SAR": 13.2378, + "ISR": 14.4119 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 5.23038, + "SIR": 30.9219, + "SAR": 14.7764, + "ISR": 5.51033 + }, + "instrumental": { + "SDR": 3.07409, + "SIR": 2.29799, + "SAR": 12.9081, + "ISR": 18.0712 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 6.51619, + "SIR": 24.1531, + "SAR": 12.1408, + "ISR": 9.11816 + }, + "instrumental": { + "SDR": 7.51586, + "SIR": 8.98796, + "SAR": 12.7079, + "ISR": 16.552 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 4.80022, + "SIR": 27.8756, + "SAR": 11.031, + "ISR": 7.66426 + }, + "instrumental": { + "SDR": 10.9353, + "SIR": 13.2876, + "SAR": 16.7817, + "ISR": 19.0614 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 0.90267, + "SIR": 11.1777, + "SAR": 1.57497, + "ISR": 7.87925 + }, + "instrumental": { + "SDR": 7.81953, + "SIR": 12.8057, + "SAR": 8.54483, + "ISR": 14.8816 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 8.29717, + "SIR": 27.7512, + "SAR": 14.1791, + "ISR": 10.4651 + }, + "instrumental": { + "SDR": 13.1779, + "SIR": 14.5176, + "SAR": 21.6159, + "ISR": 19.0704 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 9.94701, + "SIR": 20.3444, + "SAR": 12.4755, + "ISR": 16.7659 + }, + "instrumental": { + "SDR": 7.55356, + "SIR": 9.95375, + "SAR": 10.5917, + "ISR": 13.9203 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 3.93671, + "SIR": 20.2014, + "SAR": 8.68515, + "ISR": 7.75969 + }, + "instrumental": { + "SDR": 7.34594, + "SIR": 9.64287, + "SAR": 10.9994, + "ISR": 15.6019 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 0.48102, + "SIR": 5.92901, + "SAR": 2.24504, + "ISR": 8.85133 + }, + "instrumental": { + "SDR": 14.3262, + "SIR": 21.5113, + "SAR": 16.6025, + "ISR": 16.3706 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 6.38844, + "SIR": 25.9631, + "SAR": 10.9852, + "ISR": 9.69793 + }, + "instrumental": { + "SDR": 11.5178, + "SIR": 13.6892, + "SAR": 17.0456, + "ISR": 18.5194 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 4.77645, + "SIR": 29.6897, + "SAR": 12.5191, + "ISR": 6.72845 + }, + "instrumental": { + "SDR": 10.6968, + "SIR": 12.1384, + "SAR": 18.1899, + "ISR": 18.9801 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 4.56993, + "SIR": 30.0454, + "SAR": 13.3417, + "ISR": 6.34176 + }, + "instrumental": { + "SDR": 6.42373, + "SIR": 6.57884, + "SAR": 13.6072, + "ISR": 17.8828 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 4.54626, + "SIR": 20.5896, + "SAR": 10.8479, + "ISR": 8.07398 + }, + "instrumental": { + "SDR": 8.80815, + "SIR": 11.8844, + "SAR": 13.6395, + "ISR": 16.7793 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "UVR-MDX-NET_Main_406.onnx": { + "model_name": "MDX-Net Model VIP: UVR-MDX-NET_Main_406", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.85269, + "SIR": 17.2346, + "SAR": 5.75262, + "ISR": 10.9493 + }, + "instrumental": { + "SDR": 16.5944, + "SIR": 26.387, + "SAR": 19.5127, + "ISR": 18.6513 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.92379, + "SIR": 12.2082, + "SAR": 7.45387, + "ISR": 14.543 + }, + "instrumental": { + "SDR": 12.0279, + "SIR": 24.5345, + "SAR": 13.3392, + "ISR": 14.4247 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.7074, + "SIR": 22.5645, + "SAR": 11.1273, + "ISR": 16.944 + }, + "instrumental": { + "SDR": 15.7911, + "SIR": 29.0133, + "SAR": 18.1774, + "ISR": 18.2854 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.08184, + "SIR": 5.41147, + "SAR": 4.33557, + "ISR": 14.4986 + }, + "instrumental": { + "SDR": 10.4945, + "SIR": 30.1395, + "SAR": 12.777, + "ISR": 12.8862 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 13.2082, + "SIR": 23.4667, + "SAR": 13.8813, + "ISR": 18.7923 + }, + "instrumental": { + "SDR": 14.3165, + "SIR": 27.5545, + "SAR": 15.7939, + "ISR": 17.309 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.5437, + "SIR": 18.7618, + "SAR": 11.1092, + "ISR": 16.9324 + }, + "instrumental": { + "SDR": 11.9488, + "SIR": 25.3293, + "SAR": 13.1192, + "ISR": 15.8457 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 12.165, + "SIR": 21.0816, + "SAR": 12.9775, + "ISR": 17.1211 + }, + "instrumental": { + "SDR": 15.0218, + "SIR": 26.8968, + "SAR": 16.8997, + "ISR": 17.8594 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.5595, + "SIR": 19.7854, + "SAR": 5.67036, + "ISR": 9.44396 + }, + "instrumental": { + "SDR": 18.0762, + "SIR": 30.7333, + "SAR": 23.8319, + "ISR": 19.434 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 13.2822, + "SIR": 33.179, + "SAR": 13.6017, + "ISR": 18.8632 + }, + "instrumental": { + "SDR": 15.61, + "SIR": 28.717, + "SAR": 17.6275, + "ISR": 19.1609 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.9462, + "SIR": 22.4425, + "SAR": 10.9985, + "ISR": 14.0326 + }, + "instrumental": { + "SDR": 15.7365, + "SIR": 21.8904, + "SAR": 15.8364, + "ISR": 17.9213 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 15.6493, + "SIR": 32.1988, + "SAR": 16.6339, + "ISR": 21.1733 + }, + "instrumental": { + "SDR": 16.4421, + "SIR": 30.1763, + "SAR": 19.1576, + "ISR": 19.1986 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.9561, + "SIR": 22.6627, + "SAR": 12.0422, + "ISR": 17.1639 + }, + "instrumental": { + "SDR": 15.4984, + "SIR": 27.7582, + "SAR": 17.5769, + "ISR": 18.3379 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.40762, + "SIR": 17.921, + "SAR": 7.64786, + "ISR": 15.0966 + }, + "instrumental": { + "SDR": 15.4057, + "SIR": 29.5912, + "SAR": 17.0214, + "ISR": 17.4585 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 9.14378, + "SIR": 17.705, + "SAR": 9.4558, + "ISR": 14.1433 + }, + "instrumental": { + "SDR": 17.337, + "SIR": 26.837, + "SAR": 20.9095, + "ISR": 18.2032 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.43038, + "SIR": 15.8658, + "SAR": 3.14604, + "ISR": 9.85908 + }, + "instrumental": { + "SDR": 14.9572, + "SIR": 23.4585, + "SAR": 17.7611, + "ISR": 18.3835 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.3386, + "SIR": 21.4479, + "SAR": 10.8039, + "ISR": 17.2099 + }, + "instrumental": { + "SDR": 14.4504, + "SIR": 29.2352, + "SAR": 16.2578, + "ISR": 17.7763 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 9.29467, + "SIR": 25.0927, + "SAR": 9.37852, + "ISR": 15.4085 + }, + "instrumental": { + "SDR": 15.2638, + "SIR": 27.8164, + "SAR": 17.1557, + "ISR": 18.7649 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -7.95716, + "SIR": -33.6119, + "SAR": 0.169185, + "ISR": 11.6943 + }, + "instrumental": { + "SDR": 14.2022, + "SIR": 58.3928, + "SAR": 14.678, + "ISR": 14.6233 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.3409, + "SIR": 16.5622, + "SAR": 7.12643, + "ISR": 11.9651 + }, + "instrumental": { + "SDR": 16.5531, + "SIR": 23.4749, + "SAR": 18.3173, + "ISR": 17.8918 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.497, + "SIR": 24.3892, + "SAR": 11.3564, + "ISR": 15.9544 + }, + "instrumental": { + "SDR": 15.6969, + "SIR": 26.5967, + "SAR": 17.4343, + "ISR": 18.7886 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 11.4287, + "SIR": 23.7075, + "SAR": 12.0748, + "ISR": 18.0169 + }, + "instrumental": { + "SDR": 17.5176, + "SIR": 33.1457, + "SAR": 21.1284, + "ISR": 19.0461 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -6.02913, + "SIR": 1.16806, + "SAR": -0.31571, + "ISR": 3.63733 + }, + "instrumental": { + "SDR": 19.5723, + "SIR": 39.946, + "SAR": 30.3347, + "ISR": 19.2551 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.03064, + "SIR": 13.7042, + "SAR": 4.00465, + "ISR": 7.20661 + }, + "instrumental": { + "SDR": 10.65, + "SIR": 15.0243, + "SAR": 13.8727, + "ISR": 16.6632 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.66973, + "SIR": 16.1513, + "SAR": 6.45549, + "ISR": 14.9347 + }, + "instrumental": { + "SDR": 17.3235, + "SIR": 32.4516, + "SAR": 20.2595, + "ISR": 18.5398 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.91968, + "SIR": 19.0506, + "SAR": 8.03322, + "ISR": 12.8172 + }, + "instrumental": { + "SDR": 14.581, + "SIR": 24.0471, + "SAR": 16.9676, + "ISR": 18.2565 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.92466, + "SIR": 17.1233, + "SAR": 9.22667, + "ISR": 16.3965 + }, + "instrumental": { + "SDR": 15.2912, + "SIR": 29.6159, + "SAR": 16.7509, + "ISR": 17.2251 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 12.1146, + "SIR": 24.3619, + "SAR": 12.526, + "ISR": 17.1307 + }, + "instrumental": { + "SDR": 13.0685, + "SIR": 24.6799, + "SAR": 14.3078, + "ISR": 17.3545 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.12086, + "SIR": 10.2634, + "SAR": 6.11878, + "ISR": 13.9205 + }, + "instrumental": { + "SDR": 11.1575, + "SIR": 22.3877, + "SAR": 11.9012, + "ISR": 13.0429 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 10.8228, + "SIR": 24.6827, + "SAR": 11.0189, + "ISR": 17.8965 + }, + "instrumental": { + "SDR": 14.4318, + "SIR": 27.9047, + "SAR": 16.7393, + "ISR": 17.3327 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 15.7378, + "SIR": 30.6372, + "SAR": 14.5455, + "ISR": 17.2935 + }, + "instrumental": { + "SDR": 14.8449, + "SIR": 19.6048, + "SAR": 14.6099, + "ISR": 18.8052 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.839, + "SIR": 24.2648, + "SAR": 11.9585, + "ISR": 17.3835 + }, + "instrumental": { + "SDR": 14.2763, + "SIR": 25.312, + "SAR": 15.5273, + "ISR": 17.6477 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.2276, + "SIR": 27.5034, + "SAR": 12.0039, + "ISR": 16.1987 + }, + "instrumental": { + "SDR": 17.3479, + "SIR": 27.3928, + "SAR": 21.2889, + "ISR": 19.3708 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 2.17105, + "SIR": 12.5917, + "SAR": 2.85984, + "ISR": 7.54104 + }, + "instrumental": { + "SDR": 10.7638, + "SIR": 14.8659, + "SAR": 12.0567, + "ISR": 17.5165 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.7243, + "SIR": 27.3897, + "SAR": 14.1531, + "ISR": 20.945 + }, + "instrumental": { + "SDR": 18.5717, + "SIR": 37.0665, + "SAR": 24.5974, + "ISR": 19.3182 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.3548, + "SIR": 20.7762, + "SAR": 12.3786, + "ISR": 18.9285 + }, + "instrumental": { + "SDR": 11.5262, + "SIR": 26.2417, + "SAR": 12.1687, + "ISR": 15.1975 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.63999, + "SIR": 21.077, + "SAR": 8.69383, + "ISR": 15.396 + }, + "instrumental": { + "SDR": 13.7364, + "SIR": 26.0014, + "SAR": 14.8899, + "ISR": 17.3915 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 2.94074, + "SIR": 5.62562, + "SAR": 2.23153, + "ISR": 12.3325 + }, + "instrumental": { + "SDR": 17.199, + "SIR": 33.4162, + "SAR": 20.702, + "ISR": 17.7513 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.5791, + "SIR": 25.3579, + "SAR": 10.9447, + "ISR": 17.8893 + }, + "instrumental": { + "SDR": 16.9572, + "SIR": 35.2834, + "SAR": 20.2154, + "ISR": 18.9272 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 12.2134, + "SIR": 29.4645, + "SAR": 12.5179, + "ISR": 18.5048 + }, + "instrumental": { + "SDR": 17.7932, + "SIR": 36.5564, + "SAR": 22.0422, + "ISR": 19.3503 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 12.1006, + "SIR": 30.2437, + "SAR": 14.1278, + "ISR": 15.6777 + }, + "instrumental": { + "SDR": 14.791, + "SIR": 22.7587, + "SAR": 16.8571, + "ISR": 18.7422 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.4412, + "SIR": 21.0793, + "SAR": 10.8743, + "ISR": 15.8161 + }, + "instrumental": { + "SDR": 15.2775, + "SIR": 27.4736, + "SAR": 16.9945, + "ISR": 18.0622 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "UVR-MDX-NET_Main_427.onnx": { + "model_name": "MDX-Net Model VIP: UVR-MDX-NET_Main_427", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.82906, + "SIR": 17.6647, + "SAR": 5.943, + "ISR": 10.1517 + }, + "instrumental": { + "SDR": 16.5208, + "SIR": 25.1407, + "SAR": 20.0019, + "ISR": 18.7475 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 7.18473, + "SIR": 13.6405, + "SAR": 7.63287, + "ISR": 13.145 + }, + "instrumental": { + "SDR": 12.5536, + "SIR": 22.5558, + "SAR": 14.1371, + "ISR": 15.4313 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.5803, + "SIR": 23.0794, + "SAR": 11.0791, + "ISR": 15.2334 + }, + "instrumental": { + "SDR": 15.9408, + "SIR": 26.9283, + "SAR": 18.6528, + "ISR": 18.4442 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.43239, + "SIR": 5.86112, + "SAR": 4.12099, + "ISR": 12.7795 + }, + "instrumental": { + "SDR": 11.1052, + "SIR": 26.2659, + "SAR": 13.3815, + "ISR": 13.5054 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.751, + "SIR": 23.5242, + "SAR": 13.8815, + "ISR": 16.3623 + }, + "instrumental": { + "SDR": 14.6235, + "SIR": 24.7496, + "SAR": 16.1266, + "ISR": 17.4145 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.263, + "SIR": 18.6007, + "SAR": 11.1831, + "ISR": 15.163 + }, + "instrumental": { + "SDR": 12.0269, + "SIR": 22.64, + "SAR": 13.5634, + "ISR": 15.9108 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.8092, + "SIR": 20.7821, + "SAR": 12.9431, + "ISR": 15.5305 + }, + "instrumental": { + "SDR": 15.1739, + "SIR": 25.0044, + "SAR": 17.2768, + "ISR": 17.8643 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.48335, + "SIR": 20.4452, + "SAR": 6.01091, + "ISR": 9.33015 + }, + "instrumental": { + "SDR": 18.1436, + "SIR": 28.7473, + "SAR": 24.1441, + "ISR": 19.4861 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.9246, + "SIR": 32.88, + "SAR": 13.6859, + "ISR": 17.0253 + }, + "instrumental": { + "SDR": 15.7651, + "SIR": 28.1523, + "SAR": 18.0615, + "ISR": 19.1234 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.4911, + "SIR": 22.7069, + "SAR": 11.0089, + "ISR": 12.7886 + }, + "instrumental": { + "SDR": 16.108, + "SIR": 19.7213, + "SAR": 16.2973, + "ISR": 18.0665 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.7035, + "SIR": 32.9433, + "SAR": 16.7267, + "ISR": 18.1318 + }, + "instrumental": { + "SDR": 16.6874, + "SIR": 30.274, + "SAR": 19.6895, + "ISR": 19.3017 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.7368, + "SIR": 21.6175, + "SAR": 11.922, + "ISR": 14.983 + }, + "instrumental": { + "SDR": 15.5755, + "SIR": 25.2078, + "SAR": 17.8753, + "ISR": 18.1936 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.84444, + "SIR": 19.9605, + "SAR": 8.05998, + "ISR": 13.6508 + }, + "instrumental": { + "SDR": 15.6069, + "SIR": 26.5375, + "SAR": 17.6803, + "ISR": 17.9367 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 9.11076, + "SIR": 17.8021, + "SAR": 9.79032, + "ISR": 13.1461 + }, + "instrumental": { + "SDR": 17.1209, + "SIR": 24.9091, + "SAR": 21.204, + "ISR": 18.3423 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.70765, + "SIR": 18.4609, + "SAR": 3.59805, + "ISR": 9.37758 + }, + "instrumental": { + "SDR": 15.3403, + "SIR": 22.5583, + "SAR": 18.7607, + "ISR": 18.8189 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.1157, + "SIR": 21.3878, + "SAR": 10.8579, + "ISR": 15.354 + }, + "instrumental": { + "SDR": 14.5969, + "SIR": 25.8581, + "SAR": 16.6269, + "ISR": 17.8575 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 9.00868, + "SIR": 26.4189, + "SAR": 9.29668, + "ISR": 13.3758 + }, + "instrumental": { + "SDR": 15.3278, + "SIR": 24.2921, + "SAR": 17.6984, + "ISR": 19.0027 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -7.76577, + "SIR": -33.1414, + "SAR": 0.178235, + "ISR": 10.9973 + }, + "instrumental": { + "SDR": 14.3093, + "SIR": 57.9346, + "SAR": 14.9751, + "ISR": 15.1469 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.39028, + "SIR": 15.5989, + "SAR": 7.22268, + "ISR": 11.5129 + }, + "instrumental": { + "SDR": 16.5327, + "SIR": 22.7365, + "SAR": 18.8445, + "ISR": 17.692 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.2435, + "SIR": 24.4722, + "SAR": 11.2163, + "ISR": 14.2944 + }, + "instrumental": { + "SDR": 15.7269, + "SIR": 24.5448, + "SAR": 17.5491, + "ISR": 18.8246 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 11.1382, + "SIR": 23.9968, + "SAR": 11.9879, + "ISR": 15.8671 + }, + "instrumental": { + "SDR": 17.6451, + "SIR": 31.9426, + "SAR": 22.0543, + "ISR": 19.1177 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -2.49158, + "SIR": 2.15807, + "SAR": -0.12965, + "ISR": 3.57837 + }, + "instrumental": { + "SDR": 19.8011, + "SIR": 40.3989, + "SAR": 32.996, + "ISR": 19.3244 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.19905, + "SIR": 14.5709, + "SAR": 3.97645, + "ISR": 6.73817 + }, + "instrumental": { + "SDR": 10.8736, + "SIR": 14.5301, + "SAR": 14.3756, + "ISR": 17.1284 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.22215, + "SIR": 17.7075, + "SAR": 6.92583, + "ISR": 12.9828 + }, + "instrumental": { + "SDR": 17.4981, + "SIR": 28.5646, + "SAR": 20.676, + "ISR": 18.837 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.73954, + "SIR": 18.77, + "SAR": 8.08825, + "ISR": 11.792 + }, + "instrumental": { + "SDR": 14.5828, + "SIR": 22.6464, + "SAR": 17.3255, + "ISR": 18.2484 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.99932, + "SIR": 17.9972, + "SAR": 9.25604, + "ISR": 14.6958 + }, + "instrumental": { + "SDR": 15.6511, + "SIR": 26.6695, + "SAR": 17.4702, + "ISR": 17.5615 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.2289, + "SIR": 24.2029, + "SAR": 12.0261, + "ISR": 14.5605 + }, + "instrumental": { + "SDR": 13.0242, + "SIR": 21.1282, + "SAR": 14.2652, + "ISR": 17.4035 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.59393, + "SIR": 12.9057, + "SAR": 6.51486, + "ISR": 12.3617 + }, + "instrumental": { + "SDR": 12.0193, + "SIR": 20.6749, + "SAR": 13.3775, + "ISR": 14.6897 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 10.6517, + "SIR": 24.7357, + "SAR": 11.016, + "ISR": 15.8507 + }, + "instrumental": { + "SDR": 14.7927, + "SIR": 26.1829, + "SAR": 17.2063, + "ISR": 17.816 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.973, + "SIR": 31.205, + "SAR": 15.0679, + "ISR": 16.4571 + }, + "instrumental": { + "SDR": 15.2341, + "SIR": 21.4016, + "SAR": 15.3197, + "ISR": 18.9314 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.5918, + "SIR": 24.2749, + "SAR": 11.9896, + "ISR": 15.7704 + }, + "instrumental": { + "SDR": 14.3706, + "SIR": 24.4454, + "SAR": 15.8943, + "ISR": 17.736 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.8173, + "SIR": 29.9201, + "SAR": 11.588, + "ISR": 13.3619 + }, + "instrumental": { + "SDR": 17.4738, + "SIR": 24.6547, + "SAR": 21.5141, + "ISR": 19.5573 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.19626, + "SIR": 11.4512, + "SAR": 4.88464, + "ISR": 7.36752 + }, + "instrumental": { + "SDR": 11.2192, + "SIR": 14.7938, + "SAR": 13.9812, + "ISR": 16.77 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.1682, + "SIR": 28.0545, + "SAR": 14.3753, + "ISR": 17.8069 + }, + "instrumental": { + "SDR": 18.7426, + "SIR": 36.419, + "SAR": 24.9575, + "ISR": 19.404 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.9274, + "SIR": 20.7557, + "SAR": 12.1661, + "ISR": 16.3913 + }, + "instrumental": { + "SDR": 12.0172, + "SIR": 23.0026, + "SAR": 12.671, + "ISR": 15.3927 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.61115, + "SIR": 20.2167, + "SAR": 8.79476, + "ISR": 14.1855 + }, + "instrumental": { + "SDR": 13.9395, + "SIR": 23.8276, + "SAR": 15.2305, + "ISR": 17.2746 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.34018, + "SIR": 5.69531, + "SAR": 2.21021, + "ISR": 11.6237 + }, + "instrumental": { + "SDR": 15.8566, + "SIR": 31.7886, + "SAR": 18.5851, + "ISR": 17.7667 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.3832, + "SIR": 26.045, + "SAR": 10.9394, + "ISR": 15.9365 + }, + "instrumental": { + "SDR": 17.13, + "SIR": 31.0683, + "SAR": 20.6198, + "ISR": 19.0695 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.9351, + "SIR": 29.8557, + "SAR": 12.5938, + "ISR": 16.4933 + }, + "instrumental": { + "SDR": 18.0269, + "SIR": 33.1436, + "SAR": 22.7178, + "ISR": 19.3754 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 11.7682, + "SIR": 31.7154, + "SAR": 13.3831, + "ISR": 14.4392 + }, + "instrumental": { + "SDR": 14.8062, + "SIR": 21.1557, + "SAR": 17.1792, + "ISR": 18.9236 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.1894, + "SIR": 20.7689, + "SAR": 10.8986, + "ISR": 14.24 + }, + "instrumental": { + "SDR": 15.4579, + "SIR": 24.9567, + "SAR": 17.5097, + "ISR": 18.1301 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "UVR-MDX-NET_Main_438.onnx": { + "model_name": "MDX-Net Model VIP: UVR-MDX-NET_Main_438", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.53862, + "SIR": 16.0907, + "SAR": 5.62231, + "ISR": 9.7587 + }, + "instrumental": { + "SDR": 16.5526, + "SIR": 24.6013, + "SAR": 19.8913, + "ISR": 18.7021 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.87137, + "SIR": 10.954, + "SAR": 7.51221, + "ISR": 13.1776 + }, + "instrumental": { + "SDR": 11.8205, + "SIR": 22.5439, + "SAR": 13.5629, + "ISR": 13.9922 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.4693, + "SIR": 22.3815, + "SAR": 11.0578, + "ISR": 15.069 + }, + "instrumental": { + "SDR": 15.908, + "SIR": 26.5451, + "SAR": 18.5679, + "ISR": 18.2995 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 1.19079, + "SIR": 5.03508, + "SAR": 4.19754, + "ISR": 13.1544 + }, + "instrumental": { + "SDR": 10.7231, + "SIR": 27.2728, + "SAR": 12.9448, + "ISR": 12.9452 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.5596, + "SIR": 23.0696, + "SAR": 13.9336, + "ISR": 16.2919 + }, + "instrumental": { + "SDR": 14.8041, + "SIR": 24.9615, + "SAR": 16.2353, + "ISR": 17.305 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.1787, + "SIR": 18.5406, + "SAR": 11.179, + "ISR": 14.7971 + }, + "instrumental": { + "SDR": 12.0469, + "SIR": 22.015, + "SAR": 13.6313, + "ISR": 15.8742 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.8322, + "SIR": 20.9027, + "SAR": 13.0488, + "ISR": 15.241 + }, + "instrumental": { + "SDR": 15.2066, + "SIR": 24.583, + "SAR": 17.515, + "ISR": 17.8805 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.62374, + "SIR": 20.1042, + "SAR": 5.52221, + "ISR": 9.49657 + }, + "instrumental": { + "SDR": 18.1448, + "SIR": 28.4615, + "SAR": 24.2907, + "ISR": 19.4531 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.7146, + "SIR": 32.5973, + "SAR": 13.7003, + "ISR": 16.5219 + }, + "instrumental": { + "SDR": 15.627, + "SIR": 27.2061, + "SAR": 18.0835, + "ISR": 19.1334 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.3636, + "SIR": 23.6057, + "SAR": 10.8339, + "ISR": 12.3016 + }, + "instrumental": { + "SDR": 16.0353, + "SIR": 18.7557, + "SAR": 16.0968, + "ISR": 18.2179 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.6332, + "SIR": 31.4352, + "SAR": 16.6358, + "ISR": 17.7667 + }, + "instrumental": { + "SDR": 16.6191, + "SIR": 29.6305, + "SAR": 19.7205, + "ISR": 19.1658 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.5553, + "SIR": 20.4857, + "SAR": 11.9005, + "ISR": 15.2388 + }, + "instrumental": { + "SDR": 15.4347, + "SIR": 25.9966, + "SAR": 17.4954, + "ISR": 17.9408 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.69254, + "SIR": 19.7088, + "SAR": 8.24542, + "ISR": 13.385 + }, + "instrumental": { + "SDR": 15.6626, + "SIR": 26.1541, + "SAR": 17.7936, + "ISR": 17.8871 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 9.23499, + "SIR": 18.6885, + "SAR": 9.92657, + "ISR": 12.988 + }, + "instrumental": { + "SDR": 17.5952, + "SIR": 24.8591, + "SAR": 21.7264, + "ISR": 18.4903 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.36084, + "SIR": 15.7868, + "SAR": 3.15721, + "ISR": 9.26881 + }, + "instrumental": { + "SDR": 14.9717, + "SIR": 22.4424, + "SAR": 18.2432, + "ISR": 18.4725 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.0448, + "SIR": 21.0299, + "SAR": 10.8293, + "ISR": 15.0617 + }, + "instrumental": { + "SDR": 14.6096, + "SIR": 25.4094, + "SAR": 16.7105, + "ISR": 17.7909 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 9.03938, + "SIR": 25.0834, + "SAR": 9.31471, + "ISR": 13.6026 + }, + "instrumental": { + "SDR": 15.3736, + "SIR": 24.734, + "SAR": 17.9873, + "ISR": 18.8247 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -7.13392, + "SIR": -35.1355, + "SAR": 0.099835, + "ISR": 10.8927 + }, + "instrumental": { + "SDR": 13.8364, + "SIR": 57.6771, + "SAR": 13.916, + "ISR": 13.8715 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.33598, + "SIR": 15.8023, + "SAR": 6.96489, + "ISR": 11.018 + }, + "instrumental": { + "SDR": 16.48, + "SIR": 21.8868, + "SAR": 18.6566, + "ISR": 17.7627 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.2553, + "SIR": 24.1021, + "SAR": 11.4967, + "ISR": 14.5851 + }, + "instrumental": { + "SDR": 15.8207, + "SIR": 25.361, + "SAR": 18.0551, + "ISR": 18.743 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.9964, + "SIR": 23.7389, + "SAR": 12.0271, + "ISR": 15.8025 + }, + "instrumental": { + "SDR": 17.7773, + "SIR": 31.8743, + "SAR": 22.2261, + "ISR": 19.0802 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -4.21508, + "SIR": 0.4978, + "SAR": -0.15217, + "ISR": 3.50991 + }, + "instrumental": { + "SDR": 19.7313, + "SIR": 39.967, + "SAR": 31.1834, + "ISR": 19.1955 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.16299, + "SIR": 14.0534, + "SAR": 4.11577, + "ISR": 6.92901 + }, + "instrumental": { + "SDR": 10.7203, + "SIR": 14.7547, + "SAR": 14.3836, + "ISR": 16.9152 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.46138, + "SIR": 17.4229, + "SAR": 6.89396, + "ISR": 13.328 + }, + "instrumental": { + "SDR": 17.6482, + "SIR": 29.2913, + "SAR": 20.7738, + "ISR": 18.7852 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.77107, + "SIR": 18.6343, + "SAR": 8.18181, + "ISR": 11.6926 + }, + "instrumental": { + "SDR": 14.5319, + "SIR": 22.3178, + "SAR": 17.3748, + "ISR": 18.2355 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.77257, + "SIR": 16.8142, + "SAR": 8.93113, + "ISR": 14.4552 + }, + "instrumental": { + "SDR": 15.577, + "SIR": 26.0336, + "SAR": 17.1291, + "ISR": 17.2565 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 10.9914, + "SIR": 24.9799, + "SAR": 11.9488, + "ISR": 14.015 + }, + "instrumental": { + "SDR": 13.379, + "SIR": 20.3048, + "SAR": 14.5722, + "ISR": 17.6497 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.13499, + "SIR": 11.7891, + "SAR": 6.21354, + "ISR": 12.3758 + }, + "instrumental": { + "SDR": 11.7913, + "SIR": 20.1435, + "SAR": 13.1917, + "ISR": 14.1052 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 10.5549, + "SIR": 24.6736, + "SAR": 11.1417, + "ISR": 15.5767 + }, + "instrumental": { + "SDR": 14.6963, + "SIR": 25.8794, + "SAR": 17.3203, + "ISR": 17.4034 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.7173, + "SIR": 30.8442, + "SAR": 14.4554, + "ISR": 15.5749 + }, + "instrumental": { + "SDR": 15.1525, + "SIR": 20.2115, + "SAR": 15.065, + "ISR": 18.8932 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.3401, + "SIR": 24.1123, + "SAR": 11.9423, + "ISR": 15.3852 + }, + "instrumental": { + "SDR": 14.3629, + "SIR": 23.9114, + "SAR": 15.8269, + "ISR": 17.6701 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.0658, + "SIR": 29.4224, + "SAR": 12.1483, + "ISR": 14.5367 + }, + "instrumental": { + "SDR": 17.5967, + "SIR": 26.2081, + "SAR": 21.8042, + "ISR": 19.5187 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 4.19327, + "SIR": 12.3334, + "SAR": 5.97236, + "ISR": 8.99335 + }, + "instrumental": { + "SDR": 11.7635, + "SIR": 15.8535, + "SAR": 14.1537, + "ISR": 16.9865 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.9861, + "SIR": 27.2632, + "SAR": 14.1549, + "ISR": 17.4853 + }, + "instrumental": { + "SDR": 18.664, + "SIR": 35.1575, + "SAR": 24.8635, + "ISR": 19.3491 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.2005, + "SIR": 20.7725, + "SAR": 12.6536, + "ISR": 16.538 + }, + "instrumental": { + "SDR": 11.9446, + "SIR": 23.3534, + "SAR": 12.7453, + "ISR": 15.3119 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.51859, + "SIR": 19.8307, + "SAR": 8.75184, + "ISR": 13.6763 + }, + "instrumental": { + "SDR": 13.776, + "SIR": 22.8631, + "SAR": 15.2102, + "ISR": 17.2252 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.04433, + "SIR": 4.95162, + "SAR": 2.05809, + "ISR": 11.4678 + }, + "instrumental": { + "SDR": 15.2729, + "SIR": 31.2839, + "SAR": 18.0395, + "ISR": 17.6568 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.2762, + "SIR": 25.668, + "SAR": 11.0193, + "ISR": 15.543 + }, + "instrumental": { + "SDR": 17.1582, + "SIR": 30.2847, + "SAR": 20.7154, + "ISR": 19.0361 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.8025, + "SIR": 29.3939, + "SAR": 12.6197, + "ISR": 15.8903 + }, + "instrumental": { + "SDR": 18.0312, + "SIR": 31.8475, + "SAR": 22.7848, + "ISR": 19.3608 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 11.8863, + "SIR": 30.6522, + "SAR": 13.9807, + "ISR": 14.6258 + }, + "instrumental": { + "SDR": 15.214, + "SIR": 21.9328, + "SAR": 17.5349, + "ISR": 18.838 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.1118, + "SIR": 20.6291, + "SAR": 10.8316, + "ISR": 14.2351 + }, + "instrumental": { + "SDR": 15.3232, + "SIR": 25.1613, + "SAR": 17.525, + "ISR": 18.0793 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "UVR-MDX-NET_Inst_82_beta.onnx": { + "model_name": "MDX-Net Model VIP: UVR-MDX-NET_Inst_82_beta", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.97868, + "SIR": 15.9098, + "SAR": 4.93943, + "ISR": 8.46945 + }, + "instrumental": { + "SDR": 15.8315, + "SIR": 22.5876, + "SAR": 19.2636, + "ISR": 18.0554 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.33976, + "SIR": 12.3039, + "SAR": 6.87203, + "ISR": 12.0359 + }, + "instrumental": { + "SDR": 11.2058, + "SIR": 20.7697, + "SAR": 13.0201, + "ISR": 14.6704 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 9.44618, + "SIR": 19.41, + "SAR": 10.0434, + "ISR": 14.0118 + }, + "instrumental": { + "SDR": 14.8485, + "SIR": 24.4099, + "SAR": 17.4376, + "ISR": 17.388 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.47122, + "SIR": 6.56028, + "SAR": 4.05764, + "ISR": 12.2868 + }, + "instrumental": { + "SDR": 11.2159, + "SIR": 24.729, + "SAR": 13.5021, + "ISR": 13.814 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 11.5528, + "SIR": 20.6169, + "SAR": 12.421, + "ISR": 14.8839 + }, + "instrumental": { + "SDR": 13.6366, + "SIR": 21.5589, + "SAR": 15.0913, + "ISR": 16.3547 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.46487, + "SIR": 16.7948, + "SAR": 10.5931, + "ISR": 13.8946 + }, + "instrumental": { + "SDR": 11.3233, + "SIR": 20.1273, + "SAR": 13.0235, + "ISR": 15.1119 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.6629, + "SIR": 18.7702, + "SAR": 11.9801, + "ISR": 13.9944 + }, + "instrumental": { + "SDR": 14.1613, + "SIR": 21.8537, + "SAR": 16.4255, + "ISR": 16.9025 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 4.31024, + "SIR": 14.0898, + "SAR": 4.93407, + "ISR": 6.31193 + }, + "instrumental": { + "SDR": 17.0418, + "SIR": 26.8198, + "SAR": 22.776, + "ISR": 18.3882 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.5808, + "SIR": 25.1633, + "SAR": 12.3084, + "ISR": 16.1251 + }, + "instrumental": { + "SDR": 14.2692, + "SIR": 26.6604, + "SAR": 16.65, + "ISR": 17.7963 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 10.7913, + "SIR": 20.3711, + "SAR": 8.6833, + "ISR": 10.9428 + }, + "instrumental": { + "SDR": 14.5405, + "SIR": 16.5369, + "SAR": 14.3339, + "ISR": 17.1808 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 13.4825, + "SIR": 26.7907, + "SAR": 15.0602, + "ISR": 17.5295 + }, + "instrumental": { + "SDR": 15.4544, + "SIR": 30.0342, + "SAR": 18.1195, + "ISR": 18.1055 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 10.8654, + "SIR": 20.077, + "SAR": 11.1553, + "ISR": 14.0203 + }, + "instrumental": { + "SDR": 14.4459, + "SIR": 24.0598, + "SAR": 16.9315, + "ISR": 17.5409 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.02807, + "SIR": 17.5502, + "SAR": 7.50222, + "ISR": 12.2748 + }, + "instrumental": { + "SDR": 14.8281, + "SIR": 24.3257, + "SAR": 17.0102, + "ISR": 16.9566 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 6.80679, + "SIR": 19.3428, + "SAR": 10.2089, + "ISR": 10.8592 + }, + "instrumental": { + "SDR": 15.1631, + "SIR": 22.2432, + "SAR": 19.3452, + "ISR": 17.2753 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.11965, + "SIR": 14.4788, + "SAR": 3.33064, + "ISR": 8.66795 + }, + "instrumental": { + "SDR": 14.6763, + "SIR": 21.5402, + "SAR": 18.8246, + "ISR": 17.7569 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.04124, + "SIR": 18.1292, + "SAR": 9.78163, + "ISR": 14.396 + }, + "instrumental": { + "SDR": 13.398, + "SIR": 23.7996, + "SAR": 15.486, + "ISR": 16.5433 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 7.63307, + "SIR": 13.4695, + "SAR": 7.31423, + "ISR": 11.2282 + }, + "instrumental": { + "SDR": 13.689, + "SIR": 20.9781, + "SAR": 15.5905, + "ISR": 17.0138 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -19.243, + "SIR": -39.0255, + "SAR": 0.66646, + "ISR": 10.4374 + }, + "instrumental": { + "SDR": 11.92, + "SIR": 53.7986, + "SAR": 11.236, + "ISR": 11.0034 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.46186, + "SIR": 14.8059, + "SAR": 6.06655, + "ISR": 9.46849 + }, + "instrumental": { + "SDR": 15.2147, + "SIR": 19.9269, + "SAR": 17.2396, + "ISR": 17.3638 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 9.87192, + "SIR": 20.6308, + "SAR": 9.2786, + "ISR": 11.64 + }, + "instrumental": { + "SDR": 14.2598, + "SIR": 19.9639, + "SAR": 16.8666, + "ISR": 17.8177 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 8.80995, + "SIR": 17.973, + "SAR": 9.84104, + "ISR": 14.1602 + }, + "instrumental": { + "SDR": 16.3427, + "SIR": 28.1697, + "SAR": 19.6022, + "ISR": 17.7344 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -14.2101, + "SIR": -10.2625, + "SAR": 2.13489, + "ISR": 12.8683 + }, + "instrumental": { + "SDR": 18.6652, + "SIR": 44.0013, + "SAR": 26.785, + "ISR": 18.3033 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.80457, + "SIR": 12.6507, + "SAR": 3.66269, + "ISR": 6.03163 + }, + "instrumental": { + "SDR": 10.3415, + "SIR": 13.5011, + "SAR": 14.4417, + "ISR": 16.3849 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 2.9181, + "SIR": 15.5006, + "SAR": 4.01626, + "ISR": 8.32992 + }, + "instrumental": { + "SDR": 16.5603, + "SIR": 23.4027, + "SAR": 19.8952, + "ISR": 18.1015 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.07668, + "SIR": 16.6664, + "SAR": 7.43408, + "ISR": 10.731 + }, + "instrumental": { + "SDR": 13.866, + "SIR": 20.8703, + "SAR": 16.8175, + "ISR": 17.435 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 7.62121, + "SIR": 14.5528, + "SAR": 8.26119, + "ISR": 13.5425 + }, + "instrumental": { + "SDR": 14.6368, + "SIR": 24.172, + "SAR": 16.2977, + "ISR": 16.4566 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 10.217, + "SIR": 21.4823, + "SAR": 11.3837, + "ISR": 13.3821 + }, + "instrumental": { + "SDR": 12.3735, + "SIR": 19.0836, + "SAR": 13.7436, + "ISR": 16.5025 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.00672, + "SIR": 16.3591, + "SAR": 5.80263, + "ISR": 9.39829 + }, + "instrumental": { + "SDR": 12.5378, + "SIR": 16.5914, + "SAR": 13.588, + "ISR": 16.3429 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 6.2233, + "SIR": 7.77928, + "SAR": 7.96899, + "ISR": 14.4686 + }, + "instrumental": { + "SDR": 11.7616, + "SIR": 21.9019, + "SAR": 12.9497, + "ISR": 13.7031 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.2107, + "SIR": 26.3023, + "SAR": 13.2331, + "ISR": 14.8089 + }, + "instrumental": { + "SDR": 14.2371, + "SIR": 19.0771, + "SAR": 13.9072, + "ISR": 17.6365 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 10.5285, + "SIR": 21.4459, + "SAR": 11.2219, + "ISR": 14.132 + }, + "instrumental": { + "SDR": 13.5597, + "SIR": 21.5254, + "SAR": 15.2236, + "ISR": 16.8931 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.1928, + "SIR": 21.6071, + "SAR": 9.88645, + "ISR": 11.775 + }, + "instrumental": { + "SDR": 16.0795, + "SIR": 22.3702, + "SAR": 19.4496, + "ISR": 18.6247 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 1.21492, + "SIR": 9.27714, + "SAR": 2.07043, + "ISR": 7.40248 + }, + "instrumental": { + "SDR": 10.5473, + "SIR": 14.3239, + "SAR": 11.8278, + "ISR": 15.839 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 11.5194, + "SIR": 21.2608, + "SAR": 12.1847, + "ISR": 17.3034 + }, + "instrumental": { + "SDR": 17.5868, + "SIR": 34.249, + "SAR": 23.1577, + "ISR": 18.1323 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.6511, + "SIR": 18.5914, + "SAR": 11.9932, + "ISR": 16.5261 + }, + "instrumental": { + "SDR": 11.0901, + "SIR": 22.6392, + "SAR": 11.6467, + "ISR": 14.1197 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 7.09959, + "SIR": 19.2745, + "SAR": 7.55956, + "ISR": 11.8409 + }, + "instrumental": { + "SDR": 12.6853, + "SIR": 20.0304, + "SAR": 14.3729, + "ISR": 16.9422 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 0.72921, + "SIR": 0.83863, + "SAR": 1.55131, + "ISR": 9.45459 + }, + "instrumental": { + "SDR": 16.7747, + "SIR": 30.0314, + "SAR": 21.0191, + "ISR": 16.8437 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.3368, + "SIR": 21.9294, + "SAR": 10.1128, + "ISR": 14.9206 + }, + "instrumental": { + "SDR": 16.1781, + "SIR": 28.9311, + "SAR": 19.9618, + "ISR": 18.0022 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 10.3285, + "SIR": 23.1891, + "SAR": 10.7884, + "ISR": 14.3528 + }, + "instrumental": { + "SDR": 16.9151, + "SIR": 28.4261, + "SAR": 21.1221, + "ISR": 18.2953 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 11.6637, + "SIR": 24.5604, + "SAR": 12.3422, + "ISR": 14.9468 + }, + "instrumental": { + "SDR": 14.3565, + "SIR": 22.0978, + "SAR": 16.0513, + "ISR": 17.5292 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.22151, + "SIR": 18.0511, + "SAR": 8.98095, + "ISR": 12.5775 + }, + "instrumental": { + "SDR": 14.3129, + "SIR": 22.3067, + "SAR": 16.5377, + "ISR": 17.2281 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "UVR-MDX-NET_Inst_90_beta.onnx": { + "model_name": "MDX-Net Model VIP: UVR-MDX-NET_Inst_90_beta", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.20267, + "SIR": 12.2383, + "SAR": 6.46048, + "ISR": 9.42509 + }, + "instrumental": { + "SDR": 15.2004, + "SIR": 23.5832, + "SAR": 19.5653, + "ISR": 16.7009 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 5.57133, + "SIR": 9.09481, + "SAR": 6.93344, + "ISR": 12.0644 + }, + "instrumental": { + "SDR": 10.2586, + "SIR": 20.2755, + "SAR": 12.5757, + "ISR": 12.9299 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 9.38302, + "SIR": 16.3522, + "SAR": 10.5141, + "ISR": 14.2015 + }, + "instrumental": { + "SDR": 14.1767, + "SIR": 24.6142, + "SAR": 17.499, + "ISR": 16.1413 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 1.67459, + "SIR": 4.69882, + "SAR": 4.86601, + "ISR": 13.0126 + }, + "instrumental": { + "SDR": 10.4524, + "SIR": 25.6892, + "SAR": 13.266, + "ISR": 12.3422 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 11.1491, + "SIR": 18.1338, + "SAR": 12.8584, + "ISR": 15.4072 + }, + "instrumental": { + "SDR": 13.1982, + "SIR": 22.6092, + "SAR": 15.1417, + "ISR": 15.1294 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.46007, + "SIR": 15.0668, + "SAR": 11.0231, + "ISR": 14.3746 + }, + "instrumental": { + "SDR": 11.1035, + "SIR": 20.7546, + "SAR": 13.0315, + "ISR": 13.9626 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.7217, + "SIR": 16.615, + "SAR": 12.4598, + "ISR": 14.4201 + }, + "instrumental": { + "SDR": 13.6973, + "SIR": 22.5849, + "SAR": 16.6048, + "ISR": 15.7591 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 4.21906, + "SIR": 9.85829, + "SAR": 6.62323, + "ISR": 6.96987 + }, + "instrumental": { + "SDR": 16.1991, + "SIR": 27.1252, + "SAR": 23.1972, + "ISR": 17.1665 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.3584, + "SIR": 20.1837, + "SAR": 12.5645, + "ISR": 16.2482 + }, + "instrumental": { + "SDR": 13.7105, + "SIR": 26.7251, + "SAR": 16.638, + "ISR": 16.2788 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 10.6352, + "SIR": 16.3377, + "SAR": 9.74293, + "ISR": 11.9466 + }, + "instrumental": { + "SDR": 14.0272, + "SIR": 18.334, + "SAR": 14.8331, + "ISR": 15.5219 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 13.292, + "SIR": 21.7226, + "SAR": 15.1109, + "ISR": 17.633 + }, + "instrumental": { + "SDR": 14.707, + "SIR": 30.2118, + "SAR": 18.1144, + "ISR": 16.6277 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 10.6523, + "SIR": 17.3253, + "SAR": 11.5388, + "ISR": 14.6133 + }, + "instrumental": { + "SDR": 13.9999, + "SIR": 24.8454, + "SAR": 17.0806, + "ISR": 16.2674 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.1097, + "SIR": 14.5728, + "SAR": 7.85878, + "ISR": 12.839 + }, + "instrumental": { + "SDR": 14.1288, + "SIR": 24.9779, + "SAR": 17.2192, + "ISR": 15.4992 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 7.57967, + "SIR": 15.6643, + "SAR": 10.7271, + "ISR": 11.4946 + }, + "instrumental": { + "SDR": 14.5064, + "SIR": 22.6226, + "SAR": 18.8388, + "ISR": 15.9312 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.93704, + "SIR": 10.894, + "SAR": 5.66662, + "ISR": 8.86966 + }, + "instrumental": { + "SDR": 14.1478, + "SIR": 21.6014, + "SAR": 18.5365, + "ISR": 16.528 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 8.98175, + "SIR": 16.154, + "SAR": 10.0676, + "ISR": 14.4547 + }, + "instrumental": { + "SDR": 12.7934, + "SIR": 23.7011, + "SAR": 15.5471, + "ISR": 15.4652 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 7.74832, + "SIR": 12.4927, + "SAR": 7.89414, + "ISR": 12.4142 + }, + "instrumental": { + "SDR": 13.3587, + "SIR": 22.2747, + "SAR": 15.8602, + "ISR": 15.7992 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -27.4341, + "SIR": -41.7215, + "SAR": 2.36152, + "ISR": 12.0074 + }, + "instrumental": { + "SDR": 10.3352, + "SIR": 54.3477, + "SAR": 9.52361, + "ISR": 8.93 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.16758, + "SIR": 11.4117, + "SAR": 6.74364, + "ISR": 9.93892 + }, + "instrumental": { + "SDR": 14.5351, + "SIR": 20.3294, + "SAR": 17.5407, + "ISR": 15.8813 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 9.86415, + "SIR": 17.0683, + "SAR": 10.232, + "ISR": 12.356 + }, + "instrumental": { + "SDR": 13.9609, + "SIR": 21.2519, + "SAR": 16.9743, + "ISR": 16.5743 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 8.53017, + "SIR": 14.9536, + "SAR": 10.1498, + "ISR": 14.872 + }, + "instrumental": { + "SDR": 15.484, + "SIR": 29.1, + "SAR": 19.5157, + "ISR": 16.5301 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -13.0368, + "SIR": -10.6564, + "SAR": 7.59445, + "ISR": 13.2938 + }, + "instrumental": { + "SDR": 17.3802, + "SIR": 44.1642, + "SAR": 27.1096, + "ISR": 17.0368 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 3.87647, + "SIR": 10.8503, + "SAR": 4.26633, + "ISR": 6.29382 + }, + "instrumental": { + "SDR": 10.1952, + "SIR": 13.6309, + "SAR": 14.5818, + "ISR": 15.3893 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.5467, + "SIR": 11.5149, + "SAR": 6.95337, + "ISR": 11.755 + }, + "instrumental": { + "SDR": 15.7581, + "SIR": 27.6261, + "SAR": 20.5288, + "ISR": 16.6283 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 6.99209, + "SIR": 14.0758, + "SAR": 7.92927, + "ISR": 10.9793 + }, + "instrumental": { + "SDR": 13.387, + "SIR": 21.145, + "SAR": 17.0217, + "ISR": 16.2149 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 7.59957, + "SIR": 12.3984, + "SAR": 8.52245, + "ISR": 13.7444 + }, + "instrumental": { + "SDR": 14.1692, + "SIR": 24.3327, + "SAR": 16.2307, + "ISR": 15.3322 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.032, + "SIR": 18.9589, + "SAR": 12.2025, + "ISR": 14.7923 + }, + "instrumental": { + "SDR": 12.0707, + "SIR": 21.6104, + "SAR": 13.967, + "ISR": 15.2024 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 5.76981, + "SIR": 11.0752, + "SAR": 6.32747, + "ISR": 10.4228 + }, + "instrumental": { + "SDR": 11.6102, + "SIR": 17.3353, + "SAR": 13.2431, + "ISR": 13.9176 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 5.99845, + "SIR": 6.98281, + "SAR": 8.44448, + "ISR": 14.7222 + }, + "instrumental": { + "SDR": 11.4324, + "SIR": 22.2574, + "SAR": 13.0607, + "ISR": 13.0165 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.072, + "SIR": 23.2516, + "SAR": 13.545, + "ISR": 14.9129 + }, + "instrumental": { + "SDR": 13.6541, + "SIR": 19.3555, + "SAR": 14.1474, + "ISR": 16.3782 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 10.3247, + "SIR": 18.5579, + "SAR": 11.3553, + "ISR": 14.5035 + }, + "instrumental": { + "SDR": 13.0946, + "SIR": 21.7402, + "SAR": 15.3277, + "ISR": 15.6151 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 9.93231, + "SIR": 17.0268, + "SAR": 11.1058, + "ISR": 13.3245 + }, + "instrumental": { + "SDR": 15.3262, + "SIR": 24.0168, + "SAR": 19.8755, + "ISR": 17.1591 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.97279, + "SIR": 7.16759, + "SAR": 6.58768, + "ISR": 10.5582 + }, + "instrumental": { + "SDR": 10.8523, + "SIR": 18.3732, + "SAR": 13.0302, + "ISR": 13.4754 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 11.4563, + "SIR": 18.5555, + "SAR": 12.8828, + "ISR": 17.2104 + }, + "instrumental": { + "SDR": 16.6174, + "SIR": 33.7264, + "SAR": 23.5436, + "ISR": 17.0111 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.1738, + "SIR": 17.3697, + "SAR": 11.9402, + "ISR": 15.8828 + }, + "instrumental": { + "SDR": 10.6332, + "SIR": 21.7943, + "SAR": 11.6937, + "ISR": 13.4713 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 7.38409, + "SIR": 13.9087, + "SAR": 8.13109, + "ISR": 12.8174 + }, + "instrumental": { + "SDR": 12.2273, + "SIR": 20.9835, + "SAR": 13.9579, + "ISR": 14.7378 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 1.39374, + "SIR": 0.70406, + "SAR": 3.9578, + "ISR": 9.18104 + }, + "instrumental": { + "SDR": 14.674, + "SIR": 30.4623, + "SAR": 18.3033, + "ISR": 15.6645 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.20524, + "SIR": 17.4444, + "SAR": 10.5626, + "ISR": 15.0667 + }, + "instrumental": { + "SDR": 15.332, + "SIR": 29.0095, + "SAR": 19.9754, + "ISR": 16.6886 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 10.0138, + "SIR": 17.9647, + "SAR": 11.1812, + "ISR": 14.7069 + }, + "instrumental": { + "SDR": 15.9754, + "SIR": 28.285, + "SAR": 21.0298, + "ISR": 16.9922 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 11.6604, + "SIR": 18.9153, + "SAR": 12.9875, + "ISR": 15.9069 + }, + "instrumental": { + "SDR": 13.8227, + "SIR": 25.1864, + "SAR": 16.1632, + "ISR": 15.4374 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.13924, + "SIR": 15.0102, + "SAR": 9.90526, + "ISR": 13.3091 + }, + "instrumental": { + "SDR": 13.8918, + "SIR": 23.1029, + "SAR": 16.6214, + "ISR": 15.7792 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "UVR-MDX-NET_Inst_187_beta.onnx": { + "model_name": "MDX-Net Model VIP: UVR-MDX-NET_Inst_187_beta", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.36936, + "SIR": 13.026, + "SAR": 7.20428, + "ISR": 9.46774 + }, + "instrumental": { + "SDR": 15.2983, + "SIR": 23.7378, + "SAR": 19.7604, + "ISR": 16.8152 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 5.51237, + "SIR": 8.68336, + "SAR": 7.02625, + "ISR": 13.4352 + }, + "instrumental": { + "SDR": 10.0231, + "SIR": 22.6724, + "SAR": 12.2508, + "ISR": 12.4554 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 9.79824, + "SIR": 16.4021, + "SAR": 10.9665, + "ISR": 15.019 + }, + "instrumental": { + "SDR": 14.3635, + "SIR": 26.1217, + "SAR": 17.8836, + "ISR": 16.0959 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 1.28764, + "SIR": 4.63104, + "SAR": 4.53183, + "ISR": 13.1727 + }, + "instrumental": { + "SDR": 10.4408, + "SIR": 26.0525, + "SAR": 13.1905, + "ISR": 12.3168 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 11.8284, + "SIR": 18.846, + "SAR": 13.3086, + "ISR": 16.0081 + }, + "instrumental": { + "SDR": 13.5657, + "SIR": 23.8069, + "SAR": 15.5869, + "ISR": 15.3798 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.7213, + "SIR": 15.6196, + "SAR": 11.2403, + "ISR": 14.6775 + }, + "instrumental": { + "SDR": 11.1598, + "SIR": 21.3468, + "SAR": 13.2475, + "ISR": 14.1823 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.9998, + "SIR": 17.2269, + "SAR": 12.8645, + "ISR": 14.7168 + }, + "instrumental": { + "SDR": 13.9219, + "SIR": 23.188, + "SAR": 17.0147, + "ISR": 15.8638 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 4.76283, + "SIR": 10.1612, + "SAR": 7.41427, + "ISR": 7.76716 + }, + "instrumental": { + "SDR": 16.1556, + "SIR": 28.0721, + "SAR": 23.101, + "ISR": 17.0586 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.9189, + "SIR": 21.6511, + "SAR": 12.9066, + "ISR": 16.7239 + }, + "instrumental": { + "SDR": 14.078, + "SIR": 27.9904, + "SAR": 17.1271, + "ISR": 16.6125 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.119, + "SIR": 17.5241, + "SAR": 10.1873, + "ISR": 12.0741 + }, + "instrumental": { + "SDR": 14.4694, + "SIR": 18.2688, + "SAR": 15.2649, + "ISR": 15.8977 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 13.9378, + "SIR": 22.6192, + "SAR": 16.0801, + "ISR": 18.03 + }, + "instrumental": { + "SDR": 15.0557, + "SIR": 30.9244, + "SAR": 18.6909, + "ISR": 16.8214 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 10.9621, + "SIR": 17.2045, + "SAR": 12.1515, + "ISR": 15.504 + }, + "instrumental": { + "SDR": 14.2716, + "SIR": 26.8404, + "SAR": 17.397, + "ISR": 16.1551 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.49748, + "SIR": 15.7191, + "SAR": 8.18195, + "ISR": 13.005 + }, + "instrumental": { + "SDR": 14.4973, + "SIR": 25.2574, + "SAR": 17.5821, + "ISR": 16.0322 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.10643, + "SIR": 16.0526, + "SAR": 11.3911, + "ISR": 11.7472 + }, + "instrumental": { + "SDR": 14.6982, + "SIR": 23.1172, + "SAR": 19.0789, + "ISR": 16.0708 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 2.98627, + "SIR": 11.3211, + "SAR": 6.16117, + "ISR": 8.96469 + }, + "instrumental": { + "SDR": 14.277, + "SIR": 21.6327, + "SAR": 18.9127, + "ISR": 16.6113 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.33747, + "SIR": 16.4205, + "SAR": 10.4907, + "ISR": 14.9317 + }, + "instrumental": { + "SDR": 13.0885, + "SIR": 24.6582, + "SAR": 15.8527, + "ISR": 15.4861 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 7.88963, + "SIR": 12.7681, + "SAR": 8.13672, + "ISR": 13.1047 + }, + "instrumental": { + "SDR": 13.3498, + "SIR": 23.4772, + "SAR": 15.9515, + "ISR": 15.7655 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -25.1384, + "SIR": -38.8244, + "SAR": 1.65476, + "ISR": 11.6135 + }, + "instrumental": { + "SDR": 12.3747, + "SIR": 56.5735, + "SAR": 12.5153, + "ISR": 11.3759 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.50226, + "SIR": 11.7269, + "SAR": 7.02281, + "ISR": 10.7734 + }, + "instrumental": { + "SDR": 14.6904, + "SIR": 21.3717, + "SAR": 17.9454, + "ISR": 15.8412 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.2548, + "SIR": 17.5972, + "SAR": 11.2889, + "ISR": 13.9862 + }, + "instrumental": { + "SDR": 14.4079, + "SIR": 23.8972, + "SAR": 17.2697, + "ISR": 16.5928 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 8.99252, + "SIR": 15.1268, + "SAR": 10.439, + "ISR": 15.2382 + }, + "instrumental": { + "SDR": 15.6408, + "SIR": 29.1007, + "SAR": 20.2419, + "ISR": 16.5109 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -12.3581, + "SIR": -10.5771, + "SAR": 9.06836, + "ISR": 12.773 + }, + "instrumental": { + "SDR": 17.2892, + "SIR": 43.0899, + "SAR": 28.9179, + "ISR": 16.9788 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.04467, + "SIR": 11.1306, + "SAR": 4.42455, + "ISR": 6.55434 + }, + "instrumental": { + "SDR": 10.3007, + "SIR": 13.933, + "SAR": 14.5828, + "ISR": 15.4258 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 5.84179, + "SIR": 12.1022, + "SAR": 7.61948, + "ISR": 12.0636 + }, + "instrumental": { + "SDR": 15.8385, + "SIR": 27.6706, + "SAR": 20.4044, + "ISR": 16.6957 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.20076, + "SIR": 14.6473, + "SAR": 8.17887, + "ISR": 11.1653 + }, + "instrumental": { + "SDR": 13.6283, + "SIR": 21.4367, + "SAR": 17.19, + "ISR": 16.3149 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.0528, + "SIR": 12.9967, + "SAR": 8.89459, + "ISR": 14.0636 + }, + "instrumental": { + "SDR": 14.3749, + "SIR": 25.005, + "SAR": 16.849, + "ISR": 15.4946 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.3206, + "SIR": 19.6451, + "SAR": 12.4908, + "ISR": 14.9285 + }, + "instrumental": { + "SDR": 12.2574, + "SIR": 21.7951, + "SAR": 14.2051, + "ISR": 15.4701 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.13154, + "SIR": 13.0094, + "SAR": 6.66814, + "ISR": 10.7435 + }, + "instrumental": { + "SDR": 12.1288, + "SIR": 18.1541, + "SAR": 13.6063, + "ISR": 14.6017 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 6.55034, + "SIR": 7.36739, + "SAR": 8.59668, + "ISR": 14.8697 + }, + "instrumental": { + "SDR": 11.5973, + "SIR": 22.5521, + "SAR": 13.3371, + "ISR": 13.2887 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.2929, + "SIR": 24.0298, + "SAR": 14.2954, + "ISR": 15.3965 + }, + "instrumental": { + "SDR": 13.8998, + "SIR": 20.3896, + "SAR": 14.6298, + "ISR": 16.5022 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 10.9149, + "SIR": 19.0512, + "SAR": 12.0628, + "ISR": 15.0942 + }, + "instrumental": { + "SDR": 13.4183, + "SIR": 22.9578, + "SAR": 15.7083, + "ISR": 15.7118 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.4199, + "SIR": 17.0238, + "SAR": 11.9322, + "ISR": 14.4594 + }, + "instrumental": { + "SDR": 15.3481, + "SIR": 26.2851, + "SAR": 20.2876, + "ISR": 17.0469 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 1.56634, + "SIR": 8.85607, + "SAR": 2.53657, + "ISR": 7.47159 + }, + "instrumental": { + "SDR": 10.4968, + "SIR": 13.9847, + "SAR": 12.7539, + "ISR": 14.9708 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 11.3323, + "SIR": 18.5174, + "SAR": 13.25, + "ISR": 17.7224 + }, + "instrumental": { + "SDR": 16.6316, + "SIR": 35.4979, + "SAR": 23.8839, + "ISR": 16.9231 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.8046, + "SIR": 17.8196, + "SAR": 12.5165, + "ISR": 16.572 + }, + "instrumental": { + "SDR": 11.1833, + "SIR": 22.7637, + "SAR": 12.2072, + "ISR": 13.6263 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.101, + "SIR": 16.0713, + "SAR": 8.70599, + "ISR": 13.1482 + }, + "instrumental": { + "SDR": 12.8315, + "SIR": 21.4532, + "SAR": 14.8154, + "ISR": 15.5388 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 2.50855, + "SIR": 0.67222, + "SAR": 4.61358, + "ISR": 10.3423 + }, + "instrumental": { + "SDR": 16.0653, + "SIR": 30.3329, + "SAR": 21.1636, + "ISR": 15.8941 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.60538, + "SIR": 17.9619, + "SAR": 10.8293, + "ISR": 15.4658 + }, + "instrumental": { + "SDR": 15.4963, + "SIR": 29.9486, + "SAR": 20.3135, + "ISR": 16.7951 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 10.2757, + "SIR": 18.1564, + "SAR": 11.5929, + "ISR": 15.1745 + }, + "instrumental": { + "SDR": 15.9764, + "SIR": 29.5843, + "SAR": 21.4453, + "ISR": 16.9758 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 12.4525, + "SIR": 21.1111, + "SAR": 13.6101, + "ISR": 15.9529 + }, + "instrumental": { + "SDR": 14.2756, + "SIR": 24.5536, + "SAR": 17.1151, + "ISR": 16.3198 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.54948, + "SIR": 15.8859, + "SAR": 10.3132, + "ISR": 14.0249 + }, + "instrumental": { + "SDR": 14.2736, + "SIR": 23.852, + "SAR": 17.1211, + "ISR": 15.9649 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "UVR-MDX-NET-Inst_full_292.onnx": { + "model_name": "MDX-Net Model VIP: UVR-MDX-NET-Inst_full_292", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.54252, + "SIR": 15.7078, + "SAR": 5.50417, + "ISR": 10.0188 + }, + "instrumental": { + "SDR": 16.1056, + "SIR": 24.6499, + "SAR": 19.6085, + "ISR": 18.3314 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.47415, + "SIR": 10.7711, + "SAR": 7.08723, + "ISR": 13.123 + }, + "instrumental": { + "SDR": 11.317, + "SIR": 22.4021, + "SAR": 12.8289, + "ISR": 13.9143 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.1643, + "SIR": 21.0724, + "SAR": 10.6419, + "ISR": 15.1426 + }, + "instrumental": { + "SDR": 15.558, + "SIR": 26.565, + "SAR": 18.1709, + "ISR": 18.0106 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.39747, + "SIR": 5.51887, + "SAR": 4.56685, + "ISR": 13.7659 + }, + "instrumental": { + "SDR": 10.8682, + "SIR": 27.211, + "SAR": 13.0723, + "ISR": 13.1838 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 11.987, + "SIR": 22.0627, + "SAR": 12.9677, + "ISR": 15.9777 + }, + "instrumental": { + "SDR": 14.3953, + "SIR": 24.3051, + "SAR": 15.6619, + "ISR": 17.0268 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.81381, + "SIR": 17.1199, + "SAR": 10.742, + "ISR": 14.8021 + }, + "instrumental": { + "SDR": 11.5654, + "SIR": 21.8976, + "SAR": 13.0929, + "ISR": 15.2299 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.3714, + "SIR": 20.038, + "SAR": 12.587, + "ISR": 14.8939 + }, + "instrumental": { + "SDR": 14.891, + "SIR": 23.6299, + "SAR": 17.0918, + "ISR": 17.5681 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.15152, + "SIR": 17.8522, + "SAR": 5.08817, + "ISR": 8.532 + }, + "instrumental": { + "SDR": 17.8187, + "SIR": 28.61, + "SAR": 23.4221, + "ISR": 19.1368 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.9932, + "SIR": 28.4073, + "SAR": 12.853, + "ISR": 16.4699 + }, + "instrumental": { + "SDR": 15.0332, + "SIR": 27.6154, + "SAR": 17.1807, + "ISR": 18.6237 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.7741, + "SIR": 20.7192, + "SAR": 10.2936, + "ISR": 12.4045 + }, + "instrumental": { + "SDR": 15.4307, + "SIR": 19.0908, + "SAR": 15.7516, + "ISR": 17.4509 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.1183, + "SIR": 30.6671, + "SAR": 15.9555, + "ISR": 17.8021 + }, + "instrumental": { + "SDR": 16.4406, + "SIR": 30.4041, + "SAR": 19.1185, + "ISR": 19.0291 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.2107, + "SIR": 20.4259, + "SAR": 11.5713, + "ISR": 15.6806 + }, + "instrumental": { + "SDR": 15.0826, + "SIR": 27.3436, + "SAR": 17.3563, + "ISR": 17.8239 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.6928, + "SIR": 19.2459, + "SAR": 8.11505, + "ISR": 13.2198 + }, + "instrumental": { + "SDR": 15.4035, + "SIR": 25.9502, + "SAR": 17.386, + "ISR": 17.6483 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.02842, + "SIR": 19.9925, + "SAR": 10.7817, + "ISR": 11.7508 + }, + "instrumental": { + "SDR": 15.7368, + "SIR": 23.3707, + "SAR": 19.1946, + "ISR": 17.7475 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.51616, + "SIR": 16.1912, + "SAR": 3.34447, + "ISR": 9.09535 + }, + "instrumental": { + "SDR": 14.9567, + "SIR": 22.2559, + "SAR": 18.4926, + "ISR": 18.4256 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 8.61379, + "SIR": 17.0044, + "SAR": 9.31084, + "ISR": 14.7581 + }, + "instrumental": { + "SDR": 12.6567, + "SIR": 24.5011, + "SAR": 14.3967, + "ISR": 16.2093 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.29479, + "SIR": 20.8529, + "SAR": 8.52881, + "ISR": 13.5185 + }, + "instrumental": { + "SDR": 14.5113, + "SIR": 24.4933, + "SAR": 16.7242, + "ISR": 18.1657 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -17.7931, + "SIR": -38.9964, + "SAR": 0.26585, + "ISR": 11.6109 + }, + "instrumental": { + "SDR": 11.8178, + "SIR": 57.5807, + "SAR": 11.1146, + "ISR": 11.2028 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.61161, + "SIR": 13.6788, + "SAR": 6.68038, + "ISR": 11.0572 + }, + "instrumental": { + "SDR": 15.5741, + "SIR": 22.0444, + "SAR": 17.6169, + "ISR": 17.0856 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.768, + "SIR": 22.2074, + "SAR": 11.09, + "ISR": 15.0508 + }, + "instrumental": { + "SDR": 15.3527, + "SIR": 26.0894, + "SAR": 17.6055, + "ISR": 18.2836 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.0469, + "SIR": 20.9816, + "SAR": 10.4421, + "ISR": 15.483 + }, + "instrumental": { + "SDR": 16.9409, + "SIR": 31.2262, + "SAR": 20.2999, + "ISR": 18.5831 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -11.9116, + "SIR": -8.97781, + "SAR": -0.96472, + "ISR": 10.0981 + }, + "instrumental": { + "SDR": 19.4743, + "SIR": 40.7421, + "SAR": 29.1881, + "ISR": 18.9728 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.10791, + "SIR": 14.5987, + "SAR": 3.90009, + "ISR": 6.39505 + }, + "instrumental": { + "SDR": 10.7603, + "SIR": 14.0662, + "SAR": 14.5859, + "ISR": 17.1264 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.0496, + "SIR": 16.0767, + "SAR": 6.23946, + "ISR": 12.7454 + }, + "instrumental": { + "SDR": 17.2552, + "SIR": 28.4409, + "SAR": 19.7706, + "ISR": 18.5276 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.537, + "SIR": 18.3375, + "SAR": 7.87007, + "ISR": 11.4149 + }, + "instrumental": { + "SDR": 14.3855, + "SIR": 22.0259, + "SAR": 17.2115, + "ISR": 18.1118 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.4672, + "SIR": 16.6646, + "SAR": 8.71142, + "ISR": 14.2952 + }, + "instrumental": { + "SDR": 15.286, + "SIR": 25.8262, + "SAR": 17.1067, + "ISR": 17.1934 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.5318, + "SIR": 23.4127, + "SAR": 11.874, + "ISR": 14.7266 + }, + "instrumental": { + "SDR": 12.9211, + "SIR": 21.74, + "SAR": 14.3134, + "ISR": 17.1976 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 5.6753, + "SIR": 9.97184, + "SAR": 5.78856, + "ISR": 12.0798 + }, + "instrumental": { + "SDR": 11.1482, + "SIR": 19.6303, + "SAR": 12.2594, + "ISR": 13.2331 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 6.30236, + "SIR": 6.23026, + "SAR": 7.5286, + "ISR": 15.1277 + }, + "instrumental": { + "SDR": 11.8388, + "SIR": 23.4107, + "SAR": 12.8049, + "ISR": 13.2665 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.4394, + "SIR": 28.6187, + "SAR": 14.7549, + "ISR": 16.262 + }, + "instrumental": { + "SDR": 14.8457, + "SIR": 21.7121, + "SAR": 15.1061, + "ISR": 18.5389 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.2095, + "SIR": 22.9471, + "SAR": 11.6402, + "ISR": 15.3509 + }, + "instrumental": { + "SDR": 14.095, + "SIR": 23.6691, + "SAR": 15.6341, + "ISR": 17.3565 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.3092, + "SIR": 24.8561, + "SAR": 10.2104, + "ISR": 12.0652 + }, + "instrumental": { + "SDR": 17.1074, + "SIR": 23.3349, + "SAR": 20.2268, + "ISR": 18.8935 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 3.46394, + "SIR": 8.40823, + "SAR": 5.5441, + "ISR": 11.4008 + }, + "instrumental": { + "SDR": 10.8089, + "SIR": 19.5895, + "SAR": 11.8569, + "ISR": 14.7945 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.7168, + "SIR": 25.8381, + "SAR": 13.5305, + "ISR": 17.6718 + }, + "instrumental": { + "SDR": 18.5516, + "SIR": 35.4711, + "SAR": 24.2257, + "ISR": 19.1836 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.6445, + "SIR": 19.4317, + "SAR": 12.2014, + "ISR": 16.6169 + }, + "instrumental": { + "SDR": 11.2919, + "SIR": 23.2338, + "SAR": 12.1039, + "ISR": 14.6652 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.34852, + "SIR": 22.1235, + "SAR": 8.43358, + "ISR": 13.3752 + }, + "instrumental": { + "SDR": 13.5486, + "SIR": 22.2081, + "SAR": 15.0949, + "ISR": 17.6535 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.65055, + "SIR": 6.04193, + "SAR": 2.11584, + "ISR": 10.596 + }, + "instrumental": { + "SDR": 16.4938, + "SIR": 30.5691, + "SAR": 20.1651, + "ISR": 17.8085 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.87268, + "SIR": 24.9939, + "SAR": 10.489, + "ISR": 15.3587 + }, + "instrumental": { + "SDR": 16.8517, + "SIR": 30.1136, + "SAR": 20.3862, + "ISR": 18.8673 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.1302, + "SIR": 27.8748, + "SAR": 11.5186, + "ISR": 15.5401 + }, + "instrumental": { + "SDR": 17.7366, + "SIR": 30.7493, + "SAR": 21.875, + "ISR": 19.1881 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 12.9939, + "SIR": 26.5542, + "SAR": 13.726, + "ISR": 16.7207 + }, + "instrumental": { + "SDR": 15.4001, + "SIR": 26.7834, + "SAR": 17.2413, + "ISR": 18.1632 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.54049, + "SIR": 19.7121, + "SAR": 9.76062, + "ISR": 14.0305 + }, + "instrumental": { + "SDR": 15.0579, + "SIR": 24.4972, + "SAR": 17.1961, + "ISR": 17.778 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "htdemucs_ft.yaml": { + "model_name": "Demucs v4: htdemucs_ft", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 6.08748, + "SIR": 17.144, + "SAR": 6.11034, + "ISR": 12.6967 + }, + "drums": { + "SDR": 5.1398, + "SIR": 16.7632, + "SAR": 4.47122, + "ISR": 8.87269 + }, + "bass": { + "SDR": 19.6061, + "SIR": 26.9475, + "SAR": 19.9212, + "ISR": 25.6764 + }, + "other": { + "SDR": 10.379, + "SIR": 15.77, + "SAR": 11.5282, + "ISR": 20.5043 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 7.87915, + "SIR": 19.0441, + "SAR": 7.86232, + "ISR": 14.6037 + }, + "drums": { + "SDR": 9.49839, + "SIR": 20.977, + "SAR": 10.2955, + "ISR": 14.0041 + }, + "bass": { + "SDR": 12.555, + "SIR": 20.7999, + "SAR": 14.0735, + "ISR": 15.4626 + }, + "other": { + "SDR": 8.49975, + "SIR": 14.2335, + "SAR": 9.43418, + "ISR": 16.7411 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.8088, + "SIR": 18.8631, + "SAR": 10.8714, + "ISR": 20.7598 + }, + "drums": { + "SDR": 12.3337, + "SIR": 22.0962, + "SAR": 12.4767, + "ISR": 21.6261 + }, + "bass": { + "SDR": 11.3562, + "SIR": 22.8976, + "SAR": 9.73282, + "ISR": 12.9839 + }, + "other": { + "SDR": 7.05993, + "SIR": 12.191, + "SAR": 6.20555, + "ISR": 13.8254 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 1.95752, + "SIR": 4.50647, + "SAR": 5.77934, + "ISR": 15.4828 + }, + "drums": { + "SDR": 8.88779, + "SIR": 16.2661, + "SAR": 10.0191, + "ISR": 17.5029 + }, + "bass": { + "SDR": 4.93095, + "SIR": 24.8171, + "SAR": 5.56008, + "ISR": 6.97457 + }, + "other": { + "SDR": -0.39985, + "SIR": -2.64823, + "SAR": 1.72115, + "ISR": 4.62734 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 11.8694, + "SIR": 20.2473, + "SAR": 12.2777, + "ISR": 20.4483 + }, + "drums": { + "SDR": 10.0244, + "SIR": 21.133, + "SAR": 10.997, + "ISR": 16.7617 + }, + "bass": { + "SDR": 11.6992, + "SIR": 21.4431, + "SAR": 11.629, + "ISR": 17.3537 + }, + "other": { + "SDR": 7.96476, + "SIR": 13.3619, + "SAR": 7.95521, + "ISR": 14.1681 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.94422, + "SIR": 14.9863, + "SAR": 9.64679, + "ISR": 16.4351 + }, + "drums": { + "SDR": 9.78024, + "SIR": 18.8449, + "SAR": 11.0301, + "ISR": 14.7087 + }, + "bass": { + "SDR": 7.90541, + "SIR": 9.18312, + "SAR": 7.63197, + "ISR": 16.4765 + }, + "other": { + "SDR": 6.29039, + "SIR": 12.3169, + "SAR": 6.34577, + "ISR": 9.87795 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.036, + "SIR": 17.9162, + "SAR": 11.6161, + "ISR": 19.0923 + }, + "drums": { + "SDR": 10.1848, + "SIR": 20.0882, + "SAR": 11.3395, + "ISR": 16.0502 + }, + "bass": { + "SDR": 17.7502, + "SIR": 27.2123, + "SAR": 14.336, + "ISR": 17.6888 + }, + "other": { + "SDR": 7.87695, + "SIR": 12.534, + "SAR": 7.61291, + "ISR": 14.4614 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.68739, + "SIR": 19.6404, + "SAR": 6.70557, + "ISR": 12.4074 + }, + "drums": { + "SDR": 10.2345, + "SIR": 18.1301, + "SAR": 10.7862, + "ISR": 18.0684 + }, + "bass": { + "SDR": 17.9564, + "SIR": 30.6188, + "SAR": 16.498, + "ISR": 19.6131 + }, + "other": { + "SDR": 7.5472, + "SIR": 11.3519, + "SAR": 7.54351, + "ISR": 14.3772 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.8404, + "SIR": 27.6138, + "SAR": 11.9268, + "ISR": 22.1581 + }, + "drums": { + "SDR": 8.31121, + "SIR": 18.0997, + "SAR": 8.71986, + "ISR": 15.0845 + }, + "bass": { + "SDR": 10.3589, + "SIR": 22.6435, + "SAR": 9.97587, + "ISR": 14.6063 + }, + "other": { + "SDR": 11.1281, + "SIR": 17.8399, + "SAR": 11.7408, + "ISR": 19.6241 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.0388, + "SIR": 18.5112, + "SAR": 10.0006, + "ISR": 16.282 + }, + "drums": { + "SDR": 10.2561, + "SIR": 19.7651, + "SAR": 10.3934, + "ISR": 16.4898 + }, + "bass": { + "SDR": 16.1016, + "SIR": 30.238, + "SAR": 15.0562, + "ISR": 21.7911 + }, + "other": { + "SDR": 11.3816, + "SIR": 15.8239, + "SAR": 10.451, + "ISR": 17.1779 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.1298, + "SIR": 23.1288, + "SAR": 13.7556, + "ISR": 25.9922 + }, + "drums": { + "SDR": 11.2861, + "SIR": 17.9969, + "SAR": 11.0163, + "ISR": 18.9596 + }, + "bass": { + "SDR": 12.0199, + "SIR": 20.3359, + "SAR": 7.91919, + "ISR": 9.77948 + }, + "other": { + "SDR": 10.1695, + "SIR": 12.4923, + "SAR": 8.84543, + "ISR": 20.3318 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 10.7932, + "SIR": 19.5952, + "SAR": 10.9821, + "ISR": 19.8238 + }, + "drums": { + "SDR": 12.7738, + "SIR": 22.425, + "SAR": 13.7751, + "ISR": 20.141 + }, + "bass": { + "SDR": 11.4445, + "SIR": 20.1414, + "SAR": 11.9458, + "ISR": 20.2774 + }, + "other": { + "SDR": 6.91353, + "SIR": 13.7917, + "SAR": 7.03032, + "ISR": 12.8673 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.0187, + "SIR": 17.2363, + "SAR": 7.372, + "ISR": 15.644 + }, + "drums": { + "SDR": 7.09524, + "SIR": 18.0718, + "SAR": 7.31846, + "ISR": 13.0651 + }, + "bass": { + "SDR": 13.9639, + "SIR": 25.1196, + "SAR": 14.7761, + "ISR": 22.8725 + }, + "other": { + "SDR": 10.7082, + "SIR": 17.8976, + "SAR": 10.1184, + "ISR": 16.4778 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.7932, + "SIR": 18.8631, + "SAR": 10.0006, + "ISR": 16.4351 + }, + "drums": { + "SDR": 10.0244, + "SIR": 18.8449, + "SAR": 10.7862, + "ISR": 16.4898 + }, + "bass": { + "SDR": 12.0199, + "SIR": 22.8976, + "SAR": 11.9458, + "ISR": 17.3537 + } + }, + "stems": [ + "vocals", + "drums", + "bass", + "other" + ], + "target_stem": null + }, + "htdemucs.yaml": { + "model_name": "Demucs v4: htdemucs", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.57989, + "SIR": 15.919, + "SAR": 5.6672, + "ISR": 12.5146 + }, + "drums": { + "SDR": 3.4786, + "SIR": 15.3778, + "SAR": 2.08293, + "ISR": 5.22501 + }, + "bass": { + "SDR": 18.5115, + "SIR": 22.9108, + "SAR": 19.5757, + "ISR": 25.8449 + }, + "other": { + "SDR": 9.94838, + "SIR": 15.6823, + "SAR": 11.0621, + "ISR": 19.3189 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 7.39182, + "SIR": 18.1421, + "SAR": 7.33519, + "ISR": 13.7516 + }, + "drums": { + "SDR": 8.40161, + "SIR": 19.6676, + "SAR": 8.92091, + "ISR": 12.633 + }, + "bass": { + "SDR": 11.909, + "SIR": 19.711, + "SAR": 13.632, + "ISR": 14.9125 + }, + "other": { + "SDR": 7.77882, + "SIR": 12.9784, + "SAR": 8.84332, + "ISR": 16.1011 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.1811, + "SIR": 17.5339, + "SAR": 10.3123, + "ISR": 19.459 + }, + "drums": { + "SDR": 10.4373, + "SIR": 18.3586, + "SAR": 10.8625, + "ISR": 22.2567 + }, + "bass": { + "SDR": 9.19871, + "SIR": 19.7823, + "SAR": 8.32562, + "ISR": 12.5227 + }, + "other": { + "SDR": 5.53135, + "SIR": 10.962, + "SAR": 4.45932, + "ISR": 11.3536 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.2606, + "SIR": 4.69423, + "SAR": 5.8341, + "ISR": 15.8249 + }, + "drums": { + "SDR": 8.19452, + "SIR": 14.4369, + "SAR": 9.44168, + "ISR": 18.1507 + }, + "bass": { + "SDR": 6.28668, + "SIR": 23.4279, + "SAR": 7.212, + "ISR": 9.27559 + }, + "other": { + "SDR": 0.55542, + "SIR": 1.21317, + "SAR": 0.23462, + "ISR": 4.11639 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 11.4819, + "SIR": 19.0492, + "SAR": 11.8735, + "ISR": 20.3725 + }, + "drums": { + "SDR": 9.48768, + "SIR": 20.1542, + "SAR": 10.3816, + "ISR": 15.8755 + }, + "bass": { + "SDR": 11.6443, + "SIR": 20.7386, + "SAR": 11.3031, + "ISR": 17.2754 + }, + "other": { + "SDR": 7.58634, + "SIR": 13.272, + "SAR": 7.48369, + "ISR": 13.0932 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.82893, + "SIR": 14.8728, + "SAR": 9.54323, + "ISR": 16.0121 + }, + "drums": { + "SDR": 9.36481, + "SIR": 18.7192, + "SAR": 10.701, + "ISR": 14.2709 + }, + "bass": { + "SDR": 8.11879, + "SIR": 14.1439, + "SAR": 7.86138, + "ISR": 15.0381 + }, + "other": { + "SDR": 6.64456, + "SIR": 12.3823, + "SAR": 7.11786, + "ISR": 11.6687 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.2856, + "SIR": 17.4402, + "SAR": 10.8917, + "ISR": 18.1344 + }, + "drums": { + "SDR": 9.44627, + "SIR": 19.3698, + "SAR": 10.5507, + "ISR": 15.4531 + }, + "bass": { + "SDR": 16.8356, + "SIR": 25.6126, + "SAR": 14.164, + "ISR": 17.6165 + }, + "other": { + "SDR": 7.46841, + "SIR": 12.1285, + "SAR": 7.00531, + "ISR": 13.5816 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.15287, + "SIR": 18.4751, + "SAR": 6.21281, + "ISR": 11.6394 + }, + "drums": { + "SDR": 9.453, + "SIR": 17.7372, + "SAR": 10.1852, + "ISR": 16.6252 + }, + "bass": { + "SDR": 17.4451, + "SIR": 29.9173, + "SAR": 15.9392, + "ISR": 19.2901 + }, + "other": { + "SDR": 7.01304, + "SIR": 10.2876, + "SAR": 7.1112, + "ISR": 14.2461 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 10.925, + "SIR": 25.9155, + "SAR": 11.397, + "ISR": 20.0906 + }, + "drums": { + "SDR": 7.77766, + "SIR": 17.8595, + "SAR": 8.13634, + "ISR": 15.0445 + }, + "bass": { + "SDR": 10.1941, + "SIR": 22.6631, + "SAR": 9.63813, + "ISR": 14.0471 + }, + "other": { + "SDR": 10.9618, + "SIR": 17.5331, + "SAR": 11.5776, + "ISR": 19.6973 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 9.86742, + "SIR": 17.6698, + "SAR": 9.09544, + "ISR": 14.7304 + }, + "drums": { + "SDR": 9.65639, + "SIR": 18.3177, + "SAR": 9.66205, + "ISR": 15.5911 + }, + "bass": { + "SDR": 15.3681, + "SIR": 29.0374, + "SAR": 14.3688, + "ISR": 20.5504 + }, + "other": { + "SDR": 10.7408, + "SIR": 14.9256, + "SAR": 9.80483, + "ISR": 16.4024 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 13.2306, + "SIR": 22.3695, + "SAR": 13.1633, + "ISR": 24.1674 + }, + "drums": { + "SDR": 10.0162, + "SIR": 14.3347, + "SAR": 9.38603, + "ISR": 17.3695 + }, + "bass": { + "SDR": 11.0374, + "SIR": 19.7294, + "SAR": 7.4226, + "ISR": 8.89045 + }, + "other": { + "SDR": 9.09514, + "SIR": 11.4196, + "SAR": 7.90024, + "ISR": 17.413 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 10.3326, + "SIR": 18.4057, + "SAR": 10.577, + "ISR": 19.2448 + }, + "drums": { + "SDR": 12.174, + "SIR": 21.7936, + "SAR": 13.3275, + "ISR": 19.0528 + }, + "bass": { + "SDR": 10.9604, + "SIR": 19.8011, + "SAR": 11.62, + "ISR": 19.195 + }, + "other": { + "SDR": 6.4247, + "SIR": 12.8973, + "SAR": 6.68105, + "ISR": 12.1017 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 6.48775, + "SIR": 16.9004, + "SAR": 6.89733, + "ISR": 14.7807 + }, + "drums": { + "SDR": 6.63689, + "SIR": 16.8225, + "SAR": 6.69713, + "ISR": 12.3227 + }, + "bass": { + "SDR": 13.5712, + "SIR": 23.3432, + "SAR": 14.5354, + "ISR": 22.564 + }, + "other": { + "SDR": 10.6269, + "SIR": 17.8247, + "SAR": 9.36735, + "ISR": 15.6004 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.86742, + "SIR": 17.6698, + "SAR": 9.54323, + "ISR": 16.0121 + }, + "drums": { + "SDR": 9.44627, + "SIR": 18.3177, + "SAR": 9.66205, + "ISR": 15.5911 + }, + "bass": { + "SDR": 11.6443, + "SIR": 22.6631, + "SAR": 11.62, + "ISR": 17.2754 + } + }, + "stems": [ + "vocals", + "drums", + "bass", + "other" + ], + "target_stem": null + }, + "hdemucs_mmi.yaml": { + "model_name": "Demucs v4: hdemucs_mmi", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.56426, + "SIR": 15.3421, + "SAR": 5.81316, + "ISR": 13.3612 + }, + "drums": { + "SDR": 4.76153, + "SIR": 17.0363, + "SAR": 3.95759, + "ISR": 7.58476 + }, + "bass": { + "SDR": 19.1023, + "SIR": 24.9967, + "SAR": 20.0212, + "ISR": 26.5658 + }, + "other": { + "SDR": 9.95157, + "SIR": 16.1186, + "SAR": 11.1911, + "ISR": 18.8137 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 7.4434, + "SIR": 18.4871, + "SAR": 7.33728, + "ISR": 14.0059 + }, + "drums": { + "SDR": 8.96928, + "SIR": 21.1526, + "SAR": 10.1224, + "ISR": 12.9924 + }, + "bass": { + "SDR": 12.7492, + "SIR": 19.4508, + "SAR": 13.3306, + "ISR": 16.4465 + }, + "other": { + "SDR": 7.773, + "SIR": 13.5621, + "SAR": 8.92433, + "ISR": 16.5778 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.4397, + "SIR": 17.8346, + "SAR": 10.4412, + "ISR": 19.5344 + }, + "drums": { + "SDR": 11.3684, + "SIR": 20.2939, + "SAR": 11.5673, + "ISR": 21.5121 + }, + "bass": { + "SDR": 11.2627, + "SIR": 21.99, + "SAR": 9.48758, + "ISR": 13.1898 + }, + "other": { + "SDR": 6.23897, + "SIR": 11.8417, + "SAR": 5.5416, + "ISR": 12.7981 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.06505, + "SIR": 5.26505, + "SAR": 5.28702, + "ISR": 15.1863 + }, + "drums": { + "SDR": 8.99905, + "SIR": 16.9155, + "SAR": 10.0134, + "ISR": 17.2106 + }, + "bass": { + "SDR": 6.30738, + "SIR": 20.8858, + "SAR": 7.01856, + "ISR": 8.89273 + }, + "other": { + "SDR": 0.16473, + "SIR": -0.41634, + "SAR": 0.47168, + "ISR": 4.62325 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 11.4024, + "SIR": 19.8252, + "SAR": 11.7951, + "ISR": 19.8887 + }, + "drums": { + "SDR": 9.82706, + "SIR": 20.2907, + "SAR": 10.7675, + "ISR": 15.9836 + }, + "bass": { + "SDR": 12.2277, + "SIR": 21.215, + "SAR": 11.9833, + "ISR": 17.5396 + }, + "other": { + "SDR": 7.83546, + "SIR": 13.0879, + "SAR": 7.86218, + "ISR": 13.9801 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.74169, + "SIR": 14.1201, + "SAR": 9.72683, + "ISR": 16.3828 + }, + "drums": { + "SDR": 9.63568, + "SIR": 18.6127, + "SAR": 11.0021, + "ISR": 14.2895 + }, + "bass": { + "SDR": 8.64882, + "SIR": 15.1677, + "SAR": 8.37584, + "ISR": 14.0595 + }, + "other": { + "SDR": 6.76545, + "SIR": 12.2364, + "SAR": 7.54473, + "ISR": 12.0405 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.3752, + "SIR": 16.6912, + "SAR": 11.2973, + "ISR": 18.7731 + }, + "drums": { + "SDR": 9.92437, + "SIR": 19.1125, + "SAR": 10.9707, + "ISR": 15.7898 + }, + "bass": { + "SDR": 18.0335, + "SIR": 28.3402, + "SAR": 14.6807, + "ISR": 17.7093 + }, + "other": { + "SDR": 7.6504, + "SIR": 12.427, + "SAR": 7.33266, + "ISR": 13.8777 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.47528, + "SIR": 18.6816, + "SAR": 6.52616, + "ISR": 12.4384 + }, + "drums": { + "SDR": 9.27946, + "SIR": 17.0606, + "SAR": 9.8061, + "ISR": 16.807 + }, + "bass": { + "SDR": 17.2024, + "SIR": 28.3713, + "SAR": 15.8922, + "ISR": 19.6174 + }, + "other": { + "SDR": 7.28211, + "SIR": 10.9266, + "SAR": 7.11841, + "ISR": 13.9155 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.343, + "SIR": 27.1768, + "SAR": 11.8133, + "ISR": 20.8925 + }, + "drums": { + "SDR": 8.0797, + "SIR": 18.5335, + "SAR": 8.60186, + "ISR": 15.311 + }, + "bass": { + "SDR": 10.1394, + "SIR": 24.832, + "SAR": 9.70667, + "ISR": 13.4208 + }, + "other": { + "SDR": 11.4582, + "SIR": 17.4309, + "SAR": 11.9787, + "ISR": 21.244 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 10.166, + "SIR": 18.4076, + "SAR": 9.40416, + "ISR": 15.2365 + }, + "drums": { + "SDR": 9.99903, + "SIR": 18.2487, + "SAR": 10.1007, + "ISR": 16.4779 + }, + "bass": { + "SDR": 15.9573, + "SIR": 30.6784, + "SAR": 14.9032, + "ISR": 21.2961 + }, + "other": { + "SDR": 11.0211, + "SIR": 15.3572, + "SAR": 10.0456, + "ISR": 16.9093 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 13.3994, + "SIR": 22.7286, + "SAR": 13.1524, + "ISR": 24.0039 + }, + "drums": { + "SDR": 10.4857, + "SIR": 16.1989, + "SAR": 10.5346, + "ISR": 18.7091 + }, + "bass": { + "SDR": 11.8582, + "SIR": 21.4109, + "SAR": 8.26932, + "ISR": 10.35 + }, + "other": { + "SDR": 9.60429, + "SIR": 12.8069, + "SAR": 8.63633, + "ISR": 18.5483 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 10.44, + "SIR": 18.3898, + "SAR": 10.5196, + "ISR": 19.6375 + }, + "drums": { + "SDR": 11.9998, + "SIR": 20.8655, + "SAR": 13.0245, + "ISR": 19.6137 + }, + "bass": { + "SDR": 10.7698, + "SIR": 19.1833, + "SAR": 11.2627, + "ISR": 18.7348 + }, + "other": { + "SDR": 6.34637, + "SIR": 13.0994, + "SAR": 6.5491, + "ISR": 11.8594 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 6.54255, + "SIR": 16.6517, + "SAR": 7.06569, + "ISR": 14.773 + }, + "drums": { + "SDR": 6.66935, + "SIR": 16.3642, + "SAR": 6.84015, + "ISR": 12.5482 + }, + "bass": { + "SDR": 14.5047, + "SIR": 23.776, + "SAR": 15.0442, + "ISR": 23.5945 + }, + "other": { + "SDR": 10.7118, + "SIR": 17.9435, + "SAR": 9.71123, + "ISR": 15.856 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.166, + "SIR": 18.3898, + "SAR": 9.72683, + "ISR": 16.3828 + }, + "drums": { + "SDR": 9.63568, + "SIR": 18.5335, + "SAR": 10.1224, + "ISR": 15.9836 + }, + "bass": { + "SDR": 12.2277, + "SIR": 21.99, + "SAR": 11.9833, + "ISR": 17.5396 + } + }, + "stems": [ + "vocals", + "drums", + "bass", + "other" + ], + "target_stem": null + }, + "htdemucs_6s.yaml": { + "model_name": "Demucs v4: htdemucs_6s", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 5.0671, + "SIR": 14.5366, + "SAR": 5.39175, + "ISR": 13.2148 + }, + "drums": { + "SDR": 2.79582, + "SIR": 16.3173, + "SAR": 1.06495, + "ISR": 4.3619 + }, + "bass": { + "SDR": 17.5429, + "SIR": 22.165, + "SAR": 19.0201, + "ISR": 25.5315 + }, + "other": { + "SDR": 0.00485, + "SIR": 12.9123, + "SAR": 0.02412, + "ISR": 0.13107 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 5.63418, + "SIR": 10.3112, + "SAR": 6.45533, + "ISR": 14.8126 + }, + "drums": { + "SDR": 6.25735, + "SIR": 12.8745, + "SAR": 6.40789, + "ISR": 12.4119 + }, + "bass": { + "SDR": 9.5516, + "SIR": 17.7919, + "SAR": 11.9827, + "ISR": 11.8647 + }, + "other": { + "SDR": 3.64451, + "SIR": 10.5018, + "SAR": 4.14296, + "ISR": 6.22975 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 9.70294, + "SIR": 15.0099, + "SAR": 9.54043, + "ISR": 19.8526 + }, + "drums": { + "SDR": 7.11087, + "SIR": 11.8272, + "SAR": 7.93243, + "ISR": 15.9744 + }, + "bass": { + "SDR": 1.74278, + "SIR": 3.81685, + "SAR": 8.21649, + "ISR": 13.9148 + }, + "other": { + "SDR": 0.13952, + "SIR": 7.06959, + "SAR": -1.65524, + "ISR": 0.40887 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.08539, + "SIR": 4.85948, + "SAR": 5.63099, + "ISR": 15.7776 + }, + "drums": { + "SDR": 9.07883, + "SIR": 17.2557, + "SAR": 10.2048, + "ISR": 16.9867 + }, + "bass": { + "SDR": 7.49909, + "SIR": 22.7875, + "SAR": 7.81107, + "ISR": 9.45955 + }, + "other": { + "SDR": 0.00127, + "SIR": 8.74872, + "SAR": -0.0027, + "ISR": 0.06903 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 10.7929, + "SIR": 19.1612, + "SAR": 10.36, + "ISR": 15.8442 + }, + "drums": { + "SDR": 8.5171, + "SIR": 18.4964, + "SAR": 9.6957, + "ISR": 14.3901 + }, + "bass": { + "SDR": 10.9652, + "SIR": 19.6768, + "SAR": 10.7187, + "ISR": 17.096 + }, + "other": { + "SDR": 0.00125, + "SIR": -5.48266, + "SAR": -0.00771, + "ISR": 0.28972 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.20336, + "SIR": 14.534, + "SAR": 8.71192, + "ISR": 14.5608 + }, + "drums": { + "SDR": 8.66795, + "SIR": 16.6126, + "SAR": 10.1273, + "ISR": 13.5402 + }, + "bass": { + "SDR": 7.20517, + "SIR": 6.83853, + "SAR": 6.68404, + "ISR": 15.6228 + }, + "other": { + "SDR": 0.02392, + "SIR": 7.57753, + "SAR": -0.00311, + "ISR": 0.30841 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 9.43828, + "SIR": 16.808, + "SAR": 10.1425, + "ISR": 15.452 + }, + "drums": { + "SDR": 8.94208, + "SIR": 17.6703, + "SAR": 10.1135, + "ISR": 14.4929 + }, + "bass": { + "SDR": 15.8599, + "SIR": 18.764, + "SAR": 14.2832, + "ISR": 18.077 + }, + "other": { + "SDR": 8e-05, + "SIR": -14.1842, + "SAR": -7.86712, + "ISR": 0.00216 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.30089, + "SIR": 18.2651, + "SAR": 6.41398, + "ISR": 12.5593 + }, + "drums": { + "SDR": 6.13333, + "SIR": 20.9043, + "SAR": 7.60224, + "ISR": 9.38209 + }, + "bass": { + "SDR": 15.978, + "SIR": 28.2875, + "SAR": 14.5916, + "ISR": 17.9402 + }, + "other": { + "SDR": 0.111825, + "SIR": 4.44369, + "SAR": -0.20347, + "ISR": 0.3609 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.2096, + "SIR": 24.5018, + "SAR": 11.5893, + "ISR": 20.4149 + }, + "drums": { + "SDR": 7.6472, + "SIR": 19.1537, + "SAR": 7.98651, + "ISR": 14.0588 + }, + "bass": { + "SDR": 10.0312, + "SIR": 22.72, + "SAR": 9.88463, + "ISR": 13.9168 + }, + "other": { + "SDR": 0.0433, + "SIR": 16.9533, + "SAR": -0.00019, + "ISR": 0.27942 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 9.7852, + "SIR": 16.1949, + "SAR": 8.14363, + "ISR": 13.5847 + }, + "drums": { + "SDR": 8.81943, + "SIR": 18.9322, + "SAR": 8.76285, + "ISR": 11.9054 + }, + "bass": { + "SDR": 14.3802, + "SIR": 25.3279, + "SAR": 13.4473, + "ISR": 19.752 + }, + "other": { + "SDR": 0.00093, + "SIR": 9.72642, + "SAR": 0.00346, + "ISR": 0.78442 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 12.7892, + "SIR": 22.1083, + "SAR": 12.5385, + "ISR": 23.5863 + }, + "drums": { + "SDR": 8.42774, + "SIR": 13.9938, + "SAR": 7.77331, + "ISR": 13.3034 + }, + "bass": { + "SDR": 10.1646, + "SIR": 21.423, + "SAR": 6.79117, + "ISR": 7.58549 + }, + "other": { + "SDR": 1.10106, + "SIR": 4.73975, + "SAR": 0.40972, + "ISR": 2.0314 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.78957, + "SIR": 18.8723, + "SAR": 9.74884, + "ISR": 17.129 + }, + "drums": { + "SDR": 11.2418, + "SIR": 20.2537, + "SAR": 12.5271, + "ISR": 17.513 + }, + "bass": { + "SDR": 9.24887, + "SIR": 15.5493, + "SAR": 10.9884, + "ISR": 15.6575 + }, + "other": { + "SDR": 0.01212, + "SIR": 7.35532, + "SAR": -0.150605, + "ISR": 0.14977 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.57061, + "SIR": 16.5014, + "SAR": 9.12617, + "ISR": 15.6148 + }, + "drums": { + "SDR": 8.47242, + "SIR": 17.463, + "SAR": 8.37468, + "ISR": 13.7995 + }, + "bass": { + "SDR": 10.0979, + "SIR": 20.5499, + "SAR": 10.8536, + "ISR": 15.6402 + } + }, + "stems": [ + "vocals", + "drums", + "bass", + "guitar", + "piano", + "other" + ], + "target_stem": null + }, + "MDX23C-8KFFT-InstVoc_HQ.ckpt": { + "model_name": "MDX23C Model: MDX23C-InstVoc HQ", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 6.73898, + "SIR": 23.2009, + "SAR": 6.78415, + "ISR": 11.0084 + }, + "instrumental": { + "SDR": 17.1121, + "SIR": 25.9275, + "SAR": 20.4969, + "ISR": 19.2533 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 7.38292, + "SIR": 14.01, + "SAR": 7.95108, + "ISR": 12.7761 + }, + "instrumental": { + "SDR": 12.5347, + "SIR": 22.1489, + "SAR": 14.6948, + "ISR": 15.648 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 11.3468, + "SIR": 23.873, + "SAR": 12.0537, + "ISR": 15.6858 + }, + "instrumental": { + "SDR": 16.3686, + "SIR": 27.8991, + "SAR": 19.2361, + "ISR": 18.5818 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.87827, + "SIR": 5.4187, + "SAR": 4.89509, + "ISR": 13.4183 + }, + "instrumental": { + "SDR": 11.1203, + "SIR": 27.1057, + "SAR": 13.5972, + "ISR": 13.1595 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 13.3779, + "SIR": 25.2843, + "SAR": 14.5687, + "ISR": 16.7121 + }, + "instrumental": { + "SDR": 15.3063, + "SIR": 26.1264, + "SAR": 16.6579, + "ISR": 17.8816 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.6646, + "SIR": 19.9085, + "SAR": 11.483, + "ISR": 15.2706 + }, + "instrumental": { + "SDR": 12.5504, + "SIR": 23.0013, + "SAR": 14.0207, + "ISR": 16.3965 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 12.554, + "SIR": 22.1606, + "SAR": 13.7291, + "ISR": 15.7148 + }, + "instrumental": { + "SDR": 15.7628, + "SIR": 25.629, + "SAR": 18.1076, + "ISR": 18.2059 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 7.62088, + "SIR": 23.0322, + "SAR": 7.45352, + "ISR": 11.5589 + }, + "instrumental": { + "SDR": 18.5467, + "SIR": 30.4189, + "SAR": 25.3794, + "ISR": 19.5884 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 13.3471, + "SIR": 33.401, + "SAR": 14.501, + "ISR": 17.2427 + }, + "instrumental": { + "SDR": 16.2384, + "SIR": 29.2133, + "SAR": 18.9258, + "ISR": 19.2428 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 13.3743, + "SIR": 22.9828, + "SAR": 12.1323, + "ISR": 13.2697 + }, + "instrumental": { + "SDR": 16.9206, + "SIR": 20.6224, + "SAR": 17.3149, + "ISR": 18.0976 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 15.4204, + "SIR": 35.9524, + "SAR": 17.5186, + "ISR": 18.4415 + }, + "instrumental": { + "SDR": 17.2411, + "SIR": 32.3095, + "SAR": 20.8858, + "ISR": 19.4741 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 12.2009, + "SIR": 23.8371, + "SAR": 12.8101, + "ISR": 16.0466 + }, + "instrumental": { + "SDR": 16.0736, + "SIR": 27.8804, + "SAR": 18.726, + "ISR": 18.6299 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.97006, + "SIR": 20.0496, + "SAR": 8.53451, + "ISR": 13.8451 + }, + "instrumental": { + "SDR": 15.7593, + "SIR": 27.0842, + "SAR": 18.1094, + "ISR": 17.9407 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 9.74997, + "SIR": 15.0591, + "SAR": 9.86238, + "ISR": 13.8809 + }, + "instrumental": { + "SDR": 17.1608, + "SIR": 25.7753, + "SAR": 20.1306, + "ISR": 17.644 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 4.07479, + "SIR": 19.0069, + "SAR": 4.37509, + "ISR": 9.54885 + }, + "instrumental": { + "SDR": 15.8448, + "SIR": 22.8352, + "SAR": 19.1224, + "ISR": 18.894 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.4556, + "SIR": 22.0348, + "SAR": 11.386, + "ISR": 15.5782 + }, + "instrumental": { + "SDR": 15.1515, + "SIR": 26.6208, + "SAR": 17.2912, + "ISR": 18.0243 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 9.46556, + "SIR": 25.8202, + "SAR": 9.94502, + "ISR": 13.9694 + }, + "instrumental": { + "SDR": 15.8138, + "SIR": 25.5767, + "SAR": 18.4636, + "ISR": 18.9653 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -12.6087, + "SIR": -36.9833, + "SAR": 1.50542, + "ISR": 12.5769 + }, + "instrumental": { + "SDR": 13.7282, + "SIR": 58.4948, + "SAR": 13.4711, + "ISR": 12.5155 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.88428, + "SIR": 17.5921, + "SAR": 8.1219, + "ISR": 11.6351 + }, + "instrumental": { + "SDR": 16.9194, + "SIR": 23.1384, + "SAR": 19.3188, + "ISR": 18.2253 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 12.0926, + "SIR": 25.8245, + "SAR": 12.7132, + "ISR": 16.077 + }, + "instrumental": { + "SDR": 16.5513, + "SIR": 28.9507, + "SAR": 19.4746, + "ISR": 18.9786 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 11.9115, + "SIR": 25.6961, + "SAR": 13.2219, + "ISR": 16.6918 + }, + "instrumental": { + "SDR": 18.1611, + "SIR": 33.2309, + "SAR": 23.0705, + "ISR": 19.3022 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -0.16416, + "SIR": 4.4042, + "SAR": 0.05471, + "ISR": 4.38211 + }, + "instrumental": { + "SDR": 19.8397, + "SIR": 41.5509, + "SAR": 35.7546, + "ISR": 19.4909 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.28362, + "SIR": 15.3849, + "SAR": 4.09141, + "ISR": 6.73268 + }, + "instrumental": { + "SDR": 10.9246, + "SIR": 14.539, + "SAR": 14.6647, + "ISR": 17.3386 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 7.54968, + "SIR": 18.2247, + "SAR": 8.70481, + "ISR": 14.1121 + }, + "instrumental": { + "SDR": 17.6522, + "SIR": 31.2048, + "SAR": 21.3056, + "ISR": 18.8564 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 8.01052, + "SIR": 19.3712, + "SAR": 8.33947, + "ISR": 11.8011 + }, + "instrumental": { + "SDR": 14.824, + "SIR": 22.7367, + "SAR": 17.6442, + "ISR": 18.402 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 9.41012, + "SIR": 18.1949, + "SAR": 9.70601, + "ISR": 14.8742 + }, + "instrumental": { + "SDR": 15.8248, + "SIR": 26.6713, + "SAR": 17.9028, + "ISR": 17.6604 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 12.6009, + "SIR": 26.7887, + "SAR": 13.3081, + "ISR": 15.0671 + }, + "instrumental": { + "SDR": 14.0958, + "SIR": 22.5415, + "SAR": 15.7374, + "ISR": 18.089 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 7.15313, + "SIR": 17.8866, + "SAR": 6.74711, + "ISR": 11.1515 + }, + "instrumental": { + "SDR": 13.4603, + "SIR": 18.8979, + "SAR": 14.6241, + "ISR": 16.7606 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 11.2043, + "SIR": 26.191, + "SAR": 11.8918, + "ISR": 16.3238 + }, + "instrumental": { + "SDR": 15.5086, + "SIR": 27.4539, + "SAR": 18.1744, + "ISR": 18.2449 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 15.2326, + "SIR": 31.5087, + "SAR": 15.5602, + "ISR": 16.8085 + }, + "instrumental": { + "SDR": 15.6703, + "SIR": 21.9884, + "SAR": 16.0163, + "ISR": 18.9873 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 12.0955, + "SIR": 25.9309, + "SAR": 12.9834, + "ISR": 15.9593 + }, + "instrumental": { + "SDR": 14.8437, + "SIR": 24.8055, + "SAR": 16.4884, + "ISR": 18.1214 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.7046, + "SIR": 33.2659, + "SAR": 12.3268, + "ISR": 13.4 + }, + "instrumental": { + "SDR": 17.9052, + "SIR": 24.7932, + "SAR": 22.0302, + "ISR": 19.7173 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 5.42777, + "SIR": 11.5231, + "SAR": 8.26833, + "ISR": 9.98201 + }, + "instrumental": { + "SDR": 12.6014, + "SIR": 16.8602, + "SAR": 15.9387, + "ISR": 16.5381 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.5795, + "SIR": 27.7323, + "SAR": 14.8579, + "ISR": 17.9123 + }, + "instrumental": { + "SDR": 18.8312, + "SIR": 36.546, + "SAR": 25.3191, + "ISR": 19.4355 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.0573, + "SIR": 20.2084, + "SAR": 12.477, + "ISR": 16.8164 + }, + "instrumental": { + "SDR": 11.984, + "SIR": 23.4887, + "SAR": 12.7893, + "ISR": 15.024 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 9.11092, + "SIR": 24.5388, + "SAR": 9.48577, + "ISR": 14.2664 + }, + "instrumental": { + "SDR": 14.749, + "SIR": 24.6584, + "SAR": 16.3334, + "ISR": 18.2321 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 4.59973, + "SIR": 6.31592, + "SAR": 2.70559, + "ISR": 10.9212 + }, + "instrumental": { + "SDR": 18.4726, + "SIR": 32.1754, + "SAR": 22.7474, + "ISR": 18.0809 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.6567, + "SIR": 26.1735, + "SAR": 11.4635, + "ISR": 15.9297 + }, + "instrumental": { + "SDR": 17.3897, + "SIR": 31.1462, + "SAR": 21.1957, + "ISR": 19.0793 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 12.5711, + "SIR": 30.6399, + "SAR": 13.223, + "ISR": 16.8552 + }, + "instrumental": { + "SDR": 18.3343, + "SIR": 34.1548, + "SAR": 23.5703, + "ISR": 19.4742 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 15.0289, + "SIR": 31.4403, + "SAR": 16.3209, + "ISR": 17.6846 + }, + "instrumental": { + "SDR": 16.9739, + "SIR": 30.3621, + "SAR": 20.016, + "ISR": 18.994 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.5562, + "SIR": 23.0075, + "SAR": 11.4247, + "ISR": 14.5703 + }, + "instrumental": { + "SDR": 15.8348, + "SIR": 26.3736, + "SAR": 18.319, + "ISR": 18.2385 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": null + }, + "MDX23C_D1581.ckpt": { + "model_name": "MDX23C Model VIP: MDX23C_D1581", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 6.95222, + "SIR": 20.5681, + "SAR": 6.71226, + "ISR": 10.7332 + }, + "instrumental": { + "SDR": 16.8928, + "SIR": 25.3018, + "SAR": 20.6132, + "ISR": 19.1445 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.0582, + "SIR": 10.5784, + "SAR": 6.98246, + "ISR": 12.6513 + }, + "instrumental": { + "SDR": 10.9396, + "SIR": 21.5384, + "SAR": 12.9976, + "ISR": 13.8444 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.4242, + "SIR": 22.6483, + "SAR": 11.1974, + "ISR": 14.7769 + }, + "instrumental": { + "SDR": 15.8795, + "SIR": 26.0687, + "SAR": 18.6638, + "ISR": 18.3732 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.72703, + "SIR": 5.84843, + "SAR": 4.50749, + "ISR": 12.5716 + }, + "instrumental": { + "SDR": 11.2627, + "SIR": 25.1382, + "SAR": 13.773, + "ISR": 13.5577 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.749, + "SIR": 23.4798, + "SAR": 13.9222, + "ISR": 16.4496 + }, + "instrumental": { + "SDR": 14.6657, + "SIR": 25.2511, + "SAR": 16.0408, + "ISR": 17.4514 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.05, + "SIR": 18.9015, + "SAR": 11.1099, + "ISR": 14.4769 + }, + "instrumental": { + "SDR": 12.0495, + "SIR": 20.9268, + "SAR": 13.8577, + "ISR": 15.9558 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.6556, + "SIR": 20.3714, + "SAR": 13.1095, + "ISR": 14.8805 + }, + "instrumental": { + "SDR": 15.3011, + "SIR": 23.7043, + "SAR": 17.9684, + "ISR": 17.9062 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.68583, + "SIR": 22.1936, + "SAR": 6.83291, + "ISR": 10.5457 + }, + "instrumental": { + "SDR": 18.3252, + "SIR": 29.4822, + "SAR": 25.2045, + "ISR": 19.493 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.4956, + "SIR": 31.6306, + "SAR": 13.3118, + "ISR": 16.4537 + }, + "instrumental": { + "SDR": 15.4926, + "SIR": 27.3243, + "SAR": 17.878, + "ISR": 19.0089 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.5858, + "SIR": 22.691, + "SAR": 11.3572, + "ISR": 12.6234 + }, + "instrumental": { + "SDR": 16.3815, + "SIR": 19.7589, + "SAR": 16.6567, + "ISR": 17.9925 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.8029, + "SIR": 32.5823, + "SAR": 16.8474, + "ISR": 17.8622 + }, + "instrumental": { + "SDR": 16.7483, + "SIR": 30.1575, + "SAR": 19.8694, + "ISR": 19.2232 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.6875, + "SIR": 19.4326, + "SAR": 12.2091, + "ISR": 15.9124 + }, + "instrumental": { + "SDR": 15.4387, + "SIR": 27.8999, + "SAR": 17.7655, + "ISR": 17.6928 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.95235, + "SIR": 20.2625, + "SAR": 8.44388, + "ISR": 13.6896 + }, + "instrumental": { + "SDR": 15.7267, + "SIR": 26.6715, + "SAR": 18.1927, + "ISR": 17.9964 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.99275, + "SIR": 13.559, + "SAR": 8.99798, + "ISR": 13.594 + }, + "instrumental": { + "SDR": 16.7164, + "SIR": 25.4359, + "SAR": 18.6415, + "ISR": 17.0244 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.96877, + "SIR": 16.4629, + "SAR": 3.95051, + "ISR": 9.61576 + }, + "instrumental": { + "SDR": 15.1124, + "SIR": 22.7617, + "SAR": 18.7659, + "ISR": 18.4551 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.025, + "SIR": 21.4115, + "SAR": 10.8718, + "ISR": 14.7403 + }, + "instrumental": { + "SDR": 14.7134, + "SIR": 24.7548, + "SAR": 16.9224, + "ISR": 17.9557 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.76723, + "SIR": 23.8811, + "SAR": 9.06669, + "ISR": 13.0727 + }, + "instrumental": { + "SDR": 15.495, + "SIR": 24.0629, + "SAR": 18.2234, + "ISR": 18.7304 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -6.95664, + "SIR": -34.2185, + "SAR": 1.15597, + "ISR": 7.36254 + }, + "instrumental": { + "SDR": 14.0112, + "SIR": 56.6464, + "SAR": 14.9971, + "ISR": 14.0802 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.44438, + "SIR": 15.5031, + "SAR": 7.35615, + "ISR": 11.1522 + }, + "instrumental": { + "SDR": 16.6152, + "SIR": 21.9035, + "SAR": 18.8112, + "ISR": 17.6714 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.828, + "SIR": 25.2884, + "SAR": 12.3884, + "ISR": 15.7958 + }, + "instrumental": { + "SDR": 16.4307, + "SIR": 28.6347, + "SAR": 19.2186, + "ISR": 18.8714 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 11.4599, + "SIR": 25.4414, + "SAR": 12.4564, + "ISR": 16.0694 + }, + "instrumental": { + "SDR": 18.0562, + "SIR": 31.6105, + "SAR": 22.5894, + "ISR": 19.2663 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -0.32329, + "SIR": -0.933135, + "SAR": 0.30699, + "ISR": 3.58862 + }, + "instrumental": { + "SDR": 19.8396, + "SIR": 44.9643, + "SAR": 36.1532, + "ISR": 19.4394 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.1447, + "SIR": 14.8254, + "SAR": 4.01271, + "ISR": 6.4612 + }, + "instrumental": { + "SDR": 10.7491, + "SIR": 14.1851, + "SAR": 14.741, + "ISR": 17.2247 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 7.22039, + "SIR": 18.572, + "SAR": 8.36052, + "ISR": 14.0024 + }, + "instrumental": { + "SDR": 17.7028, + "SIR": 30.4091, + "SAR": 21.4053, + "ISR": 18.8582 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.63389, + "SIR": 18.5149, + "SAR": 8.08097, + "ISR": 11.3776 + }, + "instrumental": { + "SDR": 14.6081, + "SIR": 22.1313, + "SAR": 17.6455, + "ISR": 18.2681 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.9865, + "SIR": 17.2055, + "SAR": 9.47226, + "ISR": 14.4632 + }, + "instrumental": { + "SDR": 15.4311, + "SIR": 25.9314, + "SAR": 17.5717, + "ISR": 17.3099 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 12.179, + "SIR": 24.6598, + "SAR": 12.8949, + "ISR": 15.3986 + }, + "instrumental": { + "SDR": 13.7093, + "SIR": 23.3597, + "SAR": 15.2359, + "ISR": 17.5274 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.78009, + "SIR": 14.4834, + "SAR": 6.68291, + "ISR": 11.2418 + }, + "instrumental": { + "SDR": 12.8848, + "SIR": 18.9336, + "SAR": 14.1515, + "ISR": 15.5465 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 10.8276, + "SIR": 25.2771, + "SAR": 11.3398, + "ISR": 15.6577 + }, + "instrumental": { + "SDR": 15.3617, + "SIR": 26.368, + "SAR": 17.7301, + "ISR": 18.2811 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.8442, + "SIR": 30.7545, + "SAR": 15.5245, + "ISR": 16.4158 + }, + "instrumental": { + "SDR": 15.4201, + "SIR": 20.9387, + "SAR": 15.7531, + "ISR": 18.8383 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.7526, + "SIR": 24.875, + "SAR": 12.3944, + "ISR": 15.3059 + }, + "instrumental": { + "SDR": 14.5063, + "SIR": 23.179, + "SAR": 16.2281, + "ISR": 17.8876 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.4219, + "SIR": 27.4415, + "SAR": 12.8031, + "ISR": 14.4542 + }, + "instrumental": { + "SDR": 17.505, + "SIR": 26.7677, + "SAR": 22.1047, + "ISR": 19.3817 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 4.5368, + "SIR": 10.2714, + "SAR": 7.90839, + "ISR": 9.12476 + }, + "instrumental": { + "SDR": 11.8417, + "SIR": 16.49, + "SAR": 15.5923, + "ISR": 16.1206 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.4838, + "SIR": 25.397, + "SAR": 13.3905, + "ISR": 17.4396 + }, + "instrumental": { + "SDR": 18.4647, + "SIR": 34.5499, + "SAR": 24.0095, + "ISR": 19.1439 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.9583, + "SIR": 19.614, + "SAR": 12.5138, + "ISR": 16.6528 + }, + "instrumental": { + "SDR": 11.9676, + "SIR": 23.0671, + "SAR": 12.5528, + "ISR": 14.7855 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 9.01237, + "SIR": 22.0877, + "SAR": 9.3567, + "ISR": 13.9478 + }, + "instrumental": { + "SDR": 14.3069, + "SIR": 23.9475, + "SAR": 15.9733, + "ISR": 17.7868 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.74404, + "SIR": 8.63995, + "SAR": 2.82224, + "ISR": 9.08972 + }, + "instrumental": { + "SDR": 16.4195, + "SIR": 30.6863, + "SAR": 21.0732, + "ISR": 18.0281 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.3567, + "SIR": 25.2379, + "SAR": 10.996, + "ISR": 15.2968 + }, + "instrumental": { + "SDR": 17.123, + "SIR": 29.7162, + "SAR": 20.7122, + "ISR": 18.9704 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.8574, + "SIR": 28.0471, + "SAR": 12.6925, + "ISR": 16.1998 + }, + "instrumental": { + "SDR": 18.159, + "SIR": 31.9184, + "SAR": 23.0412, + "ISR": 19.3049 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 13.5525, + "SIR": 29.6751, + "SAR": 15.4178, + "ISR": 15.9442 + }, + "instrumental": { + "SDR": 16.1069, + "SIR": 25.0944, + "SAR": 18.9055, + "ISR": 18.7154 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.0375, + "SIR": 20.9898, + "SAR": 10.9339, + "ISR": 14.4587 + }, + "instrumental": { + "SDR": 15.4657, + "SIR": 25.2765, + "SAR": 17.9232, + "ISR": 18.0123 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": null + }, + "MDX23C-8KFFT-InstVoc_HQ_2.ckpt": { + "model_name": "MDX23C Model VIP: MDX23C-InstVoc HQ 2", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 6.87617, + "SIR": 23.4542, + "SAR": 6.81798, + "ISR": 11.2126 + }, + "instrumental": { + "SDR": 17.2403, + "SIR": 26.108, + "SAR": 20.4428, + "ISR": 19.4813 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 7.42785, + "SIR": 14.0147, + "SAR": 8.01004, + "ISR": 12.9014 + }, + "instrumental": { + "SDR": 12.6142, + "SIR": 22.3347, + "SAR": 14.5291, + "ISR": 15.5849 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 11.2569, + "SIR": 24.3811, + "SAR": 11.9624, + "ISR": 15.7206 + }, + "instrumental": { + "SDR": 16.4526, + "SIR": 27.9357, + "SAR": 19.1456, + "ISR": 18.7891 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.93309, + "SIR": 5.72764, + "SAR": 4.73445, + "ISR": 13.4099 + }, + "instrumental": { + "SDR": 11.3293, + "SIR": 26.9339, + "SAR": 13.6316, + "ISR": 13.4165 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 13.407, + "SIR": 25.4063, + "SAR": 14.4249, + "ISR": 16.855 + }, + "instrumental": { + "SDR": 15.4401, + "SIR": 26.414, + "SAR": 16.6025, + "ISR": 18.0079 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.6637, + "SIR": 19.8194, + "SAR": 11.4469, + "ISR": 15.3601 + }, + "instrumental": { + "SDR": 12.5679, + "SIR": 23.1608, + "SAR": 13.9941, + "ISR": 16.4697 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 12.4933, + "SIR": 22.1722, + "SAR": 13.6547, + "ISR": 15.7551 + }, + "instrumental": { + "SDR": 15.8546, + "SIR": 25.6608, + "SAR": 18.0355, + "ISR": 18.3799 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 7.59963, + "SIR": 23.254, + "SAR": 7.12092, + "ISR": 11.4893 + }, + "instrumental": { + "SDR": 18.7756, + "SIR": 30.5474, + "SAR": 25.3609, + "ISR": 19.8576 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 13.3131, + "SIR": 34.494, + "SAR": 14.2323, + "ISR": 17.2401 + }, + "instrumental": { + "SDR": 16.2552, + "SIR": 29.1474, + "SAR": 18.729, + "ISR": 19.2638 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 13.3367, + "SIR": 22.7857, + "SAR": 11.9941, + "ISR": 13.3302 + }, + "instrumental": { + "SDR": 17.0059, + "SIR": 20.9584, + "SAR": 17.2229, + "ISR": 18.1922 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 15.3472, + "SIR": 37.2152, + "SAR": 17.3105, + "ISR": 18.4819 + }, + "instrumental": { + "SDR": 17.3685, + "SIR": 32.115, + "SAR": 20.7553, + "ISR": 19.7369 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 12.1742, + "SIR": 24.1013, + "SAR": 12.7593, + "ISR": 16.196 + }, + "instrumental": { + "SDR": 16.1898, + "SIR": 28.2734, + "SAR": 18.721, + "ISR": 18.8564 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.97711, + "SIR": 20.0952, + "SAR": 8.48382, + "ISR": 13.8196 + }, + "instrumental": { + "SDR": 15.811, + "SIR": 27.1513, + "SAR": 18.0403, + "ISR": 18.121 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 9.69804, + "SIR": 14.3328, + "SAR": 9.44229, + "ISR": 13.789 + }, + "instrumental": { + "SDR": 16.823, + "SIR": 25.6612, + "SAR": 19.4836, + "ISR": 17.5791 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 4.054, + "SIR": 19.4671, + "SAR": 4.28294, + "ISR": 9.61485 + }, + "instrumental": { + "SDR": 15.9157, + "SIR": 22.9569, + "SAR": 18.9955, + "ISR": 19.1073 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.4036, + "SIR": 22.2632, + "SAR": 11.3155, + "ISR": 15.5475 + }, + "instrumental": { + "SDR": 15.2246, + "SIR": 26.6246, + "SAR": 17.2777, + "ISR": 18.2326 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 9.42633, + "SIR": 26.8586, + "SAR": 9.84564, + "ISR": 13.9788 + }, + "instrumental": { + "SDR": 15.9222, + "SIR": 25.6412, + "SAR": 18.4247, + "ISR": 19.2462 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -11.9921, + "SIR": -36.9813, + "SAR": 1.24128, + "ISR": 12.6392 + }, + "instrumental": { + "SDR": 13.4817, + "SIR": 58.1676, + "SAR": 13.2689, + "ISR": 12.437 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.86148, + "SIR": 17.6597, + "SAR": 8.0598, + "ISR": 11.6707 + }, + "instrumental": { + "SDR": 17.067, + "SIR": 23.1786, + "SAR": 19.3498, + "ISR": 18.3737 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 12.0482, + "SIR": 26.1427, + "SAR": 12.5525, + "ISR": 16.0693 + }, + "instrumental": { + "SDR": 16.4737, + "SIR": 28.9109, + "SAR": 19.4375, + "ISR": 18.9123 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 11.7839, + "SIR": 26.0298, + "SAR": 13.0914, + "ISR": 16.7017 + }, + "instrumental": { + "SDR": 18.3767, + "SIR": 33.2707, + "SAR": 22.8728, + "ISR": 19.6077 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -0.21578, + "SIR": 5.00571, + "SAR": -0.03989, + "ISR": 4.55859 + }, + "instrumental": { + "SDR": 19.8563, + "SIR": 41.7901, + "SAR": 35.1394, + "ISR": 19.4303 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.31119, + "SIR": 15.7484, + "SAR": 4.03378, + "ISR": 6.76134 + }, + "instrumental": { + "SDR": 10.9604, + "SIR": 14.6113, + "SAR": 14.6321, + "ISR": 17.55 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 7.42907, + "SIR": 18.0411, + "SAR": 8.35173, + "ISR": 14.2391 + }, + "instrumental": { + "SDR": 17.7597, + "SIR": 31.1492, + "SAR": 21.0164, + "ISR": 19.0249 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 8.04496, + "SIR": 19.5588, + "SAR": 8.33975, + "ISR": 11.8428 + }, + "instrumental": { + "SDR": 14.8643, + "SIR": 22.8496, + "SAR": 17.5905, + "ISR": 18.6339 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 9.34298, + "SIR": 18.4773, + "SAR": 9.67408, + "ISR": 14.9727 + }, + "instrumental": { + "SDR": 15.8701, + "SIR": 26.8708, + "SAR": 17.7779, + "ISR": 17.8068 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 12.455, + "SIR": 26.7561, + "SAR": 13.1383, + "ISR": 15.0391 + }, + "instrumental": { + "SDR": 14.0942, + "SIR": 22.4359, + "SAR": 15.5258, + "ISR": 18.1932 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 7.05343, + "SIR": 17.4415, + "SAR": 6.66362, + "ISR": 11.2003 + }, + "instrumental": { + "SDR": 13.4202, + "SIR": 19.008, + "SAR": 14.48, + "ISR": 16.6802 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 11.1993, + "SIR": 26.0982, + "SAR": 11.7279, + "ISR": 16.1879 + }, + "instrumental": { + "SDR": 15.1402, + "SIR": 27.1198, + "SAR": 17.7607, + "ISR": 17.8452 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 15.2233, + "SIR": 32.2725, + "SAR": 15.4792, + "ISR": 16.7394 + }, + "instrumental": { + "SDR": 15.747, + "SIR": 21.9231, + "SAR": 15.9607, + "ISR": 19.2218 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 12.1553, + "SIR": 26.3986, + "SAR": 12.7755, + "ISR": 15.9839 + }, + "instrumental": { + "SDR": 14.8491, + "SIR": 24.8442, + "SAR": 16.4969, + "ISR": 18.2967 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.6719, + "SIR": 33.0287, + "SAR": 12.6361, + "ISR": 14.3029 + }, + "instrumental": { + "SDR": 17.9172, + "SIR": 26.5597, + "SAR": 22.3544, + "ISR": 19.6802 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 5.54675, + "SIR": 10.8237, + "SAR": 8.67814, + "ISR": 10.5822 + }, + "instrumental": { + "SDR": 12.4174, + "SIR": 17.4604, + "SAR": 16.1392, + "ISR": 16.072 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.5144, + "SIR": 27.8448, + "SAR": 14.7456, + "ISR": 17.9309 + }, + "instrumental": { + "SDR": 19.0967, + "SIR": 36.667, + "SAR": 25.1275, + "ISR": 19.7392 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.1499, + "SIR": 20.2272, + "SAR": 12.3885, + "ISR": 17.0839 + }, + "instrumental": { + "SDR": 12.0272, + "SIR": 24.4044, + "SAR": 12.7057, + "ISR": 15.0756 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 9.08337, + "SIR": 24.7954, + "SAR": 9.38067, + "ISR": 14.3144 + }, + "instrumental": { + "SDR": 14.7452, + "SIR": 24.6377, + "SAR": 16.2441, + "ISR": 18.3736 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 4.58177, + "SIR": 6.47052, + "SAR": 2.59301, + "ISR": 10.9061 + }, + "instrumental": { + "SDR": 18.6437, + "SIR": 32.1906, + "SAR": 22.6347, + "ISR": 18.314 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.6238, + "SIR": 26.6215, + "SAR": 11.417, + "ISR": 15.9769 + }, + "instrumental": { + "SDR": 17.5271, + "SIR": 31.3342, + "SAR": 21.0824, + "ISR": 19.3129 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 12.5055, + "SIR": 31.4731, + "SAR": 13.1795, + "ISR": 16.6647 + }, + "instrumental": { + "SDR": 18.4959, + "SIR": 33.6911, + "SAR": 23.4512, + "ISR": 19.7558 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 14.3247, + "SIR": 31.9899, + "SAR": 15.8975, + "ISR": 17.1669 + }, + "instrumental": { + "SDR": 16.8544, + "SIR": 28.4349, + "SAR": 19.8302, + "ISR": 19.2184 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.5137, + "SIR": 23.0198, + "SAR": 11.3663, + "ISR": 14.6435 + }, + "instrumental": { + "SDR": 15.9189, + "SIR": 26.5922, + "SAR": 18.2325, + "ISR": 18.3768 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": null + }, + "model_bs_roformer_ep_317_sdr_12.9755.ckpt": { + "model_name": "Roformer Model: BS-Roformer-Viperx-1297", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 7.27145, + "SIR": 21.3266, + "SAR": 6.89905, + "ISR": 12.7087 + }, + "instrumental": { + "SDR": 17.2885, + "SIR": 28.2786, + "SAR": 20.7563, + "ISR": 19.1431 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 9.36916, + "SIR": 25.2781, + "SAR": 9.32521, + "ISR": 13.8011 + }, + "instrumental": { + "SDR": 14.7147, + "SIR": 24.0983, + "SAR": 16.5033, + "ISR": 18.6872 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 13.0209, + "SIR": 29.6239, + "SAR": 13.9194, + "ISR": 17.2502 + }, + "instrumental": { + "SDR": 17.206, + "SIR": 31.5398, + "SAR": 20.446, + "ISR": 19.2727 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 4.39241, + "SIR": 7.74162, + "SAR": 4.72567, + "ISR": 14.7927 + }, + "instrumental": { + "SDR": 11.4704, + "SIR": 28.5414, + "SAR": 13.288, + "ISR": 14.2931 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 14.3226, + "SIR": 27.9537, + "SAR": 15.3748, + "ISR": 17.667 + }, + "instrumental": { + "SDR": 15.604, + "SIR": 28.4274, + "SAR": 17.2536, + "ISR": 18.4205 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 11.1078, + "SIR": 21.9648, + "SAR": 11.8021, + "ISR": 15.8931 + }, + "instrumental": { + "SDR": 12.9535, + "SIR": 24.1863, + "SAR": 14.1888, + "ISR": 17.1184 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 12.867, + "SIR": 24.2088, + "SAR": 13.8855, + "ISR": 16.4038 + }, + "instrumental": { + "SDR": 16.2871, + "SIR": 27.1032, + "SAR": 18.4096, + "ISR": 18.6002 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 10.2302, + "SIR": 28.9779, + "SAR": 10.4524, + "ISR": 14.9303 + }, + "instrumental": { + "SDR": 18.0013, + "SIR": 29.6188, + "SAR": 22.9885, + "ISR": 19.681 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 14.7068, + "SIR": 39.8113, + "SAR": 15.8475, + "ISR": 18.684 + }, + "instrumental": { + "SDR": 16.9951, + "SIR": 34.8677, + "SAR": 19.8234, + "ISR": 19.659 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 14.9516, + "SIR": 23.7946, + "SAR": 13.8535, + "ISR": 14.9136 + }, + "instrumental": { + "SDR": 17.9353, + "SIR": 23.4625, + "SAR": 18.7001, + "ISR": 18.0127 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 16.1394, + "SIR": 40.5805, + "SAR": 18.4321, + "ISR": 18.949 + }, + "instrumental": { + "SDR": 17.6222, + "SIR": 34.477, + "SAR": 21.2358, + "ISR": 19.7197 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 12.7367, + "SIR": 26.4655, + "SAR": 13.6118, + "ISR": 17.0604 + }, + "instrumental": { + "SDR": 16.4724, + "SIR": 30.6654, + "SAR": 19.2084, + "ISR": 18.9816 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 9.78136, + "SIR": 22.5081, + "SAR": 10.105, + "ISR": 15.4463 + }, + "instrumental": { + "SDR": 14.6766, + "SIR": 27.6504, + "SAR": 16.3122, + "ISR": 18.0535 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 12.0149, + "SIR": 29.4709, + "SAR": 13.0542, + "ISR": 15.4531 + }, + "instrumental": { + "SDR": 17.2397, + "SIR": 26.1105, + "SAR": 20.8677, + "ISR": 19.3018 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 6.61991, + "SIR": 23.4274, + "SAR": 7.22862, + "ISR": 11.4066 + }, + "instrumental": { + "SDR": 14.7726, + "SIR": 22.3407, + "SAR": 17.5078, + "ISR": 19.0333 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 11.2783, + "SIR": 23.3212, + "SAR": 11.8311, + "ISR": 16.2971 + }, + "instrumental": { + "SDR": 15.031, + "SIR": 28.1696, + "SAR": 17.1084, + "ISR": 18.3429 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 10.8233, + "SIR": 31.2998, + "SAR": 11.2267, + "ISR": 15.4322 + }, + "instrumental": { + "SDR": 16.3026, + "SIR": 28.1272, + "SAR": 19.0388, + "ISR": 19.4063 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": 7.64678, + "SIR": 25.7471, + "SAR": 8.19411, + "ISR": 15.1165 + }, + "instrumental": { + "SDR": 16.7877, + "SIR": 29.8842, + "SAR": 19.9395, + "ISR": 19.1579 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 9.12066, + "SIR": 20.0322, + "SAR": 9.04174, + "ISR": 13.1748 + }, + "instrumental": { + "SDR": 17.5703, + "SIR": 24.8801, + "SAR": 20.2243, + "ISR": 18.5049 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 13.3468, + "SIR": 29.6378, + "SAR": 14.1276, + "ISR": 17.1629 + }, + "instrumental": { + "SDR": 16.7654, + "SIR": 30.8915, + "SAR": 19.4882, + "ISR": 19.1681 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 14.4197, + "SIR": 30.0747, + "SAR": 15.6699, + "ISR": 18.0037 + }, + "instrumental": { + "SDR": 18.0662, + "SIR": 34.185, + "SAR": 22.4746, + "ISR": 19.5247 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 13.4383, + "SIR": 33.4779, + "SAR": 13.0333, + "ISR": 18.0859 + }, + "instrumental": { + "SDR": 18.1892, + "SIR": 36.9145, + "SAR": 22.8796, + "ISR": 19.6952 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.66077, + "SIR": 17.1318, + "SAR": 4.2188, + "ISR": 7.61178 + }, + "instrumental": { + "SDR": 11.1464, + "SIR": 15.5843, + "SAR": 14.2608, + "ISR": 17.6277 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 10.4039, + "SIR": 27.3548, + "SAR": 11.0587, + "ISR": 15.5801 + }, + "instrumental": { + "SDR": 16.734, + "SIR": 28.6685, + "SAR": 19.52, + "ISR": 19.3359 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 8.66407, + "SIR": 20.5804, + "SAR": 8.87455, + "ISR": 13.1115 + }, + "instrumental": { + "SDR": 15.113, + "SIR": 24.7395, + "SAR": 17.643, + "ISR": 18.5929 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 10.126, + "SIR": 21.5221, + "SAR": 10.4151, + "ISR": 15.8837 + }, + "instrumental": { + "SDR": 16.4299, + "SIR": 29.0696, + "SAR": 18.4581, + "ISR": 18.2819 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 13.6494, + "SIR": 30.4834, + "SAR": 14.3899, + "ISR": 16.2633 + }, + "instrumental": { + "SDR": 15.0335, + "SIR": 24.9252, + "SAR": 16.2863, + "ISR": 18.8539 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 7.70131, + "SIR": 20.3859, + "SAR": 7.43047, + "ISR": 11.9802 + }, + "instrumental": { + "SDR": 13.4709, + "SIR": 19.6736, + "SAR": 14.4294, + "ISR": 17.2905 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 12.5851, + "SIR": 29.9729, + "SAR": 13.5023, + "ISR": 17.7674 + }, + "instrumental": { + "SDR": 16.6238, + "SIR": 32.5914, + "SAR": 19.2673, + "ISR": 19.0896 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 16.6426, + "SIR": 34.0086, + "SAR": 17.5022, + "ISR": 17.9602 + }, + "instrumental": { + "SDR": 16.2952, + "SIR": 21.9532, + "SAR": 16.8056, + "ISR": 19.2864 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 12.8832, + "SIR": 28.1031, + "SAR": 13.7298, + "ISR": 17.1319 + }, + "instrumental": { + "SDR": 15.2718, + "SIR": 26.1247, + "SAR": 16.7281, + "ISR": 18.519 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 14.1345, + "SIR": 37.4204, + "SAR": 15.2435, + "ISR": 17.4216 + }, + "instrumental": { + "SDR": 18.531, + "SIR": 33.2044, + "SAR": 23.9269, + "ISR": 19.7974 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 7.6385, + "SIR": 9.06066, + "SAR": 10.0479, + "ISR": 15.3108 + }, + "instrumental": { + "SDR": 13.4934, + "SIR": 25.452, + "SAR": 15.6533, + "ISR": 14.9693 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 15.8821, + "SIR": 31.434, + "SAR": 17.7598, + "ISR": 18.9229 + }, + "instrumental": { + "SDR": 19.1253, + "SIR": 40.6957, + "SAR": 26.508, + "ISR": 19.6281 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 12.3402, + "SIR": 24.5707, + "SAR": 13.4427, + "ISR": 17.7563 + }, + "instrumental": { + "SDR": 12.4393, + "SIR": 25.6194, + "SAR": 13.1366, + "ISR": 16.5581 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 9.95385, + "SIR": 27.4435, + "SAR": 10.3124, + "ISR": 15.5437 + }, + "instrumental": { + "SDR": 15.3988, + "SIR": 26.792, + "SAR": 16.9621, + "ISR": 18.695 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 8.2256, + "SIR": 21.3097, + "SAR": 8.55264, + "ISR": 13.475 + }, + "instrumental": { + "SDR": 13.6543, + "SIR": 23.7424, + "SAR": 15.7181, + "ISR": 18.4904 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 11.5335, + "SIR": 29.5621, + "SAR": 12.3213, + "ISR": 16.6072 + }, + "instrumental": { + "SDR": 16.9441, + "SIR": 31.1553, + "SAR": 20.1699, + "ISR": 19.259 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 14.4035, + "SIR": 35.4832, + "SAR": 15.5806, + "ISR": 17.8685 + }, + "instrumental": { + "SDR": 18.6056, + "SIR": 36.0998, + "SAR": 24.11, + "ISR": 19.6745 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 16.0906, + "SIR": 35.8248, + "SAR": 17.8613, + "ISR": 19.2221 + }, + "instrumental": { + "SDR": 17.953, + "SIR": 38.7085, + "SAR": 22.0366, + "ISR": 19.4598 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 11.7742, + "SIR": 27.3991, + "SAR": 12.6773, + "ISR": 16.0782 + }, + "instrumental": { + "SDR": 16.4511, + "SIR": 28.2241, + "SAR": 18.8695, + "ISR": 19.0074 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "model_bs_roformer_ep_368_sdr_12.9628.ckpt": { + "model_name": "Roformer Model: BS-Roformer-Viperx-1296", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 7.39953, + "SIR": 22.6627, + "SAR": 6.9396, + "ISR": 12.5152 + }, + "instrumental": { + "SDR": 17.2737, + "SIR": 28.1382, + "SAR": 20.7429, + "ISR": 19.2457 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 9.36037, + "SIR": 25.3319, + "SAR": 9.31179, + "ISR": 13.7824 + }, + "instrumental": { + "SDR": 14.7536, + "SIR": 24.0896, + "SAR": 16.4184, + "ISR": 18.6887 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 13.1494, + "SIR": 29.732, + "SAR": 13.9263, + "ISR": 17.2413 + }, + "instrumental": { + "SDR": 17.2264, + "SIR": 31.482, + "SAR": 20.5252, + "ISR": 19.2723 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 4.34793, + "SIR": 7.82398, + "SAR": 4.74901, + "ISR": 14.6313 + }, + "instrumental": { + "SDR": 11.3709, + "SIR": 28.2637, + "SAR": 13.2022, + "ISR": 14.1835 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 14.3395, + "SIR": 28.1322, + "SAR": 15.3707, + "ISR": 17.678 + }, + "instrumental": { + "SDR": 15.6465, + "SIR": 28.4675, + "SAR": 17.3125, + "ISR": 18.4383 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 11.1291, + "SIR": 22.0798, + "SAR": 11.826, + "ISR": 15.8762 + }, + "instrumental": { + "SDR": 12.9475, + "SIR": 24.0749, + "SAR": 14.1964, + "ISR": 17.1543 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 12.9164, + "SIR": 24.3323, + "SAR": 13.8997, + "ISR": 16.4235 + }, + "instrumental": { + "SDR": 16.2676, + "SIR": 27.1146, + "SAR": 18.3553, + "ISR": 18.6058 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 10.5495, + "SIR": 29.49, + "SAR": 10.7915, + "ISR": 15.2517 + }, + "instrumental": { + "SDR": 17.9895, + "SIR": 29.8774, + "SAR": 22.6017, + "ISR": 19.6864 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 14.7787, + "SIR": 39.8481, + "SAR": 15.8941, + "ISR": 18.6011 + }, + "instrumental": { + "SDR": 17.0029, + "SIR": 34.6981, + "SAR": 19.9098, + "ISR": 19.6592 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 15.0142, + "SIR": 24.4319, + "SAR": 13.9425, + "ISR": 14.8489 + }, + "instrumental": { + "SDR": 17.9607, + "SIR": 23.2911, + "SAR": 18.8132, + "ISR": 18.2128 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 16.1546, + "SIR": 40.5922, + "SAR": 18.5296, + "ISR": 18.8637 + }, + "instrumental": { + "SDR": 17.6162, + "SIR": 32.9914, + "SAR": 21.1756, + "ISR": 19.7181 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 12.7157, + "SIR": 26.6103, + "SAR": 13.6576, + "ISR": 17.0729 + }, + "instrumental": { + "SDR": 16.436, + "SIR": 30.7544, + "SAR": 19.1643, + "ISR": 18.9975 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 10.2251, + "SIR": 23.229, + "SAR": 10.7962, + "ISR": 15.6026 + }, + "instrumental": { + "SDR": 14.6229, + "SIR": 27.3555, + "SAR": 16.211, + "ISR": 18.1907 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 12.4581, + "SIR": 29.532, + "SAR": 13.8958, + "ISR": 16.0717 + }, + "instrumental": { + "SDR": 16.9741, + "SIR": 26.32, + "SAR": 20.6411, + "ISR": 19.2486 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 6.85879, + "SIR": 23.8983, + "SAR": 7.46923, + "ISR": 11.4269 + }, + "instrumental": { + "SDR": 14.686, + "SIR": 22.2229, + "SAR": 17.448, + "ISR": 19.0598 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 11.306, + "SIR": 23.3683, + "SAR": 11.8386, + "ISR": 16.311 + }, + "instrumental": { + "SDR": 15.045, + "SIR": 28.1509, + "SAR": 17.14, + "ISR": 18.3567 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 10.8225, + "SIR": 31.427, + "SAR": 11.2367, + "ISR": 15.4045 + }, + "instrumental": { + "SDR": 16.3166, + "SIR": 28.0932, + "SAR": 19.0669, + "ISR": 19.4124 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": 10.7401, + "SIR": 33.2741, + "SAR": 11.6433, + "ISR": 15.8872 + }, + "instrumental": { + "SDR": 14.7811, + "SIR": 25.3068, + "SAR": 16.5197, + "ISR": 19.1905 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 9.11487, + "SIR": 20.0978, + "SAR": 9.0895, + "ISR": 13.1549 + }, + "instrumental": { + "SDR": 17.64, + "SIR": 24.9244, + "SAR": 20.362, + "ISR": 18.5145 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 13.4686, + "SIR": 29.576, + "SAR": 14.3035, + "ISR": 17.2137 + }, + "instrumental": { + "SDR": 16.6969, + "SIR": 30.7686, + "SAR": 19.2, + "ISR": 19.0507 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 14.427, + "SIR": 30.229, + "SAR": 15.7906, + "ISR": 18.0289 + }, + "instrumental": { + "SDR": 17.9999, + "SIR": 34.4109, + "SAR": 22.5003, + "ISR": 19.5244 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 13.808, + "SIR": 34.9357, + "SAR": 14.9737, + "ISR": 18.3659 + }, + "instrumental": { + "SDR": 18.1845, + "SIR": 36.5155, + "SAR": 22.8768, + "ISR": 19.6935 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.63448, + "SIR": 17.3934, + "SAR": 4.1798, + "ISR": 7.48037 + }, + "instrumental": { + "SDR": 11.165, + "SIR": 15.4057, + "SAR": 14.3041, + "ISR": 17.727 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 10.9725, + "SIR": 28.1688, + "SAR": 11.5272, + "ISR": 15.511 + }, + "instrumental": { + "SDR": 16.5247, + "SIR": 27.933, + "SAR": 19.1213, + "ISR": 19.3798 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 8.66971, + "SIR": 20.9616, + "SAR": 8.84133, + "ISR": 13.0692 + }, + "instrumental": { + "SDR": 15.1038, + "SIR": 24.6768, + "SAR": 17.6344, + "ISR": 18.6515 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 10.3869, + "SIR": 23.4738, + "SAR": 10.8243, + "ISR": 15.8763 + }, + "instrumental": { + "SDR": 16.2972, + "SIR": 28.4549, + "SAR": 18.3876, + "ISR": 18.3486 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 13.7137, + "SIR": 30.679, + "SAR": 14.4911, + "ISR": 16.3675 + }, + "instrumental": { + "SDR": 14.9251, + "SIR": 25.0751, + "SAR": 16.2708, + "ISR": 18.8643 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 7.37601, + "SIR": 21.5665, + "SAR": 7.3152, + "ISR": 11.4945 + }, + "instrumental": { + "SDR": 13.2748, + "SIR": 18.9108, + "SAR": 14.2617, + "ISR": 17.5995 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 12.614, + "SIR": 30.1672, + "SAR": 13.5625, + "ISR": 17.7516 + }, + "instrumental": { + "SDR": 16.5323, + "SIR": 32.3023, + "SAR": 19.2253, + "ISR": 19.1349 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 16.6795, + "SIR": 33.7576, + "SAR": 17.5999, + "ISR": 17.9539 + }, + "instrumental": { + "SDR": 16.2509, + "SIR": 21.9868, + "SAR": 16.7314, + "ISR": 19.2491 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 12.887, + "SIR": 28.147, + "SAR": 13.6965, + "ISR": 17.0896 + }, + "instrumental": { + "SDR": 15.3179, + "SIR": 26.098, + "SAR": 16.7487, + "ISR": 18.5351 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 14.1955, + "SIR": 37.4715, + "SAR": 15.0205, + "ISR": 16.6058 + }, + "instrumental": { + "SDR": 18.5468, + "SIR": 31.6753, + "SAR": 23.8806, + "ISR": 19.7926 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 7.65754, + "SIR": 9.5571, + "SAR": 10.0174, + "ISR": 14.9344 + }, + "instrumental": { + "SDR": 13.4272, + "SIR": 24.2699, + "SAR": 15.9498, + "ISR": 15.2298 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 16.5351, + "SIR": 33.1355, + "SAR": 18.9963, + "ISR": 18.9178 + }, + "instrumental": { + "SDR": 19.0794, + "SIR": 40.0272, + "SAR": 26.3595, + "ISR": 19.6428 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 12.6328, + "SIR": 25.2811, + "SAR": 13.8165, + "ISR": 17.5757 + }, + "instrumental": { + "SDR": 12.3381, + "SIR": 24.3844, + "SAR": 12.8706, + "ISR": 16.8282 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 10.3782, + "SIR": 28.2182, + "SAR": 10.6105, + "ISR": 15.525 + }, + "instrumental": { + "SDR": 15.1444, + "SIR": 26.4238, + "SAR": 16.8456, + "ISR": 18.7488 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 8.33927, + "SIR": 21.5469, + "SAR": 8.66699, + "ISR": 13.4977 + }, + "instrumental": { + "SDR": 13.6162, + "SIR": 23.4244, + "SAR": 15.4223, + "ISR": 18.5112 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 11.7457, + "SIR": 29.9814, + "SAR": 12.3968, + "ISR": 16.6172 + }, + "instrumental": { + "SDR": 16.8959, + "SIR": 30.9538, + "SAR": 20.0131, + "ISR": 19.297 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 14.5522, + "SIR": 35.9402, + "SAR": 15.6485, + "ISR": 17.6323 + }, + "instrumental": { + "SDR": 18.5864, + "SIR": 34.6089, + "SAR": 23.9372, + "ISR": 19.6892 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 16.1661, + "SIR": 35.7526, + "SAR": 17.8551, + "ISR": 19.235 + }, + "instrumental": { + "SDR": 17.9249, + "SIR": 38.6427, + "SAR": 22.0729, + "ISR": 19.4537 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 12.1019, + "SIR": 28.1579, + "SAR": 12.9796, + "ISR": 16.1913 + }, + "instrumental": { + "SDR": 16.3069, + "SIR": 28.0131, + "SAR": 18.6004, + "ISR": 19.0241 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "model_bs_roformer_ep_937_sdr_10.5309.ckpt": { + "model_name": "Roformer Model: BS-Roformer-Viperx-1053", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "seconds_per_minute_m3": 13.3 + } + }, + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "seconds_per_minute_m3": 13.3 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "seconds_per_minute_m3": 8.4 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "seconds_per_minute_m3": 8.5 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "seconds_per_minute_m3": 8.6 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "seconds_per_minute_m3": 8.5 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "seconds_per_minute_m3": 10.2 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "seconds_per_minute_m3": 10.5 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "seconds_per_minute_m3": 9.9 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "seconds_per_minute_m3": 9.2 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "seconds_per_minute_m3": 8.8 + } + }, + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "seconds_per_minute_m3": 8.5 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "seconds_per_minute_m3": 8.3 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "seconds_per_minute_m3": 8.3 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "seconds_per_minute_m3": 8.4 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "seconds_per_minute_m3": 8.5 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "seconds_per_minute_m3": 8.5 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "seconds_per_minute_m3": 8.7 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "seconds_per_minute_m3": 8.4 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "seconds_per_minute_m3": 9.0 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "seconds_per_minute_m3": 9.3 + } + } + ], + "median_scores": { + "seconds_per_minute_m3": 8.6 + }, + "stems": [ + "no drum-bass", + "drum-bass" + ], + "target_stem": "no drum-bass" + }, + "model_mel_band_roformer_ep_3005_sdr_11.4360.ckpt": { + "model_name": "Roformer Model: Mel-Roformer-Viperx-1143", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 7.22599, + "SIR": 20.7364, + "SAR": 6.81363, + "ISR": 11.9464 + }, + "instrumental": { + "SDR": 16.1126, + "SIR": 25.7777, + "SAR": 19.0311, + "ISR": 18.8924 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 8.04546, + "SIR": 21.2043, + "SAR": 7.67787, + "ISR": 12.7872 + }, + "instrumental": { + "SDR": 13.7151, + "SIR": 22.0413, + "SAR": 15.1107, + "ISR": 17.9742 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 11.551, + "SIR": 26.2964, + "SAR": 12.1747, + "ISR": 16.2897 + }, + "instrumental": { + "SDR": 16.3613, + "SIR": 29.0243, + "SAR": 18.9893, + "ISR": 18.8874 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 4.07081, + "SIR": 10.0756, + "SAR": 4.27666, + "ISR": 13.2681 + }, + "instrumental": { + "SDR": 11.7448, + "SIR": 24.9302, + "SAR": 13.4134, + "ISR": 15.4297 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 13.0026, + "SIR": 24.4973, + "SAR": 13.4719, + "ISR": 15.9803 + }, + "instrumental": { + "SDR": 14.8087, + "SIR": 23.8779, + "SAR": 15.7901, + "ISR": 17.7153 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.2028, + "SIR": 19.3448, + "SAR": 10.8419, + "ISR": 14.8978 + }, + "instrumental": { + "SDR": 11.9256, + "SIR": 22.1487, + "SAR": 13.1911, + "ISR": 16.27 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.3702, + "SIR": 22.0296, + "SAR": 12.011, + "ISR": 14.9376 + }, + "instrumental": { + "SDR": 15.0478, + "SIR": 24.3747, + "SAR": 16.8541, + "ISR": 18.087 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 9.36541, + "SIR": 26.5573, + "SAR": 9.35732, + "ISR": 13.8703 + }, + "instrumental": { + "SDR": 17.5259, + "SIR": 28.2036, + "SAR": 21.8168, + "ISR": 19.5661 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.6578, + "SIR": 34.6168, + "SAR": 13.511, + "ISR": 16.8816 + }, + "instrumental": { + "SDR": 15.5256, + "SIR": 28.4225, + "SAR": 17.6244, + "ISR": 19.2833 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.3493, + "SIR": 23.4189, + "SAR": 10.9716, + "ISR": 12.805 + }, + "instrumental": { + "SDR": 15.8693, + "SIR": 19.1707, + "SAR": 16.1595, + "ISR": 18.0875 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.5444, + "SIR": 36.848, + "SAR": 16.0659, + "ISR": 18.0546 + }, + "instrumental": { + "SDR": 16.5295, + "SIR": 30.481, + "SAR": 19.2078, + "ISR": 19.4684 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.9422, + "SIR": 23.9059, + "SAR": 12.4638, + "ISR": 16.2029 + }, + "instrumental": { + "SDR": 15.5175, + "SIR": 28.5661, + "SAR": 17.7634, + "ISR": 18.6425 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 8.97026, + "SIR": 21.0287, + "SAR": 9.52597, + "ISR": 14.4262 + }, + "instrumental": { + "SDR": 14.3221, + "SIR": 25.4717, + "SAR": 15.9633, + "ISR": 17.7574 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 10.82, + "SIR": 25.0831, + "SAR": 11.8402, + "ISR": 14.7674 + }, + "instrumental": { + "SDR": 16.5423, + "SIR": 25.0294, + "SAR": 19.7378, + "ISR": 18.8441 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 6.19366, + "SIR": 21.4983, + "SAR": 6.30645, + "ISR": 10.5103 + }, + "instrumental": { + "SDR": 14.1842, + "SIR": 21.0838, + "SAR": 16.7889, + "ISR": 18.7831 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.0847, + "SIR": 21.8325, + "SAR": 10.8027, + "ISR": 15.352 + }, + "instrumental": { + "SDR": 14.2207, + "SIR": 25.5833, + "SAR": 16.1734, + "ISR": 17.98 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 9.62655, + "SIR": 28.8525, + "SAR": 10.0028, + "ISR": 14.3664 + }, + "instrumental": { + "SDR": 15.5942, + "SIR": 25.8222, + "SAR": 17.917, + "ISR": 19.2028 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": 0.166635, + "SIR": -6.51745, + "SAR": 0.108365, + "ISR": 11.0128 + }, + "instrumental": { + "SDR": 14.5254, + "SIR": 47.9267, + "SAR": 16.431, + "ISR": 17.7318 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 8.0742, + "SIR": 18.0718, + "SAR": 7.88194, + "ISR": 11.6038 + }, + "instrumental": { + "SDR": 16.6074, + "SIR": 22.5285, + "SAR": 18.8244, + "ISR": 18.182 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.7138, + "SIR": 26.2193, + "SAR": 12.2143, + "ISR": 15.3867 + }, + "instrumental": { + "SDR": 15.2847, + "SIR": 25.9592, + "SAR": 17.1909, + "ISR": 18.9188 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 12.862, + "SIR": 24.9785, + "SAR": 13.6176, + "ISR": 16.9629 + }, + "instrumental": { + "SDR": 17.2697, + "SIR": 30.9239, + "SAR": 20.7161, + "ISR": 19.1325 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 11.0228, + "SIR": 29.7847, + "SAR": 11.6063, + "ISR": 16.2 + }, + "instrumental": { + "SDR": 17.3957, + "SIR": 30.5321, + "SAR": 20.7349, + "ISR": 19.4281 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.23988, + "SIR": 16.4631, + "SAR": 3.66268, + "ISR": 6.83089 + }, + "instrumental": { + "SDR": 10.8817, + "SIR": 14.5998, + "SAR": 14.1, + "ISR": 17.684 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 9.16346, + "SIR": 22.447, + "SAR": 9.78872, + "ISR": 14.6676 + }, + "instrumental": { + "SDR": 16.2642, + "SIR": 28.4148, + "SAR": 18.94, + "ISR": 19.0972 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.95002, + "SIR": 19.5031, + "SAR": 8.03194, + "ISR": 12.0693 + }, + "instrumental": { + "SDR": 14.5739, + "SIR": 23.0761, + "SAR": 16.9534, + "ISR": 18.4001 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 9.73402, + "SIR": 21.5119, + "SAR": 10.3201, + "ISR": 15.0848 + }, + "instrumental": { + "SDR": 15.2111, + "SIR": 25.9637, + "SAR": 16.5764, + "ISR": 17.7013 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.8612, + "SIR": 26.1244, + "SAR": 12.2784, + "ISR": 14.382 + }, + "instrumental": { + "SDR": 13.3654, + "SIR": 21.0023, + "SAR": 14.5066, + "ISR": 18.013 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.69852, + "SIR": 18.1825, + "SAR": 6.29807, + "ISR": 10.6505 + }, + "instrumental": { + "SDR": 12.1827, + "SIR": 17.5617, + "SAR": 13.2379, + "ISR": 16.7747 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 10.9979, + "SIR": 26.6356, + "SAR": 11.5283, + "ISR": 16.1449 + }, + "instrumental": { + "SDR": 14.6651, + "SIR": 26.5811, + "SAR": 16.9057, + "ISR": 17.8642 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.7051, + "SIR": 30.6497, + "SAR": 13.6958, + "ISR": 15.7065 + }, + "instrumental": { + "SDR": 14.0371, + "SIR": 17.4896, + "SAR": 13.0171, + "ISR": 18.3478 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.8281, + "SIR": 25.4208, + "SAR": 12.5666, + "ISR": 15.8487 + }, + "instrumental": { + "SDR": 13.8659, + "SIR": 23.7314, + "SAR": 15.1002, + "ISR": 17.9173 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 12.7301, + "SIR": 34.1645, + "SAR": 13.5797, + "ISR": 16.7386 + }, + "instrumental": { + "SDR": 17.9351, + "SIR": 31.0197, + "SAR": 22.1091, + "ISR": 19.7026 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 5.17442, + "SIR": 10.972, + "SAR": 6.79369, + "ISR": 8.42129 + }, + "instrumental": { + "SDR": 11.5621, + "SIR": 14.6105, + "SAR": 14.0976, + "ISR": 15.8593 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 16.1324, + "SIR": 33.7296, + "SAR": 18.3241, + "ISR": 18.5191 + }, + "instrumental": { + "SDR": 18.3647, + "SIR": 36.8409, + "SAR": 23.587, + "ISR": 19.5641 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.9136, + "SIR": 22.688, + "SAR": 13.0509, + "ISR": 17.4081 + }, + "instrumental": { + "SDR": 11.2257, + "SIR": 23.4872, + "SAR": 11.8632, + "ISR": 15.754 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.62748, + "SIR": 22.9827, + "SAR": 8.79313, + "ISR": 14.2059 + }, + "instrumental": { + "SDR": 14.0571, + "SIR": 24.118, + "SAR": 15.4935, + "ISR": 17.8618 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 7.43734, + "SIR": 19.9247, + "SAR": 7.577, + "ISR": 12.41 + }, + "instrumental": { + "SDR": 13.0319, + "SIR": 22.1165, + "SAR": 15.0098, + "ISR": 18.1953 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.2658, + "SIR": 26.1365, + "SAR": 10.9079, + "ISR": 15.5378 + }, + "instrumental": { + "SDR": 16.0503, + "SIR": 28.9192, + "SAR": 18.7169, + "ISR": 18.8009 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 12.7917, + "SIR": 31.6955, + "SAR": 13.4608, + "ISR": 16.1853 + }, + "instrumental": { + "SDR": 17.7895, + "SIR": 30.4762, + "SAR": 21.8329, + "ISR": 19.4939 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 12.7457, + "SIR": 27.5503, + "SAR": 13.64, + "ISR": 16.7788 + }, + "instrumental": { + "SDR": 15.8242, + "SIR": 28.0431, + "SAR": 17.887, + "ISR": 18.6347 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.5429, + "SIR": 23.6624, + "SAR": 10.9398, + "ISR": 14.9177 + }, + "instrumental": { + "SDR": 15.1295, + "SIR": 25.5275, + "SAR": 16.8799, + "ISR": 18.2715 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "MDX23C-De-Reverb-aufr33-jarredou.ckpt": { + "model_name": "MDX23C Model: MDX23C De-Reverb by aufr33-jarredou", + "track_scores": [], + "median_scores": {}, + "stems": [ + "dry", + "no dry" + ], + "target_stem": null + }, + "MDX23C-DrumSep-aufr33-jarredou.ckpt": { + "model_name": "MDX23C Model: MDX23C DrumSep by aufr33-jarredou", + "track_scores": [], + "median_scores": {}, + "stems": [ + "kick", + "snare", + "toms", + "hh", + "ride", + "crash" + ], + "target_stem": null + }, + "mel_band_roformer_karaoke_aufr33_viperx_sdr_10.1956.ckpt": { + "model_name": "Roformer Model: Mel-Roformer-Karaoke-Aufr33-Viperx", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 6.80284, + "SIR": 28.1352, + "SAR": 6.2309, + "ISR": 8.72186 + }, + "instrumental": { + "SDR": 16.4103, + "SIR": 20.3727, + "SAR": 19.1878, + "ISR": 19.5712 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 8.44766, + "SIR": 28.6953, + "SAR": 5.61063, + "ISR": 7.9584 + }, + "instrumental": { + "SDR": 13.6286, + "SIR": 13.8662, + "SAR": 14.2308, + "ISR": 19.4116 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.3317, + "SIR": 31.3895, + "SAR": 8.71018, + "ISR": 10.3698 + }, + "instrumental": { + "SDR": 16.0015, + "SIR": 18.3039, + "SAR": 16.7546, + "ISR": 19.4711 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 1.36094, + "SIR": 9.84555, + "SAR": 0.35986, + "ISR": 7.04313 + }, + "instrumental": { + "SDR": 11.262, + "SIR": 16.6469, + "SAR": 13.1283, + "ISR": 16.5805 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 7.60024, + "SIR": 29.7966, + "SAR": 6.36113, + "ISR": 8.71611 + }, + "instrumental": { + "SDR": 13.5203, + "SIR": 12.0699, + "SAR": 11.2546, + "ISR": 19.1232 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 3.50892, + "SIR": 22.2888, + "SAR": 3.60457, + "ISR": 5.76414 + }, + "instrumental": { + "SDR": 6.34154, + "SIR": 8.31747, + "SAR": 10.2241, + "ISR": 18.1232 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 1.97312, + "SIR": 29.9001, + "SAR": -6.8765, + "ISR": 0.797585 + }, + "instrumental": { + "SDR": 7.36757, + "SIR": 5.43338, + "SAR": 13.1064, + "ISR": 19.853 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 9.02955, + "SIR": 28.2355, + "SAR": 10.2758, + "ISR": 12.0485 + }, + "instrumental": { + "SDR": 17.5352, + "SIR": 26.4308, + "SAR": 22.2181, + "ISR": 19.6635 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 13.9238, + "SIR": 37.8685, + "SAR": 15.3453, + "ISR": 17.4007 + }, + "instrumental": { + "SDR": 16.514, + "SIR": 30.3403, + "SAR": 19.4834, + "ISR": 19.5439 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 14.8564, + "SIR": 34.9158, + "SAR": 6.86828, + "ISR": 8.52586 + }, + "instrumental": { + "SDR": 17.5753, + "SIR": 12.3389, + "SAR": 13.2117, + "ISR": 19.5608 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 15.517, + "SIR": 39.8722, + "SAR": 17.9265, + "ISR": 18.2814 + }, + "instrumental": { + "SDR": 17.289, + "SIR": 32.4369, + "SAR": 20.7586, + "ISR": 19.644 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.2788, + "SIR": 28.7263, + "SAR": 10.0593, + "ISR": 11.7162 + }, + "instrumental": { + "SDR": 15.1491, + "SIR": 18.4602, + "SAR": 16.0043, + "ISR": 19.2895 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 4.13337, + "SIR": 28.354, + "SAR": 2.7865, + "ISR": 5.75026 + }, + "instrumental": { + "SDR": 13.4082, + "SIR": 9.98449, + "SAR": 11.2769, + "ISR": 19.2755 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 7.84089, + "SIR": 31.099, + "SAR": 8.48509, + "ISR": 10.7593 + }, + "instrumental": { + "SDR": 13.3726, + "SIR": 17.3026, + "SAR": 14.3911, + "ISR": 19.5066 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 5.24722, + "SIR": 24.2584, + "SAR": 5.69048, + "ISR": 8.05899 + }, + "instrumental": { + "SDR": 13.8662, + "SIR": 17.4352, + "SAR": 16.8385, + "ISR": 19.263 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.29622, + "SIR": 24.4992, + "SAR": 9.41904, + "ISR": 11.7931 + }, + "instrumental": { + "SDR": 14.1646, + "SIR": 19.2755, + "SAR": 15.706, + "ISR": 18.73 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": 9.2889, + "SIR": 32.4128, + "SAR": 10.0165, + "ISR": 12.3648 + }, + "instrumental": { + "SDR": 13.7498, + "SIR": 19.1051, + "SAR": 14.7954, + "ISR": 19.0623 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 5.80998, + "SIR": 27.8081, + "SAR": -2.92602, + "ISR": 1.74463 + }, + "instrumental": { + "SDR": 18.1408, + "SIR": 11.1376, + "SAR": 20.5673, + "ISR": 19.8881 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.1731, + "SIR": 29.3368, + "SAR": 11.6156, + "ISR": 12.3624 + }, + "instrumental": { + "SDR": 15.5899, + "SIR": 19.4455, + "SAR": 17.5667, + "ISR": 19.304 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 11.3855, + "SIR": 30.0185, + "SAR": 12.4226, + "ISR": 13.656 + }, + "instrumental": { + "SDR": 17.0729, + "SIR": 22.4126, + "SAR": 19.764, + "ISR": 19.5254 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 13.9903, + "SIR": 35.8745, + "SAR": 15.2679, + "ISR": 17.7962 + }, + "instrumental": { + "SDR": 17.5269, + "SIR": 31.9855, + "SAR": 21.3407, + "ISR": 19.6462 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.26104, + "SIR": 17.8598, + "SAR": 3.2037, + "ISR": 5.9366 + }, + "instrumental": { + "SDR": 11.168, + "SIR": 13.7282, + "SAR": 14.6733, + "ISR": 18.2361 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.42602, + "SIR": 37.9798, + "SAR": 3.38901, + "ISR": 5.25114 + }, + "instrumental": { + "SDR": 14.5619, + "SIR": 12.0054, + "SAR": 12.8753, + "ISR": 19.7806 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.92507, + "SIR": 24.3567, + "SAR": 5.72536, + "ISR": 8.15347 + }, + "instrumental": { + "SDR": 14.6545, + "SIR": 17.1722, + "SAR": 16.5175, + "ISR": 19.2461 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 5.85825, + "SIR": 29.3925, + "SAR": 5.97532, + "ISR": 7.97919 + }, + "instrumental": { + "SDR": 15.2766, + "SIR": 15.5439, + "SAR": 15.2343, + "ISR": 19.1974 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 8.06974, + "SIR": 31.4844, + "SAR": 9.33317, + "ISR": 9.84969 + }, + "instrumental": { + "SDR": 9.95159, + "SIR": 12.7375, + "SAR": 11.9531, + "ISR": 19.208 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 3.98873, + "SIR": 26.6854, + "SAR": 2.081, + "ISR": 4.97736 + }, + "instrumental": { + "SDR": 11.3336, + "SIR": 9.96016, + "SAR": 12.7406, + "ISR": 19.0492 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 9.50192, + "SIR": 29.6537, + "SAR": 4.82214, + "ISR": 7.43185 + }, + "instrumental": { + "SDR": 14.7999, + "SIR": 14.5408, + "SAR": 14.3212, + "ISR": 17.7872 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 15.3624, + "SIR": 35.004, + "SAR": 12.6696, + "ISR": 13.2289 + }, + "instrumental": { + "SDR": 15.4301, + "SIR": 14.091, + "SAR": 12.4263, + "ISR": 19.3 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 9.54518, + "SIR": 30.1511, + "SAR": 9.18607, + "ISR": 10.2983 + }, + "instrumental": { + "SDR": 13.9966, + "SIR": 13.8382, + "SAR": 12.9041, + "ISR": 19.0269 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 10.1641, + "SIR": 39.1433, + "SAR": 4.4328, + "ISR": 6.58832 + }, + "instrumental": { + "SDR": 17.7084, + "SIR": 15.1447, + "SAR": 15.6636, + "ISR": 19.8685 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 0.46461, + "SIR": 14.9759, + "SAR": -0.0, + "ISR": 1.32129 + }, + "instrumental": { + "SDR": 8.70372, + "SIR": 8.50921, + "SAR": 19.6935, + "ISR": 19.0185 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 7.84148, + "SIR": 37.673, + "SAR": 7.22407, + "ISR": 10.1225 + }, + "instrumental": { + "SDR": 16.0958, + "SIR": 16.6524, + "SAR": 15.3224, + "ISR": 19.7899 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 9.43367, + "SIR": 26.7779, + "SAR": 9.68603, + "ISR": 11.9258 + }, + "instrumental": { + "SDR": 10.0505, + "SIR": 12.5026, + "SAR": 9.51029, + "ISR": 17.3935 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 6.26089, + "SIR": 32.1735, + "SAR": 5.54724, + "ISR": 8.81442 + }, + "instrumental": { + "SDR": 13.1194, + "SIR": 14.4778, + "SAR": 12.8589, + "ISR": 19.2837 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 8.42876, + "SIR": 21.8126, + "SAR": 8.91982, + "ISR": 13.0204 + }, + "instrumental": { + "SDR": 13.7408, + "SIR": 22.7536, + "SAR": 15.8154, + "ISR": 18.5818 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 11.8328, + "SIR": 30.3219, + "SAR": 12.118, + "ISR": 14.1414 + }, + "instrumental": { + "SDR": 16.5724, + "SIR": 24.3882, + "SAR": 19.2364, + "ISR": 19.4295 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.9194, + "SIR": 36.6129, + "SAR": 8.11822, + "ISR": 9.68744 + }, + "instrumental": { + "SDR": 17.9919, + "SIR": 18.507, + "SAR": 17.6981, + "ISR": 19.7258 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 14.8794, + "SIR": 39.619, + "SAR": 15.3755, + "ISR": 14.6759 + }, + "instrumental": { + "SDR": 16.7705, + "SIR": 21.039, + "SAR": 18.288, + "ISR": 19.5735 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.44766, + "SIR": 29.7966, + "SAR": 7.22407, + "ISR": 9.68744 + }, + "instrumental": { + "SDR": 14.6545, + "SIR": 16.6469, + "SAR": 15.3224, + "ISR": 19.3 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": "vocals" + }, + "denoise_mel_band_roformer_aufr33_sdr_27.9959.ckpt": { + "model_name": "Roformer Model: Mel-Roformer-Denoise-Aufr33", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "seconds_per_minute_m3": 9.0 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "seconds_per_minute_m3": 8.7 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "seconds_per_minute_m3": 8.7 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "seconds_per_minute_m3": 8.9 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "seconds_per_minute_m3": 8.9 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "seconds_per_minute_m3": 9.3 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "seconds_per_minute_m3": 9.6 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "seconds_per_minute_m3": 9.8 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "seconds_per_minute_m3": 10.0 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "seconds_per_minute_m3": 10.0 + } + }, + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "seconds_per_minute_m3": 8.8 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "seconds_per_minute_m3": 8.5 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "seconds_per_minute_m3": 8.6 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "seconds_per_minute_m3": 8.8 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "seconds_per_minute_m3": 8.8 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "seconds_per_minute_m3": 9.2 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "seconds_per_minute_m3": 9.5 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "seconds_per_minute_m3": 9.3 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "seconds_per_minute_m3": 8.9 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "seconds_per_minute_m3": 9.2 + } + } + ], + "median_scores": { + "seconds_per_minute_m3": 9.0 + }, + "stems": [ + "dry", + "other" + ], + "target_stem": "dry" + }, + "denoise_mel_band_roformer_aufr33_aggr_sdr_27.9768.ckpt": { + "model_name": "Roformer Model: Mel-Roformer-Denoise-Aufr33-Aggr", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "seconds_per_minute_m3": 10.2 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "seconds_per_minute_m3": 9.6 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "seconds_per_minute_m3": 9.6 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "seconds_per_minute_m3": 9.6 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "seconds_per_minute_m3": 9.5 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "seconds_per_minute_m3": 9.7 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "seconds_per_minute_m3": 9.8 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "seconds_per_minute_m3": 9.4 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "seconds_per_minute_m3": 9.1 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "seconds_per_minute_m3": 9.0 + } + }, + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "seconds_per_minute_m3": 10.4 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "seconds_per_minute_m3": 10.1 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "seconds_per_minute_m3": 9.9 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "seconds_per_minute_m3": 9.8 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "seconds_per_minute_m3": 9.6 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "seconds_per_minute_m3": 9.6 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "seconds_per_minute_m3": 9.5 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "seconds_per_minute_m3": 9.2 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "seconds_per_minute_m3": 8.7 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "seconds_per_minute_m3": 8.6 + } + } + ], + "median_scores": { + "seconds_per_minute_m3": 9.6 + }, + "stems": [ + "dry", + "other" + ], + "target_stem": "dry" + }, + "mel_band_roformer_crowd_aufr33_viperx_sdr_8.7144.ckpt": { + "model_name": "Roformer Model: Mel-Roformer-Crowd-Aufr33-Viperx", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "seconds_per_minute_m3": 9.4 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "seconds_per_minute_m3": 8.5 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "seconds_per_minute_m3": 8.7 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "seconds_per_minute_m3": 8.8 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "seconds_per_minute_m3": 8.7 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "seconds_per_minute_m3": 8.9 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "seconds_per_minute_m3": 9.0 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "seconds_per_minute_m3": 9.0 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "seconds_per_minute_m3": 9.4 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "seconds_per_minute_m3": 10.1 + } + }, + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "seconds_per_minute_m3": 13.4 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "seconds_per_minute_m3": 12.4 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "seconds_per_minute_m3": 12.6 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "seconds_per_minute_m3": 12.9 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "seconds_per_minute_m3": 12.7 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "seconds_per_minute_m3": 13.1 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "seconds_per_minute_m3": 13.2 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "seconds_per_minute_m3": 12.9 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "seconds_per_minute_m3": 12.4 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "seconds_per_minute_m3": 12.6 + } + } + ], + "median_scores": { + "seconds_per_minute_m3": 11.2 + }, + "stems": [ + "crowd", + "other" + ], + "target_stem": "crowd" + }, + "deverb_bs_roformer_8_384dim_10depth.ckpt": { + "model_name": "Roformer Model: BS-Roformer-De-Reverb", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "seconds_per_minute_m3": 98.1 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "seconds_per_minute_m3": 37.3 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "seconds_per_minute_m3": 15.0 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "seconds_per_minute_m3": 59.5 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "seconds_per_minute_m3": 13.3 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "seconds_per_minute_m3": 85.2 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "seconds_per_minute_m3": 85.4 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "seconds_per_minute_m3": 31.7 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "seconds_per_minute_m3": 13.9 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "seconds_per_minute_m3": 41.6 + } + } + ], + "median_scores": { + "seconds_per_minute_m3": 39.4 + }, + "stems": [ + "noreverb", + "reverb" + ], + "target_stem": "noreverb" + }, + "vocals_mel_band_roformer.ckpt": { + "model_name": "Roformer Model: MelBand Roformer | Vocals by Kimberley Jensen", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 8.20453, + "SIR": 24.62, + "SAR": 8.44323, + "ISR": 12.5478 + }, + "other": { + "SDR": -4.75106, + "SIR": 18.6217, + "SAR": -5.8514, + "ISR": 17.2321 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 9.44646, + "SIR": 24.3041, + "SAR": 9.59779, + "ISR": 13.7708 + }, + "other": { + "SDR": -0.445615, + "SIR": 19.7624, + "SAR": -1.50028, + "ISR": 16.5288 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 12.5967, + "SIR": 27.6383, + "SAR": 13.7347, + "ISR": 16.5271 + }, + "other": { + "SDR": -5.52993, + "SIR": 22.4023, + "SAR": -6.43527, + "ISR": 17.6028 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 4.13064, + "SIR": 6.84398, + "SAR": 6.4108, + "ISR": 14.0466 + }, + "other": { + "SDR": -6.93653, + "SIR": 15.1097, + "SAR": -11.0505, + "ISR": 6.5595 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 13.7019, + "SIR": 26.86, + "SAR": 14.8681, + "ISR": 17.1673 + }, + "other": { + "SDR": -0.91055, + "SIR": 22.9796, + "SAR": -2.09014, + "ISR": 16.787 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 11.0534, + "SIR": 21.2412, + "SAR": 11.8893, + "ISR": 15.4179 + }, + "other": { + "SDR": 0.62249, + "SIR": 19.7785, + "SAR": -0.65793, + "ISR": 15.5725 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 12.7003, + "SIR": 24.3785, + "SAR": 13.7136, + "ISR": 15.8473 + }, + "other": { + "SDR": -3.73782, + "SIR": 19.7305, + "SAR": -4.89454, + "ISR": 15.8948 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 10.2278, + "SIR": 25.7081, + "SAR": 10.6627, + "ISR": 14.8755 + }, + "other": { + "SDR": -7.50623, + "SIR": 19.2564, + "SAR": -8.49641, + "ISR": 17.8931 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 14.1645, + "SIR": 32.8974, + "SAR": 15.6251, + "ISR": 17.6311 + }, + "other": { + "SDR": 4.03484, + "SIR": 29.0168, + "SAR": 3.13644, + "ISR": 19.0481 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 14.5588, + "SIR": 25.579, + "SAR": 13.4438, + "ISR": 14.0793 + }, + "other": { + "SDR": 0.498385, + "SIR": 18.8493, + "SAR": -0.577695, + "ISR": 17.5357 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 15.6277, + "SIR": 42.2097, + "SAR": 18.0326, + "ISR": 18.4597 + }, + "other": { + "SDR": 0.48112, + "SIR": 27.5168, + "SAR": -0.41631, + "ISR": 19.3874 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 12.5967, + "SIR": 25.579, + "SAR": 13.4438, + "ISR": 15.4179 + } + }, + "stems": [ + "vocals", + "other" + ], + "target_stem": "vocals" + }, + "mel_band_roformer_kim_ft_unwa.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | FT by unwa", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 8.35618, + "SIR": 26.0703, + "SAR": 8.36585, + "ISR": 11.7519 + }, + "other": { + "SDR": -4.98154, + "SIR": 17.0602, + "SAR": -6.0678, + "ISR": 17.3498 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 9.28118, + "SIR": 26.5467, + "SAR": 9.28576, + "ISR": 13.3506 + }, + "other": { + "SDR": -0.453755, + "SIR": 18.9808, + "SAR": -1.42004, + "ISR": 17.186 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 12.4663, + "SIR": 27.7636, + "SAR": 13.3778, + "ISR": 16.5801 + }, + "other": { + "SDR": -5.50767, + "SIR": 22.903, + "SAR": -6.45916, + "ISR": 17.5493 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 4.04107, + "SIR": 6.61981, + "SAR": 5.88247, + "ISR": 13.8226 + }, + "other": { + "SDR": -7.01421, + "SIR": 14.3395, + "SAR": -11.1192, + "ISR": 6.33089 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 13.8263, + "SIR": 27.0324, + "SAR": 15.0265, + "ISR": 16.9693 + }, + "other": { + "SDR": -0.88469, + "SIR": 22.5049, + "SAR": -2.04681, + "ISR": 16.7957 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.9469, + "SIR": 20.9137, + "SAR": 11.7642, + "ISR": 15.4123 + }, + "other": { + "SDR": 0.61887, + "SIR": 19.7633, + "SAR": -0.68734, + "ISR": 15.4564 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 12.4992, + "SIR": 24.1639, + "SAR": 13.535, + "ISR": 15.5225 + }, + "other": { + "SDR": -3.74308, + "SIR": 19.0804, + "SAR": -4.86216, + "ISR": 15.862 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 10.4672, + "SIR": 26.8517, + "SAR": 10.8946, + "ISR": 15.0238 + }, + "other": { + "SDR": -7.82418, + "SIR": 18.8163, + "SAR": -8.84081, + "ISR": 18.0755 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 13.953, + "SIR": 35.2963, + "SAR": 15.2368, + "ISR": 17.6925 + }, + "other": { + "SDR": 4.05024, + "SIR": 28.5405, + "SAR": 3.1634, + "ISR": 19.0926 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 14.4877, + "SIR": 26.4602, + "SAR": 13.1553, + "ISR": 13.696 + }, + "other": { + "SDR": 0.48458, + "SIR": 17.6172, + "SAR": -0.58263, + "ISR": 17.6945 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 15.568, + "SIR": 42.2331, + "SAR": 17.9423, + "ISR": 18.5018 + }, + "other": { + "SDR": 0.47828, + "SIR": 27.4917, + "SAR": -0.41064, + "ISR": 19.3727 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 12.4183, + "SIR": 26.1056, + "SAR": 13.1788, + "ISR": 16.1269 + }, + "other": { + "SDR": -4.18164, + "SIR": 20.2352, + "SAR": -5.38024, + "ISR": 16.6858 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 12.4423, + "SIR": 26.5035, + "SAR": 13.167, + "ISR": 15.4674 + } + }, + "stems": [ + "vocals", + "other" + ], + "target_stem": "vocals" + }, + "melband_roformer_inst_v1e.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | Inst V1 (E) by Unwa", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 6.1805, + "SIR": 24.2704, + "SAR": 6.82554, + "ISR": 9.89464 + }, + "instrumental": { + "SDR": 16.7943, + "SIR": 23.9173, + "SAR": 20.2513, + "ISR": 19.3787 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 8.51409, + "SIR": 25.3613, + "SAR": 8.6834, + "ISR": 11.6787 + }, + "instrumental": { + "SDR": 14.3868, + "SIR": 20.6518, + "SAR": 16.2606, + "ISR": 18.7944 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 11.3751, + "SIR": 28.543, + "SAR": 12.5306, + "ISR": 14.9963 + }, + "instrumental": { + "SDR": 16.7268, + "SIR": 26.6064, + "SAR": 19.7989, + "ISR": 19.1907 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 3.3697, + "SIR": 7.26461, + "SAR": 4.42895, + "ISR": 12.114 + }, + "instrumental": { + "SDR": 11.8007, + "SIR": 24.1797, + "SAR": 13.8526, + "ISR": 14.5889 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.6472, + "SIR": 27.9184, + "SAR": 13.7355, + "ISR": 15.565 + }, + "instrumental": { + "SDR": 15.0619, + "SIR": 23.387, + "SAR": 16.3172, + "ISR": 18.4356 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.9534, + "SIR": 22.0835, + "SAR": 10.9775, + "ISR": 13.6732 + }, + "instrumental": { + "SDR": 12.4782, + "SIR": 19.9114, + "SAR": 13.8838, + "ISR": 17.2865 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.2203, + "SIR": 24.2794, + "SAR": 12.2334, + "ISR": 13.6806 + }, + "instrumental": { + "SDR": 15.1993, + "SIR": 21.9269, + "SAR": 17.4485, + "ISR": 18.6176 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 7.2891, + "SIR": 26.0093, + "SAR": 7.48639, + "ISR": 10.754 + }, + "instrumental": { + "SDR": 18.6122, + "SIR": 28.9923, + "SAR": 24.8467, + "ISR": 19.6605 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.9846, + "SIR": 34.1704, + "SAR": 13.116, + "ISR": 15.3484 + }, + "instrumental": { + "SDR": 15.1801, + "SIR": 24.4637, + "SAR": 17.5123, + "ISR": 19.3009 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.8784, + "SIR": 25.13, + "SAR": 10.8475, + "ISR": 12.1154 + }, + "instrumental": { + "SDR": 16.0379, + "SIR": 19.0503, + "SAR": 16.2796, + "ISR": 18.5254 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.4741, + "SIR": 38.7534, + "SAR": 16.3561, + "ISR": 17.5507 + }, + "instrumental": { + "SDR": 16.5269, + "SIR": 29.414, + "SAR": 19.2987, + "ISR": 19.604 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.4409, + "SIR": 27.275, + "SAR": 12.3826, + "ISR": 14.361 + }, + "instrumental": { + "SDR": 15.7392, + "SIR": 24.1909, + "SAR": 18.3815, + "ISR": 19.128 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.33509, + "SIR": 22.712, + "SAR": 8.05494, + "ISR": 11.6723 + }, + "instrumental": { + "SDR": 15.8092, + "SIR": 23.2884, + "SAR": 17.9981, + "ISR": 18.578 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 9.45288, + "SIR": 25.1991, + "SAR": 10.701, + "ISR": 12.6727 + }, + "instrumental": { + "SDR": 18.0784, + "SIR": 24.9138, + "SAR": 23.2958, + "ISR": 19.3166 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.77401, + "SIR": 21.2967, + "SAR": 4.19684, + "ISR": 8.6086 + }, + "instrumental": { + "SDR": 15.8272, + "SIR": 21.7599, + "SAR": 19.2401, + "ISR": 19.1652 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.41606, + "SIR": 24.3024, + "SAR": 10.33, + "ISR": 13.0445 + }, + "instrumental": { + "SDR": 14.5402, + "SIR": 21.6912, + "SAR": 16.5876, + "ISR": 18.5579 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 9.23415, + "SIR": 30.5143, + "SAR": 9.93761, + "ISR": 12.8462 + }, + "instrumental": { + "SDR": 15.9857, + "SIR": 23.5123, + "SAR": 18.683, + "ISR": 19.3937 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -0.072135, + "SIR": -22.2234, + "SAR": 0.031185, + "ISR": 10.4577 + }, + "instrumental": { + "SDR": 19.8367, + "SIR": 57.1884, + "SAR": 29.162, + "ISR": 18.4616 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.60154, + "SIR": 20.3358, + "SAR": 8.06741, + "ISR": 10.3785 + }, + "instrumental": { + "SDR": 17.4277, + "SIR": 21.2743, + "SAR": 19.4859, + "ISR": 18.8447 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.932, + "SIR": 27.1973, + "SAR": 11.6509, + "ISR": 14.7433 + }, + "instrumental": { + "SDR": 15.9003, + "SIR": 25.6688, + "SAR": 18.429, + "ISR": 19.1145 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 11.7983, + "SIR": 26.6479, + "SAR": 13.2131, + "ISR": 15.659 + }, + "instrumental": { + "SDR": 17.8933, + "SIR": 29.1824, + "SAR": 22.1669, + "ISR": 19.3666 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -0.00039, + "SIR": 5.46794, + "SAR": 0.09246, + "ISR": 4.05517 + }, + "instrumental": { + "SDR": 19.7012, + "SIR": 40.9593, + "SAR": 36.0428, + "ISR": 19.3948 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.13607, + "SIR": 18.5241, + "SAR": 3.75436, + "ISR": 5.8868 + }, + "instrumental": { + "SDR": 11.1222, + "SIR": 13.649, + "SAR": 15.3634, + "ISR": 18.345 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.97052, + "SIR": 22.6016, + "SAR": 7.85408, + "ISR": 12.0882 + }, + "instrumental": { + "SDR": 17.5073, + "SIR": 27.7181, + "SAR": 21.5109, + "ISR": 19.3784 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.55931, + "SIR": 21.9828, + "SAR": 7.88072, + "ISR": 10.5663 + }, + "instrumental": { + "SDR": 14.7308, + "SIR": 20.901, + "SAR": 17.6799, + "ISR": 18.8723 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.89531, + "SIR": 21.2883, + "SAR": 9.52928, + "ISR": 13.4898 + }, + "instrumental": { + "SDR": 15.9504, + "SIR": 24.2647, + "SAR": 17.9409, + "ISR": 18.3744 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.128, + "SIR": 28.9954, + "SAR": 12.0096, + "ISR": 13.4383 + }, + "instrumental": { + "SDR": 13.0465, + "SIR": 19.1712, + "SAR": 14.5857, + "ISR": 18.567 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.19582, + "SIR": 21.8801, + "SAR": 5.84229, + "ISR": 8.91805 + }, + "instrumental": { + "SDR": 13.2235, + "SIR": 16.0361, + "SAR": 13.9538, + "ISR": 18.0406 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 9.85566, + "SIR": 27.2216, + "SAR": 10.9904, + "ISR": 13.675 + }, + "instrumental": { + "SDR": 14.6875, + "SIR": 22.2981, + "SAR": 17.3166, + "ISR": 18.6841 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.1754, + "SIR": 32.4062, + "SAR": 14.3075, + "ISR": 15.44 + }, + "instrumental": { + "SDR": 14.5675, + "SIR": 20.3635, + "SAR": 14.6408, + "ISR": 18.8495 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 10.7241, + "SIR": 26.8214, + "SAR": 11.4857, + "ISR": 13.72 + }, + "instrumental": { + "SDR": 14.0, + "SIR": 20.905, + "SAR": 15.5168, + "ISR": 18.3796 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.5523, + "SIR": 36.357, + "SAR": 12.8237, + "ISR": 15.084 + }, + "instrumental": { + "SDR": 17.7576, + "SIR": 27.5903, + "SAR": 22.0431, + "ISR": 19.7703 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 6.0657, + "SIR": 17.181, + "SAR": 9.31288, + "ISR": 9.66949 + }, + "instrumental": { + "SDR": 13.3134, + "SIR": 16.5477, + "SAR": 17.9914, + "ISR": 18.3898 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 13.884, + "SIR": 32.6888, + "SAR": 15.6606, + "ISR": 17.2881 + }, + "instrumental": { + "SDR": 19.046, + "SIR": 34.3802, + "SAR": 26.0809, + "ISR": 19.7068 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.8376, + "SIR": 22.833, + "SAR": 12.1502, + "ISR": 15.6833 + }, + "instrumental": { + "SDR": 11.758, + "SIR": 20.7597, + "SAR": 12.4489, + "ISR": 16.2091 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.07108, + "SIR": 27.1141, + "SAR": 8.8797, + "ISR": 12.4004 + }, + "instrumental": { + "SDR": 13.9102, + "SIR": 20.8479, + "SAR": 15.6257, + "ISR": 18.6648 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.52123, + "SIR": 8.20646, + "SAR": 4.32156, + "ISR": 9.69582 + }, + "instrumental": { + "SDR": 18.9687, + "SIR": 30.395, + "SAR": 24.9345, + "ISR": 18.8545 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.65971, + "SIR": 29.4232, + "SAR": 10.5955, + "ISR": 14.2022 + }, + "instrumental": { + "SDR": 16.9149, + "SIR": 27.2811, + "SAR": 20.2152, + "ISR": 19.3523 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.1236, + "SIR": 31.1417, + "SAR": 12.0417, + "ISR": 14.3407 + }, + "instrumental": { + "SDR": 17.7892, + "SIR": 28.4426, + "SAR": 22.1601, + "ISR": 19.5277 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 12.7602, + "SIR": 25.9511, + "SAR": 14.0482, + "ISR": 16.3066 + }, + "instrumental": { + "SDR": 15.5757, + "SIR": 27.4733, + "SAR": 17.3299, + "ISR": 17.9038 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.5563, + "SIR": 25.2802, + "SAR": 10.6483, + "ISR": 13.2414 + }, + "instrumental": { + "SDR": 15.8182, + "SIR": 23.7148, + "SAR": 17.9947, + "ISR": 18.8471 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "dereverb_mel_band_roformer_anvuew_sdr_19.1729.ckpt": { + "model_name": "Roformer Model: MelBand Roformer | De-Reverb by anvuew", + "track_scores": [], + "median_scores": {}, + "stems": [ + "noreverb", + "reverb" + ], + "target_stem": "noreverb" + }, + "dereverb_mel_band_roformer_less_aggressive_anvuew_sdr_18.8050.ckpt": { + "model_name": "Roformer Model: MelBand Roformer | De-Reverb Less Aggressive by anvuew", + "track_scores": [], + "median_scores": {}, + "stems": [ + "noreverb", + "reverb" + ], + "target_stem": "noreverb" + }, + "dereverb-echo_mel_band_roformer_sdr_10.0169.ckpt": { + "model_name": "Roformer Model: MelBand Roformer | De-Reverb-Echo by Sucial", + "track_scores": [], + "median_scores": {}, + "stems": [ + "dry", + "no dry" + ], + "target_stem": null + }, + "dereverb-echo_mel_band_roformer_sdr_13.4843_v2.ckpt": { + "model_name": "Roformer Model: MelBand Roformer | De-Reverb-Echo V2 by Sucial", + "track_scores": [], + "median_scores": {}, + "stems": [ + "dry", + "no dry" + ], + "target_stem": "dry" + }, + "MelBandRoformerSYHFT.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | SYHFT by SYH99999", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.28397, + "SIR": 25.5937, + "SAR": -6.65094, + "ISR": 2.14962 + }, + "other": { + "SDR": -4.88875, + "SIR": 5.38152, + "SAR": -4.84099, + "ISR": 18.3422 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.65496, + "SIR": 24.1503, + "SAR": -8.05382, + "ISR": 2.3716 + }, + "other": { + "SDR": -1.8057, + "SIR": 4.25746, + "SAR": -1.00565, + "ISR": 18.2375 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.56881, + "SIR": 24.7638, + "SAR": -6.56127, + "ISR": 2.76947 + }, + "other": { + "SDR": -6.17091, + "SIR": 2.64662, + "SAR": -4.37662, + "ISR": 18.6147 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": -0.06117, + "SIR": 2.913, + "SAR": -10.9283, + "ISR": 1.56717 + }, + "other": { + "SDR": -7.10168, + "SIR": 2.21937, + "SAR": -6.60669, + "ISR": 13.5741 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 10.1566, + "SIR": 24.4344, + "SAR": -6.43097, + "ISR": 2.65868 + }, + "other": { + "SDR": -2.309, + "SIR": 0.229365, + "SAR": -0.69313, + "ISR": 18.4414 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 8.10493, + "SIR": 19.1978, + "SAR": -7.67819, + "ISR": 2.29761 + }, + "other": { + "SDR": -0.20165, + "SIR": 1.12613, + "SAR": 0.28259, + "ISR": 17.9232 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 6.68887, + "SIR": 22.7006, + "SAR": -7.41624, + "ISR": 2.17881 + }, + "other": { + "SDR": -4.29739, + "SIR": 1.15407, + "SAR": -2.73527, + "ISR": 17.9061 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 7.36242, + "SIR": 25.13, + "SAR": -7.1653, + "ISR": 2.43185 + }, + "other": { + "SDR": -8.18448, + "SIR": 4.49869, + "SAR": -7.39641, + "ISR": 19.0343 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 10.8523, + "SIR": 30.2167, + "SAR": -6.74002, + "ISR": 2.84627 + }, + "other": { + "SDR": 3.319, + "SIR": 4.57753, + "SAR": 2.43338, + "ISR": 19.2716 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 7.8587, + "SIR": 28.9034, + "SAR": -8.93503, + "ISR": 2.22495 + }, + "other": { + "SDR": -0.07087, + "SIR": 2.8891, + "SAR": 0.32758, + "ISR": 19.1175 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 13.3293, + "SIR": 33.4488, + "SAR": -5.865, + "ISR": 2.87029 + }, + "other": { + "SDR": -0.76948, + "SIR": 2.5669, + "SAR": 0.18894, + "ISR": 19.3799 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.14983, + "SIR": 27.5606, + "SAR": -5.10267, + "ISR": 2.80428 + }, + "other": { + "SDR": -4.72006, + "SIR": 1.34799, + "SAR": -3.36664, + "ISR": 18.3667 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 7.98181, + "SIR": 24.9469, + "SAR": -6.95266, + "ISR": 2.40172 + } + }, + "stems": [ + "vocals", + "other" + ], + "target_stem": "vocals" + }, + "MelBandRoformerSYHFTV2.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | SYHFT V2 by SYH99999", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 4.37024, + "SIR": 26.0963, + "SAR": -6.42188, + "ISR": 2.13067 + }, + "other": { + "SDR": -5.31182, + "SIR": 5.24659, + "SAR": -5.2012, + "ISR": 18.3257 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.83564, + "SIR": 24.6619, + "SAR": -7.74812, + "ISR": 2.36961 + }, + "other": { + "SDR": -1.90102, + "SIR": 4.19655, + "SAR": -1.01898, + "ISR": 18.2521 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.77308, + "SIR": 23.852, + "SAR": -6.34669, + "ISR": 2.72775 + }, + "other": { + "SDR": -6.38002, + "SIR": 3.06188, + "SAR": -4.51879, + "ISR": 18.5106 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 0.487605, + "SIR": 3.65557, + "SAR": -10.378, + "ISR": 1.65109 + }, + "other": { + "SDR": -7.09256, + "SIR": 2.36534, + "SAR": -6.55424, + "ISR": 13.565 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 9.75731, + "SIR": 25.6381, + "SAR": -6.39069, + "ISR": 2.58615 + }, + "other": { + "SDR": -2.4114, + "SIR": 0.17628, + "SAR": -0.657185, + "ISR": 18.665 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.49478, + "SIR": 17.5819, + "SAR": -7.40468, + "ISR": 2.43491 + }, + "other": { + "SDR": -0.08301, + "SIR": 1.56056, + "SAR": 0.15452, + "ISR": 17.6402 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 9.37845, + "SIR": 22.6717, + "SAR": -6.46152, + "ISR": 2.60955 + }, + "other": { + "SDR": -4.04285, + "SIR": 1.65709, + "SAR": -3.11757, + "ISR": 17.6554 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 7.79072, + "SIR": 26.0646, + "SAR": -7.36286, + "ISR": 2.36963 + }, + "other": { + "SDR": -7.87211, + "SIR": 4.26703, + "SAR": -7.17655, + "ISR": 19.0222 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.1194, + "SIR": 32.0815, + "SAR": -6.63171, + "ISR": 2.7755 + }, + "other": { + "SDR": 3.3247, + "SIR": 4.52975, + "SAR": 2.50123, + "ISR": 19.4021 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 8.47626, + "SIR": 28.4171, + "SAR": -8.79002, + "ISR": 2.19966 + }, + "other": { + "SDR": 0.06928, + "SIR": 2.83696, + "SAR": 0.29133, + "ISR": 19.1336 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 12.8396, + "SIR": 32.1657, + "SAR": -5.99695, + "ISR": 2.81832 + }, + "other": { + "SDR": -0.97207, + "SIR": 2.47631, + "SAR": 0.31421, + "ISR": 19.2378 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 8.49911, + "SIR": 25.9433, + "SAR": -4.99301, + "ISR": 2.8464 + }, + "other": { + "SDR": -4.6784, + "SIR": 1.34594, + "SAR": -3.39803, + "ISR": 18.3066 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.6361, + "SIR": 25.7907, + "SAR": -6.54662, + "ISR": 2.51053 + } + }, + "stems": [ + "vocals", + "other" + ], + "target_stem": "vocals" + }, + "MelBandRoformerSYHFTV2.5.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | SYHFT V2.5 by SYH99999", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 3.2509, + "SIR": 27.1264, + "SAR": -5.74739, + "ISR": 1.89387 + }, + "other": { + "SDR": -4.60354, + "SIR": 5.3787, + "SAR": -4.48298, + "ISR": 18.5497 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 6.67353, + "SIR": 25.4151, + "SAR": -7.70052, + "ISR": 2.28475 + }, + "other": { + "SDR": -1.89801, + "SIR": 4.12038, + "SAR": -0.95478, + "ISR": 18.3542 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.63973, + "SIR": 25.1115, + "SAR": -6.45841, + "ISR": 2.66018 + }, + "other": { + "SDR": -6.40526, + "SIR": 3.00992, + "SAR": -4.46331, + "ISR": 18.6211 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": -0.00027, + "SIR": 3.06818, + "SAR": -10.1881, + "ISR": 1.62119 + }, + "other": { + "SDR": -7.14073, + "SIR": 2.05658, + "SAR": -6.73285, + "ISR": 13.2318 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 9.50716, + "SIR": 26.3876, + "SAR": -6.32311, + "ISR": 2.52035 + }, + "other": { + "SDR": -2.41861, + "SIR": 0.117005, + "SAR": -0.512955, + "ISR": 18.8304 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.36989, + "SIR": 18.8742, + "SAR": -7.49526, + "ISR": 2.36155 + }, + "other": { + "SDR": -0.12136, + "SIR": 1.36045, + "SAR": 0.2725, + "ISR": 17.9632 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 8.73279, + "SIR": 24.409, + "SAR": -6.54021, + "ISR": 2.51136 + }, + "other": { + "SDR": -4.04448, + "SIR": 1.57525, + "SAR": -2.97279, + "ISR": 17.9162 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 6.59133, + "SIR": 27.0506, + "SAR": -7.14608, + "ISR": 2.20751 + }, + "other": { + "SDR": -8.01336, + "SIR": 4.26656, + "SAR": -7.19951, + "ISR": 19.1576 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 10.974, + "SIR": 34.3501, + "SAR": -6.65376, + "ISR": 2.7205 + }, + "other": { + "SDR": 3.3108, + "SIR": 4.47529, + "SAR": 2.60297, + "ISR": 19.5124 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 8.13083, + "SIR": 31.1122, + "SAR": -8.92637, + "ISR": 2.11411 + }, + "other": { + "SDR": 0.05511, + "SIR": 2.77365, + "SAR": 0.377655, + "ISR": 19.3304 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 12.8844, + "SIR": 34.3363, + "SAR": -5.8707, + "ISR": 2.76611 + }, + "other": { + "SDR": -0.97863, + "SIR": 2.42401, + "SAR": 0.36995, + "ISR": 19.4227 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 8.459, + "SIR": 26.9441, + "SAR": -4.98987, + "ISR": 2.75873 + }, + "other": { + "SDR": -4.71604, + "SIR": 1.35969, + "SAR": -3.24537, + "ISR": 18.4479 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.54936, + "SIR": 26.6658, + "SAR": -6.59699, + "ISR": 2.43645 + } + }, + "stems": [ + "vocals", + "other" + ], + "target_stem": "vocals" + }, + "MelBandRoformerSYHFTV3Epsilon.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | SYHFT V3 by SYH99999", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 3.69476, + "SIR": 23.11, + "SAR": -4.41369, + "ISR": 2.2685 + }, + "other": { + "SDR": -4.2509, + "SIR": 6.84262, + "SAR": -4.03572, + "ISR": 18.5098 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 7.42636, + "SIR": 21.8764, + "SAR": -7.34939, + "ISR": 2.49869 + }, + "other": { + "SDR": -1.90187, + "SIR": 4.31387, + "SAR": -1.07243, + "ISR": 17.9758 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 8.39977, + "SIR": 24.9348, + "SAR": -6.27115, + "ISR": 2.76801 + }, + "other": { + "SDR": -6.65212, + "SIR": 3.27308, + "SAR": -4.6549, + "ISR": 18.6046 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 0.57292, + "SIR": 4.23584, + "SAR": -10.6302, + "ISR": 1.71243 + }, + "other": { + "SDR": -7.14876, + "SIR": 2.29368, + "SAR": -6.7189, + "ISR": 13.7876 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 11.0749, + "SIR": 25.7244, + "SAR": -5.99084, + "ISR": 2.85966 + }, + "other": { + "SDR": -1.91016, + "SIR": 0.53837, + "SAR": -0.809595, + "ISR": 18.5672 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 9.40808, + "SIR": 19.7226, + "SAR": -7.4225, + "ISR": 2.4391 + }, + "other": { + "SDR": -0.0883, + "SIR": 1.67919, + "SAR": 0.191055, + "ISR": 17.9385 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 10.75, + "SIR": 23.3612, + "SAR": -5.92324, + "ISR": 2.7848 + }, + "other": { + "SDR": -3.97229, + "SIR": 1.97194, + "SAR": -3.26933, + "ISR": 17.6803 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 7.6005, + "SIR": 26.4674, + "SAR": -6.70829, + "ISR": 2.37296 + }, + "other": { + "SDR": -7.30703, + "SIR": 4.46527, + "SAR": -6.91343, + "ISR": 19.1635 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 11.5544, + "SIR": 32.2282, + "SAR": -6.68533, + "ISR": 2.78445 + }, + "other": { + "SDR": 3.24795, + "SIR": 4.54709, + "SAR": 2.49366, + "ISR": 19.4482 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 9.49879, + "SIR": 25.7345, + "SAR": -7.68662, + "ISR": 2.44653 + }, + "other": { + "SDR": 0.17081, + "SIR": 3.15008, + "SAR": 0.01005, + "ISR": 18.9612 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.2173, + "SIR": 37.433, + "SAR": -5.82431, + "ISR": 2.79836 + }, + "other": { + "SDR": -0.76289, + "SIR": 2.47047, + "SAR": 0.3654, + "ISR": 19.5669 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 9.66433, + "SIR": 26.7163, + "SAR": -4.8794, + "ISR": 2.93274 + }, + "other": { + "SDR": -4.59503, + "SIR": 2.34488, + "SAR": -3.51889, + "ISR": 18.3138 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.45343, + "SIR": 25.3296, + "SAR": -6.47824, + "ISR": 2.63335 + } + }, + "stems": [ + "vocals", + "other" + ], + "target_stem": "vocals" + }, + "MelBandRoformerBigSYHFTV1.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | Big SYHFT V1 by SYH99999", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 7.32802, + "SIR": 23.7231, + "SAR": 7.63523, + "ISR": 11.8524 + }, + "other": { + "SDR": -4.23591, + "SIR": 18.7075, + "SAR": -5.19124, + "ISR": 17.3589 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 9.26036, + "SIR": 26.3146, + "SAR": 9.25244, + "ISR": 13.3987 + }, + "other": { + "SDR": -0.47455, + "SIR": 19.1456, + "SAR": -1.42593, + "ISR": 17.0664 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 12.2978, + "SIR": 27.361, + "SAR": 13.2374, + "ISR": 16.323 + }, + "other": { + "SDR": -5.78077, + "SIR": 22.0778, + "SAR": -6.88454, + "ISR": 17.5073 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 3.86945, + "SIR": 7.36771, + "SAR": 5.69638, + "ISR": 13.7535 + }, + "other": { + "SDR": -7.13562, + "SIR": 14.6932, + "SAR": -10.8205, + "ISR": 7.13055 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 13.5912, + "SIR": 27.0081, + "SAR": 14.5932, + "ISR": 16.936 + }, + "other": { + "SDR": -0.9158, + "SIR": 22.4455, + "SAR": -2.07327, + "ISR": 16.7634 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.9093, + "SIR": 21.1428, + "SAR": 11.6773, + "ISR": 15.275 + }, + "other": { + "SDR": 0.58153, + "SIR": 19.5986, + "SAR": -0.66488, + "ISR": 15.5436 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 12.4658, + "SIR": 23.8785, + "SAR": 13.3179, + "ISR": 15.7116 + }, + "other": { + "SDR": -3.74416, + "SIR": 19.3231, + "SAR": -4.8877, + "ISR": 15.7517 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 9.21062, + "SIR": 25.5773, + "SAR": 9.50849, + "ISR": 14.0962 + }, + "other": { + "SDR": -7.12991, + "SIR": 19.6647, + "SAR": -8.16753, + "ISR": 18.0027 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 13.6785, + "SIR": 36.8897, + "SAR": 14.9808, + "ISR": 17.0937 + }, + "other": { + "SDR": 4.00524, + "SIR": 27.413, + "SAR": 3.11794, + "ISR": 19.2033 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 13.6794, + "SIR": 26.1761, + "SAR": 12.7406, + "ISR": 13.4589 + }, + "other": { + "SDR": 0.45182, + "SIR": 17.9291, + "SAR": -0.61197, + "ISR": 17.8266 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 15.3621, + "SIR": 40.9233, + "SAR": 17.8066, + "ISR": 18.1758 + }, + "other": { + "SDR": 0.586795, + "SIR": 26.7615, + "SAR": -0.27375, + "ISR": 19.3057 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 12.2176, + "SIR": 25.9719, + "SAR": 12.925, + "ISR": 16.0315 + }, + "other": { + "SDR": -4.17694, + "SIR": 20.2713, + "SAR": -5.35717, + "ISR": 16.7248 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 12.2577, + "SIR": 26.074, + "SAR": 12.8328, + "ISR": 15.4933 + } + }, + "stems": [ + "vocals", + "other" + ], + "target_stem": "vocals" + }, + "melband_roformer_big_beta4.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | Big Beta 4 FT by unwa", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 7.37689, + "SIR": 22.7518, + "SAR": 7.64581, + "ISR": 12.3426 + }, + "other": { + "SDR": -4.16058, + "SIR": 19.2598, + "SAR": -5.20131, + "ISR": 17.0692 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 9.44244, + "SIR": 23.1959, + "SAR": 9.36184, + "ISR": 14.4851 + }, + "other": { + "SDR": -0.46607, + "SIR": 20.9222, + "SAR": -1.56443, + "ISR": 16.2223 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 12.5156, + "SIR": 26.3266, + "SAR": 13.2393, + "ISR": 17.0027 + }, + "other": { + "SDR": -5.73828, + "SIR": 23.7935, + "SAR": -6.92479, + "ISR": 16.9443 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 3.86382, + "SIR": 6.62091, + "SAR": 6.36907, + "ISR": 14.8088 + }, + "other": { + "SDR": -6.95283, + "SIR": 16.3892, + "SAR": -11.4173, + "ISR": 6.21786 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 13.6263, + "SIR": 24.8811, + "SAR": 14.4971, + "ISR": 18.0552 + }, + "other": { + "SDR": -0.89634, + "SIR": 25.5381, + "SAR": -2.16973, + "ISR": 16.0397 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.962, + "SIR": 19.4326, + "SAR": 11.629, + "ISR": 16.3227 + }, + "other": { + "SDR": 0.58844, + "SIR": 21.8394, + "SAR": -0.77813, + "ISR": 14.62 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 12.6095, + "SIR": 22.9288, + "SAR": 13.2689, + "ISR": 16.4467 + }, + "other": { + "SDR": -3.72353, + "SIR": 20.4047, + "SAR": -5.00858, + "ISR": 15.3488 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 8.68592, + "SIR": 23.8458, + "SAR": 9.22676, + "ISR": 13.3661 + }, + "other": { + "SDR": -7.22498, + "SIR": 20.9114, + "SAR": -8.28144, + "ISR": 17.7217 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 14.0121, + "SIR": 31.7821, + "SAR": 14.7973, + "ISR": 18.4656 + }, + "other": { + "SDR": 4.02268, + "SIR": 30.3784, + "SAR": 3.12026, + "ISR": 18.9133 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 14.2051, + "SIR": 24.8128, + "SAR": 12.7727, + "ISR": 14.4255 + }, + "other": { + "SDR": 0.4686, + "SIR": 19.5755, + "SAR": -0.67883, + "ISR": 17.4066 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 15.5632, + "SIR": 38.4082, + "SAR": 17.4184, + "ISR": 18.9371 + }, + "other": { + "SDR": 0.55558, + "SIR": 27.9603, + "SAR": -0.32981, + "ISR": 19.1225 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 12.5156, + "SIR": 23.8458, + "SAR": 12.7727, + "ISR": 16.3227 + } + }, + "stems": [ + "vocals", + "other" + ], + "target_stem": "vocals" + }, + "melband_roformer_big_beta5e.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | Big Beta 5e FT by unwa", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 7.49169, + "SIR": 22.6356, + "SAR": 7.5593, + "ISR": 12.2271 + }, + "other": { + "SDR": -4.19563, + "SIR": 19.085, + "SAR": -5.23404, + "ISR": 16.9934 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 9.23716, + "SIR": 25.0451, + "SAR": 9.27043, + "ISR": 13.7221 + }, + "other": { + "SDR": -0.44997, + "SIR": 19.5867, + "SAR": -1.46239, + "ISR": 16.7816 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 12.3365, + "SIR": 25.8589, + "SAR": 13.1486, + "ISR": 16.8873 + }, + "other": { + "SDR": -5.7321, + "SIR": 23.2169, + "SAR": -6.91466, + "ISR": 16.8053 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 2.90358, + "SIR": 6.27191, + "SAR": 5.74066, + "ISR": 13.3394 + }, + "other": { + "SDR": -7.09233, + "SIR": 12.8478, + "SAR": -11.4024, + "ISR": 6.09584 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 13.7324, + "SIR": 24.5787, + "SAR": 14.505, + "ISR": 17.2205 + }, + "other": { + "SDR": -0.92488, + "SIR": 22.9787, + "SAR": -2.17855, + "ISR": 15.9968 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.9304, + "SIR": 18.8269, + "SAR": 11.777, + "ISR": 16.2412 + }, + "other": { + "SDR": 0.58929, + "SIR": 21.4928, + "SAR": -0.80436, + "ISR": 14.3095 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 12.4935, + "SIR": 22.062, + "SAR": 13.3449, + "ISR": 16.289 + }, + "other": { + "SDR": -3.72188, + "SIR": 20.0211, + "SAR": -5.03224, + "ISR": 15.0456 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 8.64817, + "SIR": 22.9176, + "SAR": 8.86618, + "ISR": 13.8414 + }, + "other": { + "SDR": -7.19083, + "SIR": 20.325, + "SAR": -8.31767, + "ISR": 17.4081 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 13.7216, + "SIR": 34.0572, + "SAR": 14.883, + "ISR": 17.6855 + }, + "other": { + "SDR": 4.03792, + "SIR": 28.5062, + "SAR": 3.14876, + "ISR": 18.932 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 13.9148, + "SIR": 23.3127, + "SAR": 12.734, + "ISR": 14.1068 + }, + "other": { + "SDR": 0.49315, + "SIR": 18.4418, + "SAR": -0.69737, + "ISR": 16.8923 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 15.5306, + "SIR": 38.2973, + "SAR": 17.6089, + "ISR": 18.721 + }, + "other": { + "SDR": 0.55652, + "SIR": 27.5824, + "SAR": -0.31755, + "ISR": 19.0682 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 12.3716, + "SIR": 24.2785, + "SAR": 12.8717, + "ISR": 16.433 + }, + "other": { + "SDR": -4.17094, + "SIR": 20.6596, + "SAR": -5.43515, + "ISR": 16.0996 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 12.3541, + "SIR": 23.7956, + "SAR": 12.8028, + "ISR": 16.2651 + } + }, + "stems": [ + "vocals", + "other" + ], + "target_stem": "vocals" + }, + "model_chorus_bs_roformer_ep_267_sdr_24.1275.ckpt": { + "model_name": "Roformer Model: BS Roformer | Chorus Male-Female by Sucial", + "track_scores": [], + "median_scores": {}, + "stems": [ + "male", + "female" + ], + "target_stem": null + }, + "aspiration_mel_band_roformer_sdr_18.9845.ckpt": { + "model_name": "Roformer Model: MelBand Roformer | Aspiration by Sucial", + "track_scores": [], + "median_scores": {}, + "stems": [ + "aspiration", + "other" + ], + "target_stem": null + }, + "aspiration_mel_band_roformer_less_aggr_sdr_18.1201.ckpt": { + "model_name": "Roformer Model: MelBand Roformer | Aspiration Less Aggressive by Sucial", + "track_scores": [], + "median_scores": {}, + "stems": [ + "aspiration", + "other" + ], + "target_stem": null + }, + "mel_band_roformer_bleed_suppressor_v1.ckpt": { + "model_name": "Roformer Model: MelBand Roformer | Bleed Suppressor V1 by unwa-97chris", + "track_scores": [], + "median_scores": {}, + "stems": [ + "instrumental", + "bleed" + ], + "target_stem": "instrumental" + }, + "UVR-MDX-NET-Inst_HQ_5.onnx": { + "model_name": "MDX-Net Model: UVR-MDX-NET Inst HQ 5", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 6.06866, + "SIR": 17.1293, + "SAR": 6.12897, + "ISR": 10.8085 + }, + "instrumental": { + "SDR": 16.5979, + "SIR": 25.449, + "SAR": 20.1238, + "ISR": 18.5852 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 5.86413, + "SIR": 7.14475, + "SAR": 6.71163, + "ISR": 13.7815 + }, + "instrumental": { + "SDR": 10.3954, + "SIR": 23.1102, + "SAR": 11.5312, + "ISR": 11.3294 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 10.1678, + "SIR": 21.4902, + "SAR": 10.9138, + "ISR": 15.2388 + }, + "instrumental": { + "SDR": 15.5844, + "SIR": 26.8181, + "SAR": 18.1816, + "ISR": 18.0163 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 1.49665, + "SIR": 5.39072, + "SAR": 3.99017, + "ISR": 13.6714 + }, + "instrumental": { + "SDR": 10.8126, + "SIR": 26.7615, + "SAR": 12.889, + "ISR": 13.0727 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.0976, + "SIR": 22.6074, + "SAR": 13.1823, + "ISR": 15.9144 + }, + "instrumental": { + "SDR": 14.7452, + "SIR": 24.1706, + "SAR": 16.0199, + "ISR": 17.1616 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.1052, + "SIR": 17.9538, + "SAR": 11.0594, + "ISR": 15.0005 + }, + "instrumental": { + "SDR": 11.9227, + "SIR": 22.4091, + "SAR": 13.443, + "ISR": 15.6633 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.3709, + "SIR": 20.1869, + "SAR": 12.5366, + "ISR": 14.5818 + }, + "instrumental": { + "SDR": 14.8094, + "SIR": 23.0616, + "SAR": 17.0469, + "ISR": 17.6975 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 5.44196, + "SIR": 18.6383, + "SAR": 5.19323, + "ISR": 8.45813 + }, + "instrumental": { + "SDR": 17.944, + "SIR": 28.1254, + "SAR": 23.5433, + "ISR": 19.3422 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.2688, + "SIR": 29.0017, + "SAR": 13.2409, + "ISR": 16.4406 + }, + "instrumental": { + "SDR": 15.4003, + "SIR": 27.2896, + "SAR": 17.6964, + "ISR": 18.7218 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 11.9371, + "SIR": 21.7519, + "SAR": 10.3204, + "ISR": 11.9767 + }, + "instrumental": { + "SDR": 15.7308, + "SIR": 18.5303, + "SAR": 15.5904, + "ISR": 17.6628 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.9209, + "SIR": 32.4354, + "SAR": 16.8237, + "ISR": 18.0697 + }, + "instrumental": { + "SDR": 16.7015, + "SIR": 31.9637, + "SAR": 19.9936, + "ISR": 19.0201 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.2377, + "SIR": 21.7182, + "SAR": 11.8136, + "ISR": 15.4074 + }, + "instrumental": { + "SDR": 15.1684, + "SIR": 26.5507, + "SAR": 17.5078, + "ISR": 18.0099 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.66587, + "SIR": 18.3055, + "SAR": 8.12039, + "ISR": 13.2057 + }, + "instrumental": { + "SDR": 15.2961, + "SIR": 25.8978, + "SAR": 17.475, + "ISR": 17.409 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 8.43558, + "SIR": 21.3192, + "SAR": 11.4827, + "ISR": 11.7681 + }, + "instrumental": { + "SDR": 15.9103, + "SIR": 23.4344, + "SAR": 19.7739, + "ISR": 17.9954 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.60842, + "SIR": 17.7695, + "SAR": 3.42424, + "ISR": 8.95832 + }, + "instrumental": { + "SDR": 15.3167, + "SIR": 21.882, + "SAR": 18.8421, + "ISR": 18.7015 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 7.47507, + "SIR": 13.4293, + "SAR": 8.31376, + "ISR": 14.8655 + }, + "instrumental": { + "SDR": 11.3564, + "SIR": 24.4421, + "SAR": 13.1426, + "ISR": 14.6737 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 8.69496, + "SIR": 20.5642, + "SAR": 9.03007, + "ISR": 13.8318 + }, + "instrumental": { + "SDR": 14.7452, + "SIR": 25.1364, + "SAR": 17.0349, + "ISR": 18.1356 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -17.5718, + "SIR": -38.237, + "SAR": 0.57891, + "ISR": 12.2376 + }, + "instrumental": { + "SDR": 13.0372, + "SIR": 57.6564, + "SAR": 12.35, + "ISR": 12.0916 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 6.88442, + "SIR": 14.8298, + "SAR": 6.89469, + "ISR": 11.1319 + }, + "instrumental": { + "SDR": 15.7369, + "SIR": 22.1866, + "SAR": 18.0478, + "ISR": 17.4268 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 10.7124, + "SIR": 23.8202, + "SAR": 10.8061, + "ISR": 14.0169 + }, + "instrumental": { + "SDR": 15.6396, + "SIR": 24.2926, + "SAR": 17.6245, + "ISR": 18.6813 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 10.3153, + "SIR": 21.3488, + "SAR": 10.8498, + "ISR": 15.769 + }, + "instrumental": { + "SDR": 16.9638, + "SIR": 31.8237, + "SAR": 20.6841, + "ISR": 18.6502 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -10.6981, + "SIR": -7.97205, + "SAR": 0.03792, + "ISR": 8.22472 + }, + "instrumental": { + "SDR": 18.9689, + "SIR": 41.8995, + "SAR": 29.3966, + "ISR": 18.9556 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.12687, + "SIR": 13.7553, + "SAR": 3.92363, + "ISR": 6.64446 + }, + "instrumental": { + "SDR": 10.697, + "SIR": 14.3269, + "SAR": 14.3933, + "ISR": 16.762 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 4.20284, + "SIR": 13.8034, + "SAR": 4.5976, + "ISR": 11.1915 + }, + "instrumental": { + "SDR": 17.0168, + "SIR": 25.8867, + "SAR": 19.3072, + "ISR": 18.2612 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.75697, + "SIR": 18.2142, + "SAR": 8.13771, + "ISR": 11.8747 + }, + "instrumental": { + "SDR": 14.5873, + "SIR": 22.8122, + "SAR": 17.38, + "ISR": 18.1119 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 8.5251, + "SIR": 16.0533, + "SAR": 8.99974, + "ISR": 14.4896 + }, + "instrumental": { + "SDR": 15.0573, + "SIR": 25.9107, + "SAR": 16.9117, + "ISR": 17.1145 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.077, + "SIR": 25.0475, + "SAR": 12.2441, + "ISR": 14.0933 + }, + "instrumental": { + "SDR": 13.4303, + "SIR": 20.3962, + "SAR": 14.8715, + "ISR": 17.6408 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.28971, + "SIR": 11.4661, + "SAR": 6.1435, + "ISR": 12.0171 + }, + "instrumental": { + "SDR": 11.5544, + "SIR": 19.8293, + "SAR": 13.1759, + "ISR": 14.0247 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 5.975, + "SIR": 5.73503, + "SAR": 7.465, + "ISR": 15.1574 + }, + "instrumental": { + "SDR": 11.7186, + "SIR": 23.57, + "SAR": 12.8843, + "ISR": 13.0063 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.3434, + "SIR": 28.5238, + "SAR": 14.5066, + "ISR": 15.8186 + }, + "instrumental": { + "SDR": 14.7338, + "SIR": 20.7777, + "SAR": 14.7528, + "ISR": 18.1301 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.2444, + "SIR": 24.1163, + "SAR": 12.0753, + "ISR": 15.2515 + }, + "instrumental": { + "SDR": 14.2308, + "SIR": 23.7101, + "SAR": 15.8116, + "ISR": 17.6675 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.868, + "SIR": 28.1803, + "SAR": 12.5461, + "ISR": 15.479 + }, + "instrumental": { + "SDR": 17.546, + "SIR": 28.2661, + "SAR": 21.7024, + "ISR": 19.408 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 4.2702, + "SIR": 9.19773, + "SAR": 4.75764, + "ISR": 10.4024 + }, + "instrumental": { + "SDR": 11.3742, + "SIR": 18.0427, + "SAR": 11.9068, + "ISR": 15.2756 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 12.949, + "SIR": 21.946, + "SAR": 13.6592, + "ISR": 18.0142 + }, + "instrumental": { + "SDR": 18.6185, + "SIR": 36.8288, + "SAR": 23.8534, + "ISR": 18.9695 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.9692, + "SIR": 20.2516, + "SAR": 12.3834, + "ISR": 16.6795 + }, + "instrumental": { + "SDR": 11.8514, + "SIR": 23.0838, + "SAR": 12.4722, + "ISR": 15.1694 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.59135, + "SIR": 21.6023, + "SAR": 8.9602, + "ISR": 13.8188 + }, + "instrumental": { + "SDR": 14.058, + "SIR": 22.8337, + "SAR": 15.5571, + "ISR": 17.6894 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 3.79925, + "SIR": 5.80021, + "SAR": 2.36476, + "ISR": 10.5422 + }, + "instrumental": { + "SDR": 16.5183, + "SIR": 30.6284, + "SAR": 20.9877, + "ISR": 17.7329 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.92083, + "SIR": 22.3311, + "SAR": 10.7783, + "ISR": 15.5166 + }, + "instrumental": { + "SDR": 16.681, + "SIR": 30.32, + "SAR": 20.3632, + "ISR": 18.3138 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.9632, + "SIR": 29.3989, + "SAR": 12.5099, + "ISR": 15.8255 + }, + "instrumental": { + "SDR": 18.0429, + "SIR": 31.8279, + "SAR": 22.4314, + "ISR": 19.3364 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 13.8147, + "SIR": 27.7858, + "SAR": 14.5578, + "ISR": 17.1887 + }, + "instrumental": { + "SDR": 16.0434, + "SIR": 28.4183, + "SAR": 18.3994, + "ISR": 18.4986 + } + } + }, + { + "track_name": "James May - Dont Let Go", + "scores": { + "vocals": { + "SDR": 11.513, + "SIR": 22.9547, + "SAR": 12.2014, + "ISR": 16.5532 + }, + "instrumental": { + "SDR": 16.3309, + "SIR": 29.577, + "SAR": 19.5424, + "ISR": 18.6134 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.69496, + "SIR": 20.2516, + "SAR": 10.3204, + "ISR": 14.0933 + }, + "instrumental": { + "SDR": 15.2961, + "SIR": 25.1364, + "SAR": 17.475, + "ISR": 17.9954 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "melband_roformer_inst_v1.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | Inst V1 by Unwa", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 6.59313, + "SIR": 22.7019, + "SAR": 7.12521, + "ISR": 10.8986 + }, + "instrumental": { + "SDR": 16.7678, + "SIR": 25.4369, + "SAR": 20.2166, + "ISR": 19.245 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 8.80987, + "SIR": 23.0893, + "SAR": 8.89572, + "ISR": 12.5469 + }, + "instrumental": { + "SDR": 14.462, + "SIR": 22.0064, + "SAR": 16.1973, + "ISR": 18.3806 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 11.5977, + "SIR": 27.5923, + "SAR": 12.5824, + "ISR": 15.5384 + }, + "instrumental": { + "SDR": 16.7028, + "SIR": 27.6585, + "SAR": 19.6419, + "ISR": 19.0694 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 3.48132, + "SIR": 7.6045, + "SAR": 4.49987, + "ISR": 12.7623 + }, + "instrumental": { + "SDR": 11.9082, + "SIR": 25.4403, + "SAR": 13.7811, + "ISR": 14.6838 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.9825, + "SIR": 26.4734, + "SAR": 13.936, + "ISR": 16.2151 + }, + "instrumental": { + "SDR": 15.0824, + "SIR": 25.0051, + "SAR": 16.4753, + "ISR": 18.1312 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.3836, + "SIR": 21.0035, + "SAR": 11.2427, + "ISR": 14.4589 + }, + "instrumental": { + "SDR": 12.5237, + "SIR": 21.3739, + "SAR": 13.9282, + "ISR": 16.8434 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.5278, + "SIR": 23.2206, + "SAR": 12.6217, + "ISR": 14.436 + }, + "instrumental": { + "SDR": 15.2894, + "SIR": 23.2075, + "SAR": 17.4857, + "ISR": 18.3853 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 7.3173, + "SIR": 24.1923, + "SAR": 7.67168, + "ISR": 11.3225 + }, + "instrumental": { + "SDR": 18.7461, + "SIR": 30.9583, + "SAR": 25.1604, + "ISR": 19.6076 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.1105, + "SIR": 31.1097, + "SAR": 13.3075, + "ISR": 15.6329 + }, + "instrumental": { + "SDR": 15.1554, + "SIR": 25.2653, + "SAR": 17.5404, + "ISR": 19.1185 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.0197, + "SIR": 24.2418, + "SAR": 11.1345, + "ISR": 12.628 + }, + "instrumental": { + "SDR": 16.0726, + "SIR": 20.0758, + "SAR": 16.585, + "ISR": 18.3193 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 14.7085, + "SIR": 37.4375, + "SAR": 16.5238, + "ISR": 17.8271 + }, + "instrumental": { + "SDR": 16.5209, + "SIR": 30.4956, + "SAR": 19.2649, + "ISR": 19.528 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.656, + "SIR": 26.0406, + "SAR": 12.589, + "ISR": 15.1021 + }, + "instrumental": { + "SDR": 15.8132, + "SIR": 25.8702, + "SAR": 18.3155, + "ISR": 18.9679 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.63658, + "SIR": 21.6235, + "SAR": 8.34646, + "ISR": 12.4894 + }, + "instrumental": { + "SDR": 15.7658, + "SIR": 24.6296, + "SAR": 17.9832, + "ISR": 18.3308 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 9.78726, + "SIR": 22.7946, + "SAR": 10.8375, + "ISR": 13.0027 + }, + "instrumental": { + "SDR": 17.9873, + "SIR": 25.2386, + "SAR": 23.195, + "ISR": 19.1357 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 3.96104, + "SIR": 20.0224, + "SAR": 4.21664, + "ISR": 9.21622 + }, + "instrumental": { + "SDR": 15.9132, + "SIR": 22.552, + "SAR": 19.2311, + "ISR": 19.0224 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 9.78846, + "SIR": 23.0023, + "SAR": 10.5429, + "ISR": 14.048 + }, + "instrumental": { + "SDR": 14.6786, + "SIR": 23.3239, + "SAR": 16.7645, + "ISR": 18.2915 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 9.51279, + "SIR": 29.2246, + "SAR": 10.126, + "ISR": 13.6077 + }, + "instrumental": { + "SDR": 16.0283, + "SIR": 24.8546, + "SAR": 18.5468, + "ISR": 19.2948 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -0.37628, + "SIR": -28.6276, + "SAR": 0.013345, + "ISR": 11.123 + }, + "instrumental": { + "SDR": 18.5125, + "SIR": 57.5659, + "SAR": 19.6185, + "ISR": 17.1315 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 7.89028, + "SIR": 19.5303, + "SAR": 8.20676, + "ISR": 10.9664 + }, + "instrumental": { + "SDR": 17.4796, + "SIR": 22.1414, + "SAR": 19.7809, + "ISR": 18.7023 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.1078, + "SIR": 25.8818, + "SAR": 11.7517, + "ISR": 15.2895 + }, + "instrumental": { + "SDR": 15.934, + "SIR": 26.7618, + "SAR": 18.4859, + "ISR": 18.9409 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 11.8934, + "SIR": 25.3438, + "SAR": 13.0781, + "ISR": 16.1428 + }, + "instrumental": { + "SDR": 17.8815, + "SIR": 31.2395, + "SAR": 22.5189, + "ISR": 19.2768 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -0.03079, + "SIR": -3.69748, + "SAR": 0.06847, + "ISR": 4.19538 + }, + "instrumental": { + "SDR": 19.8932, + "SIR": 46.6319, + "SAR": 36.9793, + "ISR": 19.446 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.34614, + "SIR": 17.3005, + "SAR": 3.96471, + "ISR": 6.51947 + }, + "instrumental": { + "SDR": 11.1493, + "SIR": 14.3171, + "SAR": 14.9482, + "ISR": 17.9872 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 6.9198, + "SIR": 20.3273, + "SAR": 7.99178, + "ISR": 13.092 + }, + "instrumental": { + "SDR": 17.6608, + "SIR": 29.5082, + "SAR": 21.4378, + "ISR": 19.2191 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 7.78141, + "SIR": 20.5788, + "SAR": 8.06921, + "ISR": 11.4673 + }, + "instrumental": { + "SDR": 14.7541, + "SIR": 22.2265, + "SAR": 17.5065, + "ISR": 18.6101 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 9.09234, + "SIR": 20.807, + "SAR": 9.77877, + "ISR": 13.9277 + }, + "instrumental": { + "SDR": 15.9013, + "SIR": 25.1967, + "SAR": 17.9272, + "ISR": 18.1495 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.4326, + "SIR": 27.328, + "SAR": 12.3845, + "ISR": 14.0647 + }, + "instrumental": { + "SDR": 13.4148, + "SIR": 20.6769, + "SAR": 14.7155, + "ISR": 18.2046 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.3978, + "SIR": 19.5302, + "SAR": 6.04242, + "ISR": 9.90361 + }, + "instrumental": { + "SDR": 13.2972, + "SIR": 16.9654, + "SAR": 13.8593, + "ISR": 17.4784 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 10.0652, + "SIR": 25.8667, + "SAR": 11.1473, + "ISR": 14.2432 + }, + "instrumental": { + "SDR": 14.6695, + "SIR": 23.0059, + "SAR": 17.2168, + "ISR": 18.4369 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 14.3048, + "SIR": 31.6282, + "SAR": 14.4973, + "ISR": 15.8107 + }, + "instrumental": { + "SDR": 14.6387, + "SIR": 21.0255, + "SAR": 14.8086, + "ISR": 18.6725 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.0456, + "SIR": 25.607, + "SAR": 11.5202, + "ISR": 14.2325 + }, + "instrumental": { + "SDR": 14.0077, + "SIR": 22.0011, + "SAR": 15.6984, + "ISR": 18.1016 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 11.8392, + "SIR": 35.0962, + "SAR": 13.0003, + "ISR": 15.6768 + }, + "instrumental": { + "SDR": 17.737, + "SIR": 28.5758, + "SAR": 22.0999, + "ISR": 19.7177 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 6.45893, + "SIR": 15.8722, + "SAR": 9.81507, + "ISR": 10.2869 + }, + "instrumental": { + "SDR": 13.5702, + "SIR": 17.1708, + "SAR": 18.1745, + "ISR": 17.9683 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 14.151, + "SIR": 31.9359, + "SAR": 15.6072, + "ISR": 17.7287 + }, + "instrumental": { + "SDR": 19.0501, + "SIR": 35.9791, + "SAR": 26.2297, + "ISR": 19.6703 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 10.9019, + "SIR": 21.4803, + "SAR": 12.2739, + "ISR": 16.27 + }, + "instrumental": { + "SDR": 12.2484, + "SIR": 22.3732, + "SAR": 12.603, + "ISR": 15.8561 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.37636, + "SIR": 25.5439, + "SAR": 8.8963, + "ISR": 13.0278 + }, + "instrumental": { + "SDR": 13.8614, + "SIR": 21.5895, + "SAR": 15.507, + "ISR": 18.3778 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.73788, + "SIR": 7.26737, + "SAR": 4.12875, + "ISR": 10.7461 + }, + "instrumental": { + "SDR": 19.0454, + "SIR": 31.8882, + "SAR": 24.2473, + "ISR": 18.6447 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 9.82229, + "SIR": 27.5433, + "SAR": 10.5432, + "ISR": 14.6576 + }, + "instrumental": { + "SDR": 16.9939, + "SIR": 28.3647, + "SAR": 20.3799, + "ISR": 19.1742 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 11.496, + "SIR": 29.6762, + "SAR": 12.2974, + "ISR": 14.8449 + }, + "instrumental": { + "SDR": 17.7971, + "SIR": 29.862, + "SAR": 22.1579, + "ISR": 19.4217 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 13.0959, + "SIR": 25.1333, + "SAR": 14.1252, + "ISR": 16.8017 + }, + "instrumental": { + "SDR": 15.5816, + "SIR": 28.5947, + "SAR": 17.2643, + "ISR": 17.6931 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.80538, + "SIR": 23.7065, + "SAR": 10.6904, + "ISR": 13.9878 + }, + "instrumental": { + "SDR": 15.8573, + "SIR": 25.1009, + "SAR": 18.0788, + "ISR": 18.6274 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "melband_roformer_inst_v2.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | Inst V2 by Unwa", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 7.02113, + "SIR": 22.8732, + "SAR": 7.34674, + "ISR": 11.4878 + }, + "instrumental": { + "SDR": 16.8635, + "SIR": 26.2265, + "SAR": 20.4975, + "ISR": 19.2417 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 9.12526, + "SIR": 22.6007, + "SAR": 9.21153, + "ISR": 13.2992 + }, + "instrumental": { + "SDR": 14.4697, + "SIR": 23.1296, + "SAR": 16.3163, + "ISR": 18.279 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 12.0387, + "SIR": 27.3062, + "SAR": 12.8191, + "ISR": 16.1088 + }, + "instrumental": { + "SDR": 16.8135, + "SIR": 28.8152, + "SAR": 19.9229, + "ISR": 19.0194 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 3.80585, + "SIR": 7.58774, + "SAR": 4.64893, + "ISR": 13.3517 + }, + "instrumental": { + "SDR": 11.7368, + "SIR": 26.3669, + "SAR": 13.6008, + "ISR": 14.4638 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 13.1766, + "SIR": 26.0215, + "SAR": 14.2426, + "ISR": 16.6319 + }, + "instrumental": { + "SDR": 15.2261, + "SIR": 25.7423, + "SAR": 16.6955, + "ISR": 17.9991 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.5388, + "SIR": 20.7882, + "SAR": 11.448, + "ISR": 14.8628 + }, + "instrumental": { + "SDR": 12.6654, + "SIR": 22.1246, + "SAR": 14.0122, + "ISR": 16.7403 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.7922, + "SIR": 22.968, + "SAR": 12.8275, + "ISR": 14.9688 + }, + "instrumental": { + "SDR": 15.2577, + "SIR": 24.0257, + "SAR": 17.5925, + "ISR": 18.2725 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 7.90708, + "SIR": 24.2879, + "SAR": 8.06339, + "ISR": 12.0824 + }, + "instrumental": { + "SDR": 18.6465, + "SIR": 32.0538, + "SAR": 24.935, + "ISR": 19.5385 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 13.0676, + "SIR": 30.9494, + "SAR": 14.1914, + "ISR": 16.8357 + }, + "instrumental": { + "SDR": 15.8017, + "SIR": 28.0276, + "SAR": 18.3979, + "ISR": 19.0722 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 13.2034, + "SIR": 23.7646, + "SAR": 12.2129, + "ISR": 13.3 + }, + "instrumental": { + "SDR": 16.8116, + "SIR": 21.1692, + "SAR": 17.4623, + "ISR": 18.2198 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 15.1494, + "SIR": 37.3432, + "SAR": 17.0733, + "ISR": 18.3459 + }, + "instrumental": { + "SDR": 16.8335, + "SIR": 31.958, + "SAR": 19.9383, + "ISR": 19.5205 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 11.8861, + "SIR": 25.6621, + "SAR": 12.7967, + "ISR": 15.5019 + }, + "instrumental": { + "SDR": 15.8931, + "SIR": 26.8758, + "SAR": 18.3758, + "ISR": 18.9207 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 7.87606, + "SIR": 21.4379, + "SAR": 8.40433, + "ISR": 13.343 + }, + "instrumental": { + "SDR": 16.0064, + "SIR": 26.0934, + "SAR": 18.2581, + "ISR": 18.2002 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 10.1088, + "SIR": 22.4545, + "SAR": 11.0841, + "ISR": 13.3075 + }, + "instrumental": { + "SDR": 18.0389, + "SIR": 25.4843, + "SAR": 23.3216, + "ISR": 19.0655 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 4.10086, + "SIR": 19.8791, + "SAR": 4.61918, + "ISR": 9.77326 + }, + "instrumental": { + "SDR": 15.8275, + "SIR": 23.2805, + "SAR": 18.9869, + "ISR": 18.9551 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.2267, + "SIR": 22.3629, + "SAR": 10.926, + "ISR": 14.7369 + }, + "instrumental": { + "SDR": 14.8179, + "SIR": 24.6144, + "SAR": 16.9599, + "ISR": 18.1218 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 9.80505, + "SIR": 29.0038, + "SAR": 10.395, + "ISR": 14.0552 + }, + "instrumental": { + "SDR": 16.1516, + "SIR": 25.692, + "SAR": 18.8756, + "ISR": 19.2613 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -0.07154, + "SIR": -28.7508, + "SAR": 0.033545, + "ISR": 11.5 + }, + "instrumental": { + "SDR": 18.6129, + "SIR": 58.4135, + "SAR": 19.6397, + "ISR": 17.0796 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 8.0983, + "SIR": 19.0257, + "SAR": 8.43441, + "ISR": 11.2693 + }, + "instrumental": { + "SDR": 17.5558, + "SIR": 22.6064, + "SAR": 20.0213, + "ISR": 18.5654 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 11.829, + "SIR": 26.6002, + "SAR": 12.386, + "ISR": 16.0067 + }, + "instrumental": { + "SDR": 16.2763, + "SIR": 28.398, + "SAR": 19.021, + "ISR": 18.9973 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 12.4479, + "SIR": 26.0774, + "SAR": 13.7517, + "ISR": 16.6435 + }, + "instrumental": { + "SDR": 17.8987, + "SIR": 32.1639, + "SAR": 22.4922, + "ISR": 19.2739 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": -0.00067, + "SIR": -3.67736, + "SAR": 0.19529, + "ISR": 4.24983 + }, + "instrumental": { + "SDR": 19.9326, + "SIR": 47.1931, + "SAR": 37.5267, + "ISR": 19.5308 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.44956, + "SIR": 16.8059, + "SAR": 4.11688, + "ISR": 6.90925 + }, + "instrumental": { + "SDR": 11.1846, + "SIR": 14.7724, + "SAR": 14.6363, + "ISR": 17.7607 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 7.47103, + "SIR": 20.1499, + "SAR": 8.15602, + "ISR": 13.9796 + }, + "instrumental": { + "SDR": 17.762, + "SIR": 30.146, + "SAR": 21.6146, + "ISR": 19.174 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 8.00871, + "SIR": 20.3855, + "SAR": 8.35842, + "ISR": 11.968 + }, + "instrumental": { + "SDR": 14.8171, + "SIR": 22.9609, + "SAR": 17.5545, + "ISR": 18.5724 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 9.42273, + "SIR": 20.6284, + "SAR": 10.1366, + "ISR": 14.4831 + }, + "instrumental": { + "SDR": 16.1081, + "SIR": 26.3549, + "SAR": 18.2536, + "ISR": 18.0555 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 11.8382, + "SIR": 27.9563, + "SAR": 12.9275, + "ISR": 14.2597 + }, + "instrumental": { + "SDR": 13.8321, + "SIR": 21.0212, + "SAR": 15.3133, + "ISR": 18.3662 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 6.81159, + "SIR": 18.8671, + "SAR": 6.73053, + "ISR": 10.4935 + }, + "instrumental": { + "SDR": 13.6415, + "SIR": 17.94, + "SAR": 14.2477, + "ISR": 17.1803 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 10.8706, + "SIR": 26.3121, + "SAR": 11.8612, + "ISR": 15.5736 + }, + "instrumental": { + "SDR": 14.7792, + "SIR": 25.4772, + "SAR": 17.8785, + "ISR": 17.4578 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 15.0225, + "SIR": 31.2628, + "SAR": 15.1781, + "ISR": 16.548 + }, + "instrumental": { + "SDR": 15.0741, + "SIR": 21.2328, + "SAR": 15.7661, + "ISR": 18.7671 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 11.6538, + "SIR": 24.9279, + "SAR": 12.5349, + "ISR": 15.3253 + }, + "instrumental": { + "SDR": 14.4443, + "SIR": 23.4619, + "SAR": 15.975, + "ISR": 17.903 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 12.7004, + "SIR": 35.4648, + "SAR": 13.8985, + "ISR": 16.33 + }, + "instrumental": { + "SDR": 18.059, + "SIR": 30.9682, + "SAR": 22.7971, + "ISR": 19.7761 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 6.4941, + "SIR": 16.2176, + "SAR": 10.0121, + "ISR": 10.5968 + }, + "instrumental": { + "SDR": 13.5837, + "SIR": 17.4015, + "SAR": 17.9409, + "ISR": 18.1126 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 14.5832, + "SIR": 31.2557, + "SAR": 16.3811, + "ISR": 18.1319 + }, + "instrumental": { + "SDR": 19.1675, + "SIR": 37.5946, + "SAR": 26.8855, + "ISR": 19.6217 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 11.349, + "SIR": 21.7457, + "SAR": 12.7289, + "ISR": 16.7757 + }, + "instrumental": { + "SDR": 12.0854, + "SIR": 23.1845, + "SAR": 13.0484, + "ISR": 15.657 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 8.72349, + "SIR": 25.2805, + "SAR": 9.13203, + "ISR": 13.6972 + }, + "instrumental": { + "SDR": 14.3485, + "SIR": 22.6056, + "SAR": 16.2959, + "ISR": 18.2944 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 5.91693, + "SIR": 7.30367, + "SAR": 4.20726, + "ISR": 11.1963 + }, + "instrumental": { + "SDR": 19.0816, + "SIR": 32.2645, + "SAR": 24.1358, + "ISR": 18.6023 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.2827, + "SIR": 27.4632, + "SAR": 10.8963, + "ISR": 15.4544 + }, + "instrumental": { + "SDR": 17.1289, + "SIR": 29.9609, + "SAR": 20.6392, + "ISR": 19.1566 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 12.6367, + "SIR": 31.1013, + "SAR": 13.0895, + "ISR": 16.8252 + }, + "instrumental": { + "SDR": 18.2822, + "SIR": 33.3222, + "SAR": 23.2674, + "ISR": 19.4432 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 13.9713, + "SIR": 25.7951, + "SAR": 15.2871, + "ISR": 17.5479 + }, + "instrumental": { + "SDR": 16.141, + "SIR": 30.4691, + "SAR": 18.4409, + "ISR": 17.8294 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.2547, + "SIR": 23.3663, + "SAR": 11.0051, + "ISR": 14.3714 + }, + "instrumental": { + "SDR": 16.0572, + "SIR": 25.9179, + "SAR": 18.3869, + "ISR": 18.5689 + } + }, + "stems": [ + "instrumental", + "vocals" + ], + "target_stem": "instrumental" + }, + "melband_roformer_instvoc_duality_v1.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | InstVoc Duality V1 by Unwa", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 7.53732, + "SIR": 23.5485, + "SAR": 7.88449, + "ISR": 12.236 + }, + "instrumental": { + "SDR": 17.0929, + "SIR": 27.1492, + "SAR": 20.6733, + "ISR": 19.2657 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 9.34051, + "SIR": 23.251, + "SAR": 9.499, + "ISR": 13.6445 + }, + "instrumental": { + "SDR": 14.7629, + "SIR": 23.6761, + "SAR": 16.69, + "ISR": 18.3834 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 12.6666, + "SIR": 28.7856, + "SAR": 13.5288, + "ISR": 16.6932 + }, + "instrumental": { + "SDR": 16.9549, + "SIR": 29.8781, + "SAR": 20.2144, + "ISR": 19.1733 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 4.15616, + "SIR": 7.9543, + "SAR": 4.78232, + "ISR": 13.9195 + }, + "instrumental": { + "SDR": 11.7598, + "SIR": 27.1678, + "SAR": 13.5728, + "ISR": 14.4721 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 13.6768, + "SIR": 26.9935, + "SAR": 14.7913, + "ISR": 17.023 + }, + "instrumental": { + "SDR": 15.4851, + "SIR": 26.8696, + "SAR": 17.1382, + "ISR": 18.2263 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.9739, + "SIR": 21.1101, + "SAR": 11.8031, + "ISR": 15.4413 + }, + "instrumental": { + "SDR": 12.8497, + "SIR": 23.3393, + "SAR": 14.3829, + "ISR": 16.849 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 12.5633, + "SIR": 22.9539, + "SAR": 13.6573, + "ISR": 15.7894 + }, + "instrumental": { + "SDR": 15.7737, + "SIR": 25.5918, + "SAR": 18.0411, + "ISR": 18.3408 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 9.24035, + "SIR": 26.3555, + "SAR": 9.73442, + "ISR": 14.4685 + }, + "instrumental": { + "SDR": 18.2664, + "SIR": 31.4603, + "SAR": 23.8276, + "ISR": 19.5771 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 13.8878, + "SIR": 32.681, + "SAR": 15.2947, + "ISR": 17.3878 + }, + "instrumental": { + "SDR": 16.4206, + "SIR": 29.7129, + "SAR": 19.39, + "ISR": 19.3272 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 14.3684, + "SIR": 24.2992, + "SAR": 13.2207, + "ISR": 13.9473 + }, + "instrumental": { + "SDR": 17.4952, + "SIR": 21.9423, + "SAR": 18.1069, + "ISR": 18.3174 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 15.4328, + "SIR": 39.2139, + "SAR": 17.8256, + "ISR": 18.3919 + }, + "instrumental": { + "SDR": 17.2783, + "SIR": 32.6546, + "SAR": 20.7553, + "ISR": 19.6359 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 12.4095, + "SIR": 26.0061, + "SAR": 13.2019, + "ISR": 16.184 + }, + "instrumental": { + "SDR": 16.0388, + "SIR": 28.1231, + "SAR": 18.6728, + "ISR": 18.9389 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 9.43016, + "SIR": 22.6494, + "SAR": 9.9772, + "ISR": 14.3791 + }, + "instrumental": { + "SDR": 15.7698, + "SIR": 26.9032, + "SAR": 17.8109, + "ISR": 18.2583 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 12.1896, + "SIR": 27.7667, + "SAR": 13.755, + "ISR": 15.4648 + }, + "instrumental": { + "SDR": 16.7317, + "SIR": 25.3364, + "SAR": 20.1383, + "ISR": 19.1183 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 6.07174, + "SIR": 22.3263, + "SAR": 6.40451, + "ISR": 10.381 + }, + "instrumental": { + "SDR": 15.083, + "SIR": 22.3937, + "SAR": 18.4798, + "ISR": 18.9954 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.7754, + "SIR": 23.0938, + "SAR": 11.4937, + "ISR": 15.5828 + }, + "instrumental": { + "SDR": 15.0219, + "SIR": 26.4808, + "SAR": 17.1003, + "ISR": 18.285 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 10.316, + "SIR": 29.8442, + "SAR": 10.8124, + "ISR": 14.7429 + }, + "instrumental": { + "SDR": 16.3174, + "SIR": 26.8933, + "SAR": 19.2417, + "ISR": 19.3104 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": -0.00021, + "SIR": -27.8217, + "SAR": 0.042015, + "ISR": 11.4847 + }, + "instrumental": { + "SDR": 17.9651, + "SIR": 58.4226, + "SAR": 19.6784, + "ISR": 17.3881 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 8.74227, + "SIR": 19.5223, + "SAR": 8.93713, + "ISR": 11.9711 + }, + "instrumental": { + "SDR": 17.621, + "SIR": 23.3362, + "SAR": 20.2091, + "ISR": 18.564 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 12.6484, + "SIR": 27.7845, + "SAR": 13.6929, + "ISR": 16.594 + }, + "instrumental": { + "SDR": 16.444, + "SIR": 29.4823, + "SAR": 19.019, + "ISR": 19.081 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 13.7193, + "SIR": 28.2691, + "SAR": 15.2732, + "ISR": 17.337 + }, + "instrumental": { + "SDR": 17.881, + "SIR": 32.0659, + "SAR": 22.0586, + "ISR": 19.4043 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 5.09568, + "SIR": 24.5833, + "SAR": 5.12182, + "ISR": 12.2483 + }, + "instrumental": { + "SDR": 19.2241, + "SIR": 37.6732, + "SAR": 28.282, + "ISR": 19.6981 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.54699, + "SIR": 17.2812, + "SAR": 4.28651, + "ISR": 7.05889 + }, + "instrumental": { + "SDR": 11.2575, + "SIR": 14.9722, + "SAR": 14.6705, + "ISR": 17.85 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 9.38185, + "SIR": 21.7325, + "SAR": 10.0402, + "ISR": 14.8602 + }, + "instrumental": { + "SDR": 17.3412, + "SIR": 29.6069, + "SAR": 20.5866, + "ISR": 19.108 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 8.45359, + "SIR": 20.7774, + "SAR": 8.7449, + "ISR": 12.3763 + }, + "instrumental": { + "SDR": 15.0671, + "SIR": 23.6141, + "SAR": 17.6703, + "ISR": 18.6145 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 10.0815, + "SIR": 22.4071, + "SAR": 10.7082, + "ISR": 15.209 + }, + "instrumental": { + "SDR": 16.1855, + "SIR": 27.1852, + "SAR": 18.2517, + "ISR": 18.1533 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 12.2051, + "SIR": 28.7439, + "SAR": 13.2644, + "ISR": 14.7713 + }, + "instrumental": { + "SDR": 14.0138, + "SIR": 21.8613, + "SAR": 15.5807, + "ISR": 18.5267 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 7.30297, + "SIR": 19.6108, + "SAR": 7.22984, + "ISR": 11.103 + }, + "instrumental": { + "SDR": 13.6599, + "SIR": 18.5861, + "SAR": 14.4515, + "ISR": 17.3265 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 11.8493, + "SIR": 28.4299, + "SAR": 12.8431, + "ISR": 16.569 + }, + "instrumental": { + "SDR": 15.3577, + "SIR": 27.6344, + "SAR": 18.1915, + "ISR": 17.9545 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 16.0123, + "SIR": 33.7107, + "SAR": 16.3625, + "ISR": 17.0475 + }, + "instrumental": { + "SDR": 15.7082, + "SIR": 21.4094, + "SAR": 15.9916, + "ISR": 19.1976 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 12.4792, + "SIR": 26.4868, + "SAR": 13.4953, + "ISR": 16.0018 + }, + "instrumental": { + "SDR": 14.6539, + "SIR": 24.3769, + "SAR": 16.1475, + "ISR": 18.2052 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 13.4389, + "SIR": 36.2467, + "SAR": 14.6843, + "ISR": 16.9709 + }, + "instrumental": { + "SDR": 18.2103, + "SIR": 31.5702, + "SAR": 22.9304, + "ISR": 19.7679 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 7.00356, + "SIR": 16.1957, + "SAR": 10.7257, + "ISR": 10.8562 + }, + "instrumental": { + "SDR": 13.6959, + "SIR": 17.682, + "SAR": 18.6418, + "ISR": 17.9722 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 17.0876, + "SIR": 36.3891, + "SAR": 20.2477, + "ISR": 18.662 + }, + "instrumental": { + "SDR": 18.9359, + "SIR": 37.944, + "SAR": 25.8288, + "ISR": 19.7083 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 12.212, + "SIR": 22.6858, + "SAR": 13.8374, + "ISR": 17.5489 + }, + "instrumental": { + "SDR": 11.6508, + "SIR": 24.2611, + "SAR": 12.6734, + "ISR": 15.7187 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 9.28262, + "SIR": 26.7611, + "SAR": 9.69987, + "ISR": 14.4338 + }, + "instrumental": { + "SDR": 14.8417, + "SIR": 23.9982, + "SAR": 16.5929, + "ISR": 18.5479 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 7.68977, + "SIR": 21.2588, + "SAR": 8.33894, + "ISR": 12.9313 + }, + "instrumental": { + "SDR": 14.259, + "SIR": 23.7148, + "SAR": 16.6304, + "ISR": 18.6012 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 10.9469, + "SIR": 28.4195, + "SAR": 11.6161, + "ISR": 15.8446 + }, + "instrumental": { + "SDR": 17.2245, + "SIR": 30.3024, + "SAR": 20.8416, + "ISR": 19.2408 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 13.4731, + "SIR": 32.7145, + "SAR": 14.209, + "ISR": 17.1316 + }, + "instrumental": { + "SDR": 18.4981, + "SIR": 34.2829, + "SAR": 23.7271, + "ISR": 19.534 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 15.2016, + "SIR": 26.1342, + "SAR": 16.3848, + "ISR": 18.1669 + }, + "instrumental": { + "SDR": 16.8135, + "SIR": 32.159, + "SAR": 19.2943, + "ISR": 17.9213 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.9604, + "SIR": 25.2947, + "SAR": 11.7096, + "ISR": 15.3252 + }, + "instrumental": { + "SDR": 16.1121, + "SIR": 26.8982, + "SAR": 18.5608, + "ISR": 18.5826 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": null + }, + "melband_roformer_instvox_duality_v2.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | InstVoc Duality V2 by Unwa", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 7.56213, + "SIR": 23.5803, + "SAR": 8.01788, + "ISR": 12.2982 + }, + "instrumental": { + "SDR": 17.0833, + "SIR": 27.1384, + "SAR": 20.5861, + "ISR": 19.2745 + } + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 9.3538, + "SIR": 23.2952, + "SAR": 9.50223, + "ISR": 13.7509 + }, + "instrumental": { + "SDR": 14.7621, + "SIR": 23.8415, + "SAR": 16.6724, + "ISR": 18.3805 + } + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 12.6859, + "SIR": 28.3699, + "SAR": 13.4957, + "ISR": 16.7817 + }, + "instrumental": { + "SDR": 16.95, + "SIR": 30.064, + "SAR": 20.2448, + "ISR": 19.1293 + } + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 4.14893, + "SIR": 7.93664, + "SAR": 4.75506, + "ISR": 13.979 + }, + "instrumental": { + "SDR": 11.7227, + "SIR": 27.3124, + "SAR": 13.5381, + "ISR": 14.4529 + } + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 13.7073, + "SIR": 26.8221, + "SAR": 14.8115, + "ISR": 17.1036 + }, + "instrumental": { + "SDR": 15.4715, + "SIR": 27.1383, + "SAR": 17.1429, + "ISR": 18.1914 + } + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.9888, + "SIR": 21.1002, + "SAR": 11.7907, + "ISR": 15.5365 + }, + "instrumental": { + "SDR": 12.865, + "SIR": 23.6144, + "SAR": 14.3884, + "ISR": 16.8312 + } + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 12.6114, + "SIR": 23.0081, + "SAR": 13.5893, + "ISR": 15.9311 + }, + "instrumental": { + "SDR": 15.7647, + "SIR": 25.7301, + "SAR": 18.0456, + "ISR": 18.3371 + } + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 9.39377, + "SIR": 26.3752, + "SAR": 9.78446, + "ISR": 14.506 + }, + "instrumental": { + "SDR": 18.2595, + "SIR": 31.4199, + "SAR": 23.836, + "ISR": 19.5807 + } + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 13.968, + "SIR": 32.5421, + "SAR": 15.3772, + "ISR": 17.5148 + }, + "instrumental": { + "SDR": 16.3979, + "SIR": 30.1502, + "SAR": 19.4376, + "ISR": 19.2938 + } + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 14.4153, + "SIR": 24.3086, + "SAR": 13.2163, + "ISR": 13.9688 + }, + "instrumental": { + "SDR": 17.4273, + "SIR": 21.9713, + "SAR": 18.0786, + "ISR": 18.3127 + } + } + }, + { + "track_name": "Angela Thomas Wade - Milk Cow Blues", + "scores": { + "vocals": { + "SDR": 15.5581, + "SIR": 39.0615, + "SAR": 17.8452, + "ISR": 18.4987 + }, + "instrumental": { + "SDR": 17.2634, + "SIR": 33.0066, + "SAR": 20.7647, + "ISR": 19.6081 + } + } + }, + { + "track_name": "Atlantis Bound - It Was My Fault For Waiting", + "scores": { + "vocals": { + "SDR": 12.3986, + "SIR": 25.9959, + "SAR": 13.2257, + "ISR": 16.2344 + }, + "instrumental": { + "SDR": 16.0211, + "SIR": 28.0995, + "SAR": 18.6324, + "ISR": 18.9417 + } + } + }, + { + "track_name": "Auctioneer - Our Future Faces", + "scores": { + "vocals": { + "SDR": 9.44872, + "SIR": 22.6731, + "SAR": 10.0688, + "ISR": 14.4276 + }, + "instrumental": { + "SDR": 15.751, + "SIR": 26.7836, + "SAR": 17.7727, + "ISR": 18.2575 + } + } + }, + { + "track_name": "AvaLuna - Waterduct", + "scores": { + "vocals": { + "SDR": 12.4018, + "SIR": 27.9021, + "SAR": 13.9866, + "ISR": 15.6672 + }, + "instrumental": { + "SDR": 16.5541, + "SIR": 25.372, + "SAR": 19.8524, + "ISR": 19.1069 + } + } + }, + { + "track_name": "BigTroubles - Phantom", + "scores": { + "vocals": { + "SDR": 6.07413, + "SIR": 22.316, + "SAR": 6.43003, + "ISR": 10.4376 + }, + "instrumental": { + "SDR": 15.0768, + "SIR": 22.4817, + "SAR": 18.4517, + "ISR": 18.991 + } + } + }, + { + "track_name": "Bill Chudziak - Children Of No-one", + "scores": { + "vocals": { + "SDR": 10.811, + "SIR": 23.0166, + "SAR": 11.532, + "ISR": 15.6425 + }, + "instrumental": { + "SDR": 14.9405, + "SIR": 26.5712, + "SAR": 17.0262, + "ISR": 18.2699 + } + } + }, + { + "track_name": "Black Bloc - If You Want Success", + "scores": { + "vocals": { + "SDR": 10.3263, + "SIR": 29.7592, + "SAR": 10.8044, + "ISR": 14.8284 + }, + "instrumental": { + "SDR": 16.3251, + "SIR": 26.9479, + "SAR": 19.2524, + "ISR": 19.3048 + } + } + }, + { + "track_name": "Celestial Shore - Die For Us", + "scores": { + "vocals": { + "SDR": 0.00032, + "SIR": -26.9405, + "SAR": 0.02117, + "ISR": 11.772 + }, + "instrumental": { + "SDR": 17.0721, + "SIR": 58.3051, + "SAR": 19.7925, + "ISR": 17.4556 + } + } + }, + { + "track_name": "Chris Durban - Celebrate", + "scores": { + "vocals": { + "SDR": 8.75441, + "SIR": 19.6373, + "SAR": 8.89659, + "ISR": 11.9712 + }, + "instrumental": { + "SDR": 17.6158, + "SIR": 23.3934, + "SAR": 20.1776, + "ISR": 18.584 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Air Traffic", + "scores": { + "vocals": { + "SDR": 12.6805, + "SIR": 27.6377, + "SAR": 13.7269, + "ISR": 16.6359 + }, + "instrumental": { + "SDR": 16.373, + "SIR": 29.4872, + "SAR": 18.9453, + "ISR": 19.0654 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Stella", + "scores": { + "vocals": { + "SDR": 13.7774, + "SIR": 28.3098, + "SAR": 15.2925, + "ISR": 17.4487 + }, + "instrumental": { + "SDR": 17.845, + "SIR": 32.1952, + "SAR": 22.0013, + "ISR": 19.3851 + } + } + }, + { + "track_name": "Clara Berry And Wooldog - Waltz For My Victims", + "scores": { + "vocals": { + "SDR": 3.35433, + "SIR": 18.5918, + "SAR": 3.67859, + "ISR": 10.5347 + }, + "instrumental": { + "SDR": 19.4528, + "SIR": 40.166, + "SAR": 29.4948, + "ISR": 19.6741 + } + } + }, + { + "track_name": "Cnoc An Tursa - Bannockburn", + "scores": { + "vocals": { + "SDR": 4.53327, + "SIR": 17.229, + "SAR": 4.24291, + "ISR": 7.07261 + }, + "instrumental": { + "SDR": 11.2504, + "SIR": 15.0017, + "SAR": 14.6025, + "ISR": 17.8569 + } + } + }, + { + "track_name": "Creepoid - OldTree", + "scores": { + "vocals": { + "SDR": 9.85855, + "SIR": 23.0928, + "SAR": 10.6531, + "ISR": 14.9853 + }, + "instrumental": { + "SDR": 16.9119, + "SIR": 28.2879, + "SAR": 19.8147, + "ISR": 19.1488 + } + } + }, + { + "track_name": "Dark Ride - Burning Bridges", + "scores": { + "vocals": { + "SDR": 8.48367, + "SIR": 20.6599, + "SAR": 8.7805, + "ISR": 12.4913 + }, + "instrumental": { + "SDR": 15.0735, + "SIR": 23.8228, + "SAR": 17.6036, + "ISR": 18.6037 + } + } + }, + { + "track_name": "Dreamers Of The Ghetto - Heavy Love", + "scores": { + "vocals": { + "SDR": 10.1522, + "SIR": 22.534, + "SAR": 10.7907, + "ISR": 15.2616 + }, + "instrumental": { + "SDR": 16.1381, + "SIR": 27.2561, + "SAR": 18.1049, + "ISR": 18.1098 + } + } + }, + { + "track_name": "Drumtracks - Ghost Bitch", + "scores": { + "vocals": { + "SDR": 12.2619, + "SIR": 28.6554, + "SAR": 13.3458, + "ISR": 14.8631 + }, + "instrumental": { + "SDR": 13.9779, + "SIR": 21.8934, + "SAR": 15.5658, + "ISR": 18.4962 + } + } + }, + { + "track_name": "Faces On Film - Waiting For Ga", + "scores": { + "vocals": { + "SDR": 7.30912, + "SIR": 19.7839, + "SAR": 7.21224, + "ISR": 11.0408 + }, + "instrumental": { + "SDR": 13.6766, + "SIR": 18.5157, + "SAR": 14.5054, + "ISR": 17.3744 + } + } + }, + { + "track_name": "Fergessen - Back From The Start", + "scores": { + "vocals": { + "SDR": 11.8857, + "SIR": 28.2239, + "SAR": 12.8874, + "ISR": 16.6981 + }, + "instrumental": { + "SDR": 15.4411, + "SIR": 27.9302, + "SAR": 18.1965, + "ISR": 18.0683 + } + } + }, + { + "track_name": "Fergessen - Nos Palpitants", + "scores": { + "vocals": { + "SDR": 16.1799, + "SIR": 33.5181, + "SAR": 16.5025, + "ISR": 17.2713 + }, + "instrumental": { + "SDR": 15.688, + "SIR": 21.5381, + "SAR": 16.0575, + "ISR": 19.1489 + } + } + }, + { + "track_name": "Fergessen - The Wind", + "scores": { + "vocals": { + "SDR": 12.4938, + "SIR": 26.428, + "SAR": 13.5541, + "ISR": 16.0992 + }, + "instrumental": { + "SDR": 14.6561, + "SIR": 24.4644, + "SAR": 16.089, + "ISR": 18.1811 + } + } + }, + { + "track_name": "Flags - 54", + "scores": { + "vocals": { + "SDR": 13.5298, + "SIR": 36.2277, + "SAR": 14.7146, + "ISR": 17.0672 + }, + "instrumental": { + "SDR": 18.2133, + "SIR": 31.9328, + "SAR": 22.9548, + "ISR": 19.7633 + } + } + }, + { + "track_name": "Giselle - Moss", + "scores": { + "vocals": { + "SDR": 7.02334, + "SIR": 16.1852, + "SAR": 10.7386, + "ISR": 10.903 + }, + "instrumental": { + "SDR": 13.7227, + "SIR": 17.7357, + "SAR": 18.69, + "ISR": 17.951 + } + } + }, + { + "track_name": "Grants - PunchDrunk", + "scores": { + "vocals": { + "SDR": 17.1541, + "SIR": 36.1393, + "SAR": 20.2997, + "ISR": 18.7722 + }, + "instrumental": { + "SDR": 18.9338, + "SIR": 38.4876, + "SAR": 25.9108, + "ISR": 19.695 + } + } + }, + { + "track_name": "Helado Negro - Mitad Del Mundo", + "scores": { + "vocals": { + "SDR": 12.2775, + "SIR": 22.7516, + "SAR": 13.8514, + "ISR": 17.5384 + }, + "instrumental": { + "SDR": 11.6894, + "SIR": 24.096, + "SAR": 12.6792, + "ISR": 15.7647 + } + } + }, + { + "track_name": "Hezekiah Jones - Borrowed Heart", + "scores": { + "vocals": { + "SDR": 9.37351, + "SIR": 26.6779, + "SAR": 9.80521, + "ISR": 14.4952 + }, + "instrumental": { + "SDR": 14.8059, + "SIR": 24.1667, + "SAR": 16.5469, + "ISR": 18.5168 + } + } + }, + { + "track_name": "Hollow Ground - Left Blind", + "scores": { + "vocals": { + "SDR": 7.94777, + "SIR": 21.2505, + "SAR": 8.51137, + "ISR": 13.1184 + }, + "instrumental": { + "SDR": 14.1797, + "SIR": 24.0022, + "SAR": 16.4555, + "ISR": 18.5701 + } + } + }, + { + "track_name": "Hop Along - Sister Cities", + "scores": { + "vocals": { + "SDR": 11.0289, + "SIR": 28.4668, + "SAR": 11.7626, + "ISR": 16.0497 + }, + "instrumental": { + "SDR": 17.2159, + "SIR": 30.666, + "SAR": 20.7845, + "ISR": 19.2309 + } + } + }, + { + "track_name": "Invisible Familiars - Disturbing Wildlife", + "scores": { + "vocals": { + "SDR": 13.5372, + "SIR": 32.6778, + "SAR": 14.2421, + "ISR": 17.3472 + }, + "instrumental": { + "SDR": 18.4862, + "SIR": 34.8379, + "SAR": 23.6458, + "ISR": 19.5244 + } + } + }, + { + "track_name": "James May - All Souls Moon", + "scores": { + "vocals": { + "SDR": 15.2624, + "SIR": 26.2994, + "SAR": 16.4019, + "ISR": 18.2776 + }, + "instrumental": { + "SDR": 16.7773, + "SIR": 32.3473, + "SAR": 19.3981, + "ISR": 17.9431 + } + } + } + ], + "median_scores": { + "vocals": { + "SDR": 11.0088, + "SIR": 25.1522, + "SAR": 11.7767, + "ISR": 15.399 + }, + "instrumental": { + "SDR": 16.0796, + "SIR": 27.0431, + "SAR": 18.542, + "ISR": 18.577 + } + }, + "stems": [ + "vocals", + "instrumental" + ], + "target_stem": null + }, + "mel_band_roformer_karaoke_gabox.ckpt": { + "model_name": "Roformer Model: MelBand Roformer | Karaoke by Gabox", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 6.88608, + "SIR": 27.7786, + "SAR": 6.37612, + "ISR": 9.25014 + }, + "instrumental": { + "SDR": 16.4048, + "SIR": 21.2481, + "SAR": 19.3112, + "ISR": 19.5408 + }, + "seconds_per_minute_m3": 17.5 + } + }, + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 6.88608, + "SIR": 27.7786, + "SAR": 6.37612, + "ISR": 9.25014 + }, + "instrumental": { + "SDR": 16.4048, + "SIR": 21.2481, + "SAR": 19.3112, + "ISR": 19.5408 + }, + "seconds_per_minute_m3": 9.5 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 8.68991, + "SIR": 28.3824, + "SAR": 5.72926, + "ISR": 8.15281 + }, + "instrumental": { + "SDR": 13.618, + "SIR": 14.1145, + "SAR": 14.2226, + "ISR": 19.3663 + }, + "seconds_per_minute_m3": 8.8 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 11.3862, + "SIR": 30.3756, + "SAR": 10.6916, + "ISR": 12.2328 + }, + "instrumental": { + "SDR": 16.3727, + "SIR": 20.9004, + "SAR": 17.9822, + "ISR": 19.3596 + }, + "seconds_per_minute_m3": 8.8 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 0.77195, + "SIR": 8.6655, + "SAR": 0.31449, + "ISR": 7.357 + }, + "instrumental": { + "SDR": 11.3035, + "SIR": 17.2281, + "SAR": 13.1654, + "ISR": 16.1609 + }, + "seconds_per_minute_m3": 8.8 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 8.92063, + "SIR": 29.0326, + "SAR": 6.73376, + "ISR": 9.13132 + }, + "instrumental": { + "SDR": 13.588, + "SIR": 12.6607, + "SAR": 11.4185, + "ISR": 19.0098 + }, + "seconds_per_minute_m3": 8.7 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 3.63006, + "SIR": 22.2393, + "SAR": 3.69297, + "ISR": 5.86008 + }, + "instrumental": { + "SDR": 6.39273, + "SIR": 8.46748, + "SAR": 10.1885, + "ISR": 18.0867 + }, + "seconds_per_minute_m3": 8.9 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 0.470655, + "SIR": 29.0074, + "SAR": -6.29013, + "ISR": 0.447975 + }, + "instrumental": { + "SDR": 6.65515, + "SIR": 5.20545, + "SAR": 19.3375, + "ISR": 19.8512 + }, + "seconds_per_minute_m3": 8.9 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 8.92486, + "SIR": 28.1179, + "SAR": 10.2117, + "ISR": 11.9891 + }, + "instrumental": { + "SDR": 17.4948, + "SIR": 26.61, + "SAR": 22.2038, + "ISR": 19.6608 + }, + "seconds_per_minute_m3": 8.6 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 14.0375, + "SIR": 37.1893, + "SAR": 15.4431, + "ISR": 17.6437 + }, + "instrumental": { + "SDR": 16.4592, + "SIR": 31.2339, + "SAR": 19.4534, + "ISR": 19.4882 + }, + "seconds_per_minute_m3": 8.4 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 14.9097, + "SIR": 33.7731, + "SAR": 7.02799, + "ISR": 8.7271 + }, + "instrumental": { + "SDR": 17.4964, + "SIR": 12.616, + "SAR": 13.1806, + "ISR": 19.475 + }, + "seconds_per_minute_m3": 8.5 + } + }, + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 6.88608, + "SIR": 27.7786, + "SAR": 6.37612, + "ISR": 9.25014 + }, + "instrumental": { + "SDR": 16.4048, + "SIR": 21.2481, + "SAR": 19.3112, + "ISR": 19.5408 + }, + "seconds_per_minute_m3": 9.9 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 8.68991, + "SIR": 28.3824, + "SAR": 5.72926, + "ISR": 8.15281 + }, + "instrumental": { + "SDR": 13.618, + "SIR": 14.1145, + "SAR": 14.2226, + "ISR": 19.3663 + }, + "seconds_per_minute_m3": 9.2 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 11.3862, + "SIR": 30.3756, + "SAR": 10.6916, + "ISR": 12.2328 + }, + "instrumental": { + "SDR": 16.3727, + "SIR": 20.9004, + "SAR": 17.9822, + "ISR": 19.3596 + }, + "seconds_per_minute_m3": 9.0 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 0.77195, + "SIR": 8.6655, + "SAR": 0.31449, + "ISR": 7.357 + }, + "instrumental": { + "SDR": 11.3035, + "SIR": 17.2281, + "SAR": 13.1654, + "ISR": 16.1609 + }, + "seconds_per_minute_m3": 8.9 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 8.92063, + "SIR": 29.0326, + "SAR": 6.73376, + "ISR": 9.13132 + }, + "instrumental": { + "SDR": 13.588, + "SIR": 12.6607, + "SAR": 11.4185, + "ISR": 19.0098 + }, + "seconds_per_minute_m3": 8.7 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 3.63006, + "SIR": 22.2393, + "SAR": 3.69297, + "ISR": 5.86008 + }, + "instrumental": { + "SDR": 6.39273, + "SIR": 8.46748, + "SAR": 10.1885, + "ISR": 18.0867 + }, + "seconds_per_minute_m3": 8.8 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 0.470655, + "SIR": 29.0074, + "SAR": -6.29013, + "ISR": 0.447975 + }, + "instrumental": { + "SDR": 6.65515, + "SIR": 5.20545, + "SAR": 19.3375, + "ISR": 19.8512 + }, + "seconds_per_minute_m3": 8.9 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 8.92486, + "SIR": 28.1179, + "SAR": 10.2117, + "ISR": 11.9891 + }, + "instrumental": { + "SDR": 17.4948, + "SIR": 26.61, + "SAR": 22.2038, + "ISR": 19.6608 + }, + "seconds_per_minute_m3": 8.6 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 14.0375, + "SIR": 37.1893, + "SAR": 15.4431, + "ISR": 17.6437 + }, + "instrumental": { + "SDR": 16.4592, + "SIR": 31.2339, + "SAR": 19.4534, + "ISR": 19.4882 + }, + "seconds_per_minute_m3": 8.3 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 14.9097, + "SIR": 33.7731, + "SAR": 7.02799, + "ISR": 8.7271 + }, + "instrumental": { + "SDR": 17.4964, + "SIR": 12.616, + "SAR": 13.1806, + "ISR": 19.475 + }, + "seconds_per_minute_m3": 8.2 + } + } + ], + "median_scores": { + "vocals": { + "SDR": 8.68991, + "SIR": 28.3824, + "SAR": 6.37612, + "ISR": 9.13132 + }, + "instrumental": { + "SDR": 16.3727, + "SIR": 17.2281, + "SAR": 17.9822, + "ISR": 19.475 + }, + "seconds_per_minute_m3": 8.8 + }, + "stems": [], + "target_stem": null + }, + "mel_band_roformer_denoise_debleed_gabox.ckpt": { + "model_name": "Roformer Model: MelBand Roformer | Denoise-Debleed by Gabox", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 0.0014, + "SIR": -7.03493, + "SAR": -0.78799, + "ISR": 0.00577 + }, + "instrumental": { + "SDR": 11.2134, + "SIR": 10.8891, + "SAR": 54.0149, + "ISR": 20.0249 + }, + "seconds_per_minute_m3": 187.2 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": -0.00383, + "SIR": -18.3608, + "SAR": -2.43427, + "ISR": 0.00322 + }, + "instrumental": { + "SDR": 6.52325, + "SIR": 5.77486, + "SAR": 39.9222, + "ISR": 19.7504 + }, + "seconds_per_minute_m3": 189.3 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": -0.00109, + "SIR": -5.29795, + "SAR": -4.38224, + "ISR": 0.00076 + }, + "instrumental": { + "SDR": 7.01523, + "SIR": 6.31504, + "SAR": 50.0547, + "ISR": 19.8552 + }, + "seconds_per_minute_m3": 184.7 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": -0.00112, + "SIR": -3.4899, + "SAR": -3.95266, + "ISR": 0.00793 + }, + "instrumental": { + "SDR": 9.87913, + "SIR": 9.54545, + "SAR": 45.0831, + "ISR": 19.8955 + }, + "seconds_per_minute_m3": 190.3 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": -0.00467, + "SIR": -4.53636, + "SAR": -4.6382, + "ISR": 0.003105 + }, + "instrumental": { + "SDR": 2.92688, + "SIR": 2.09233, + "SAR": 33.2344, + "ISR": 19.6816 + }, + "seconds_per_minute_m3": 189.7 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": -8e-05, + "SIR": -10.0035, + "SAR": -0.11587, + "ISR": 0.00328 + }, + "instrumental": { + "SDR": 2.77824, + "SIR": 1.9335, + "SAR": 47.0445, + "ISR": 19.7313 + }, + "seconds_per_minute_m3": 187.6 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": -0.00069, + "SIR": -5.94093, + "SAR": 2.48549, + "ISR": -0.0003 + }, + "instrumental": { + "SDR": 4.99121, + "SIR": 4.21889, + "SAR": 54.2827, + "ISR": 19.9887 + }, + "seconds_per_minute_m3": 191.9 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": -0.00822, + "SIR": -14.4576, + "SAR": 0.99151, + "ISR": 0.003885 + }, + "instrumental": { + "SDR": 13.342, + "SIR": 13.6352, + "SAR": 55.1339, + "ISR": 19.9534 + }, + "seconds_per_minute_m3": 189.0 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": -0.00366, + "SIR": -3.65317, + "SAR": -2.79238, + "ISR": 0.00026 + }, + "instrumental": { + "SDR": 4.04863, + "SIR": 3.25497, + "SAR": 43.0345, + "ISR": 19.7609 + }, + "seconds_per_minute_m3": 189.9 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": -0.0027, + "SIR": -3.70894, + "SAR": -1.77426, + "ISR": -0.00154 + }, + "instrumental": { + "SDR": 4.7393, + "SIR": 3.93978, + "SAR": 49.3048, + "ISR": 19.8585 + }, + "seconds_per_minute_m3": 188.6 + } + }, + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 0.0014, + "SIR": -7.03493, + "SAR": -0.78799, + "ISR": 0.00577 + }, + "instrumental": { + "SDR": 11.2134, + "SIR": 10.8891, + "SAR": 54.0149, + "ISR": 20.0249 + }, + "seconds_per_minute_m3": 184.8 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": -0.00383, + "SIR": -18.3608, + "SAR": -2.43427, + "ISR": 0.00322 + }, + "instrumental": { + "SDR": 6.52325, + "SIR": 5.77486, + "SAR": 39.9222, + "ISR": 19.7504 + }, + "seconds_per_minute_m3": 186.6 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": -0.00109, + "SIR": -5.29795, + "SAR": -4.38224, + "ISR": 0.00076 + }, + "instrumental": { + "SDR": 7.01523, + "SIR": 6.31504, + "SAR": 50.0547, + "ISR": 19.8552 + }, + "seconds_per_minute_m3": 187.6 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": -0.00112, + "SIR": -3.4899, + "SAR": -3.95266, + "ISR": 0.00793 + }, + "instrumental": { + "SDR": 9.87913, + "SIR": 9.54545, + "SAR": 45.0831, + "ISR": 19.8955 + }, + "seconds_per_minute_m3": 189.5 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": -0.00467, + "SIR": -4.53636, + "SAR": -4.6382, + "ISR": 0.003105 + }, + "instrumental": { + "SDR": 2.92688, + "SIR": 2.09233, + "SAR": 33.2344, + "ISR": 19.6816 + }, + "seconds_per_minute_m3": 189.5 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": -8e-05, + "SIR": -10.0035, + "SAR": -0.11587, + "ISR": 0.00328 + }, + "instrumental": { + "SDR": 2.77824, + "SIR": 1.9335, + "SAR": 47.0445, + "ISR": 19.7313 + }, + "seconds_per_minute_m3": 186.9 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": -0.00069, + "SIR": -5.94093, + "SAR": 2.48549, + "ISR": -0.0003 + }, + "instrumental": { + "SDR": 4.99121, + "SIR": 4.21889, + "SAR": 54.2827, + "ISR": 19.9887 + }, + "seconds_per_minute_m3": 194.3 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": -0.00822, + "SIR": -14.4576, + "SAR": 0.99151, + "ISR": 0.003885 + }, + "instrumental": { + "SDR": 13.342, + "SIR": 13.6352, + "SAR": 55.1339, + "ISR": 19.9534 + }, + "seconds_per_minute_m3": 188.7 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": -0.00366, + "SIR": -3.65317, + "SAR": -2.79238, + "ISR": 0.00026 + }, + "instrumental": { + "SDR": 4.04863, + "SIR": 3.25497, + "SAR": 43.0345, + "ISR": 19.7609 + }, + "seconds_per_minute_m3": 187.7 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": -0.0027, + "SIR": -3.70894, + "SAR": -1.77426, + "ISR": -0.00154 + }, + "instrumental": { + "SDR": 4.7393, + "SIR": 3.93978, + "SAR": 49.3048, + "ISR": 19.8585 + }, + "seconds_per_minute_m3": 196.9 + } + } + ], + "median_scores": { + "vocals": { + "SDR": -0.00191, + "SIR": -5.61944, + "SAR": -2.10426, + "ISR": 0.0031625 + }, + "instrumental": { + "SDR": 5.75723, + "SIR": 4.99688, + "SAR": 48.1746, + "ISR": 19.8569 + }, + "seconds_per_minute_m3": 188.8 + }, + "stems": [], + "target_stem": null + }, + "mel_band_roformer_kim_ft2_unwa.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | FT 2 by unwa", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "seconds_per_minute_m3": 8.9 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "seconds_per_minute_m3": 8.6 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "seconds_per_minute_m3": 8.6 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "seconds_per_minute_m3": 8.7 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "seconds_per_minute_m3": 8.7 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "seconds_per_minute_m3": 8.9 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "seconds_per_minute_m3": 9.0 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "seconds_per_minute_m3": 8.8 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "seconds_per_minute_m3": 8.8 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "seconds_per_minute_m3": 9.9 + } + } + ], + "median_scores": { + "seconds_per_minute_m3": 8.8 + }, + "stems": [], + "target_stem": null + }, + "mel_band_roformer_kim_ft2_bleedless_unwa.ckpt": { + "model_name": "Roformer Model: MelBand Roformer Kim | FT 2 Bleedless by unwa", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "seconds_per_minute_m3": 11.3 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "seconds_per_minute_m3": 10.3 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "seconds_per_minute_m3": 9.9 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "seconds_per_minute_m3": 9.8 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "seconds_per_minute_m3": 9.5 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "seconds_per_minute_m3": 9.5 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "seconds_per_minute_m3": 9.6 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "seconds_per_minute_m3": 9.2 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "seconds_per_minute_m3": 8.9 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "seconds_per_minute_m3": 8.8 + } + } + ], + "median_scores": { + "seconds_per_minute_m3": 9.6 + }, + "stems": [], + "target_stem": null + }, + "mel_band_roformer_vocals_becruily.ckpt": { + "model_name": "Roformer Model: MelBand Roformer | Vocals by becruily", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "seconds_per_minute_m3": 193.7 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "seconds_per_minute_m3": 192.2 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "seconds_per_minute_m3": 185.1 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "seconds_per_minute_m3": 186.2 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "seconds_per_minute_m3": 190.2 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "seconds_per_minute_m3": 197.5 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "seconds_per_minute_m3": 193.7 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "seconds_per_minute_m3": 189.6 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "seconds_per_minute_m3": 191.4 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "seconds_per_minute_m3": 187.5 + } + } + ], + "median_scores": { + "seconds_per_minute_m3": 190.8 + }, + "stems": [], + "target_stem": null + }, + "mel_band_roformer_instrumental_becruily.ckpt": { + "model_name": "Roformer Model: MelBand Roformer | Instrumental by becruily", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 6.54838, + "SIR": 23.3712, + "SAR": 7.08102, + "ISR": 10.7044 + }, + "instrumental": { + "SDR": 16.8472, + "SIR": 24.8601, + "SAR": 20.4971, + "ISR": 19.3149 + }, + "seconds_per_minute_m3": 196.2 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 8.73301, + "SIR": 25.8327, + "SAR": 8.89428, + "ISR": 12.1507 + }, + "instrumental": { + "SDR": 14.5559, + "SIR": 21.2613, + "SAR": 16.3529, + "ISR": 18.8549 + }, + "seconds_per_minute_m3": 188.9 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 11.6503, + "SIR": 28.9944, + "SAR": 12.5913, + "ISR": 15.3496 + }, + "instrumental": { + "SDR": 16.7889, + "SIR": 27.3235, + "SAR": 19.7342, + "ISR": 19.237 + }, + "seconds_per_minute_m3": 189.8 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "vocals": { + "SDR": 3.39664, + "SIR": 7.7368, + "SAR": 3.69738, + "ISR": 11.5511 + }, + "instrumental": { + "SDR": 12.0128, + "SIR": 23.3865, + "SAR": 13.95, + "ISR": 15.072 + }, + "seconds_per_minute_m3": 193.7 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "vocals": { + "SDR": 12.9068, + "SIR": 27.0069, + "SAR": 13.8643, + "ISR": 15.6858 + }, + "instrumental": { + "SDR": 15.171, + "SIR": 23.7782, + "SAR": 16.3809, + "ISR": 18.2652 + }, + "seconds_per_minute_m3": 191.0 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "vocals": { + "SDR": 10.124, + "SIR": 21.3743, + "SAR": 11.1673, + "ISR": 13.8313 + }, + "instrumental": { + "SDR": 12.4319, + "SIR": 20.1249, + "SAR": 13.9947, + "ISR": 17.0897 + }, + "seconds_per_minute_m3": 197.3 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "vocals": { + "SDR": 11.3785, + "SIR": 23.5187, + "SAR": 12.508, + "ISR": 13.8912 + }, + "instrumental": { + "SDR": 15.2864, + "SIR": 22.2421, + "SAR": 17.5517, + "ISR": 18.4807 + }, + "seconds_per_minute_m3": 201.1 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "vocals": { + "SDR": 7.41175, + "SIR": 24.9306, + "SAR": 7.57044, + "ISR": 11.0494 + }, + "instrumental": { + "SDR": 18.6341, + "SIR": 29.5544, + "SAR": 25.1912, + "ISR": 19.6354 + }, + "seconds_per_minute_m3": 188.6 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "vocals": { + "SDR": 12.4047, + "SIR": 35.1477, + "SAR": 13.5941, + "ISR": 15.8628 + }, + "instrumental": { + "SDR": 15.4372, + "SIR": 25.9366, + "SAR": 17.7951, + "ISR": 19.3184 + }, + "seconds_per_minute_m3": 191.0 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "vocals": { + "SDR": 12.2305, + "SIR": 23.9563, + "SAR": 11.279, + "ISR": 12.4526 + }, + "instrumental": { + "SDR": 16.2548, + "SIR": 19.7432, + "SAR": 16.6159, + "ISR": 18.3415 + }, + "seconds_per_minute_m3": 194.4 + } + } + ], + "median_scores": { + "vocals": { + "SDR": 10.7513, + "SIR": 24.4434, + "SAR": 11.2232, + "ISR": 13.142 + }, + "instrumental": { + "SDR": 15.3618, + "SIR": 23.5823, + "SAR": 17.0838, + "ISR": 18.6678 + }, + "seconds_per_minute_m3": 192.4 + }, + "stems": [], + "target_stem": null + }, + "mel_band_roformer_vocal_fullness_aname.ckpt": { + "model_name": "Roformer Model: MelBand Roformer | Vocals Fullness by Aname", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "seconds_per_minute_m3": 188.4 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "seconds_per_minute_m3": 193.8 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "seconds_per_minute_m3": 188.1 + } + }, + { + "track_name": "ANiMAL - Rockshow", + "scores": { + "seconds_per_minute_m3": 189.3 + } + }, + { + "track_name": "Actions - Devil's Words", + "scores": { + "seconds_per_minute_m3": 187.8 + } + }, + { + "track_name": "Actions - One Minute Smile", + "scores": { + "seconds_per_minute_m3": 193.0 + } + }, + { + "track_name": "Actions - South Of The Water", + "scores": { + "seconds_per_minute_m3": 199.2 + } + }, + { + "track_name": "Aimee Norwich - Child", + "scores": { + "seconds_per_minute_m3": 187.0 + } + }, + { + "track_name": "Alexander Ross - Goodbye Bolero", + "scores": { + "seconds_per_minute_m3": 192.9 + } + }, + { + "track_name": "Alexander Ross - Velvet Curtain", + "scores": { + "seconds_per_minute_m3": 191.3 + } + } + ], + "median_scores": { + "seconds_per_minute_m3": 190.3 + }, + "stems": [], + "target_stem": null + }, + "bs_roformer_vocals_gabox.ckpt": { + "model_name": "Roformer Model: BS Roformer | Vocals by Gabox", + "track_scores": [ + { + "track_name": "A Classic Education - NightOwl", + "scores": { + "vocals": { + "SDR": 7.30156, + "SIR": 21.5334, + "SAR": 6.88792, + "ISR": 12.6678 + }, + "instrumental": { + "SDR": 17.2849, + "SIR": 28.2602, + "SAR": 20.7549, + "ISR": 19.1586 + }, + "seconds_per_minute_m3": 141.0 + } + }, + { + "track_name": "ANiMAL - Clinic A", + "scores": { + "vocals": { + "SDR": 9.38357, + "SIR": 25.3187, + "SAR": 9.32861, + "ISR": 13.8029 + }, + "instrumental": { + "SDR": 14.7397, + "SIR": 24.1059, + "SAR": 16.5124, + "ISR": 18.6934 + }, + "seconds_per_minute_m3": 154.8 + } + }, + { + "track_name": "ANiMAL - Easy Tiger", + "scores": { + "vocals": { + "SDR": 13.0706, + "SIR": 29.6609, + "SAR": 13.9141, + "ISR": 17.2466 + }, + "instrumental": { + "SDR": 17.2147, + "SIR": 31.544, + "SAR": 20.5026, + "ISR": 19.2753 + }, + "seconds_per_minute_m3": 170.7 + } + } + ], + "median_scores": { + "vocals": { + "SDR": 9.38357, + "SIR": 25.3187, + "SAR": 9.32861, + "ISR": 13.8029 + }, + "instrumental": { + "SDR": 17.2147, + "SIR": 28.2602, + "SAR": 20.5026, + "ISR": 19.1586 + }, + "seconds_per_minute_m3": 154.8 + }, + "stems": [], + "target_stem": null + } +} \ No newline at end of file diff --git a/audio_separator/models.json b/audio_separator/models.json new file mode 100644 index 0000000000000000000000000000000000000000..56a43b3b19084b99268196ae5c2edd424e9848fe --- /dev/null +++ b/audio_separator/models.json @@ -0,0 +1,216 @@ +{ + "vr_download_list": { + "VR Arch Single Model v4: UVR-De-Reverb by aufr33-jarredou": "UVR-De-Reverb-aufr33-jarredou.pth" + }, + "mdx_download_list": { + "MDX-Net Model: UVR-MDX-NET Inst HQ 5": "UVR-MDX-NET-Inst_HQ_5.onnx" + }, + "mdx23c_download_list": { + "MDX23C Model: MDX23C De-Reverb by aufr33-jarredou": { + "MDX23C-De-Reverb-aufr33-jarredou.ckpt": "config_dereverb_mdx23c.yaml" + }, + "MDX23C Model: MDX23C DrumSep by aufr33-jarredou": { + "MDX23C-DrumSep-aufr33-jarredou.ckpt": "config_drumsep_mdx23c.yaml" + } + }, + "roformer_download_list": { + "Roformer Model: Mel-Roformer-Karaoke-Aufr33-Viperx": { + "mel_band_roformer_karaoke_aufr33_viperx_sdr_10.1956.ckpt": "mel_band_roformer_karaoke_aufr33_viperx_sdr_10.1956_config.yaml" + }, + "Roformer Model: MelBand Roformer | Karaoke by Gabox": { + "mel_band_roformer_karaoke_gabox.ckpt": "mel_band_roformer_karaoke_aufr33_viperx_sdr_10.1956_config.yaml" + }, + "Roformer Model: MelBand Roformer | Karaoke by becruily": { + "mel_band_roformer_karaoke_becruily.ckpt": "config_mel_band_roformer_karaoke_becruily.yaml" + }, + "Roformer Model: Mel-Roformer-Denoise-Aufr33": { + "denoise_mel_band_roformer_aufr33_sdr_27.9959.ckpt": "denoise_mel_band_roformer_aufr33_sdr_27.9959_config.yaml" + }, + "Roformer Model: Mel-Roformer-Denoise-Aufr33-Aggr": { + "denoise_mel_band_roformer_aufr33_aggr_sdr_27.9768.ckpt": "denoise_mel_band_roformer_aufr33_aggr_sdr_27.9768_config.yaml" + }, + "Roformer Model: MelBand Roformer | Denoise-Debleed by Gabox": { + "mel_band_roformer_denoise_debleed_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: Mel-Roformer-Crowd-Aufr33-Viperx": { + "mel_band_roformer_crowd_aufr33_viperx_sdr_8.7144.ckpt": "mel_band_roformer_crowd_aufr33_viperx_sdr_8.7144_config.yaml" + }, + "Roformer Model: BS-Roformer-De-Reverb": { + "deverb_bs_roformer_8_384dim_10depth.ckpt": "deverb_bs_roformer_8_384dim_10depth_config.yaml" + }, + "Roformer Model: MelBand Roformer | Vocals by Kimberley Jensen": { + "vocals_mel_band_roformer.ckpt": "vocals_mel_band_roformer.yaml" + }, + "Roformer Model: MelBand Roformer Kim | FT by unwa": { + "mel_band_roformer_kim_ft_unwa.ckpt": "config_mel_band_roformer_kim_ft_unwa.yaml" + }, + "Roformer Model: MelBand Roformer Kim | FT 2 by unwa": { + "mel_band_roformer_kim_ft2_unwa.ckpt": "config_mel_band_roformer_kim_ft_unwa.yaml" + }, + "Roformer Model: MelBand Roformer Kim | FT 2 Bleedless by unwa": { + "mel_band_roformer_kim_ft2_bleedless_unwa.ckpt": "config_mel_band_roformer_kim_ft_unwa.yaml" + }, + "Roformer Model: MelBand Roformer Kim | FT 3 by unwa": { + "mel_band_roformer_kim_ft3_unwa.ckpt": "config_mel_band_roformer_kim_ft_unwa.yaml" + }, + "Roformer Model: MelBand Roformer Kim | Inst V1 Plus by Unwa": { + "melband_roformer_inst_v1_plus.ckpt": "config_melbandroformer_inst.yaml" + }, + "Roformer Model: MelBand Roformer Kim | Inst V1 (E) by Unwa": { + "melband_roformer_inst_v1e.ckpt": "config_melbandroformer_inst.yaml" + }, + "Roformer Model: MelBand Roformer Kim | Inst V1 (E) Plus by Unwa": { + "melband_roformer_inst_v1e_plus.ckpt": "config_melbandroformer_inst.yaml" + }, + "Roformer Model: MelBand Roformer | Vocals by becruily": { + "mel_band_roformer_vocals_becruily.ckpt": "config_mel_band_roformer_vocals_becruily.yaml" + }, + "Roformer Model: MelBand Roformer | Instrumental by becruily": { + "mel_band_roformer_instrumental_becruily.ckpt": "config_mel_band_roformer_instrumental_becruily.yaml" + }, + "Roformer Model: MelBand Roformer | Vocals Fullness by Aname": { + "mel_band_roformer_vocal_fullness_aname.ckpt": "config_mel_band_roformer_vocal_fullness_aname.yaml" + }, + "Roformer Model: BS Roformer | Vocals by Gabox": { + "bs_roformer_vocals_gabox.ckpt": "config_bs_roformer_vocals_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Vocals by Gabox": { + "mel_band_roformer_vocals_gabox.ckpt": "config_mel_band_roformer_vocals_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Vocals FV1 by Gabox": { + "mel_band_roformer_vocals_fv1_gabox.ckpt": "config_mel_band_roformer_vocals_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Vocals FV2 by Gabox": { + "mel_band_roformer_vocals_fv2_gabox.ckpt": "config_mel_band_roformer_vocals_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Vocals FV3 by Gabox": { + "mel_band_roformer_vocals_fv3_gabox.ckpt": "config_mel_band_roformer_vocals_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Vocals FV4 by Gabox": { + "mel_band_roformer_vocals_fv4_gabox.ckpt": "config_mel_band_roformer_vocals_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Instrumental by Gabox": { + "mel_band_roformer_instrumental_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Instrumental 2 by Gabox": { + "mel_band_roformer_instrumental_2_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Instrumental 3 by Gabox": { + "mel_band_roformer_instrumental_3_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Instrumental Bleedless V1 by Gabox": { + "mel_band_roformer_instrumental_bleedless_v1_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Instrumental Bleedless V2 by Gabox": { + "mel_band_roformer_instrumental_bleedless_v2_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Instrumental Bleedless V3 by Gabox": { + "mel_band_roformer_instrumental_bleedless_v3_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Instrumental Fullness V1 by Gabox": { + "mel_band_roformer_instrumental_fullness_v1_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Instrumental Fullness V2 by Gabox": { + "mel_band_roformer_instrumental_fullness_v2_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Instrumental Fullness V3 by Gabox": { + "mel_band_roformer_instrumental_fullness_v3_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | Instrumental Fullness Noisy V4 by Gabox": { + "mel_band_roformer_instrumental_fullness_noise_v4_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | INSTV5 by Gabox": { + "mel_band_roformer_instrumental_instv5_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | INSTV5N by Gabox": { + "mel_band_roformer_instrumental_instv5n_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | INSTV6 by Gabox": { + "mel_band_roformer_instrumental_instv6_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | INSTV6N by Gabox": { + "mel_band_roformer_instrumental_instv6n_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | INSTV7 by Gabox": { + "mel_band_roformer_instrumental_instv7_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | INSTV7N by Gabox": { + "mel_band_roformer_instrumental_instv7n_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | INSTV8 by Gabox": { + "mel_band_roformer_instrumental_instv8_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | INSTV8N by Gabox": { + "mel_band_roformer_instrumental_instv8n_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | FVX by Gabox": { + "mel_band_roformer_instrumental_fvx_gabox.ckpt": "config_mel_band_roformer_instrumental_gabox.yaml" + }, + "Roformer Model: MelBand Roformer | De-Reverb by anvuew": { + "dereverb_mel_band_roformer_anvuew_sdr_19.1729.ckpt": "dereverb_mel_band_roformer_anvuew.yaml" + }, + "Roformer Model: MelBand Roformer | De-Reverb Less Aggressive by anvuew": { + "dereverb_mel_band_roformer_less_aggressive_anvuew_sdr_18.8050.ckpt": "dereverb_mel_band_roformer_anvuew.yaml" + }, + "Roformer Model: MelBand Roformer | De-Reverb Mono by anvuew": { + "dereverb_mel_band_roformer_mono_anvuew.ckpt": "dereverb_mel_band_roformer_anvuew.yaml" + }, + "Roformer Model: MelBand Roformer | De-Reverb Big by Sucial": { + "dereverb_big_mbr_ep_362.ckpt": "config_dereverb_echo_mel_band_roformer_v2.yaml" + }, + "Roformer Model: MelBand Roformer | De-Reverb Super Big by Sucial": { + "dereverb_super_big_mbr_ep_346.ckpt": "config_dereverb_echo_mel_band_roformer_v2.yaml" + }, + "Roformer Model: MelBand Roformer | De-Reverb-Echo by Sucial": { + "dereverb-echo_mel_band_roformer_sdr_10.0169.ckpt": "config_dereverb-echo_mel_band_roformer.yaml" + }, + "Roformer Model: MelBand Roformer | De-Reverb-Echo V2 by Sucial": { + "dereverb-echo_mel_band_roformer_sdr_13.4843_v2.ckpt": "config_dereverb-echo_mel_band_roformer_sdr_13.4843_v2.yaml" + }, + "Roformer Model: MelBand Roformer | De-Reverb-Echo Fused by Sucial": { + "dereverb_echo_mbr_fused.ckpt": "config_dereverb_echo_mel_band_roformer_v2.yaml" + }, + "Roformer Model: MelBand Roformer Kim | SYHFT by SYH99999": { + "MelBandRoformerSYHFT.ckpt": "config_vocals_mel_band_roformer_ft.yaml" + }, + "Roformer Model: MelBand Roformer Kim | SYHFT V2 by SYH99999": { + "MelBandRoformerSYHFTV2.ckpt": "config_vocals_mel_band_roformer_ft.yaml" + }, + "Roformer Model: MelBand Roformer Kim | SYHFT V2.5 by SYH99999": { + "MelBandRoformerSYHFTV2.5.ckpt": "config_vocals_mel_band_roformer_ft.yaml" + }, + "Roformer Model: MelBand Roformer Kim | SYHFT V3 by SYH99999": { + "MelBandRoformerSYHFTV3Epsilon.ckpt": "config_vocals_mel_band_roformer_ft.yaml" + }, + "Roformer Model: MelBand Roformer Kim | Big SYHFT V1 by SYH99999": { + "MelBandRoformerBigSYHFTV1.ckpt": "config_vocals_mel_band_roformer_big_v1_ft.yaml" + }, + "Roformer Model: MelBand Roformer Kim | Big Beta 4 FT by unwa": { + "melband_roformer_big_beta4.ckpt": "config_melbandroformer_big_beta4.yaml" + }, + "Roformer Model: MelBand Roformer Kim | Big Beta 5e FT by unwa": { + "melband_roformer_big_beta5e.ckpt": "config_melband_roformer_big_beta5e.yaml" + }, + "Roformer Model: MelBand Roformer | Big Beta 6 by unwa": { + "melband_roformer_big_beta6.ckpt": "config_melbandroformer_big_beta6.yaml" + }, + "Roformer Model: MelBand Roformer | Big Beta 6X by unwa": { + "melband_roformer_big_beta6x.ckpt": "config_melbandroformer_big_beta6x.yaml" + }, + "Roformer Model: BS Roformer | Chorus Male-Female by Sucial": { + "model_chorus_bs_roformer_ep_267_sdr_24.1275.ckpt": "config_chorus_male_female_bs_roformer.yaml" + }, + "Roformer Model: BS Roformer | Male-Female by aufr33": { + "bs_roformer_male_female_by_aufr33_sdr_7.2889.ckpt": "config_chorus_male_female_bs_roformer.yaml" + }, + "Roformer Model: MelBand Roformer | Aspiration by Sucial": { + "aspiration_mel_band_roformer_sdr_18.9845.ckpt": "config_aspiration_mel_band_roformer.yaml" + }, + "Roformer Model: MelBand Roformer | Aspiration Less Aggressive by Sucial": { + "aspiration_mel_band_roformer_less_aggr_sdr_18.1201.ckpt": "config_aspiration_mel_band_roformer.yaml" + }, + "Roformer Model: MelBand Roformer | Bleed Suppressor V1 by unwa-97chris": { + "mel_band_roformer_bleed_suppressor_v1.ckpt": "config_mel_band_roformer_bleed_suppressor_v1.yaml" + } + } +} diff --git a/audio_separator/separator/__init__.py b/audio_separator/separator/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..2d36e8f2324c37d5f4ab2087ca071322bf450df8 --- /dev/null +++ b/audio_separator/separator/__init__.py @@ -0,0 +1 @@ +from .separator import Separator diff --git a/audio_separator/separator/architectures/__init__.py b/audio_separator/separator/architectures/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/audio_separator/separator/architectures/demucs_separator.py b/audio_separator/separator/architectures/demucs_separator.py new file mode 100644 index 0000000000000000000000000000000000000000..d1d62dc3103dc72ed047f58b37e487f724ae0d5c --- /dev/null +++ b/audio_separator/separator/architectures/demucs_separator.py @@ -0,0 +1,195 @@ +import os +import sys +from pathlib import Path +import torch +import numpy as np +from audio_separator.separator.common_separator import CommonSeparator +from audio_separator.separator.uvr_lib_v5.demucs.apply import apply_model, demucs_segments +from audio_separator.separator.uvr_lib_v5.demucs.hdemucs import HDemucs +from audio_separator.separator.uvr_lib_v5.demucs.pretrained import get_model as get_demucs_model +from audio_separator.separator.uvr_lib_v5 import spec_utils + +DEMUCS_4_SOURCE = ["drums", "bass", "other", "vocals"] + +DEMUCS_2_SOURCE_MAPPER = {CommonSeparator.INST_STEM: 0, CommonSeparator.VOCAL_STEM: 1} +DEMUCS_4_SOURCE_MAPPER = {CommonSeparator.BASS_STEM: 0, CommonSeparator.DRUM_STEM: 1, CommonSeparator.OTHER_STEM: 2, CommonSeparator.VOCAL_STEM: 3} +DEMUCS_6_SOURCE_MAPPER = { + CommonSeparator.BASS_STEM: 0, + CommonSeparator.DRUM_STEM: 1, + CommonSeparator.OTHER_STEM: 2, + CommonSeparator.VOCAL_STEM: 3, + CommonSeparator.GUITAR_STEM: 4, + CommonSeparator.PIANO_STEM: 5, +} + + +class DemucsSeparator(CommonSeparator): + """ + DemucsSeparator is responsible for separating audio sources using Demucs models. + It initializes with configuration parameters and prepares the model for separation tasks. + """ + + def __init__(self, common_config, arch_config): + # Any configuration values which can be shared between architectures should be set already in CommonSeparator, + # e.g. user-specified functionality choices (self.output_single_stem) or common model parameters (self.primary_stem_name) + super().__init__(config=common_config) + + # Initializing user-configurable parameters, passed through with an mdx_from the CLI or Separator instance + + # Adjust segments to manage RAM or V-RAM usage: + # - Smaller sizes consume less resources. + # - Bigger sizes consume more resources, but may provide better results. + # - "Default" picks the optimal size. + # DEMUCS_SEGMENTS = (DEF_OPT, '1', '5', '10', '15', '20', + # '25', '30', '35', '40', '45', '50', + # '55', '60', '65', '70', '75', '80', + # '85', '90', '95', '100') + self.segment_size = arch_config.get("segment_size", "Default") + + # Performs multiple predictions with random shifts of the input and averages them. + # The higher number of shifts, the longer the prediction will take. + # Not recommended unless you have a GPU. + # DEMUCS_SHIFTS = (0, 1, 2, 3, 4, 5, + # 6, 7, 8, 9, 10, 11, + # 12, 13, 14, 15, 16, 17, + # 18, 19, 20) + self.shifts = arch_config.get("shifts", 2) + + # This option controls the amount of overlap between prediction windows. + # - Higher values can provide better results, but will lead to longer processing times. + # - You can choose between 0.001-0.999 + # DEMUCS_OVERLAP = (0.25, 0.50, 0.75, 0.99) + self.overlap = arch_config.get("overlap", 0.25) + + # Enables "Segments". Deselecting this option is only recommended for those with powerful PCs. + self.segments_enabled = arch_config.get("segments_enabled", True) + + self.logger.debug(f"Demucs arch params: segment_size={self.segment_size}, segments_enabled={self.segments_enabled}") + self.logger.debug(f"Demucs arch params: shifts={self.shifts}, overlap={self.overlap}") + + self.demucs_source_map = DEMUCS_4_SOURCE_MAPPER + + self.audio_file_path = None + self.audio_file_base = None + self.demucs_model_instance = None + + # Add uvr_lib_v5 folder to system path so pytorch serialization can find the demucs module + current_dir = os.path.dirname(__file__) + uvr_lib_v5_path = os.path.join(current_dir, "..", "uvr_lib_v5") + sys.path.insert(0, uvr_lib_v5_path) + + self.logger.info("Demucs Separator initialisation complete") + + def separate(self, audio_file_path, custom_output_names=None): + """ + Separates the audio file into its component stems using the Demucs model. + + Args: + audio_file_path (str): The path to the audio file to be processed. + custom_output_names (dict, optional): Custom names for the output files. Defaults to None. + + Returns: + list: A list of paths to the output files generated by the separation process. + """ + self.logger.debug("Starting separation process...") + source = None + stem_source = None + inst_source = {} + + self.audio_file_path = audio_file_path + self.audio_file_base = os.path.splitext(os.path.basename(audio_file_path))[0] + + # Prepare the mix for processing + self.logger.debug("Preparing mix...") + mix = self.prepare_mix(self.audio_file_path) + + self.logger.debug(f"Mix prepared for demixing. Shape: {mix.shape}") + + self.logger.debug("Loading model for demixing...") + + self.demucs_model_instance = HDemucs(sources=DEMUCS_4_SOURCE) + self.demucs_model_instance = get_demucs_model(name=os.path.splitext(os.path.basename(self.model_path))[0], repo=Path(os.path.dirname(self.model_path))) + self.demucs_model_instance = demucs_segments(self.segment_size, self.demucs_model_instance) + self.demucs_model_instance.to(self.torch_device) + self.demucs_model_instance.eval() + + self.logger.debug("Model loaded and set to evaluation mode.") + + source = self.demix_demucs(mix) + + del self.demucs_model_instance + self.clear_gpu_cache() + self.logger.debug("Model and GPU cache cleared after demixing.") + + output_files = [] + self.logger.debug("Processing output files...") + + if isinstance(inst_source, np.ndarray): + self.logger.debug("Processing instance source...") + source_reshape = spec_utils.reshape_sources(inst_source[self.demucs_source_map[CommonSeparator.VOCAL_STEM]], source[self.demucs_source_map[CommonSeparator.VOCAL_STEM]]) + inst_source[self.demucs_source_map[CommonSeparator.VOCAL_STEM]] = source_reshape + source = inst_source + + if isinstance(source, np.ndarray): + source_length = len(source) + self.logger.debug(f"Processing source array, source length is {source_length}") + match source_length: + case 2: + self.logger.debug("Setting source map to 2-stem...") + self.demucs_source_map = DEMUCS_2_SOURCE_MAPPER + case 6: + self.logger.debug("Setting source map to 6-stem...") + self.demucs_source_map = DEMUCS_6_SOURCE_MAPPER + case _: + self.logger.debug("Setting source map to 4-stem...") + self.demucs_source_map = DEMUCS_4_SOURCE_MAPPER + + self.logger.debug("Processing for all stems...") + for stem_name, stem_value in self.demucs_source_map.items(): + if self.output_single_stem is not None: + if stem_name.lower() != self.output_single_stem.lower(): + self.logger.debug(f"Skipping writing stem {stem_name} as output_single_stem is set to {self.output_single_stem}...") + continue + + stem_path = self.get_stem_output_path(stem_name, custom_output_names) + stem_source = source[stem_value].T + + self.final_process(stem_path, stem_source, stem_name) + output_files.append(stem_path) + + return output_files + + def demix_demucs(self, mix): + """ + Demixes the input mix using the demucs model. + """ + self.logger.debug("Starting demixing process in demix_demucs...") + + processed = {} + mix = torch.tensor(mix, dtype=torch.float32) + ref = mix.mean(0) + mix = (mix - ref.mean()) / ref.std() + mix_infer = mix + + with torch.no_grad(): + self.logger.debug("Running model inference...") + sources = apply_model( + model=self.demucs_model_instance, + mix=mix_infer[None], + shifts=self.shifts, + split=self.segments_enabled, + overlap=self.overlap, + static_shifts=1 if self.shifts == 0 else self.shifts, + set_progress_bar=None, + device=self.torch_device, + progress=True, + )[0] + + sources = (sources * ref.std() + ref.mean()).cpu().numpy() + sources[[0, 1]] = sources[[1, 0]] + processed[mix] = sources[:, :, 0:None].copy() + sources = list(processed.values()) + sources = [s[:, :, 0:None] for s in sources] + sources = np.concatenate(sources, axis=-1) + + return sources diff --git a/audio_separator/separator/architectures/mdx_separator.py b/audio_separator/separator/architectures/mdx_separator.py new file mode 100644 index 0000000000000000000000000000000000000000..bcef5c1da0c3ca30c393c89baf1648d531e0ab6b --- /dev/null +++ b/audio_separator/separator/architectures/mdx_separator.py @@ -0,0 +1,451 @@ +"""Module for separating audio sources using MDX architecture models.""" + +import os +import platform +import torch +import onnx +import onnxruntime as ort +import numpy as np +import onnx2torch +from tqdm import tqdm +from audio_separator.separator.uvr_lib_v5 import spec_utils +from audio_separator.separator.uvr_lib_v5.stft import STFT +from audio_separator.separator.common_separator import CommonSeparator + + +class MDXSeparator(CommonSeparator): + """ + MDXSeparator is responsible for separating audio sources using MDX models. + It initializes with configuration parameters and prepares the model for separation tasks. + """ + + def __init__(self, common_config, arch_config): + # Any configuration values which can be shared between architectures should be set already in CommonSeparator, + # e.g. user-specified functionality choices (self.output_single_stem) or common model parameters (self.primary_stem_name) + super().__init__(config=common_config) + + # Initializing user-configurable parameters, passed through with an mdx_from the CLI or Separator instance + + # Pick a segment size to balance speed, resource use, and quality: + # - Smaller sizes consume less resources. + # - Bigger sizes consume more resources, but may provide better results. + # - Default size is 256. Quality can change based on your pick. + self.segment_size = arch_config.get("segment_size") + + # This option controls the amount of overlap between prediction windows. + # - Higher values can provide better results, but will lead to longer processing times. + # - For Non-MDX23C models: You can choose between 0.001-0.999 + self.overlap = arch_config.get("overlap") + + # Number of batches to be processed at a time. + # - Higher values mean more RAM usage but slightly faster processing times. + # - Lower values mean less RAM usage but slightly longer processing times. + # - Batch size value has no effect on output quality. + # BATCH_SIZE = ('1', ''2', '3', '4', '5', '6', '7', '8', '9', '10') + self.batch_size = arch_config.get("batch_size", 1) + + # hop_length is equivalent to the more commonly used term "stride" in convolutional neural networks + # In machine learning, particularly in the context of convolutional neural networks (CNNs), + # the term "stride" refers to the number of pixels by which we move the filter across the input image. + # Strides are a crucial component in the convolution operation, a fundamental building block of CNNs used primarily in the field of computer vision. + # Stride is a parameter that dictates the movement of the kernel, or filter, across the input data, such as an image. + # When performing a convolution operation, the stride determines how many units the filter shifts at each step. + # The choice of stride affects the model in several ways: + # Output Size: A larger stride will result in a smaller output spatial dimension. + # Computational Efficiency: Increasing the stride can decrease the computational load. + # Field of View: A higher stride means that each step of the filter takes into account a wider area of the input image. + # This can be beneficial when the model needs to capture more global features rather than focusing on finer details. + self.hop_length = arch_config.get("hop_length") + + # If enabled, model will be run twice to reduce noise in output audio. + self.enable_denoise = arch_config.get("enable_denoise") + + self.logger.debug(f"MDX arch params: batch_size={self.batch_size}, segment_size={self.segment_size}") + self.logger.debug(f"MDX arch params: overlap={self.overlap}, hop_length={self.hop_length}, enable_denoise={self.enable_denoise}") + + # Initializing model-specific parameters from model_data JSON + self.compensate = self.model_data["compensate"] + self.dim_f = self.model_data["mdx_dim_f_set"] + self.dim_t = 2 ** self.model_data["mdx_dim_t_set"] + self.n_fft = self.model_data["mdx_n_fft_scale_set"] + self.config_yaml = self.model_data.get("config_yaml", None) + + self.logger.debug(f"MDX arch params: compensate={self.compensate}, dim_f={self.dim_f}, dim_t={self.dim_t}, n_fft={self.n_fft}") + self.logger.debug(f"MDX arch params: config_yaml={self.config_yaml}") + + # In UVR, these variables are set but either aren't useful or are better handled in audio-separator. + # Leaving these comments explaining to help myself or future developers understand why these aren't in audio-separator. + + # "chunks" is not actually used for anything in UVR... + # self.chunks = 0 + + # "adjust" is hard-coded to 1 in UVR, and only used as a multiplier in run_model, so it does nothing. + # self.adjust = 1 + + # "hop" is hard-coded to 1024 in UVR. We have a "hop_length" parameter instead + # self.hop = 1024 + + # "margin" maps to sample rate and is set from the GUI in UVR (default: 44100). We have a "sample_rate" parameter instead. + # self.margin = 44100 + + # "dim_c" is hard-coded to 4 in UVR, seems to be a parameter for the number of channels, and is only used for checkpoint models. + # We haven't implemented support for the checkpoint models here, so we're not using it. + # self.dim_c = 4 + + self.load_model() + + self.n_bins = 0 + self.trim = 0 + self.chunk_size = 0 + self.gen_size = 0 + self.stft = None + + self.primary_source = None + self.secondary_source = None + self.audio_file_path = None + self.audio_file_base = None + + def load_model(self): + """ + Load the model into memory from file on disk, initialize it with config from the model data, + and prepare for inferencing using hardware accelerated Torch device. + """ + self.logger.debug("Loading ONNX model for inference...") + + if self.segment_size == self.dim_t: + ort_session_options = ort.SessionOptions() + if self.log_level > 10: + ort_session_options.log_severity_level = 3 + else: + ort_session_options.log_severity_level = 0 + + ort_inference_session = ort.InferenceSession(self.model_path, providers=self.onnx_execution_provider, sess_options=ort_session_options) + self.model_run = lambda spek: ort_inference_session.run(None, {"input": spek.cpu().numpy()})[0] + self.logger.debug("Model loaded successfully using ONNXruntime inferencing session.") + else: + if platform.system() == 'Windows': + onnx_model = onnx.load(self.model_path) + self.model_run = onnx2torch.convert(onnx_model) + else: + self.model_run = onnx2torch.convert(self.model_path) + + self.model_run.to(self.torch_device).eval() + self.logger.warning("Model converted from onnx to pytorch due to segment size not matching dim_t, processing may be slower.") + + def separate(self, audio_file_path, custom_output_names=None): + """ + Separates the audio file into primary and secondary sources based on the model's configuration. + It processes the mix, demixes it into sources, normalizes the sources, and saves the output files. + + Args: + audio_file_path (str): The path to the audio file to be processed. + custom_output_names (dict, optional): Custom names for the output files. Defaults to None. + + Returns: + list: A list of paths to the output files generated by the separation process. + """ + self.audio_file_path = audio_file_path + self.audio_file_base = os.path.splitext(os.path.basename(audio_file_path))[0] + + # Prepare the mix for processing + self.logger.debug(f"Preparing mix for input audio file {self.audio_file_path}...") + mix = self.prepare_mix(self.audio_file_path) + + self.logger.debug("Normalizing mix before demixing...") + mix = spec_utils.normalize(wave=mix, max_peak=self.normalization_threshold, min_peak=self.amplification_threshold) + + # Start the demixing process + source = self.demix(mix) + self.logger.debug("Demixing completed.") + + # In UVR, the source is cached here if it's a vocal split model, but we're not supporting that yet + + # Initialize the list for output files + output_files = [] + self.logger.debug("Processing output files...") + + # Normalize and transpose the primary source if it's not already an array + if not isinstance(self.primary_source, np.ndarray): + self.logger.debug("Normalizing primary source...") + self.primary_source = spec_utils.normalize(wave=source, max_peak=self.normalization_threshold, min_peak=self.amplification_threshold).T + + # Process the secondary source if not already an array + if not isinstance(self.secondary_source, np.ndarray): + self.logger.debug("Producing secondary source: demixing in match_mix mode") + raw_mix = self.demix(mix, is_match_mix=True) + + if self.invert_using_spec: + self.logger.debug("Inverting secondary stem using spectogram as invert_using_spec is set to True") + self.secondary_source = spec_utils.invert_stem(raw_mix, source) + else: + self.logger.debug("Inverting secondary stem by subtracting of transposed demixed stem from transposed original mix") + self.secondary_source = mix.T - source.T + + # Save and process the secondary stem if needed + if not self.output_single_stem or self.output_single_stem.lower() == self.secondary_stem_name.lower(): + self.secondary_stem_output_path = self.get_stem_output_path(self.secondary_stem_name, custom_output_names) + + self.logger.info(f"Saving {self.secondary_stem_name} stem to {self.secondary_stem_output_path}...") + self.final_process(self.secondary_stem_output_path, self.secondary_source, self.secondary_stem_name) + output_files.append(self.secondary_stem_output_path) + + # Save and process the primary stem if needed + if not self.output_single_stem or self.output_single_stem.lower() == self.primary_stem_name.lower(): + self.primary_stem_output_path = self.get_stem_output_path(self.primary_stem_name, custom_output_names) + + if not isinstance(self.primary_source, np.ndarray): + self.primary_source = source.T + + self.logger.info(f"Saving {self.primary_stem_name} stem to {self.primary_stem_output_path}...") + self.final_process(self.primary_stem_output_path, self.primary_source, self.primary_stem_name) + output_files.append(self.primary_stem_output_path) + + # Not yet implemented from UVR features: + # self.process_vocal_split_chain(secondary_sources) + # self.logger.debug("Vocal split chain processed.") + + return output_files + + def initialize_model_settings(self): + """ + This function sets up the necessary parameters for the model, like the number of frequency bins (n_bins), the trimming size (trim), + the size of each audio chunk (chunk_size), and the window function for spectral transformations (window). + It ensures that the model is configured with the correct settings for processing the audio data. + """ + self.logger.debug("Initializing model settings...") + + # n_bins is half the FFT size plus one (self.n_fft // 2 + 1). + self.n_bins = self.n_fft // 2 + 1 + + # trim is half the FFT size (self.n_fft // 2). + self.trim = self.n_fft // 2 + + # chunk_size is the hop_length size times the segment size minus one + self.chunk_size = self.hop_length * (self.segment_size - 1) + + # gen_size is the chunk size minus twice the trim size + self.gen_size = self.chunk_size - 2 * self.trim + + self.stft = STFT(self.logger, self.n_fft, self.hop_length, self.dim_f, self.torch_device) + + self.logger.debug(f"Model input params: n_fft={self.n_fft} hop_length={self.hop_length} dim_f={self.dim_f}") + self.logger.debug(f"Model settings: n_bins={self.n_bins}, trim={self.trim}, chunk_size={self.chunk_size}, gen_size={self.gen_size}") + + def initialize_mix(self, mix, is_ckpt=False): + """ + After prepare_mix segments the audio, initialize_mix further processes each segment. + It ensures each audio segment is in the correct format for the model, applies necessary padding, + and converts the segments into tensors for processing with the model. + This step is essential for preparing the audio data in a format that the neural network can process. + """ + # Log the initialization of the mix and whether checkpoint mode is used + self.logger.debug(f"Initializing mix with is_ckpt={is_ckpt}. Initial mix shape: {mix.shape}") + + # Ensure the mix is a 2-channel (stereo) audio signal + if mix.shape[0] != 2: + error_message = f"Expected a 2-channel audio signal, but got {mix.shape[0]} channels" + self.logger.error(error_message) + raise ValueError(error_message) + + # If in checkpoint mode, process the mix differently + if is_ckpt: + self.logger.debug("Processing in checkpoint mode...") + # Calculate padding based on the generation size and trim + pad = self.gen_size + self.trim - (mix.shape[-1] % self.gen_size) + self.logger.debug(f"Padding calculated: {pad}") + # Add padding at the beginning and the end of the mix + mixture = np.concatenate((np.zeros((2, self.trim), dtype="float32"), mix, np.zeros((2, pad), dtype="float32")), 1) + # Determine the number of chunks based on the mixture's length + num_chunks = mixture.shape[-1] // self.gen_size + self.logger.debug(f"Mixture shape after padding: {mixture.shape}, Number of chunks: {num_chunks}") + # Split the mixture into chunks + mix_waves = [mixture[:, i * self.gen_size : i * self.gen_size + self.chunk_size] for i in range(num_chunks)] + else: + # If not in checkpoint mode, process normally + self.logger.debug("Processing in non-checkpoint mode...") + mix_waves = [] + n_sample = mix.shape[1] + # Calculate necessary padding to make the total length divisible by the generation size + pad = self.gen_size - n_sample % self.gen_size + self.logger.debug(f"Number of samples: {n_sample}, Padding calculated: {pad}") + # Apply padding to the mix + mix_p = np.concatenate((np.zeros((2, self.trim)), mix, np.zeros((2, pad)), np.zeros((2, self.trim))), 1) + self.logger.debug(f"Shape of mix after padding: {mix_p.shape}") + + # Process the mix in chunks + i = 0 + while i < n_sample + pad: + waves = np.array(mix_p[:, i : i + self.chunk_size]) + mix_waves.append(waves) + self.logger.debug(f"Processed chunk {len(mix_waves)}: Start {i}, End {i + self.chunk_size}") + i += self.gen_size + + # Convert the list of wave chunks into a tensor for processing on the specified device + mix_waves_tensor = torch.tensor(mix_waves, dtype=torch.float32).to(self.torch_device) + self.logger.debug(f"Converted mix_waves to tensor. Tensor shape: {mix_waves_tensor.shape}") + + return mix_waves_tensor, pad + + def demix(self, mix, is_match_mix=False): + """ + Demixes the input mix into its constituent sources. If is_match_mix is True, the function adjusts the processing + to better match the mix, affecting chunk sizes and overlaps. The demixing process involves padding the mix, + processing it in chunks, applying windowing for overlaps, and accumulating the results to separate the sources. + """ + self.logger.debug(f"Starting demixing process with is_match_mix: {is_match_mix}...") + self.initialize_model_settings() + + # Preserves the original mix for later use. + # In UVR, this is used for the pitch fix and VR denoise processes, which aren't yet implemented here. + org_mix = mix + self.logger.debug(f"Original mix stored. Shape: {org_mix.shape}") + + # Initializes a list to store the separated waveforms. + tar_waves_ = [] + + # Handling different chunk sizes and overlaps based on the matching requirement. + if is_match_mix: + # Sets a smaller chunk size specifically for matching the mix. + chunk_size = self.hop_length * (self.segment_size - 1) + # Sets a small overlap for the chunks. + overlap = 0.02 + self.logger.debug(f"Chunk size for matching mix: {chunk_size}, Overlap: {overlap}") + else: + # Uses the regular chunk size defined in model settings. + chunk_size = self.chunk_size + # Uses the overlap specified in the model settings. + overlap = self.overlap + self.logger.debug(f"Standard chunk size: {chunk_size}, Overlap: {overlap}") + + # Calculates the generated size after subtracting the trim from both ends of the chunk. + gen_size = chunk_size - 2 * self.trim + self.logger.debug(f"Generated size calculated: {gen_size}") + + # Calculates padding to make the mix length a multiple of the generated size. + pad = gen_size + self.trim - ((mix.shape[-1]) % gen_size) + # Prepares the mixture with padding at the beginning and the end. + mixture = np.concatenate((np.zeros((2, self.trim), dtype="float32"), mix, np.zeros((2, pad), dtype="float32")), 1) + self.logger.debug(f"Mixture prepared with padding. Mixture shape: {mixture.shape}") + + # Calculates the step size for processing chunks based on the overlap. + step = int((1 - overlap) * chunk_size) + self.logger.debug(f"Step size for processing chunks: {step} as overlap is set to {overlap}.") + + # Initializes arrays to store the results and to account for overlap. + result = np.zeros((1, 2, mixture.shape[-1]), dtype=np.float32) + divider = np.zeros((1, 2, mixture.shape[-1]), dtype=np.float32) + + # Initializes counters for processing chunks. + total = 0 + total_chunks = (mixture.shape[-1] + step - 1) // step + self.logger.debug(f"Total chunks to process: {total_chunks}") + + # Processes each chunk of the mixture. + for i in tqdm(range(0, mixture.shape[-1], step)): + total += 1 + start = i + end = min(i + chunk_size, mixture.shape[-1]) + self.logger.debug(f"Processing chunk {total}/{total_chunks}: Start {start}, End {end}") + + # Handles windowing for overlapping chunks. + chunk_size_actual = end - start + window = None + if overlap != 0: + window = np.hanning(chunk_size_actual) + window = np.tile(window[None, None, :], (1, 2, 1)) + self.logger.debug("Window applied to the chunk.") + + # Zero-pad the chunk to prepare it for processing. + mix_part_ = mixture[:, start:end] + if end != i + chunk_size: + pad_size = (i + chunk_size) - end + mix_part_ = np.concatenate((mix_part_, np.zeros((2, pad_size), dtype="float32")), axis=-1) + + # Converts the chunk to a tensor for processing. + mix_part = torch.tensor([mix_part_], dtype=torch.float32).to(self.torch_device) + # Splits the chunk into smaller batches if necessary. + mix_waves = mix_part.split(self.batch_size) + total_batches = len(mix_waves) + self.logger.debug(f"Mix part split into batches. Number of batches: {total_batches}") + + with torch.no_grad(): + # Processes each batch in the chunk. + batches_processed = 0 + for mix_wave in mix_waves: + batches_processed += 1 + self.logger.debug(f"Processing mix_wave batch {batches_processed}/{total_batches}") + + # Runs the model to separate the sources. + tar_waves = self.run_model(mix_wave, is_match_mix=is_match_mix) + + # Applies windowing if needed and accumulates the results. + if window is not None: + tar_waves[..., :chunk_size_actual] *= window + divider[..., start:end] += window + else: + divider[..., start:end] += 1 + + result[..., start:end] += tar_waves[..., : end - start] + + # Normalizes the results by the divider to account for overlap. + self.logger.debug("Normalizing result by dividing result by divider.") + tar_waves = result / divider + tar_waves_.append(tar_waves) + + # Reshapes the results to match the original dimensions. + tar_waves_ = np.vstack(tar_waves_)[:, :, self.trim : -self.trim] + tar_waves = np.concatenate(tar_waves_, axis=-1)[:, : mix.shape[-1]] + + # Extracts the source from the results. + source = tar_waves[:, 0:None] + self.logger.debug(f"Concatenated tar_waves. Shape: {tar_waves.shape}") + + # TODO: In UVR, pitch changing happens here. Consider implementing this as a feature. + + # Compensates the source if not matching the mix. + if not is_match_mix: + source *= self.compensate + self.logger.debug("Match mix mode; compensate multiplier applied.") + + # TODO: In UVR, VR denoise model gets applied here. Consider implementing this as a feature. + + self.logger.debug("Demixing process completed.") + return source + + def run_model(self, mix, is_match_mix=False): + """ + Processes the input mix through the model to separate the sources. + Applies STFT, handles spectrum modifications, and runs the model for source separation. + """ + # Applying the STFT to the mix. The mix is moved to the specified device (e.g., GPU) before processing. + # self.logger.debug(f"Running STFT on the mix. Mix shape before STFT: {mix.shape}") + spek = self.stft(mix.to(self.torch_device)) + self.logger.debug(f"STFT applied on mix. Spectrum shape: {spek.shape}") + + # Zeroing out the first 3 bins of the spectrum. This is often done to reduce low-frequency noise. + spek[:, :, :3, :] *= 0 + # self.logger.debug("First 3 bins of the spectrum zeroed out.") + + # Handling the case where the mix needs to be matched (is_match_mix = True) + if is_match_mix: + # self.logger.debug("Match mix mode is enabled. Converting spectrum to NumPy array.") + spec_pred = spek.cpu().numpy() + self.logger.debug("is_match_mix: spectrum prediction obtained directly from STFT output.") + else: + # If denoising is enabled, the model is run on both the negative and positive spectrums. + if self.enable_denoise: + # Assuming spek is a tensor and self.model_run can process it directly + spec_pred_neg = self.model_run(-spek) # Ensure this line correctly negates spek and runs the model + spec_pred_pos = self.model_run(spek) + # Ensure both spec_pred_neg and spec_pred_pos are tensors before applying operations + spec_pred = (spec_pred_neg * -0.5) + (spec_pred_pos * 0.5) # [invalid-unary-operand-type] + self.logger.debug("Model run on both negative and positive spectrums for denoising.") + else: + spec_pred = self.model_run(spek) + self.logger.debug("Model run on the spectrum without denoising.") + + # Applying the inverse STFT to convert the spectrum back to the time domain. + result = self.stft.inverse(torch.tensor(spec_pred).to(self.torch_device)).cpu().detach().numpy() + self.logger.debug(f"Inverse STFT applied. Returning result with shape: {result.shape}") + + return result diff --git a/audio_separator/separator/architectures/mdxc_separator.py b/audio_separator/separator/architectures/mdxc_separator.py new file mode 100644 index 0000000000000000000000000000000000000000..39bd98382f5b08bb68958292e75e2396091e54b4 --- /dev/null +++ b/audio_separator/separator/architectures/mdxc_separator.py @@ -0,0 +1,423 @@ +import os +import sys + +import torch +import numpy as np +from tqdm import tqdm +from ml_collections import ConfigDict +from scipy import signal + +from audio_separator.separator.common_separator import CommonSeparator +from audio_separator.separator.uvr_lib_v5 import spec_utils +from audio_separator.separator.uvr_lib_v5.tfc_tdf_v3 import TFC_TDF_net +from audio_separator.separator.uvr_lib_v5.roformer.mel_band_roformer import MelBandRoformer +from audio_separator.separator.uvr_lib_v5.roformer.bs_roformer import BSRoformer + + +class MDXCSeparator(CommonSeparator): + """ + MDXCSeparator is responsible for separating audio sources using MDXC models. + It initializes with configuration parameters and prepares the model for separation tasks. + """ + + def __init__(self, common_config, arch_config): + # Any configuration values which can be shared between architectures should be set already in CommonSeparator, + # e.g. user-specified functionality choices (self.output_single_stem) or common model parameters (self.primary_stem_name) + super().__init__(config=common_config) + + # Model data is basic overview metadata about the model, e.g. which stem is primary and whether it's a karaoke model + # It's loaded in from model_data_new.json in Separator.load_model and there are JSON examples in that method + # The instance variable self.model_data is passed through from Separator and set in CommonSeparator + self.logger.debug(f"Model data: {self.model_data}") + + # Arch Config is the MDXC architecture specific user configuration options, which should all be configurable by the user + # either by their Separator class instantiation or by passing in a CLI parameter. + # While there are similarities between architectures for some of these (e.g. batch_size), they are deliberately configured + # this way as they have architecture-specific default values. + self.segment_size = arch_config.get("segment_size", 256) + + # Whether or not to use the segment size from model config, or the default + # The segment size is set based on the value provided in a chosen model's associated config file (yaml). + self.override_model_segment_size = arch_config.get("override_model_segment_size", False) + + self.overlap = arch_config.get("overlap", 8) + self.batch_size = arch_config.get("batch_size", 1) + + # Amount of pitch shift to apply during processing (this does NOT affect the pitch of the output audio): + # • Whole numbers indicate semitones. + # • Using higher pitches may cut the upper bandwidth, even in high-quality models. + # • Upping the pitch can be better for tracks with deeper vocals. + # • Dropping the pitch may take more processing time but works well for tracks with high-pitched vocals. + self.pitch_shift = arch_config.get("pitch_shift", 0) + + self.process_all_stems = arch_config.get("process_all_stems", True) + + self.logger.debug(f"MDXC arch params: batch_size={self.batch_size}, segment_size={self.segment_size}, overlap={self.overlap}") + self.logger.debug(f"MDXC arch params: override_model_segment_size={self.override_model_segment_size}, pitch_shift={self.pitch_shift}") + self.logger.debug(f"MDXC multi-stem params: process_all_stems={self.process_all_stems}") + + self.is_roformer = "is_roformer" in self.model_data + + self.load_model() + + self.primary_source = None + self.secondary_source = None + self.audio_file_path = None + self.audio_file_base = None + + self.is_primary_stem_main_target = False + if self.model_data_cfgdict.training.target_instrument == "Vocals" or len(self.model_data_cfgdict.training.instruments) > 1: + self.is_primary_stem_main_target = True + + self.logger.debug(f"is_primary_stem_main_target: {self.is_primary_stem_main_target}") + + self.logger.info("MDXC Separator initialisation complete") + + def load_model(self): + """ + Load the model into memory from file on disk, initialize it with config from the model data, + and prepare for inferencing using hardware accelerated Torch device. + """ + self.logger.debug("Loading checkpoint model for inference...") + + self.model_data_cfgdict = ConfigDict(self.model_data) + + try: + if self.is_roformer: + self.logger.debug("Loading Roformer model...") + + # Determine the model type based on the configuration and instantiate it + if "num_bands" in self.model_data_cfgdict.model: + self.logger.debug("Loading MelBandRoformer model...") + model = MelBandRoformer(**self.model_data_cfgdict.model) + elif "freqs_per_bands" in self.model_data_cfgdict.model: + self.logger.debug("Loading BSRoformer model...") + model = BSRoformer(**self.model_data_cfgdict.model) + else: + raise ValueError("Unknown Roformer model type in the configuration.") + + # Load model checkpoint + checkpoint = torch.load(self.model_path, map_location="cpu", weights_only=True) + self.model_run = model if not isinstance(model, torch.nn.DataParallel) else model.module + self.model_run.load_state_dict(checkpoint) + self.model_run.to(self.torch_device).eval() + + else: + self.logger.debug("Loading TFC_TDF_net model...") + self.model_run = TFC_TDF_net(self.model_data_cfgdict, device=self.torch_device) + self.logger.debug("Loading model onto cpu") + # For some reason loading the state onto a hardware accelerated devices causes issues, + # so we load it onto CPU first then move it to the device + self.model_run.load_state_dict(torch.load(self.model_path, map_location="cpu")) + self.model_run.to(self.torch_device).eval() + + except RuntimeError as e: + self.logger.error(f"Error: {e}") + self.logger.error("An error occurred while loading the model file. This often occurs when the model file is corrupt or incomplete.") + self.logger.error(f"Please try deleting the model file from {self.model_path} and run audio-separator again to re-download it.") + sys.exit(1) + + def separate(self, audio_file_path, custom_output_names=None): + """ + Separates the audio file into primary and secondary sources based on the model's configuration. + It processes the mix, demixes it into sources, normalizes the sources, and saves the output files. + + Args: + audio_file_path (str): The path to the audio file to be processed. + custom_output_names (dict, optional): Custom names for the output files. Defaults to None. + + Returns: + list: A list of paths to the output files generated by the separation process. + """ + self.primary_source = None + self.secondary_source = None + + self.audio_file_path = audio_file_path + self.audio_file_base = os.path.splitext(os.path.basename(audio_file_path))[0] + + self.logger.debug(f"Preparing mix for input audio file {self.audio_file_path}...") + mix = self.prepare_mix(self.audio_file_path) + + self.logger.debug("Normalizing mix before demixing...") + mix = spec_utils.normalize(wave=mix, max_peak=self.normalization_threshold, min_peak=self.amplification_threshold) + + source = self.demix(mix=mix) + self.logger.debug("Demixing completed.") + + output_files = [] + self.logger.debug("Processing output files...") + + if isinstance(source, dict): + self.logger.debug("Source is a dict, processing each stem...") + + stem_list = [] + if self.model_data_cfgdict.training.target_instrument: + stem_list = [self.model_data_cfgdict.training.target_instrument] + else: + stem_list = self.model_data_cfgdict.training.instruments + + self.logger.debug(f"Available stems: {stem_list}") + + is_multi_stem_model = len(stem_list) > 2 + should_process_all_stems = self.process_all_stems and is_multi_stem_model + + if should_process_all_stems: + self.logger.debug("Processing all stems from multi-stem model...") + for stem_name in stem_list: + stem_output_path = self.get_stem_output_path(stem_name, custom_output_names) + stem_source = spec_utils.normalize( + wave=source[stem_name], + max_peak=self.normalization_threshold, + min_peak=self.amplification_threshold + ).T + + self.logger.info(f"Saving {stem_name} stem to {stem_output_path}...") + self.final_process(stem_output_path, stem_source, stem_name) + output_files.append(stem_output_path) + else: + # Standard processing for primary and secondary stems + if not isinstance(self.primary_source, np.ndarray): + self.logger.debug(f"Normalizing primary source for primary stem {self.primary_stem_name}...") + self.primary_source = spec_utils.normalize( + wave=source[self.primary_stem_name], + max_peak=self.normalization_threshold, + min_peak=self.amplification_threshold + ).T + + if not isinstance(self.secondary_source, np.ndarray): + self.logger.debug(f"Normalizing secondary source for secondary stem {self.secondary_stem_name}...") + self.secondary_source = spec_utils.normalize( + wave=source[self.secondary_stem_name], + max_peak=self.normalization_threshold, + min_peak=self.amplification_threshold + ).T + + if not self.output_single_stem or self.output_single_stem.lower() == self.secondary_stem_name.lower(): + self.secondary_stem_output_path = self.get_stem_output_path(self.secondary_stem_name, custom_output_names) + + self.logger.info(f"Saving {self.secondary_stem_name} stem to {self.secondary_stem_output_path}...") + self.final_process(self.secondary_stem_output_path, self.secondary_source, self.secondary_stem_name) + output_files.append(self.secondary_stem_output_path) + + if not self.output_single_stem or self.output_single_stem.lower() == self.primary_stem_name.lower(): + self.primary_stem_output_path = self.get_stem_output_path(self.primary_stem_name, custom_output_names) + + self.logger.info(f"Saving {self.primary_stem_name} stem to {self.primary_stem_output_path}...") + self.final_process(self.primary_stem_output_path, self.primary_source, self.primary_stem_name) + output_files.append(self.primary_stem_output_path) + + else: + # Handle case when source is not a dictionary (single source model) + if not self.output_single_stem or self.output_single_stem.lower() == self.primary_stem_name.lower(): + self.primary_stem_output_path = self.get_stem_output_path(self.primary_stem_name, custom_output_names) + + if not isinstance(self.primary_source, np.ndarray): + self.primary_source = source.T + + self.logger.info(f"Saving {self.primary_stem_name} stem to {self.primary_stem_output_path}...") + self.final_process(self.primary_stem_output_path, self.primary_source, self.primary_stem_name) + output_files.append(self.primary_stem_output_path) + + return output_files + + def pitch_fix(self, source, sr_pitched, orig_mix): + """ + Change the pitch of the source audio by a number of semitones. + + Args: + source (np.ndarray): The source audio to be pitch-shifted. + sr_pitched (int): The sample rate of the pitch-shifted audio. + orig_mix (np.ndarray): The original mix, used to match the shape of the pitch-shifted audio. + + Returns: + np.ndarray: The pitch-shifted source audio. + """ + source = spec_utils.change_pitch_semitones(source, sr_pitched, semitone_shift=self.pitch_shift)[0] + source = spec_utils.match_array_shapes(source, orig_mix) + return source + + def overlap_add(self, result, x, weights, start, length): + """ + Adds the overlapping part of the result to the result tensor. + """ + result[..., start : start + length] += x[..., :length] * weights[:length] + return result + + def demix(self, mix: np.ndarray) -> dict: + """ + Demixes the input mix into primary and secondary sources using the model and model data. + + Args: + mix (np.ndarray): The mix to be demixed. + Returns: + dict: A dictionary containing the demixed sources. + """ + orig_mix = mix + + if self.pitch_shift != 0: + self.logger.debug(f"Shifting pitch by -{self.pitch_shift} semitones...") + mix, sample_rate = spec_utils.change_pitch_semitones(mix, self.sample_rate, semitone_shift=-self.pitch_shift) + + if self.is_roformer: + # Note: Currently, for Roformer models, `batch_size` is not utilized due to negligible performance improvements. + + mix = torch.tensor(mix, dtype=torch.float32) + + if self.override_model_segment_size: + mdx_segment_size = self.segment_size + self.logger.debug(f"Using configured segment size: {mdx_segment_size}") + else: + mdx_segment_size = self.model_data_cfgdict.inference.dim_t + self.logger.debug(f"Using model default segment size: {mdx_segment_size}") + + # num_stems aka "S" in UVR + num_stems = 1 if self.model_data_cfgdict.training.target_instrument else len(self.model_data_cfgdict.training.instruments) + self.logger.debug(f"Number of stems: {num_stems}") + + # chunk_size aka "C" in UVR + chunk_size = self.model_data_cfgdict.audio.hop_length * (mdx_segment_size - 1) + self.logger.debug(f"Chunk size: {chunk_size}") + + step = int(self.overlap * self.model_data_cfgdict.audio.sample_rate) + self.logger.debug(f"Step: {step}") + + # Create a weighting table and convert it to a PyTorch tensor + window = torch.tensor(signal.windows.hamming(chunk_size), dtype=torch.float32) + + device = next(self.model_run.parameters()).device + + + with torch.no_grad(): + req_shape = (len(self.model_data_cfgdict.training.instruments),) + tuple(mix.shape) + result = torch.zeros(req_shape, dtype=torch.float32) + counter = torch.zeros(req_shape, dtype=torch.float32) + + for i in tqdm(range(0, mix.shape[1], step)): + part = mix[:, i : i + chunk_size] + length = part.shape[-1] + if i + chunk_size > mix.shape[1]: + part = mix[:, -chunk_size:] + length = chunk_size + part = part.to(device) + x = self.model_run(part.unsqueeze(0))[0] + x = x.cpu() + # Perform overlap_add on CPU + if i + chunk_size > mix.shape[1]: + # Fixed to correctly add to the end of the tensor + result = self.overlap_add(result, x, window, result.shape[-1] - chunk_size, length) + counter[..., result.shape[-1] - chunk_size :] += window[:length] + else: + result = self.overlap_add(result, x, window, i, length) + counter[..., i : i + length] += window[:length] + + inferenced_outputs = result / counter.clamp(min=1e-10) + + else: + mix = torch.tensor(mix, dtype=torch.float32) + + try: + num_stems = self.model_run.num_target_instruments + except AttributeError: + num_stems = self.model_run.module.num_target_instruments + self.logger.debug(f"Number of stems: {num_stems}") + + if self.override_model_segment_size: + mdx_segment_size = self.segment_size + self.logger.debug(f"Using configured segment size: {mdx_segment_size}") + else: + mdx_segment_size = self.model_data_cfgdict.inference.dim_t + self.logger.debug(f"Using model default segment size: {mdx_segment_size}") + + chunk_size = self.model_data_cfgdict.audio.hop_length * (mdx_segment_size - 1) + self.logger.debug(f"Chunk size: {chunk_size}") + + hop_size = chunk_size // self.overlap + self.logger.debug(f"Hop size: {hop_size}") + + mix_shape = mix.shape[1] + pad_size = hop_size - (mix_shape - chunk_size) % hop_size + self.logger.debug(f"Pad size: {pad_size}") + + mix = torch.cat([torch.zeros(2, chunk_size - hop_size), mix, torch.zeros(2, pad_size + chunk_size - hop_size)], 1) + self.logger.debug(f"Mix shape: {mix.shape}") + + chunks = mix.unfold(1, chunk_size, hop_size).transpose(0, 1) + self.logger.debug(f"Chunks length: {len(chunks)} and shape: {chunks.shape}") + + batches = [chunks[i : i + self.batch_size] for i in range(0, len(chunks), self.batch_size)] + self.logger.debug(f"Batch size: {self.batch_size}, number of batches: {len(batches)}") + + # accumulated_outputs is used to accumulate the output from processing each batch of chunks through the model. + # It starts as a tensor of zeros and is updated in-place as the model processes each batch. + # The variable holds the combined result of all processed batches, which, after post-processing, represents the separated audio sources. + accumulated_outputs = torch.zeros(num_stems, *mix.shape) if num_stems > 1 else torch.zeros_like(mix) + + with torch.no_grad(): + count = 0 + for batch in tqdm(batches): + # Since the model processes the audio data in batches, single_batch_result temporarily holds the model's output + # for each batch before it is accumulated into accumulated_outputs. + single_batch_result = self.model_run(batch.to(self.torch_device)) + + # Each individual output tensor from the current batch's processing result. + # Since single_batch_result can contain multiple output tensors (one for each piece of audio in the batch), + # individual_output is used to iterate through these tensors and accumulate them into accumulated_outputs. + for individual_output in single_batch_result: + individual_output_cpu = individual_output.cpu() + # Accumulate outputs on CPU + accumulated_outputs[..., count * hop_size : count * hop_size + chunk_size] += individual_output_cpu + count += 1 + + self.logger.debug("Calculating inferenced outputs based on accumulated outputs and overlap") + inferenced_outputs = accumulated_outputs[..., chunk_size - hop_size : -(pad_size + chunk_size - hop_size)] / self.overlap + self.logger.debug("Deleting accumulated outputs to free up memory") + del accumulated_outputs + + if num_stems > 1 or self.is_primary_stem_main_target: + self.logger.debug("Number of stems is greater than 1 or vocals are main target, detaching individual sources and correcting pitch if necessary...") + + sources = {} + + # Iterates over each instrument specified in the model's configuration and its corresponding separated audio source. + # self.model_data_cfgdict.training.instruments provides the list of stems. + # estimated_sources.cpu().detach().numpy() converts the separated sources tensor to a NumPy array for processing. + # Each iteration provides an instrument name ('key') and its separated audio ('value') for further processing. + for key, value in zip(self.model_data_cfgdict.training.instruments, inferenced_outputs.cpu().detach().numpy()): + self.logger.debug(f"Processing instrument: {key}") + if self.pitch_shift != 0: + self.logger.debug(f"Applying pitch correction for {key}") + sources[key] = self.pitch_fix(value, sample_rate, orig_mix) + else: + sources[key] = value + + if self.is_primary_stem_main_target: + self.logger.debug(f"Primary stem: {self.primary_stem_name} is main target, detaching and matching array shapes if necessary...") + if sources[self.primary_stem_name].shape[1] != orig_mix.shape[1]: + sources[self.primary_stem_name] = spec_utils.match_array_shapes(sources[self.primary_stem_name], orig_mix) + sources[self.secondary_stem_name] = orig_mix - sources[self.primary_stem_name] + + self.logger.debug("Deleting inferenced outputs to free up memory") + del inferenced_outputs + + self.logger.debug("Returning separated sources") + return sources + else: + self.logger.debug("Processing single source...") + + if self.is_roformer: + sources = {k: v.cpu().detach().numpy() for k, v in zip([self.model_data_cfgdict.training.target_instrument], inferenced_outputs)} + inferenced_output = sources[self.model_data_cfgdict.training.target_instrument] + else: + inferenced_output = inferenced_outputs.cpu().detach().numpy() + + self.logger.debug("Demix process completed for single source.") + + self.logger.debug("Deleting inferenced outputs to free up memory") + del inferenced_outputs + + if self.pitch_shift != 0: + self.logger.debug("Applying pitch correction for single instrument") + return self.pitch_fix(inferenced_output, sample_rate, orig_mix) + else: + self.logger.debug("Returning inferenced output for single instrument") + return inferenced_output diff --git a/audio_separator/separator/architectures/vr_separator.py b/audio_separator/separator/architectures/vr_separator.py new file mode 100644 index 0000000000000000000000000000000000000000..f61f69b512de9efb77a08e5e7b5a7a69574c78fd --- /dev/null +++ b/audio_separator/separator/architectures/vr_separator.py @@ -0,0 +1,357 @@ +"""Module for separating audio sources using VR architecture models.""" + +import os +import math + +import torch +import librosa +import numpy as np +from tqdm import tqdm + +# Check if we really need the rerun_mp3 function, remove if not +import audioread + +from audio_separator.separator.common_separator import CommonSeparator +from audio_separator.separator.uvr_lib_v5 import spec_utils +from audio_separator.separator.uvr_lib_v5.vr_network import nets +from audio_separator.separator.uvr_lib_v5.vr_network import nets_new +from audio_separator.separator.uvr_lib_v5.vr_network.model_param_init import ModelParameters + + +class VRSeparator(CommonSeparator): + """ + VRSeparator is responsible for separating audio sources using VR models. + It initializes with configuration parameters and prepares the model for separation tasks. + """ + + def __init__(self, common_config, arch_config: dict): + # Any configuration values which can be shared between architectures should be set already in CommonSeparator, + # e.g. user-specified functionality choices (self.output_single_stem) or common model parameters (self.primary_stem_name) + super().__init__(config=common_config) + + # Model data is basic overview metadata about the model, e.g. which stem is primary and whether it's a karaoke model + # It's loaded in from model_data_new.json in Separator.load_model and there are JSON examples in that method + # The instance variable self.model_data is passed through from Separator and set in CommonSeparator + self.logger.debug(f"Model data: {self.model_data}") + + # Most of the VR models use the same number of output channels, but the VR 51 models have specific values set in model_data JSON + self.model_capacity = 32, 128 + self.is_vr_51_model = False + + if "nout" in self.model_data.keys() and "nout_lstm" in self.model_data.keys(): + self.model_capacity = self.model_data["nout"], self.model_data["nout_lstm"] + self.is_vr_51_model = True + + # Model params are additional technical parameter values from JSON files in separator/uvr_lib_v5/vr_network/modelparams/*.json, + # with filenames referenced by the model_data["vr_model_param"] value + package_root_filepath = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + vr_params_json_dir = os.path.join(package_root_filepath, "uvr_lib_v5", "vr_network", "modelparams") + vr_params_json_filename = f"{self.model_data['vr_model_param']}.json" + vr_params_json_filepath = os.path.join(vr_params_json_dir, vr_params_json_filename) + self.model_params = ModelParameters(vr_params_json_filepath) + + self.logger.debug(f"Model params: {self.model_params.param}") + + # Arch Config is the VR architecture specific user configuration options, which should all be configurable by the user + # either by their Separator class instantiation or by passing in a CLI parameter. + # While there are similarities between architectures for some of these (e.g. batch_size), they are deliberately configured + # this way as they have architecture-specific default values. + + # This option performs Test-Time-Augmentation to improve the separation quality. + # Note: Having this selected will increase the time it takes to complete a conversion + self.enable_tta = arch_config.get("enable_tta", False) + + # This option can potentially identify leftover instrumental artifacts within the vocal outputs; may improve the separation of some songs. + # Note: Selecting this option can adversely affect the conversion process, depending on the track. Because of this, it is only recommended as a last resort. + self.enable_post_process = arch_config.get("enable_post_process", False) + + # post_process_threshold values = ('0.1', '0.2', '0.3') + self.post_process_threshold = arch_config.get("post_process_threshold", 0.2) + + # Number of batches to be processed at a time. + # - Higher values mean more RAM usage but slightly faster processing times. + # - Lower values mean less RAM usage but slightly longer processing times. + # - Batch size value has no effect on output quality. + + # Andrew note: for some reason, lower batch sizes seem to cause broken output for VR arch; need to investigate why + self.batch_size = arch_config.get("batch_size", 1) + + # Select window size to balance quality and speed: + # - 1024 - Quick but lesser quality. + # - 512 - Medium speed and quality. + # - 320 - Takes longer but may offer better quality. + self.window_size = arch_config.get("window_size", 512) + + # The application will mirror the missing frequency range of the output. + self.high_end_process = arch_config.get("high_end_process", False) + self.input_high_end_h = None + self.input_high_end = None + + # Adjust the intensity of primary stem extraction: + # - Ranges from -100 - 100. + # - Bigger values mean deeper extractions. + # - Typically, it's set to 5 for vocals & instrumentals. + # - Values beyond 5 might muddy the sound for non-vocal models. + self.aggression = float(int(arch_config.get("aggression", 5)) / 100) + + self.aggressiveness = {"value": self.aggression, "split_bin": self.model_params.param["band"][1]["crop_stop"], "aggr_correction": self.model_params.param.get("aggr_correction")} + + self.model_samplerate = self.model_params.param["sr"] + + self.logger.debug(f"VR arch params: enable_tta={self.enable_tta}, enable_post_process={self.enable_post_process}, post_process_threshold={self.post_process_threshold}") + self.logger.debug(f"VR arch params: batch_size={self.batch_size}, window_size={self.window_size}") + self.logger.debug(f"VR arch params: high_end_process={self.high_end_process}, aggression={self.aggression}") + self.logger.debug(f"VR arch params: is_vr_51_model={self.is_vr_51_model}, model_samplerate={self.model_samplerate}, model_capacity={self.model_capacity}") + + self.model_run = lambda *args, **kwargs: self.logger.error("Model run method is not initialised yet.") + + # This should go away once we refactor to remove soundfile.write and replace with pydub like we did for the MDX rewrite + self.wav_subtype = "PCM_16" + + self.logger.info("VR Separator initialisation complete") + + def separate(self, audio_file_path, custom_output_names=None): + """ + Separates the audio file into primary and secondary sources based on the model's configuration. + It processes the mix, demixes it into sources, normalizes the sources, and saves the output files. + + Args: + audio_file_path (str): The path to the audio file to be processed. + custom_output_names (dict, optional): Custom names for the output files. Defaults to None. + + Returns: + list: A list of paths to the output files generated by the separation process. + """ + self.primary_source = None + self.secondary_source = None + + self.audio_file_path = audio_file_path + self.audio_file_base = os.path.splitext(os.path.basename(audio_file_path))[0] + + self.logger.debug(f"Starting separation for input audio file {self.audio_file_path}...") + + nn_arch_sizes = [31191, 33966, 56817, 123821, 123812, 129605, 218409, 537238, 537227] # default + vr_5_1_models = [56817, 218409] + model_size = math.ceil(os.stat(self.model_path).st_size / 1024) + nn_arch_size = min(nn_arch_sizes, key=lambda x: abs(x - model_size)) + self.logger.debug(f"Model size determined: {model_size}, NN architecture size: {nn_arch_size}") + + if nn_arch_size in vr_5_1_models or self.is_vr_51_model: + self.logger.debug("Using CascadedNet for VR 5.1 model...") + self.model_run = nets_new.CascadedNet(self.model_params.param["bins"] * 2, nn_arch_size, nout=self.model_capacity[0], nout_lstm=self.model_capacity[1]) + self.is_vr_51_model = True + else: + self.logger.debug("Determining model capacity...") + self.model_run = nets.determine_model_capacity(self.model_params.param["bins"] * 2, nn_arch_size) + + self.model_run.load_state_dict(torch.load(self.model_path, map_location="cpu")) + self.model_run.to(self.torch_device) + self.logger.debug("Model loaded and moved to device.") + + y_spec, v_spec = self.inference_vr(self.loading_mix(), self.torch_device, self.aggressiveness) + self.logger.debug("Inference completed.") + + # Sanitize y_spec and v_spec to replace NaN and infinite values + y_spec = np.nan_to_num(y_spec, nan=0.0, posinf=0.0, neginf=0.0) + v_spec = np.nan_to_num(v_spec, nan=0.0, posinf=0.0, neginf=0.0) + + self.logger.debug("Sanitization completed. Replaced NaN and infinite values in y_spec and v_spec.") + + # After inference_vr call + self.logger.debug(f"Inference VR completed. y_spec shape: {y_spec.shape}, v_spec shape: {v_spec.shape}") + self.logger.debug(f"y_spec stats - min: {np.min(y_spec)}, max: {np.max(y_spec)}, isnan: {np.isnan(y_spec).any()}, isinf: {np.isinf(y_spec).any()}") + self.logger.debug(f"v_spec stats - min: {np.min(v_spec)}, max: {np.max(v_spec)}, isnan: {np.isnan(v_spec).any()}, isinf: {np.isinf(v_spec).any()}") + + # Not yet implemented from UVR features: + # + # if not self.is_vocal_split_model: + # self.cache_source((y_spec, v_spec)) + + # if self.is_secondary_model_activated and self.secondary_model: + # self.logger.debug("Processing secondary model...") + # self.secondary_source_primary, self.secondary_source_secondary = process_secondary_model( + # self.secondary_model, self.process_data, main_process_method=self.process_method, main_model_primary=self.primary_stem + # ) + + # Initialize the list for output files + output_files = [] + self.logger.debug("Processing output files...") + + # Note: logic similar to the following should probably be added to the other architectures + # Check if output_single_stem is set to a value that would result in no output files + if self.output_single_stem and (self.output_single_stem.lower() != self.primary_stem_name.lower() and self.output_single_stem.lower() != self.secondary_stem_name.lower()): + # If so, reset output_single_stem to None to save both stems + self.output_single_stem = None + self.logger.warning(f"The output_single_stem setting '{self.output_single_stem}' does not match any of the output files: '{self.primary_stem_name}' and '{self.secondary_stem_name}'. For this model '{self.model_name}', the output_single_stem setting will be ignored and all output files will be saved.") + + # Save and process the primary stem if needed + if not self.output_single_stem or self.output_single_stem.lower() == self.primary_stem_name.lower(): + self.logger.debug(f"Processing primary stem: {self.primary_stem_name}") + if not isinstance(self.primary_source, np.ndarray): + self.logger.debug(f"Preparing to convert spectrogram to waveform. Spec shape: {y_spec.shape}") + + self.primary_source = self.spec_to_wav(y_spec).T + self.logger.debug("Converting primary source spectrogram to waveform.") + if not self.model_samplerate == 44100: + self.primary_source = librosa.resample(self.primary_source.T, orig_sr=self.model_samplerate, target_sr=44100).T + self.logger.debug("Resampling primary source to 44100Hz.") + + self.primary_stem_output_path = self.get_stem_output_path(self.primary_stem_name, custom_output_names) + + self.logger.info(f"Saving {self.primary_stem_name} stem to {self.primary_stem_output_path}...") + self.final_process(self.primary_stem_output_path, self.primary_source, self.primary_stem_name) + output_files.append(self.primary_stem_output_path) + + # Save and process the secondary stem if needed + if not self.output_single_stem or self.output_single_stem.lower() == self.secondary_stem_name.lower(): + self.logger.debug(f"Processing secondary stem: {self.secondary_stem_name}") + if not isinstance(self.secondary_source, np.ndarray): + self.logger.debug(f"Preparing to convert spectrogram to waveform. Spec shape: {v_spec.shape}") + + self.secondary_source = self.spec_to_wav(v_spec).T + self.logger.debug("Converting secondary source spectrogram to waveform.") + if not self.model_samplerate == 44100: + self.secondary_source = librosa.resample(self.secondary_source.T, orig_sr=self.model_samplerate, target_sr=44100).T + self.logger.debug("Resampling secondary source to 44100Hz.") + + self.secondary_stem_output_path = self.get_stem_output_path(self.secondary_stem_name, custom_output_names) + + self.logger.info(f"Saving {self.secondary_stem_name} stem to {self.secondary_stem_output_path}...") + self.final_process(self.secondary_stem_output_path, self.secondary_source, self.secondary_stem_name) + output_files.append(self.secondary_stem_output_path) + + # Not yet implemented from UVR features: + # self.process_vocal_split_chain(secondary_sources) + # self.logger.debug("Vocal split chain processed.") + + return output_files + + def loading_mix(self): + X_wave, X_spec_s = {}, {} + + bands_n = len(self.model_params.param["band"]) + + audio_file = spec_utils.write_array_to_mem(self.audio_file_path, subtype=self.wav_subtype) + is_mp3 = audio_file.endswith(".mp3") if isinstance(audio_file, str) else False + + self.logger.debug(f"loading_mix iteraring through {bands_n} bands") + for d in tqdm(range(bands_n, 0, -1)): + bp = self.model_params.param["band"][d] + + wav_resolution = bp["res_type"] + + if self.torch_device_mps is not None: + wav_resolution = "polyphase" + + if d == bands_n: # high-end band + X_wave[d], _ = librosa.load(audio_file, sr=bp["sr"], mono=False, dtype=np.float32, res_type=wav_resolution) + X_spec_s[d] = spec_utils.wave_to_spectrogram(X_wave[d], bp["hl"], bp["n_fft"], self.model_params, band=d, is_v51_model=self.is_vr_51_model) + + if not np.any(X_wave[d]) and is_mp3: + X_wave[d] = rerun_mp3(audio_file, bp["sr"]) + + if X_wave[d].ndim == 1: + X_wave[d] = np.asarray([X_wave[d], X_wave[d]]) + else: # lower bands + X_wave[d] = librosa.resample(X_wave[d + 1], orig_sr=self.model_params.param["band"][d + 1]["sr"], target_sr=bp["sr"], res_type=wav_resolution) + X_spec_s[d] = spec_utils.wave_to_spectrogram(X_wave[d], bp["hl"], bp["n_fft"], self.model_params, band=d, is_v51_model=self.is_vr_51_model) + + if d == bands_n and self.high_end_process: + self.input_high_end_h = (bp["n_fft"] // 2 - bp["crop_stop"]) + (self.model_params.param["pre_filter_stop"] - self.model_params.param["pre_filter_start"]) + self.input_high_end = X_spec_s[d][:, bp["n_fft"] // 2 - self.input_high_end_h : bp["n_fft"] // 2, :] + + X_spec = spec_utils.combine_spectrograms(X_spec_s, self.model_params, is_v51_model=self.is_vr_51_model) + + del X_wave, X_spec_s, audio_file + + return X_spec + + def inference_vr(self, X_spec, device, aggressiveness): + def _execute(X_mag_pad, roi_size): + X_dataset = [] + patches = (X_mag_pad.shape[2] - 2 * self.model_run.offset) // roi_size + + self.logger.debug(f"inference_vr appending to X_dataset for each of {patches} patches") + for i in tqdm(range(patches)): + start = i * roi_size + X_mag_window = X_mag_pad[:, :, start : start + self.window_size] + X_dataset.append(X_mag_window) + + total_iterations = patches // self.batch_size if not self.enable_tta else (patches // self.batch_size) * 2 + self.logger.debug(f"inference_vr iterating through {total_iterations} batches, batch_size = {self.batch_size}") + + X_dataset = np.asarray(X_dataset) + self.model_run.eval() + with torch.no_grad(): + mask = [] + + for i in tqdm(range(0, patches, self.batch_size)): + + X_batch = X_dataset[i : i + self.batch_size] + X_batch = torch.from_numpy(X_batch).to(device) + pred = self.model_run.predict_mask(X_batch) + if not pred.size()[3] > 0: + raise ValueError(f"Window size error: h1_shape[3] must be greater than h2_shape[3]") + pred = pred.detach().cpu().numpy() + pred = np.concatenate(pred, axis=2) + mask.append(pred) + if len(mask) == 0: + raise ValueError(f"Window size error: h1_shape[3] must be greater than h2_shape[3]") + + mask = np.concatenate(mask, axis=2) + return mask + + def postprocess(mask, X_mag, X_phase): + is_non_accom_stem = False + for stem in CommonSeparator.NON_ACCOM_STEMS: + if stem == self.primary_stem_name: + is_non_accom_stem = True + + mask = spec_utils.adjust_aggr(mask, is_non_accom_stem, aggressiveness) + + if self.enable_post_process: + mask = spec_utils.merge_artifacts(mask, thres=self.post_process_threshold) + + y_spec = mask * X_mag * np.exp(1.0j * X_phase) + v_spec = (1 - mask) * X_mag * np.exp(1.0j * X_phase) + + return y_spec, v_spec + + X_mag, X_phase = spec_utils.preprocess(X_spec) + n_frame = X_mag.shape[2] + pad_l, pad_r, roi_size = spec_utils.make_padding(n_frame, self.window_size, self.model_run.offset) + X_mag_pad = np.pad(X_mag, ((0, 0), (0, 0), (pad_l, pad_r)), mode="constant") + X_mag_pad /= X_mag_pad.max() + mask = _execute(X_mag_pad, roi_size) + + if self.enable_tta: + pad_l += roi_size // 2 + pad_r += roi_size // 2 + X_mag_pad = np.pad(X_mag, ((0, 0), (0, 0), (pad_l, pad_r)), mode="constant") + X_mag_pad /= X_mag_pad.max() + mask_tta = _execute(X_mag_pad, roi_size) + mask_tta = mask_tta[:, :, roi_size // 2 :] + mask = (mask[:, :, :n_frame] + mask_tta[:, :, :n_frame]) * 0.5 + else: + mask = mask[:, :, :n_frame] + + y_spec, v_spec = postprocess(mask, X_mag, X_phase) + + return y_spec, v_spec + + def spec_to_wav(self, spec): + if self.high_end_process and isinstance(self.input_high_end, np.ndarray) and self.input_high_end_h: + input_high_end_ = spec_utils.mirroring("mirroring", spec, self.input_high_end, self.model_params) + wav = spec_utils.cmb_spectrogram_to_wave(spec, self.model_params, self.input_high_end_h, input_high_end_, is_v51_model=self.is_vr_51_model) + else: + wav = spec_utils.cmb_spectrogram_to_wave(spec, self.model_params, is_v51_model=self.is_vr_51_model) + + return wav + + +# Check if we really need the rerun_mp3 function, refactor or remove if not +def rerun_mp3(audio_file, sample_rate=44100): + with audioread.audio_open(audio_file) as f: + track_length = int(f.duration) + + return librosa.load(audio_file, duration=track_length, mono=False, sr=sample_rate)[0] diff --git a/audio_separator/separator/common_separator.py b/audio_separator/separator/common_separator.py new file mode 100644 index 0000000000000000000000000000000000000000..bf095791009089a890d40304006de1770b86935f --- /dev/null +++ b/audio_separator/separator/common_separator.py @@ -0,0 +1,403 @@ +""" This file contains the CommonSeparator class, common to all architecture-specific Separator classes. """ + +from logging import Logger +import os +import re +import gc +import numpy as np +import librosa +import torch +from pydub import AudioSegment +import soundfile as sf +from audio_separator.separator.uvr_lib_v5 import spec_utils + + +class CommonSeparator: + """ + This class contains the common methods and attributes common to all architecture-specific Separator classes. + """ + + ALL_STEMS = "All Stems" + VOCAL_STEM = "Vocals" + INST_STEM = "Instrumental" + OTHER_STEM = "Other" + BASS_STEM = "Bass" + DRUM_STEM = "Drums" + GUITAR_STEM = "Guitar" + PIANO_STEM = "Piano" + SYNTH_STEM = "Synthesizer" + STRINGS_STEM = "Strings" + WOODWINDS_STEM = "Woodwinds" + BRASS_STEM = "Brass" + WIND_INST_STEM = "Wind Inst" + NO_OTHER_STEM = "No Other" + NO_BASS_STEM = "No Bass" + NO_DRUM_STEM = "No Drums" + NO_GUITAR_STEM = "No Guitar" + NO_PIANO_STEM = "No Piano" + NO_SYNTH_STEM = "No Synthesizer" + NO_STRINGS_STEM = "No Strings" + NO_WOODWINDS_STEM = "No Woodwinds" + NO_WIND_INST_STEM = "No Wind Inst" + NO_BRASS_STEM = "No Brass" + PRIMARY_STEM = "Primary Stem" + SECONDARY_STEM = "Secondary Stem" + LEAD_VOCAL_STEM = "lead_only" + BV_VOCAL_STEM = "backing_only" + LEAD_VOCAL_STEM_I = "with_lead_vocals" + BV_VOCAL_STEM_I = "with_backing_vocals" + LEAD_VOCAL_STEM_LABEL = "Lead Vocals" + BV_VOCAL_STEM_LABEL = "Backing Vocals" + NO_STEM = "No " + + STEM_PAIR_MAPPER = {VOCAL_STEM: INST_STEM, INST_STEM: VOCAL_STEM, LEAD_VOCAL_STEM: BV_VOCAL_STEM, BV_VOCAL_STEM: LEAD_VOCAL_STEM, PRIMARY_STEM: SECONDARY_STEM} + + NON_ACCOM_STEMS = (VOCAL_STEM, OTHER_STEM, BASS_STEM, DRUM_STEM, GUITAR_STEM, PIANO_STEM, SYNTH_STEM, STRINGS_STEM, WOODWINDS_STEM, BRASS_STEM, WIND_INST_STEM) + + def __init__(self, config): + + self.logger: Logger = config.get("logger") + self.log_level: int = config.get("log_level") + + # Inferencing device / acceleration config + self.torch_device = config.get("torch_device") + self.torch_device_cpu = config.get("torch_device_cpu") + self.torch_device_mps = config.get("torch_device_mps") + self.onnx_execution_provider = config.get("onnx_execution_provider") + + # Model data + self.model_name = config.get("model_name") + self.model_path = config.get("model_path") + self.model_data = config.get("model_data") + + # Output directory and format + self.output_dir = config.get("output_dir") + self.output_format = config.get("output_format") + self.output_bitrate = config.get("output_bitrate") + + # Functional options which are applicable to all architectures and the user may tweak to affect the output + self.normalization_threshold = config.get("normalization_threshold") + self.amplification_threshold = config.get("amplification_threshold") + self.enable_denoise = config.get("enable_denoise") + self.output_single_stem = config.get("output_single_stem") + self.invert_using_spec = config.get("invert_using_spec") + self.sample_rate = config.get("sample_rate") + self.use_soundfile = config.get("use_soundfile") + + # Model specific properties + + # Check if model_data has a "training" key with "instruments" list + self.primary_stem_name = None + self.secondary_stem_name = None + + if "training" in self.model_data and "instruments" in self.model_data["training"]: + instruments = self.model_data["training"]["instruments"] + if instruments: + self.primary_stem_name = instruments[0] + self.secondary_stem_name = instruments[1] if len(instruments) > 1 else self.secondary_stem(self.primary_stem_name) + + if self.primary_stem_name is None: + self.primary_stem_name = self.model_data.get("primary_stem", "Vocals") + self.secondary_stem_name = self.secondary_stem(self.primary_stem_name) + + self.is_karaoke = self.model_data.get("is_karaoke", False) + self.is_bv_model = self.model_data.get("is_bv_model", False) + self.bv_model_rebalance = self.model_data.get("is_bv_model_rebalanced", 0) + + self.logger.debug(f"Common params: model_name={self.model_name}, model_path={self.model_path}") + self.logger.debug(f"Common params: output_dir={self.output_dir}, output_format={self.output_format}") + self.logger.debug(f"Common params: normalization_threshold={self.normalization_threshold}, amplification_threshold={self.amplification_threshold}") + self.logger.debug(f"Common params: enable_denoise={self.enable_denoise}, output_single_stem={self.output_single_stem}") + self.logger.debug(f"Common params: invert_using_spec={self.invert_using_spec}, sample_rate={self.sample_rate}") + + self.logger.debug(f"Common params: primary_stem_name={self.primary_stem_name}, secondary_stem_name={self.secondary_stem_name}") + self.logger.debug(f"Common params: is_karaoke={self.is_karaoke}, is_bv_model={self.is_bv_model}, bv_model_rebalance={self.bv_model_rebalance}") + + # File-specific variables which need to be cleared between processing different audio inputs + self.audio_file_path = None + self.audio_file_base = None + + self.primary_source = None + self.secondary_source = None + + self.primary_stem_output_path = None + self.secondary_stem_output_path = None + + self.cached_sources_map = {} + + def secondary_stem(self, primary_stem: str): + """Determines secondary stem name based on the primary stem name.""" + primary_stem = primary_stem if primary_stem else self.NO_STEM + + if primary_stem in self.STEM_PAIR_MAPPER: + secondary_stem = self.STEM_PAIR_MAPPER[primary_stem] + else: + secondary_stem = primary_stem.replace(self.NO_STEM, "") if self.NO_STEM in primary_stem else f"{self.NO_STEM}{primary_stem}" + + return secondary_stem + + def separate(self, audio_file_path): + """ + Placeholder method for separating audio sources. Should be overridden by subclasses. + """ + raise NotImplementedError("This method should be overridden by subclasses.") + + def final_process(self, stem_path, source, stem_name): + """ + Finalizes the processing of a stem by writing the audio to a file and returning the processed source. + """ + self.logger.debug(f"Finalizing {stem_name} stem processing and writing audio...") + self.write_audio(stem_path, source) + + return {stem_name: source} + + def cached_sources_clear(self): + """ + Clears the cache dictionaries for VR, MDX, and Demucs models. + + This function is essential for ensuring that the cache does not hold outdated or irrelevant data + between different processing sessions or when a new batch of audio files is processed. + It helps in managing memory efficiently and prevents potential errors due to stale data. + """ + self.cached_sources_map = {} + + def cached_source_callback(self, model_architecture, model_name=None): + """ + Retrieves the model and sources from the cache based on the processing method and model name. + + Args: + model_architecture: The architecture type (VR, MDX, or Demucs) being used for processing. + model_name: The specific model name within the architecture type, if applicable. + + Returns: + A tuple containing the model and its sources if found in the cache; otherwise, None. + + This function is crucial for optimizing performance by avoiding redundant processing. + If the requested model and its sources are already in the cache, they can be reused directly, + saving time and computational resources. + """ + model, sources = None, None + + mapper = self.cached_sources_map[model_architecture] + + for key, value in mapper.items(): + if model_name in key: + model = key + sources = value + + return model, sources + + def cached_model_source_holder(self, model_architecture, sources, model_name=None): + """ + Update the dictionary for the given model_architecture with the new model name and its sources. + Use the model_architecture as a key to access the corresponding cache source mapper dictionary. + """ + self.cached_sources_map[model_architecture] = {**self.cached_sources_map.get(model_architecture, {}), **{model_name: sources}} + + def prepare_mix(self, mix): + """ + Prepares the mix for processing. This includes loading the audio from a file if necessary, + ensuring the mix is in the correct format, and converting mono to stereo if needed. + """ + # Store the original path or the mix itself for later checks + audio_path = mix + + # Check if the input is a file path (string) and needs to be loaded + if not isinstance(mix, np.ndarray): + self.logger.debug(f"Loading audio from file: {mix}") + mix, sr = librosa.load(mix, mono=False, sr=self.sample_rate) + self.logger.debug(f"Audio loaded. Sample rate: {sr}, Audio shape: {mix.shape}") + else: + # Transpose the mix if it's already an ndarray (expected shape: [channels, samples]) + self.logger.debug("Transposing the provided mix array.") + mix = mix.T + self.logger.debug(f"Transposed mix shape: {mix.shape}") + + # If the original input was a filepath, check if the loaded mix is empty + if isinstance(audio_path, str): + if not np.any(mix): + error_msg = f"Audio file {audio_path} is empty or not valid" + self.logger.error(error_msg) + raise ValueError(error_msg) + else: + self.logger.debug("Audio file is valid and contains data.") + + # Ensure the mix is in stereo format + if mix.ndim == 1: + self.logger.debug("Mix is mono. Converting to stereo.") + mix = np.asfortranarray([mix, mix]) + self.logger.debug("Converted to stereo mix.") + + # Final log indicating successful preparation of the mix + self.logger.debug("Mix preparation completed.") + return mix + + def write_audio(self, stem_path: str, stem_source): + """ + Writes the separated audio source to a file using pydub or soundfile + Pydub supports a much wider range of audio formats and produces better encoded lossy files for some formats. + Soundfile is used for very large files (longer than 1 hour), as pydub has memory issues with large files: + https://github.com/jiaaro/pydub/issues/135 + """ + # Get the duration of the input audio file + duration_seconds = librosa.get_duration(filename=self.audio_file_path) + duration_hours = duration_seconds / 3600 + self.logger.info(f"Audio duration is {duration_hours:.2f} hours ({duration_seconds:.2f} seconds).") + + if self.use_soundfile: + self.logger.warning(f"Using soundfile for writing.") + self.write_audio_soundfile(stem_path, stem_source) + else: + self.logger.info(f"Using pydub for writing.") + self.write_audio_pydub(stem_path, stem_source) + + def write_audio_pydub(self, stem_path: str, stem_source): + """ + Writes the separated audio source to a file using pydub (ffmpeg) + """ + self.logger.debug(f"Entering write_audio_pydub with stem_path: {stem_path}") + + stem_source = spec_utils.normalize(wave=stem_source, max_peak=self.normalization_threshold, min_peak=self.amplification_threshold) + + # Check if the numpy array is empty or contains very low values + if np.max(np.abs(stem_source)) < 1e-6: + self.logger.warning("Warning: stem_source array is near-silent or empty.") + return + + # If output_dir is specified, create it and join it with stem_path + if self.output_dir: + os.makedirs(self.output_dir, exist_ok=True) + stem_path = os.path.join(self.output_dir, stem_path) + + self.logger.debug(f"Audio data shape before processing: {stem_source.shape}") + self.logger.debug(f"Data type before conversion: {stem_source.dtype}") + + # Ensure the audio data is in the correct format (e.g., int16) + if stem_source.dtype != np.int16: + stem_source = (stem_source * 32767).astype(np.int16) + self.logger.debug("Converted stem_source to int16.") + + # Correctly interleave stereo channels + stem_source_interleaved = np.empty((2 * stem_source.shape[0],), dtype=np.int16) + stem_source_interleaved[0::2] = stem_source[:, 0] # Left channel + stem_source_interleaved[1::2] = stem_source[:, 1] # Right channel + + self.logger.debug(f"Interleaved audio data shape: {stem_source_interleaved.shape}") + + # Create a pydub AudioSegment + try: + audio_segment = AudioSegment(stem_source_interleaved.tobytes(), frame_rate=self.sample_rate, sample_width=stem_source.dtype.itemsize, channels=2) + self.logger.debug("Created AudioSegment successfully.") + except (IOError, ValueError) as e: + self.logger.error(f"Specific error creating AudioSegment: {e}") + return + + # Determine file format based on the file extension + file_format = stem_path.lower().split(".")[-1] + + # For m4a files, specify mp4 as the container format as the extension doesn't match the format name + if file_format == "m4a": + file_format = "mp4" + elif file_format == "mka": + file_format = "matroska" + + # Set the bitrate to 320k for mp3 files if output_bitrate is not specified + bitrate = "320k" if file_format == "mp3" and self.output_bitrate is None else self.output_bitrate + + # Export using the determined format + try: + audio_segment.export(stem_path, format=file_format, bitrate=bitrate) + self.logger.debug(f"Exported audio file successfully to {stem_path}") + except (IOError, ValueError) as e: + self.logger.error(f"Error exporting audio file: {e}") + + def write_audio_soundfile(self, stem_path: str, stem_source): + """ + Writes the separated audio source to a file using soundfile library. + """ + self.logger.debug(f"Entering write_audio_soundfile with stem_path: {stem_path}") + + # Correctly interleave stereo channels if needed + if stem_source.shape[1] == 2: + # If the audio is already interleaved, ensure it's in the correct order + # Check if the array is Fortran contiguous (column-major) + if stem_source.flags["F_CONTIGUOUS"]: + # Convert to C contiguous (row-major) + stem_source = np.ascontiguousarray(stem_source) + # Otherwise, perform interleaving + else: + stereo_interleaved = np.empty((2 * stem_source.shape[0],), dtype=np.int16) + # Left channel + stereo_interleaved[0::2] = stem_source[:, 0] + # Right channel + stereo_interleaved[1::2] = stem_source[:, 1] + stem_source = stereo_interleaved + + self.logger.debug(f"Interleaved audio data shape: {stem_source.shape}") + + """ + Write audio using soundfile (for formats other than M4A). + """ + # Save audio using soundfile + try: + # Specify the subtype to define the sample width + sf.write(stem_path, stem_source, self.sample_rate) + self.logger.debug(f"Exported audio file successfully to {stem_path}") + except Exception as e: + self.logger.error(f"Error exporting audio file: {e}") + + def clear_gpu_cache(self): + """ + This method clears the GPU cache to free up memory. + """ + self.logger.debug("Running garbage collection...") + gc.collect() + if self.torch_device == torch.device("mps"): + self.logger.debug("Clearing MPS cache...") + torch.mps.empty_cache() + if self.torch_device == torch.device("cuda"): + self.logger.debug("Clearing CUDA cache...") + torch.cuda.empty_cache() + + def clear_file_specific_paths(self): + """ + Clears the file-specific variables which need to be cleared between processing different audio inputs. + """ + self.logger.info("Clearing input audio file paths, sources and stems...") + + self.audio_file_path = None + self.audio_file_base = None + + self.primary_source = None + self.secondary_source = None + + self.primary_stem_output_path = None + self.secondary_stem_output_path = None + + def sanitize_filename(self, filename): + """ + Cleans the filename by replacing invalid characters with underscores. + """ + sanitized = re.sub(r'[<>:"/\\|?*]', '_', filename) + sanitized = re.sub(r'_+', '_', sanitized) + sanitized = sanitized.strip('_. ') + return sanitized + + def get_stem_output_path(self, stem_name, custom_output_names): + """ + Gets the output path for a stem based on the stem name and custom output names. + """ + # Convert custom_output_names keys to lowercase for case-insensitive comparison + if custom_output_names: + custom_output_names_lower = {k.lower(): v for k, v in custom_output_names.items()} + stem_name_lower = stem_name.lower() + if stem_name_lower in custom_output_names_lower: + sanitized_custom_name = self.sanitize_filename(custom_output_names_lower[stem_name_lower]) + return os.path.join(f"{sanitized_custom_name}.{self.output_format.lower()}") + + sanitized_audio_base = self.sanitize_filename(self.audio_file_base) + sanitized_stem_name = self.sanitize_filename(stem_name) + sanitized_model_name = self.sanitize_filename(self.model_name) + + filename = f"{sanitized_audio_base}_({sanitized_stem_name})_{sanitized_model_name}.{self.output_format.lower()}" + return os.path.join(filename) diff --git a/audio_separator/separator/separator.py b/audio_separator/separator/separator.py new file mode 100644 index 0000000000000000000000000000000000000000..65ccb5c337f10d35b3e37d789da588e42286cd24 --- /dev/null +++ b/audio_separator/separator/separator.py @@ -0,0 +1,959 @@ +""" This file contains the Separator class, to facilitate the separation of stems from audio. """ + +from importlib import metadata, resources +import os +import sys +import platform +import subprocess +import time +import logging +import warnings +import importlib +import io +from typing import Optional + +import hashlib +import json +import yaml +import requests +import torch +import torch.amp.autocast_mode as autocast_mode +import onnxruntime as ort +from tqdm import tqdm + + +class Separator: + """ + The Separator class is designed to facilitate the separation of audio sources from a given audio file. + It supports various separation architectures and models, including MDX, VR, and Demucs. The class provides + functionalities to configure separation parameters, load models, and perform audio source separation. + It also handles logging, normalization, and output formatting of the separated audio stems. + + The actual separation task is handled by one of the architecture-specific classes in the `architectures` module; + this class is responsible for initialising logging, configuring hardware acceleration, loading the model, + initiating the separation process and passing outputs back to the caller. + + Common Attributes: + log_level (int): The logging level. + log_formatter (logging.Formatter): The logging formatter. + model_file_dir (str): The directory where model files are stored. + output_dir (str): The directory where output files will be saved. + output_format (str): The format of the output audio file. + output_bitrate (str): The bitrate of the output audio file. + amplification_threshold (float): The threshold for audio amplification. + normalization_threshold (float): The threshold for audio normalization. + output_single_stem (str): Option to output a single stem. + invert_using_spec (bool): Flag to invert using spectrogram. + sample_rate (int): The sample rate of the audio. + use_soundfile (bool): Use soundfile for audio writing, can solve OOM issues. + use_autocast (bool): Flag to use PyTorch autocast for faster inference. + + MDX Architecture Specific Attributes: + hop_length (int): The hop length for STFT. + segment_size (int): The segment size for processing. + overlap (float): The overlap between segments. + batch_size (int): The batch size for processing. + enable_denoise (bool): Flag to enable or disable denoising. + + VR Architecture Specific Attributes & Defaults: + batch_size: 16 + window_size: 512 + aggression: 5 + enable_tta: False + enable_post_process: False + post_process_threshold: 0.2 + high_end_process: False + + Demucs Architecture Specific Attributes & Defaults: + segment_size: "Default" + shifts: 2 + overlap: 0.25 + segments_enabled: True + + MDXC Architecture Specific Attributes & Defaults: + segment_size: 256 + override_model_segment_size: False + batch_size: 1 + overlap: 8 + pitch_shift: 0 + """ + + def __init__( + self, + log_level=logging.INFO, + log_formatter=None, + model_file_dir="/tmp/audio-separator-models/", + output_dir=None, + output_format="WAV", + output_bitrate=None, + normalization_threshold=0.9, + amplification_threshold=0.0, + output_single_stem=None, + invert_using_spec=False, + sample_rate=44100, + use_soundfile=False, + use_autocast=False, + use_directml=False, + mdx_params={"hop_length": 1024, "segment_size": 256, "overlap": 0.25, "batch_size": 1, "enable_denoise": False}, + vr_params={"batch_size": 1, "window_size": 512, "aggression": 5, "enable_tta": False, "enable_post_process": False, "post_process_threshold": 0.2, "high_end_process": False}, + demucs_params={"segment_size": "Default", "shifts": 2, "overlap": 0.25, "segments_enabled": True}, + mdxc_params={"segment_size": 256, "override_model_segment_size": False, "batch_size": 1, "overlap": 8, "pitch_shift": 0}, + info_only=False, + ): + """Initialize the separator.""" + self.logger = logging.getLogger(__name__) + self.logger.setLevel(log_level) + self.log_level = log_level + self.log_formatter = log_formatter + + self.log_handler = logging.StreamHandler() + + if self.log_formatter is None: + self.log_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(module)s - %(message)s") + + self.log_handler.setFormatter(self.log_formatter) + + if not self.logger.hasHandlers(): + self.logger.addHandler(self.log_handler) + + # Filter out noisy warnings from PyTorch for users who don't care about them + if log_level > logging.DEBUG: + warnings.filterwarnings("ignore") + + # Skip initialization logs if info_only is True + if not info_only: + package_version = self.get_package_distribution("audio-separator").version + self.logger.info(f"Separator version {package_version} instantiating with output_dir: {output_dir}, output_format: {output_format}") + + if output_dir is None: + output_dir = os.getcwd() + if not info_only: + self.logger.info("Output directory not specified. Using current working directory.") + + self.output_dir = output_dir + + # Check for environment variable to override model_file_dir + env_model_dir = os.environ.get("AUDIO_SEPARATOR_MODEL_DIR") + if env_model_dir: + self.model_file_dir = env_model_dir + self.logger.info(f"Using model directory from AUDIO_SEPARATOR_MODEL_DIR env var: {self.model_file_dir}") + if not os.path.exists(self.model_file_dir): + raise FileNotFoundError(f"The specified model directory does not exist: {self.model_file_dir}") + else: + self.logger.info(f"Using model directory from model_file_dir parameter: {model_file_dir}") + self.model_file_dir = model_file_dir + + # Create the model directory if it does not exist + os.makedirs(self.model_file_dir, exist_ok=True) + os.makedirs(self.output_dir, exist_ok=True) + + self.output_format = output_format + self.output_bitrate = output_bitrate + + if self.output_format is None: + self.output_format = "WAV" + + self.normalization_threshold = normalization_threshold + if normalization_threshold <= 0 or normalization_threshold > 1: + raise ValueError("The normalization_threshold must be greater than 0 and less than or equal to 1.") + + self.amplification_threshold = amplification_threshold + if amplification_threshold < 0 or amplification_threshold > 1: + raise ValueError("The amplification_threshold must be greater than or equal to 0 and less than or equal to 1.") + + self.output_single_stem = output_single_stem + if output_single_stem is not None: + self.logger.debug(f"Single stem output requested, so only one output file ({output_single_stem}) will be written") + + self.invert_using_spec = invert_using_spec + if self.invert_using_spec: + self.logger.debug(f"Secondary step will be inverted using spectogram rather than waveform. This may improve quality but is slightly slower.") + + try: + self.sample_rate = int(sample_rate) + if self.sample_rate <= 0: + raise ValueError(f"The sample rate setting is {self.sample_rate} but it must be a non-zero whole number.") + if self.sample_rate > 12800000: + raise ValueError(f"The sample rate setting is {self.sample_rate}. Enter something less ambitious.") + except ValueError: + raise ValueError("The sample rate must be a non-zero whole number. Please provide a valid integer.") + + self.use_soundfile = use_soundfile + self.use_autocast = use_autocast + self.use_directml = use_directml + + # These are parameters which users may want to configure so we expose them to the top-level Separator class, + # even though they are specific to a single model architecture + self.arch_specific_params = {"MDX": mdx_params, "VR": vr_params, "Demucs": demucs_params, "MDXC": mdxc_params} + + self.torch_device = None + self.torch_device_cpu = None + self.torch_device_mps = None + + self.onnx_execution_provider = None + self.model_instance = None + + self.model_is_uvr_vip = False + self.model_friendly_name = None + + if not info_only: + self.setup_accelerated_inferencing_device() + + def setup_accelerated_inferencing_device(self): + """ + This method sets up the PyTorch and/or ONNX Runtime inferencing device, using GPU hardware acceleration if available. + """ + system_info = self.get_system_info() + self.check_ffmpeg_installed() + self.log_onnxruntime_packages() + self.setup_torch_device(system_info) + + def get_system_info(self): + """ + This method logs the system information, including the operating system, CPU archutecture and Python version + """ + os_name = platform.system() + os_version = platform.version() + self.logger.info(f"Operating System: {os_name} {os_version}") + + system_info = platform.uname() + self.logger.info(f"System: {system_info.system} Node: {system_info.node} Release: {system_info.release} Machine: {system_info.machine} Proc: {system_info.processor}") + + python_version = platform.python_version() + self.logger.info(f"Python Version: {python_version}") + + pytorch_version = torch.__version__ + self.logger.info(f"PyTorch Version: {pytorch_version}") + return system_info + + def check_ffmpeg_installed(self): + """ + This method checks if ffmpeg is installed and logs its version. + """ + try: + ffmpeg_version_output = subprocess.check_output(["ffmpeg", "-version"], text=True) + first_line = ffmpeg_version_output.splitlines()[0] + self.logger.info(f"FFmpeg installed: {first_line}") + except FileNotFoundError: + self.logger.error("FFmpeg is not installed. Please install FFmpeg to use this package.") + # Raise an exception if this is being run by a user, as ffmpeg is required for pydub to write audio + # but if we're just running unit tests in CI, no reason to throw + if "PYTEST_CURRENT_TEST" not in os.environ: + raise + + def log_onnxruntime_packages(self): + """ + This method logs the ONNX Runtime package versions, including the GPU and Silicon packages if available. + """ + onnxruntime_gpu_package = self.get_package_distribution("onnxruntime-gpu") + onnxruntime_silicon_package = self.get_package_distribution("onnxruntime-silicon") + onnxruntime_cpu_package = self.get_package_distribution("onnxruntime") + onnxruntime_dml_package = self.get_package_distribution("onnxruntime-directml") + + if onnxruntime_gpu_package is not None: + self.logger.info(f"ONNX Runtime GPU package installed with version: {onnxruntime_gpu_package.version}") + if onnxruntime_silicon_package is not None: + self.logger.info(f"ONNX Runtime Silicon package installed with version: {onnxruntime_silicon_package.version}") + if onnxruntime_cpu_package is not None: + self.logger.info(f"ONNX Runtime CPU package installed with version: {onnxruntime_cpu_package.version}") + if onnxruntime_dml_package is not None: + self.logger.info(f"ONNX Runtime DirectML package installed with version: {onnxruntime_dml_package.version}") + + def setup_torch_device(self, system_info): + """ + This method sets up the PyTorch and/or ONNX Runtime inferencing device, using GPU hardware acceleration if available. + """ + hardware_acceleration_enabled = False + ort_providers = ort.get_available_providers() + has_torch_dml_installed = self.get_package_distribution("torch_directml") + + self.torch_device_cpu = torch.device("cpu") + + if torch.cuda.is_available(): + self.configure_cuda(ort_providers) + hardware_acceleration_enabled = True + elif hasattr(torch.backends, "mps") and torch.backends.mps.is_available() and system_info.processor == "arm": + self.configure_mps(ort_providers) + hardware_acceleration_enabled = True + elif self.use_directml and has_torch_dml_installed: + import torch_directml + if torch_directml.is_available(): + self.configure_dml(ort_providers) + hardware_acceleration_enabled = True + + if not hardware_acceleration_enabled: + self.logger.info("No hardware acceleration could be configured, running in CPU mode") + self.torch_device = self.torch_device_cpu + self.onnx_execution_provider = ["CPUExecutionProvider"] + + def configure_cuda(self, ort_providers): + """ + This method configures the CUDA device for PyTorch and ONNX Runtime, if available. + """ + self.logger.info("CUDA is available in Torch, setting Torch device to CUDA") + self.torch_device = torch.device("cuda") + if "CUDAExecutionProvider" in ort_providers: + self.logger.info("ONNXruntime has CUDAExecutionProvider available, enabling acceleration") + self.onnx_execution_provider = ["CUDAExecutionProvider"] + else: + self.logger.warning("CUDAExecutionProvider not available in ONNXruntime, so acceleration will NOT be enabled") + + def configure_mps(self, ort_providers): + """ + This method configures the Apple Silicon MPS/CoreML device for PyTorch and ONNX Runtime, if available. + """ + self.logger.info("Apple Silicon MPS/CoreML is available in Torch and processor is ARM, setting Torch device to MPS") + self.torch_device_mps = torch.device("mps") + + self.torch_device = self.torch_device_mps + + if "CoreMLExecutionProvider" in ort_providers: + self.logger.info("ONNXruntime has CoreMLExecutionProvider available, enabling acceleration") + self.onnx_execution_provider = ["CoreMLExecutionProvider"] + else: + self.logger.warning("CoreMLExecutionProvider not available in ONNXruntime, so acceleration will NOT be enabled") + + def configure_dml(self, ort_providers): + """ + This method configures the DirectML device for PyTorch and ONNX Runtime, if available. + """ + import torch_directml + self.logger.info("DirectML is available in Torch, setting Torch device to DirectML") + self.torch_device_dml = torch_directml.device() + self.torch_device = self.torch_device_dml + + if "DmlExecutionProvider" in ort_providers: + self.logger.info("ONNXruntime has DmlExecutionProvider available, enabling acceleration") + self.onnx_execution_provider = ["DmlExecutionProvider"] + else: + self.logger.warning("DmlExecutionProvider not available in ONNXruntime, so acceleration will NOT be enabled") + + def get_package_distribution(self, package_name): + """ + This method returns the package distribution for a given package name if installed, or None otherwise. + """ + try: + return metadata.distribution(package_name) + except metadata.PackageNotFoundError: + self.logger.debug(f"Python package: {package_name} not installed") + return None + + def get_model_hash(self, model_path): + """ + This method returns the MD5 hash of a given model file. + """ + self.logger.debug(f"Calculating hash of model file {model_path}") + # Use the specific byte count from the original logic + BYTES_TO_HASH = 10000 * 1024 # 10,240,000 bytes + + try: + file_size = os.path.getsize(model_path) + + with open(model_path, "rb") as f: + if file_size < BYTES_TO_HASH: + # Hash the entire file if smaller than the target byte count + self.logger.debug(f"File size {file_size} < {BYTES_TO_HASH}, hashing entire file.") + hash_value = hashlib.md5(f.read()).hexdigest() + else: + # Seek to the specific position before the end (from the beginning) and hash + seek_pos = file_size - BYTES_TO_HASH + self.logger.debug(f"File size {file_size} >= {BYTES_TO_HASH}, seeking to {seek_pos} and hashing remaining bytes.") + f.seek(seek_pos, io.SEEK_SET) + hash_value = hashlib.md5(f.read()).hexdigest() + + # Log the calculated hash + self.logger.info(f"Hash of model file {model_path} is {hash_value}") + return hash_value + + except FileNotFoundError: + self.logger.error(f"Model file not found at {model_path}") + raise # Re-raise the specific error + except Exception as e: + # Catch other potential errors (e.g., permissions, other IOErrors) + self.logger.error(f"Error calculating hash for {model_path}: {e}") + raise # Re-raise other errors + + def download_file_if_not_exists(self, url, output_path): + """ + This method downloads a file from a given URL to a given output path, if the file does not already exist. + """ + + if os.path.isfile(output_path): + self.logger.debug(f"File already exists at {output_path}, skipping download") + return + + self.logger.debug(f"Downloading file from {url} to {output_path} with timeout 300s") + response = requests.get(url, stream=True, timeout=300) + + if response.status_code == 200: + total_size_in_bytes = int(response.headers.get("content-length", 0)) + progress_bar = tqdm(total=total_size_in_bytes, unit="iB", unit_scale=True) + + with open(output_path, "wb") as f: + for chunk in response.iter_content(chunk_size=8192): + progress_bar.update(len(chunk)) + f.write(chunk) + progress_bar.close() + else: + raise RuntimeError(f"Failed to download file from {url}, response code: {response.status_code}") + + def list_supported_model_files(self): + """ + This method lists the supported model files for audio-separator, by fetching the same file UVR uses to list these. + Also includes model performance scores where available. + + Example response object: + + { + "MDX": { + "MDX-Net Model VIP: UVR-MDX-NET-Inst_full_292": { + "filename": "UVR-MDX-NET-Inst_full_292.onnx", + "scores": { + "vocals": { + "SDR": 10.6497, + "SIR": 20.3786, + "SAR": 10.692, + "ISR": 14.848 + }, + "instrumental": { + "SDR": 15.2149, + "SIR": 25.6075, + "SAR": 17.1363, + "ISR": 17.7893 + } + }, + "download_files": [ + "UVR-MDX-NET-Inst_full_292.onnx" + ] + } + }, + "Demucs": { + "Demucs v4: htdemucs_ft": { + "filename": "htdemucs_ft.yaml", + "scores": { + "vocals": { + "SDR": 11.2685, + "SIR": 21.257, + "SAR": 11.0359, + "ISR": 19.3753 + }, + "drums": { + "SDR": 13.235, + "SIR": 23.3053, + "SAR": 13.0313, + "ISR": 17.2889 + }, + "bass": { + "SDR": 9.72743, + "SIR": 19.5435, + "SAR": 9.20801, + "ISR": 13.5037 + } + }, + "download_files": [ + "https://dl.fbaipublicfiles.com/demucs/hybrid_transformer/f7e0c4bc-ba3fe64a.th", + "https://dl.fbaipublicfiles.com/demucs/hybrid_transformer/d12395a8-e57c48e6.th", + "https://dl.fbaipublicfiles.com/demucs/hybrid_transformer/92cfc3b6-ef3bcb9c.th", + "https://dl.fbaipublicfiles.com/demucs/hybrid_transformer/04573f0d-f3cf25b2.th", + "https://github.com/TRvlvr/model_repo/releases/download/all_public_uvr_models/htdemucs_ft.yaml" + ] + } + }, + "MDXC": { + "MDX23C Model: MDX23C-InstVoc HQ": { + "filename": "MDX23C-8KFFT-InstVoc_HQ.ckpt", + "scores": { + "vocals": { + "SDR": 11.9504, + "SIR": 23.1166, + "SAR": 12.093, + "ISR": 15.4782 + }, + "instrumental": { + "SDR": 16.3035, + "SIR": 26.6161, + "SAR": 18.5167, + "ISR": 18.3939 + } + }, + "download_files": [ + "MDX23C-8KFFT-InstVoc_HQ.ckpt", + "model_2_stem_full_band_8k.yaml" + ] + } + } + } + """ + download_checks_path = os.path.join(self.model_file_dir, "download_checks.json") + + self.download_file_if_not_exists("https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_checks.json", download_checks_path) + + model_downloads_list = json.load(open(download_checks_path, encoding="utf-8")) + self.logger.debug(f"UVR model download list loaded") + + # Load the model scores with error handling + model_scores = {} + try: + with resources.open_text("audio_separator", "models-scores.json") as f: + model_scores = json.load(f) + self.logger.debug(f"Model scores loaded") + except json.JSONDecodeError as e: + self.logger.warning(f"Failed to load model scores: {str(e)}") + self.logger.warning("Continuing without model scores") + + # Only show Demucs v4 models as we've only implemented support for v4 + filtered_demucs_v4 = {key: value for key, value in model_downloads_list["demucs_download_list"].items() if key.startswith("Demucs v4")} + + # Modified Demucs handling to use YAML files as identifiers and include download files + demucs_models = {} + for name, files in filtered_demucs_v4.items(): + # Find the YAML file in the model files + yaml_file = next((filename for filename in files.keys() if filename.endswith(".yaml")), None) + if yaml_file: + model_score_data = model_scores.get(yaml_file, {}) + demucs_models[name] = { + "filename": yaml_file, + "scores": model_score_data.get("median_scores", {}), + "stems": model_score_data.get("stems", []), + "target_stem": model_score_data.get("target_stem"), + "download_files": list(files.values()), # List of all download URLs/filenames + } + + # Load the JSON file using importlib.resources + with resources.open_text("audio_separator", "models.json") as f: + audio_separator_models_list = json.load(f) + self.logger.debug(f"Audio-Separator model list loaded") + + # Return object with list of model names + model_files_grouped_by_type = { + "VR": { + name: { + "filename": filename, + "scores": model_scores.get(filename, {}).get("median_scores", {}), + "stems": model_scores.get(filename, {}).get("stems", []), + "target_stem": model_scores.get(filename, {}).get("target_stem"), + "download_files": [filename], + } # Just the filename for VR models + for name, filename in {**model_downloads_list["vr_download_list"], **audio_separator_models_list["vr_download_list"]}.items() + }, + "MDX": { + name: { + "filename": filename, + "scores": model_scores.get(filename, {}).get("median_scores", {}), + "stems": model_scores.get(filename, {}).get("stems", []), + "target_stem": model_scores.get(filename, {}).get("target_stem"), + "download_files": [filename], + } # Just the filename for MDX models + for name, filename in {**model_downloads_list["mdx_download_list"], **model_downloads_list["mdx_download_vip_list"], **audio_separator_models_list["mdx_download_list"]}.items() + }, + "Demucs": demucs_models, + "MDXC": { + name: { + "filename": next(iter(files.keys())), + "scores": model_scores.get(next(iter(files.keys())), {}).get("median_scores", {}), + "stems": model_scores.get(next(iter(files.keys())), {}).get("stems", []), + "target_stem": model_scores.get(next(iter(files.keys())), {}).get("target_stem"), + "download_files": list(files.keys()) + list(files.values()), # List of both model filenames and config filenames + } + for name, files in { + **model_downloads_list["mdx23c_download_list"], + **model_downloads_list["mdx23c_download_vip_list"], + **model_downloads_list["roformer_download_list"], + **audio_separator_models_list["mdx23c_download_list"], + **audio_separator_models_list["roformer_download_list"], + }.items() + }, + } + + return model_files_grouped_by_type + + def print_uvr_vip_message(self): + """ + This method prints a message to the user if they have downloaded a VIP model, reminding them to support Anjok07 on Patreon. + """ + if self.model_is_uvr_vip: + self.logger.warning(f"The model: '{self.model_friendly_name}' is a VIP model, intended by Anjok07 for access by paying subscribers only.") + self.logger.warning("If you are not already subscribed, please consider supporting the developer of UVR, Anjok07 by subscribing here: https://patreon.com/uvr") + + def download_model_files(self, model_filename): + """ + This method downloads the model files for a given model filename, if they are not already present. + Returns tuple of (model_filename, model_type, model_friendly_name, model_path, yaml_config_filename) + """ + model_path = os.path.join(self.model_file_dir, f"{model_filename}") + + supported_model_files_grouped = self.list_supported_model_files() + public_model_repo_url_prefix = "https://github.com/TRvlvr/model_repo/releases/download/all_public_uvr_models" + vip_model_repo_url_prefix = "https://github.com/Anjok0109/ai_magic/releases/download/v5" + audio_separator_models_repo_url_prefix = "https://github.com/nomadkaraoke/python-audio-separator/releases/download/model-configs" + + yaml_config_filename = None + + self.logger.debug(f"Searching for model_filename {model_filename} in supported_model_files_grouped") + + # Iterate through model types (MDX, Demucs, MDXC) + for model_type, models in supported_model_files_grouped.items(): + # Iterate through each model in this type + for model_friendly_name, model_info in models.items(): + self.model_is_uvr_vip = "VIP" in model_friendly_name + model_repo_url_prefix = vip_model_repo_url_prefix if self.model_is_uvr_vip else public_model_repo_url_prefix + + # Check if this model matches our target filename + if model_info["filename"] == model_filename or model_filename in model_info["download_files"]: + self.logger.debug(f"Found matching model: {model_friendly_name}") + self.model_friendly_name = model_friendly_name + self.print_uvr_vip_message() + + # Download each required file for this model + for file_to_download in model_info["download_files"]: + # For URLs, extract just the filename portion + if file_to_download.startswith("http"): + filename = file_to_download.split("/")[-1] + download_path = os.path.join(self.model_file_dir, filename) + self.download_file_if_not_exists(file_to_download, download_path) + continue + + download_path = os.path.join(self.model_file_dir, file_to_download) + + # For MDXC models, handle YAML config files specially + if model_type == "MDXC" and file_to_download.endswith(".yaml"): + yaml_config_filename = file_to_download + try: + yaml_url = f"{model_repo_url_prefix}/mdx_model_data/mdx_c_configs/{file_to_download}" + self.download_file_if_not_exists(yaml_url, download_path) + except RuntimeError: + self.logger.debug("YAML config not found in UVR repo, trying audio-separator models repo...") + yaml_url = f"{audio_separator_models_repo_url_prefix}/{file_to_download}" + self.download_file_if_not_exists(yaml_url, download_path) + continue + + # For regular model files, try UVR repo first, then audio-separator repo + try: + download_url = f"{model_repo_url_prefix}/{file_to_download}" + self.download_file_if_not_exists(download_url, download_path) + except RuntimeError: + self.logger.debug("Model not found in UVR repo, trying audio-separator models repo...") + download_url = f"{audio_separator_models_repo_url_prefix}/{file_to_download}" + self.download_file_if_not_exists(download_url, download_path) + + return model_filename, model_type, model_friendly_name, model_path, yaml_config_filename + + raise ValueError(f"Model file {model_filename} not found in supported model files") + + def load_model_data_from_yaml(self, yaml_config_filename): + """ + This method loads model-specific parameters from the YAML file for that model. + The parameters in the YAML are critical to inferencing, as they need to match whatever was used during training. + """ + # Verify if the YAML filename includes a full path or just the filename + if not os.path.exists(yaml_config_filename): + model_data_yaml_filepath = os.path.join(self.model_file_dir, yaml_config_filename) + else: + model_data_yaml_filepath = yaml_config_filename + + self.logger.debug(f"Loading model data from YAML at path {model_data_yaml_filepath}") + + model_data = yaml.load(open(model_data_yaml_filepath, encoding="utf-8"), Loader=yaml.FullLoader) + self.logger.debug(f"Model data loaded from YAML file: {model_data}") + + if "roformer" in model_data_yaml_filepath: + model_data["is_roformer"] = True + + return model_data + + def load_model_data_using_hash(self, model_path): + """ + This method loads model-specific parameters from UVR model data files. + These parameters are critical to inferencing using a given model, as they need to match whatever was used during training. + The correct parameters are identified by calculating the hash of the model file and looking up the hash in the UVR data files. + """ + # Model data and configuration sources from UVR + model_data_url_prefix = "https://raw.githubusercontent.com/TRvlvr/application_data/main" + + vr_model_data_url = f"{model_data_url_prefix}/vr_model_data/model_data_new.json" + mdx_model_data_url = f"{model_data_url_prefix}/mdx_model_data/model_data_new.json" + + # Calculate hash for the downloaded model + self.logger.debug("Calculating MD5 hash for model file to identify model parameters from UVR data...") + model_hash = self.get_model_hash(model_path) + self.logger.debug(f"Model {model_path} has hash {model_hash}") + + # Setting up the path for model data and checking its existence + vr_model_data_path = os.path.join(self.model_file_dir, "vr_model_data.json") + self.logger.debug(f"VR model data path set to {vr_model_data_path}") + self.download_file_if_not_exists(vr_model_data_url, vr_model_data_path) + + mdx_model_data_path = os.path.join(self.model_file_dir, "mdx_model_data.json") + self.logger.debug(f"MDX model data path set to {mdx_model_data_path}") + self.download_file_if_not_exists(mdx_model_data_url, mdx_model_data_path) + + # Loading model data from UVR + self.logger.debug("Loading MDX and VR model parameters from UVR model data files...") + vr_model_data_object = json.load(open(vr_model_data_path, encoding="utf-8")) + mdx_model_data_object = json.load(open(mdx_model_data_path, encoding="utf-8")) + + # Load additional model data from audio-separator + self.logger.debug("Loading additional model parameters from audio-separator model data file...") + with resources.open_text("audio_separator", "model-data.json") as f: + audio_separator_model_data = json.load(f) + + # Merge the model data objects, with audio-separator data taking precedence + vr_model_data_object = {**vr_model_data_object, **audio_separator_model_data.get("vr_model_data", {})} + mdx_model_data_object = {**mdx_model_data_object, **audio_separator_model_data.get("mdx_model_data", {})} + + if model_hash in mdx_model_data_object: + model_data = mdx_model_data_object[model_hash] + elif model_hash in vr_model_data_object: + model_data = vr_model_data_object[model_hash] + else: + raise ValueError(f"Unsupported Model File: parameters for MD5 hash {model_hash} could not be found in UVR model data file for MDX or VR arch.") + + self.logger.debug(f"Model data loaded using hash {model_hash}: {model_data}") + + return model_data + + def load_model(self, model_filename="model_mel_band_roformer_ep_3005_sdr_11.4360.ckpt"): + """ + This method instantiates the architecture-specific separation class, + loading the separation model into memory, downloading it first if necessary. + """ + self.logger.info(f"Loading model {model_filename}...") + + load_model_start_time = time.perf_counter() + + # Setting up the model path + model_filename, model_type, model_friendly_name, model_path, yaml_config_filename = self.download_model_files(model_filename) + model_name = model_filename.split(".")[0] + self.logger.debug(f"Model downloaded, friendly name: {model_friendly_name}, model_path: {model_path}") + + if model_path.lower().endswith(".yaml"): + yaml_config_filename = model_path + + if yaml_config_filename is not None: + model_data = self.load_model_data_from_yaml(yaml_config_filename) + else: + model_data = self.load_model_data_using_hash(model_path) + + common_params = { + "logger": self.logger, + "log_level": self.log_level, + "torch_device": self.torch_device, + "torch_device_cpu": self.torch_device_cpu, + "torch_device_mps": self.torch_device_mps, + "onnx_execution_provider": self.onnx_execution_provider, + "model_name": model_name, + "model_path": model_path, + "model_data": model_data, + "output_format": self.output_format, + "output_bitrate": self.output_bitrate, + "output_dir": self.output_dir, + "normalization_threshold": self.normalization_threshold, + "amplification_threshold": self.amplification_threshold, + "output_single_stem": self.output_single_stem, + "invert_using_spec": self.invert_using_spec, + "sample_rate": self.sample_rate, + "use_soundfile": self.use_soundfile, + } + + # Instantiate the appropriate separator class depending on the model type + separator_classes = {"MDX": "mdx_separator.MDXSeparator", "VR": "vr_separator.VRSeparator", "Demucs": "demucs_separator.DemucsSeparator", "MDXC": "mdxc_separator.MDXCSeparator"} + + if model_type not in self.arch_specific_params or model_type not in separator_classes: + raise ValueError(f"Model type not supported (yet): {model_type}") + + if model_type == "Demucs" and sys.version_info < (3, 10): + raise Exception("Demucs models require Python version 3.10 or newer.") + + self.logger.debug(f"Importing module for model type {model_type}: {separator_classes[model_type]}") + + module_name, class_name = separator_classes[model_type].split(".") + module = importlib.import_module(f"audio_separator.separator.architectures.{module_name}") + separator_class = getattr(module, class_name) + + self.logger.debug(f"Instantiating separator class for model type {model_type}: {separator_class}") + self.model_instance = separator_class(common_config=common_params, arch_config=self.arch_specific_params[model_type]) + + # Log the completion of the model load process + self.logger.debug("Loading model completed.") + self.logger.info(f'Load model duration: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - load_model_start_time)))}') + + def separate(self, audio_file_path, custom_output_names=None): + """ + Separates the audio file(s) into different stems (e.g., vocals, instruments) using the loaded model. + + This method takes the path to an audio file or a directory containing audio files, processes them through + the loaded separation model, and returns the paths to the output files containing the separated audio stems. + It handles the entire flow from loading the audio, running the separation, clearing up resources, and logging the process. + + Parameters: + - audio_file_path (str or list): The path to the audio file or directory, or a list of paths. + - custom_output_names (dict, optional): Custom names for the output files. Defaults to None. + + Returns: + - output_files (list of str): A list containing the paths to the separated audio stem files. + """ + # Check if the model and device are properly initialized + if not (self.torch_device and self.model_instance): + raise ValueError("Initialization failed or model not loaded. Please load a model before attempting to separate.") + + # If audio_file_path is a string, convert it to a list for uniform processing + if isinstance(audio_file_path, str): + audio_file_path = [audio_file_path] + + # Initialize a list to store paths of all output files + output_files = [] + + # Process each path in the list + for path in audio_file_path: + if os.path.isdir(path): + # If the path is a directory, recursively search for all audio files + for root, dirs, files in os.walk(path): + for file in files: + # Check the file extension to ensure it's an audio file + if file.endswith((".wav", ".flac", ".mp3", ".ogg", ".opus", ".m4a", ".aiff", ".ac3")): # Add other formats if needed + full_path = os.path.join(root, file) + self.logger.info(f"Processing file: {full_path}") + try: + # Perform separation for each file + files_output = self._separate_file(full_path, custom_output_names) + output_files.extend(files_output) + except Exception as e: + self.logger.error(f"Failed to process file {full_path}: {e}") + else: + # If the path is a file, process it directly + self.logger.info(f"Processing file: {path}") + try: + files_output = self._separate_file(path, custom_output_names) + output_files.extend(files_output) + except Exception as e: + self.logger.error(f"Failed to process file {path}: {e}") + + return output_files + + def _separate_file(self, audio_file_path, custom_output_names=None): + """ + Internal method to handle separation for a single audio file. + This method performs the actual separation process for a single audio file. It logs the start and end of the process, + handles autocast if enabled, and ensures GPU cache is cleared after processing. + Parameters: + - audio_file_path (str): The path to the audio file. + - custom_output_names (dict, optional): Custom names for the output files. Defaults to None. + Returns: + - output_files (list of str): A list containing the paths to the separated audio stem files. + """ + # Log the start of the separation process + self.logger.info(f"Starting separation process for audio_file_path: {audio_file_path}") + separate_start_time = time.perf_counter() + + # Log normalization and amplification thresholds + self.logger.debug(f"Normalization threshold set to {self.normalization_threshold}, waveform will be lowered to this max amplitude to avoid clipping.") + self.logger.debug(f"Amplification threshold set to {self.amplification_threshold}, waveform will be scaled up to this max amplitude if below it.") + + # Run separation method for the loaded model with autocast enabled if supported by the device + output_files = None + if self.use_autocast and autocast_mode.is_autocast_available(self.torch_device.type): + self.logger.debug("Autocast available.") + with autocast_mode.autocast(self.torch_device.type): + output_files = self.model_instance.separate(audio_file_path, custom_output_names) + else: + self.logger.debug("Autocast unavailable.") + output_files = self.model_instance.separate(audio_file_path, custom_output_names) + + # Clear GPU cache to free up memory + self.model_instance.clear_gpu_cache() + + # Unset separation parameters to prevent accidentally re-using the wrong source files or output paths + self.model_instance.clear_file_specific_paths() + + # Remind the user one more time if they used a VIP model, so the message doesn't get lost in the logs + self.print_uvr_vip_message() + + # Log the completion of the separation process + self.logger.debug("Separation process completed.") + self.logger.info(f'Separation duration: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - separate_start_time)))}') + + return output_files + + def download_model_and_data(self, model_filename): + """ + Downloads the model file without loading it into memory. + """ + self.logger.info(f"Downloading model {model_filename}...") + + model_filename, model_type, model_friendly_name, model_path, yaml_config_filename = self.download_model_files(model_filename) + + if model_path.lower().endswith(".yaml"): + yaml_config_filename = model_path + + if yaml_config_filename is not None: + model_data = self.load_model_data_from_yaml(yaml_config_filename) + else: + model_data = self.load_model_data_using_hash(model_path) + + model_data_dict_size = len(model_data) + + self.logger.info(f"Model downloaded, type: {model_type}, friendly name: {model_friendly_name}, model_path: {model_path}, model_data: {model_data_dict_size} items") + + def get_simplified_model_list(self, filter_sort_by: Optional[str] = None): + """ + Returns a simplified, user-friendly list of models with their key metrics. + Optionally sorts the list based on the specified criteria. + + :param sort_by: Criteria to sort by. Can be "name", "filename", or any stem name + """ + model_files = self.list_supported_model_files() + simplified_list = {} + + for model_type, models in model_files.items(): + for name, data in models.items(): + filename = data["filename"] + scores = data.get("scores") or {} + stems = data.get("stems") or [] + target_stem = data.get("target_stem") + + # Format stems with their SDR scores where available + stems_with_scores = [] + stem_sdr_dict = {} + + # Process each stem from the model's stem list + for stem in stems: + stem_scores = scores.get(stem, {}) + # Add asterisk if this is the target stem + stem_display = f"{stem}*" if stem == target_stem else stem + + if isinstance(stem_scores, dict) and "SDR" in stem_scores: + sdr = round(stem_scores["SDR"], 1) + stems_with_scores.append(f"{stem_display} ({sdr})") + stem_sdr_dict[stem.lower()] = sdr + else: + # Include stem without SDR score + stems_with_scores.append(stem_display) + stem_sdr_dict[stem.lower()] = None + + # If no stems listed, mark as Unknown + if not stems_with_scores: + stems_with_scores = ["Unknown"] + stem_sdr_dict["unknown"] = None + + simplified_list[filename] = {"Name": name, "Type": model_type, "Stems": stems_with_scores, "SDR": stem_sdr_dict} + + # Sort and filter the list if a sort_by parameter is provided + if filter_sort_by: + if filter_sort_by == "name": + return dict(sorted(simplified_list.items(), key=lambda x: x[1]["Name"])) + elif filter_sort_by == "filename": + return dict(sorted(simplified_list.items())) + else: + # Convert sort_by to lowercase for case-insensitive comparison + sort_by_lower = filter_sort_by.lower() + # Filter out models that don't have the specified stem + filtered_list = {k: v for k, v in simplified_list.items() if sort_by_lower in v["SDR"]} + + # Sort by SDR score if available, putting None values last + def sort_key(item): + sdr = item[1]["SDR"][sort_by_lower] + return (0 if sdr is None else 1, sdr if sdr is not None else float("-inf")) + + return dict(sorted(filtered_list.items(), key=sort_key, reverse=True)) + + return simplified_list diff --git a/audio_separator/separator/uvr_lib_v5/__init__.py b/audio_separator/separator/uvr_lib_v5/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/audio_separator/separator/uvr_lib_v5/demucs/__init__.py b/audio_separator/separator/uvr_lib_v5/demucs/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5656d59e07f3fa33dd3bad1a0f9279ff4b8a6128 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/__init__.py @@ -0,0 +1,5 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. diff --git a/audio_separator/separator/uvr_lib_v5/demucs/__main__.py b/audio_separator/separator/uvr_lib_v5/demucs/__main__.py new file mode 100644 index 0000000000000000000000000000000000000000..b13c2e0b398b9e938f691c06937d420a2de9c588 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/__main__.py @@ -0,0 +1,212 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import json +import os +import sys +import time +from dataclasses import dataclass, field +from fractions import Fraction + +import torch as th +from torch import distributed, nn +from torch.nn.parallel.distributed import DistributedDataParallel + +from .augment import FlipChannels, FlipSign, Remix, Shift +from .compressed import StemsSet, build_musdb_metadata, get_musdb_tracks +from .model import Demucs +from .parser import get_name, get_parser +from .raw import Rawset +from .tasnet import ConvTasNet +from .test import evaluate +from .train import train_model, validate_model +from .utils import human_seconds, load_model, save_model, sizeof_fmt + + +@dataclass +class SavedState: + metrics: list = field(default_factory=list) + last_state: dict = None + best_state: dict = None + optimizer: dict = None + + +def main(): + parser = get_parser() + args = parser.parse_args() + name = get_name(parser, args) + print(f"Experiment {name}") + + if args.musdb is None and args.rank == 0: + print("You must provide the path to the MusDB dataset with the --musdb flag. " "To download the MusDB dataset, see https://sigsep.github.io/datasets/musdb.html.", file=sys.stderr) + sys.exit(1) + + eval_folder = args.evals / name + eval_folder.mkdir(exist_ok=True, parents=True) + args.logs.mkdir(exist_ok=True) + metrics_path = args.logs / f"{name}.json" + eval_folder.mkdir(exist_ok=True, parents=True) + args.checkpoints.mkdir(exist_ok=True, parents=True) + args.models.mkdir(exist_ok=True, parents=True) + + if args.device is None: + device = "cpu" + if th.cuda.is_available(): + device = "cuda" + else: + device = args.device + + th.manual_seed(args.seed) + # Prevents too many threads to be started when running `museval` as it can be quite + # inefficient on NUMA architectures. + os.environ["OMP_NUM_THREADS"] = "1" + + if args.world_size > 1: + if device != "cuda" and args.rank == 0: + print("Error: distributed training is only available with cuda device", file=sys.stderr) + sys.exit(1) + th.cuda.set_device(args.rank % th.cuda.device_count()) + distributed.init_process_group(backend="nccl", init_method="tcp://" + args.master, rank=args.rank, world_size=args.world_size) + + checkpoint = args.checkpoints / f"{name}.th" + checkpoint_tmp = args.checkpoints / f"{name}.th.tmp" + if args.restart and checkpoint.exists(): + checkpoint.unlink() + + if args.test: + args.epochs = 1 + args.repeat = 0 + model = load_model(args.models / args.test) + elif args.tasnet: + model = ConvTasNet(audio_channels=args.audio_channels, samplerate=args.samplerate, X=args.X) + else: + model = Demucs( + audio_channels=args.audio_channels, + channels=args.channels, + context=args.context, + depth=args.depth, + glu=args.glu, + growth=args.growth, + kernel_size=args.kernel_size, + lstm_layers=args.lstm_layers, + rescale=args.rescale, + rewrite=args.rewrite, + sources=4, + stride=args.conv_stride, + upsample=args.upsample, + samplerate=args.samplerate, + ) + model.to(device) + if args.show: + print(model) + size = sizeof_fmt(4 * sum(p.numel() for p in model.parameters())) + print(f"Model size {size}") + return + + optimizer = th.optim.Adam(model.parameters(), lr=args.lr) + + try: + saved = th.load(checkpoint, map_location="cpu") + except IOError: + saved = SavedState() + else: + model.load_state_dict(saved.last_state) + optimizer.load_state_dict(saved.optimizer) + + if args.save_model: + if args.rank == 0: + model.to("cpu") + model.load_state_dict(saved.best_state) + save_model(model, args.models / f"{name}.th") + return + + if args.rank == 0: + done = args.logs / f"{name}.done" + if done.exists(): + done.unlink() + + if args.augment: + augment = nn.Sequential(FlipSign(), FlipChannels(), Shift(args.data_stride), Remix(group_size=args.remix_group_size)).to(device) + else: + augment = Shift(args.data_stride) + + if args.mse: + criterion = nn.MSELoss() + else: + criterion = nn.L1Loss() + + # Setting number of samples so that all convolution windows are full. + # Prevents hard to debug mistake with the prediction being shifted compared + # to the input mixture. + samples = model.valid_length(args.samples) + print(f"Number of training samples adjusted to {samples}") + + if args.raw: + train_set = Rawset(args.raw / "train", samples=samples + args.data_stride, channels=args.audio_channels, streams=[0, 1, 2, 3, 4], stride=args.data_stride) + + valid_set = Rawset(args.raw / "valid", channels=args.audio_channels) + else: + if not args.metadata.is_file() and args.rank == 0: + build_musdb_metadata(args.metadata, args.musdb, args.workers) + if args.world_size > 1: + distributed.barrier() + metadata = json.load(open(args.metadata)) + duration = Fraction(samples + args.data_stride, args.samplerate) + stride = Fraction(args.data_stride, args.samplerate) + train_set = StemsSet(get_musdb_tracks(args.musdb, subsets=["train"], split="train"), metadata, duration=duration, stride=stride, samplerate=args.samplerate, channels=args.audio_channels) + valid_set = StemsSet(get_musdb_tracks(args.musdb, subsets=["train"], split="valid"), metadata, samplerate=args.samplerate, channels=args.audio_channels) + + best_loss = float("inf") + for epoch, metrics in enumerate(saved.metrics): + print(f"Epoch {epoch:03d}: " f"train={metrics['train']:.8f} " f"valid={metrics['valid']:.8f} " f"best={metrics['best']:.4f} " f"duration={human_seconds(metrics['duration'])}") + best_loss = metrics["best"] + + if args.world_size > 1: + dmodel = DistributedDataParallel(model, device_ids=[th.cuda.current_device()], output_device=th.cuda.current_device()) + else: + dmodel = model + + for epoch in range(len(saved.metrics), args.epochs): + begin = time.time() + model.train() + train_loss = train_model( + epoch, train_set, dmodel, criterion, optimizer, augment, batch_size=args.batch_size, device=device, repeat=args.repeat, seed=args.seed, workers=args.workers, world_size=args.world_size + ) + model.eval() + valid_loss = validate_model(epoch, valid_set, model, criterion, device=device, rank=args.rank, split=args.split_valid, world_size=args.world_size) + + duration = time.time() - begin + if valid_loss < best_loss: + best_loss = valid_loss + saved.best_state = {key: value.to("cpu").clone() for key, value in model.state_dict().items()} + saved.metrics.append({"train": train_loss, "valid": valid_loss, "best": best_loss, "duration": duration}) + if args.rank == 0: + json.dump(saved.metrics, open(metrics_path, "w")) + + saved.last_state = model.state_dict() + saved.optimizer = optimizer.state_dict() + if args.rank == 0 and not args.test: + th.save(saved, checkpoint_tmp) + checkpoint_tmp.rename(checkpoint) + + print(f"Epoch {epoch:03d}: " f"train={train_loss:.8f} valid={valid_loss:.8f} best={best_loss:.4f} " f"duration={human_seconds(duration)}") + + del dmodel + model.load_state_dict(saved.best_state) + if args.eval_cpu: + device = "cpu" + model.to(device) + model.eval() + evaluate(model, args.musdb, eval_folder, rank=args.rank, world_size=args.world_size, device=device, save=args.save, split=args.split_valid, shifts=args.shifts, workers=args.eval_workers) + model.to("cpu") + save_model(model, args.models / f"{name}.th") + if args.rank == 0: + print("done") + done.write_text("done") + + +if __name__ == "__main__": + main() diff --git a/audio_separator/separator/uvr_lib_v5/demucs/apply.py b/audio_separator/separator/uvr_lib_v5/demucs/apply.py new file mode 100644 index 0000000000000000000000000000000000000000..9e5f5091244249110e8dc1f8aafb80cf42b35044 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/apply.py @@ -0,0 +1,294 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +""" +Code to apply a model to a mix. It will handle chunking with overlaps and +inteprolation between chunks, as well as the "shift trick". +""" +from concurrent.futures import ThreadPoolExecutor +import random +import typing as tp + +import torch as th +from torch import nn +from torch.nn import functional as F +import tqdm + +from .demucs import Demucs +from .hdemucs import HDemucs +from .utils import center_trim, DummyPoolExecutor + +Model = tp.Union[Demucs, HDemucs] + +progress_bar_num = 0 + + +class BagOfModels(nn.Module): + def __init__(self, models: tp.List[Model], weights: tp.Optional[tp.List[tp.List[float]]] = None, segment: tp.Optional[float] = None): + """ + Represents a bag of models with specific weights. + You should call `apply_model` rather than calling directly the forward here for + optimal performance. + + Args: + models (list[nn.Module]): list of Demucs/HDemucs models. + weights (list[list[float]]): list of weights. If None, assumed to + be all ones, otherwise it should be a list of N list (N number of models), + each containing S floats (S number of sources). + segment (None or float): overrides the `segment` attribute of each model + (this is performed inplace, be careful if you reuse the models passed). + """ + + super().__init__() + assert len(models) > 0 + first = models[0] + for other in models: + assert other.sources == first.sources + assert other.samplerate == first.samplerate + assert other.audio_channels == first.audio_channels + if segment is not None: + other.segment = segment + + self.audio_channels = first.audio_channels + self.samplerate = first.samplerate + self.sources = first.sources + self.models = nn.ModuleList(models) + + if weights is None: + weights = [[1.0 for _ in first.sources] for _ in models] + else: + assert len(weights) == len(models) + for weight in weights: + assert len(weight) == len(first.sources) + self.weights = weights + + def forward(self, x): + raise NotImplementedError("Call `apply_model` on this.") + + +class TensorChunk: + def __init__(self, tensor, offset=0, length=None): + total_length = tensor.shape[-1] + assert offset >= 0 + assert offset < total_length + + if length is None: + length = total_length - offset + else: + length = min(total_length - offset, length) + + if isinstance(tensor, TensorChunk): + self.tensor = tensor.tensor + self.offset = offset + tensor.offset + else: + self.tensor = tensor + self.offset = offset + self.length = length + self.device = tensor.device + + @property + def shape(self): + shape = list(self.tensor.shape) + shape[-1] = self.length + return shape + + def padded(self, target_length): + delta = target_length - self.length + total_length = self.tensor.shape[-1] + assert delta >= 0 + + start = self.offset - delta // 2 + end = start + target_length + + correct_start = max(0, start) + correct_end = min(total_length, end) + + pad_left = correct_start - start + pad_right = end - correct_end + + out = F.pad(self.tensor[..., correct_start:correct_end], (pad_left, pad_right)) + assert out.shape[-1] == target_length + return out + + +def tensor_chunk(tensor_or_chunk): + if isinstance(tensor_or_chunk, TensorChunk): + return tensor_or_chunk + else: + assert isinstance(tensor_or_chunk, th.Tensor) + return TensorChunk(tensor_or_chunk) + + +def apply_model(model, mix, shifts=1, split=True, overlap=0.25, transition_power=1.0, static_shifts=1, set_progress_bar=None, device=None, progress=False, num_workers=0, pool=None): + """ + Apply model to a given mixture. + + Args: + shifts (int): if > 0, will shift in time `mix` by a random amount between 0 and 0.5 sec + and apply the oppositve shift to the output. This is repeated `shifts` time and + all predictions are averaged. This effectively makes the model time equivariant + and improves SDR by up to 0.2 points. + split (bool): if True, the input will be broken down in 8 seconds extracts + and predictions will be performed individually on each and concatenated. + Useful for model with large memory footprint like Tasnet. + progress (bool): if True, show a progress bar (requires split=True) + device (torch.device, str, or None): if provided, device on which to + execute the computation, otherwise `mix.device` is assumed. + When `device` is different from `mix.device`, only local computations will + be on `device`, while the entire tracks will be stored on `mix.device`. + """ + + global fut_length + global bag_num + global prog_bar + + if device is None: + device = mix.device + else: + device = th.device(device) + if pool is None: + if num_workers > 0 and device.type == "cpu": + pool = ThreadPoolExecutor(num_workers) + else: + pool = DummyPoolExecutor() + + kwargs = { + "shifts": shifts, + "split": split, + "overlap": overlap, + "transition_power": transition_power, + "progress": progress, + "device": device, + "pool": pool, + "set_progress_bar": set_progress_bar, + "static_shifts": static_shifts, + } + + if isinstance(model, BagOfModels): + # Special treatment for bag of model. + # We explicitely apply multiple times `apply_model` so that the random shifts + # are different for each model. + + estimates = 0 + totals = [0] * len(model.sources) + bag_num = len(model.models) + fut_length = 0 + prog_bar = 0 + current_model = 0 # (bag_num + 1) + for sub_model, weight in zip(model.models, model.weights): + original_model_device = next(iter(sub_model.parameters())).device + sub_model.to(device) + fut_length += fut_length + current_model += 1 + out = apply_model(sub_model, mix, **kwargs) + sub_model.to(original_model_device) + for k, inst_weight in enumerate(weight): + out[:, k, :, :] *= inst_weight + totals[k] += inst_weight + estimates += out + del out + + for k in range(estimates.shape[1]): + estimates[:, k, :, :] /= totals[k] + return estimates + + model.to(device) + model.eval() + assert transition_power >= 1, "transition_power < 1 leads to weird behavior." + batch, channels, length = mix.shape + + if shifts: + kwargs["shifts"] = 0 + max_shift = int(0.5 * model.samplerate) + mix = tensor_chunk(mix) + padded_mix = mix.padded(length + 2 * max_shift) + out = 0 + for _ in range(shifts): + offset = random.randint(0, max_shift) + shifted = TensorChunk(padded_mix, offset, length + max_shift - offset) + shifted_out = apply_model(model, shifted, **kwargs) + out += shifted_out[..., max_shift - offset :] + out /= shifts + return out + elif split: + kwargs["split"] = False + out = th.zeros(batch, len(model.sources), channels, length, device=mix.device) + sum_weight = th.zeros(length, device=mix.device) + segment = int(model.samplerate * model.segment) + stride = int((1 - overlap) * segment) + offsets = range(0, length, stride) + scale = float(format(stride / model.samplerate, ".2f")) + # We start from a triangle shaped weight, with maximal weight in the middle + # of the segment. Then we normalize and take to the power `transition_power`. + # Large values of transition power will lead to sharper transitions. + weight = th.cat([th.arange(1, segment // 2 + 1, device=device), th.arange(segment - segment // 2, 0, -1, device=device)]) + assert len(weight) == segment + # If the overlap < 50%, this will translate to linear transition when + # transition_power is 1. + weight = (weight / weight.max()) ** transition_power + futures = [] + for offset in offsets: + chunk = TensorChunk(mix, offset, segment) + future = pool.submit(apply_model, model, chunk, **kwargs) + futures.append((future, offset)) + offset += segment + if progress: + futures = tqdm.tqdm(futures) + for future, offset in futures: + if set_progress_bar: + fut_length = len(futures) * bag_num * static_shifts + prog_bar += 1 + set_progress_bar(0.1, (0.8 / fut_length * prog_bar)) + chunk_out = future.result() + chunk_length = chunk_out.shape[-1] + out[..., offset : offset + segment] += (weight[:chunk_length] * chunk_out).to(mix.device) + sum_weight[offset : offset + segment] += weight[:chunk_length].to(mix.device) + assert sum_weight.min() > 0 + out /= sum_weight + return out + else: + if hasattr(model, "valid_length"): + valid_length = model.valid_length(length) + else: + valid_length = length + mix = tensor_chunk(mix) + padded_mix = mix.padded(valid_length).to(device) + with th.no_grad(): + out = model(padded_mix) + return center_trim(out, length) + + +def demucs_segments(demucs_segment, demucs_model): + + if demucs_segment == "Default": + segment = None + if isinstance(demucs_model, BagOfModels): + if segment is not None: + for sub in demucs_model.models: + sub.segment = segment + else: + if segment is not None: + sub.segment = segment + else: + try: + segment = int(demucs_segment) + if isinstance(demucs_model, BagOfModels): + if segment is not None: + for sub in demucs_model.models: + sub.segment = segment + else: + if segment is not None: + sub.segment = segment + except: + segment = None + if isinstance(demucs_model, BagOfModels): + if segment is not None: + for sub in demucs_model.models: + sub.segment = segment + else: + if segment is not None: + sub.segment = segment + + return demucs_model diff --git a/audio_separator/separator/uvr_lib_v5/demucs/demucs.py b/audio_separator/separator/uvr_lib_v5/demucs/demucs.py new file mode 100644 index 0000000000000000000000000000000000000000..f34f75d5a60856c42f9baddfda545c4e8e3c16f5 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/demucs.py @@ -0,0 +1,453 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import math +import typing as tp + +import julius +import torch +from torch import nn +from torch.nn import functional as F + +from .states import capture_init +from .utils import center_trim, unfold + + +class BLSTM(nn.Module): + """ + BiLSTM with same hidden units as input dim. + If `max_steps` is not None, input will be splitting in overlapping + chunks and the LSTM applied separately on each chunk. + """ + + def __init__(self, dim, layers=1, max_steps=None, skip=False): + super().__init__() + assert max_steps is None or max_steps % 4 == 0 + self.max_steps = max_steps + self.lstm = nn.LSTM(bidirectional=True, num_layers=layers, hidden_size=dim, input_size=dim) + self.linear = nn.Linear(2 * dim, dim) + self.skip = skip + + def forward(self, x): + B, C, T = x.shape + y = x + framed = False + if self.max_steps is not None and T > self.max_steps: + width = self.max_steps + stride = width // 2 + frames = unfold(x, width, stride) + nframes = frames.shape[2] + framed = True + x = frames.permute(0, 2, 1, 3).reshape(-1, C, width) + + x = x.permute(2, 0, 1) + + x = self.lstm(x)[0] + x = self.linear(x) + x = x.permute(1, 2, 0) + if framed: + out = [] + frames = x.reshape(B, -1, C, width) + limit = stride // 2 + for k in range(nframes): + if k == 0: + out.append(frames[:, k, :, :-limit]) + elif k == nframes - 1: + out.append(frames[:, k, :, limit:]) + else: + out.append(frames[:, k, :, limit:-limit]) + out = torch.cat(out, -1) + out = out[..., :T] + x = out + if self.skip: + x = x + y + return x + + +def rescale_conv(conv, reference): + """Rescale initial weight scale. It is unclear why it helps but it certainly does.""" + std = conv.weight.std().detach() + scale = (std / reference) ** 0.5 + conv.weight.data /= scale + if conv.bias is not None: + conv.bias.data /= scale + + +def rescale_module(module, reference): + for sub in module.modules(): + if isinstance(sub, (nn.Conv1d, nn.ConvTranspose1d, nn.Conv2d, nn.ConvTranspose2d)): + rescale_conv(sub, reference) + + +class LayerScale(nn.Module): + """Layer scale from [Touvron et al 2021] (https://arxiv.org/pdf/2103.17239.pdf). + This rescales diagonaly residual outputs close to 0 initially, then learnt. + """ + + def __init__(self, channels: int, init: float = 0): + super().__init__() + self.scale = nn.Parameter(torch.zeros(channels, requires_grad=True)) + self.scale.data[:] = init + + def forward(self, x): + return self.scale[:, None] * x + + +class DConv(nn.Module): + """ + New residual branches in each encoder layer. + This alternates dilated convolutions, potentially with LSTMs and attention. + Also before entering each residual branch, dimension is projected on a smaller subspace, + e.g. of dim `channels // compress`. + """ + + def __init__(self, channels: int, compress: float = 4, depth: int = 2, init: float = 1e-4, norm=True, attn=False, heads=4, ndecay=4, lstm=False, gelu=True, kernel=3, dilate=True): + """ + Args: + channels: input/output channels for residual branch. + compress: amount of channel compression inside the branch. + depth: number of layers in the residual branch. Each layer has its own + projection, and potentially LSTM and attention. + init: initial scale for LayerNorm. + norm: use GroupNorm. + attn: use LocalAttention. + heads: number of heads for the LocalAttention. + ndecay: number of decay controls in the LocalAttention. + lstm: use LSTM. + gelu: Use GELU activation. + kernel: kernel size for the (dilated) convolutions. + dilate: if true, use dilation, increasing with the depth. + """ + + super().__init__() + assert kernel % 2 == 1 + self.channels = channels + self.compress = compress + self.depth = abs(depth) + dilate = depth > 0 + + norm_fn: tp.Callable[[int], nn.Module] + norm_fn = lambda d: nn.Identity() # noqa + if norm: + norm_fn = lambda d: nn.GroupNorm(1, d) # noqa + + hidden = int(channels / compress) + + act: tp.Type[nn.Module] + if gelu: + act = nn.GELU + else: + act = nn.ReLU + + self.layers = nn.ModuleList([]) + for d in range(self.depth): + dilation = 2**d if dilate else 1 + padding = dilation * (kernel // 2) + mods = [ + nn.Conv1d(channels, hidden, kernel, dilation=dilation, padding=padding), + norm_fn(hidden), + act(), + nn.Conv1d(hidden, 2 * channels, 1), + norm_fn(2 * channels), + nn.GLU(1), + LayerScale(channels, init), + ] + if attn: + mods.insert(3, LocalState(hidden, heads=heads, ndecay=ndecay)) + if lstm: + mods.insert(3, BLSTM(hidden, layers=2, max_steps=200, skip=True)) + layer = nn.Sequential(*mods) + self.layers.append(layer) + + def forward(self, x): + for layer in self.layers: + x = x + layer(x) + return x + + +class LocalState(nn.Module): + """Local state allows to have attention based only on data (no positional embedding), + but while setting a constraint on the time window (e.g. decaying penalty term). + + Also a failed experiments with trying to provide some frequency based attention. + """ + + def __init__(self, channels: int, heads: int = 4, nfreqs: int = 0, ndecay: int = 4): + super().__init__() + assert channels % heads == 0, (channels, heads) + self.heads = heads + self.nfreqs = nfreqs + self.ndecay = ndecay + self.content = nn.Conv1d(channels, channels, 1) + self.query = nn.Conv1d(channels, channels, 1) + self.key = nn.Conv1d(channels, channels, 1) + if nfreqs: + self.query_freqs = nn.Conv1d(channels, heads * nfreqs, 1) + if ndecay: + self.query_decay = nn.Conv1d(channels, heads * ndecay, 1) + # Initialize decay close to zero (there is a sigmoid), for maximum initial window. + self.query_decay.weight.data *= 0.01 + assert self.query_decay.bias is not None # stupid type checker + self.query_decay.bias.data[:] = -2 + self.proj = nn.Conv1d(channels + heads * nfreqs, channels, 1) + + def forward(self, x): + B, C, T = x.shape + heads = self.heads + indexes = torch.arange(T, device=x.device, dtype=x.dtype) + # left index are keys, right index are queries + delta = indexes[:, None] - indexes[None, :] + + queries = self.query(x).view(B, heads, -1, T) + keys = self.key(x).view(B, heads, -1, T) + # t are keys, s are queries + dots = torch.einsum("bhct,bhcs->bhts", keys, queries) + dots /= keys.shape[2] ** 0.5 + if self.nfreqs: + periods = torch.arange(1, self.nfreqs + 1, device=x.device, dtype=x.dtype) + freq_kernel = torch.cos(2 * math.pi * delta / periods.view(-1, 1, 1)) + freq_q = self.query_freqs(x).view(B, heads, -1, T) / self.nfreqs**0.5 + dots += torch.einsum("fts,bhfs->bhts", freq_kernel, freq_q) + if self.ndecay: + decays = torch.arange(1, self.ndecay + 1, device=x.device, dtype=x.dtype) + decay_q = self.query_decay(x).view(B, heads, -1, T) + decay_q = torch.sigmoid(decay_q) / 2 + decay_kernel = -decays.view(-1, 1, 1) * delta.abs() / self.ndecay**0.5 + dots += torch.einsum("fts,bhfs->bhts", decay_kernel, decay_q) + + # Kill self reference. + dots.masked_fill_(torch.eye(T, device=dots.device, dtype=torch.bool), -100) + weights = torch.softmax(dots, dim=2) + + content = self.content(x).view(B, heads, -1, T) + result = torch.einsum("bhts,bhct->bhcs", weights, content) + if self.nfreqs: + time_sig = torch.einsum("bhts,fts->bhfs", weights, freq_kernel) + result = torch.cat([result, time_sig], 2) + result = result.reshape(B, -1, T) + return x + self.proj(result) + + +class Demucs(nn.Module): + @capture_init + def __init__( + self, + sources, + # Channels + audio_channels=2, + channels=64, + growth=2.0, + # Main structure + depth=6, + rewrite=True, + lstm_layers=0, + # Convolutions + kernel_size=8, + stride=4, + context=1, + # Activations + gelu=True, + glu=True, + # Normalization + norm_starts=4, + norm_groups=4, + # DConv residual branch + dconv_mode=1, + dconv_depth=2, + dconv_comp=4, + dconv_attn=4, + dconv_lstm=4, + dconv_init=1e-4, + # Pre/post processing + normalize=True, + resample=True, + # Weight init + rescale=0.1, + # Metadata + samplerate=44100, + segment=4 * 10, + ): + """ + Args: + sources (list[str]): list of source names + audio_channels (int): stereo or mono + channels (int): first convolution channels + depth (int): number of encoder/decoder layers + growth (float): multiply (resp divide) number of channels by that + for each layer of the encoder (resp decoder) + depth (int): number of layers in the encoder and in the decoder. + rewrite (bool): add 1x1 convolution to each layer. + lstm_layers (int): number of lstm layers, 0 = no lstm. Deactivated + by default, as this is now replaced by the smaller and faster small LSTMs + in the DConv branches. + kernel_size (int): kernel size for convolutions + stride (int): stride for convolutions + context (int): kernel size of the convolution in the + decoder before the transposed convolution. If > 1, + will provide some context from neighboring time steps. + gelu: use GELU activation function. + glu (bool): use glu instead of ReLU for the 1x1 rewrite conv. + norm_starts: layer at which group norm starts being used. + decoder layers are numbered in reverse order. + norm_groups: number of groups for group norm. + dconv_mode: if 1: dconv in encoder only, 2: decoder only, 3: both. + dconv_depth: depth of residual DConv branch. + dconv_comp: compression of DConv branch. + dconv_attn: adds attention layers in DConv branch starting at this layer. + dconv_lstm: adds a LSTM layer in DConv branch starting at this layer. + dconv_init: initial scale for the DConv branch LayerScale. + normalize (bool): normalizes the input audio on the fly, and scales back + the output by the same amount. + resample (bool): upsample x2 the input and downsample /2 the output. + rescale (int): rescale initial weights of convolutions + to get their standard deviation closer to `rescale`. + samplerate (int): stored as meta information for easing + future evaluations of the model. + segment (float): duration of the chunks of audio to ideally evaluate the model on. + This is used by `demucs.apply.apply_model`. + """ + + super().__init__() + self.audio_channels = audio_channels + self.sources = sources + self.kernel_size = kernel_size + self.context = context + self.stride = stride + self.depth = depth + self.resample = resample + self.channels = channels + self.normalize = normalize + self.samplerate = samplerate + self.segment = segment + self.encoder = nn.ModuleList() + self.decoder = nn.ModuleList() + self.skip_scales = nn.ModuleList() + + if glu: + activation = nn.GLU(dim=1) + ch_scale = 2 + else: + activation = nn.ReLU() + ch_scale = 1 + if gelu: + act2 = nn.GELU + else: + act2 = nn.ReLU + + in_channels = audio_channels + padding = 0 + for index in range(depth): + norm_fn = lambda d: nn.Identity() # noqa + if index >= norm_starts: + norm_fn = lambda d: nn.GroupNorm(norm_groups, d) # noqa + + encode = [] + encode += [nn.Conv1d(in_channels, channels, kernel_size, stride), norm_fn(channels), act2()] + attn = index >= dconv_attn + lstm = index >= dconv_lstm + if dconv_mode & 1: + encode += [DConv(channels, depth=dconv_depth, init=dconv_init, compress=dconv_comp, attn=attn, lstm=lstm)] + if rewrite: + encode += [nn.Conv1d(channels, ch_scale * channels, 1), norm_fn(ch_scale * channels), activation] + self.encoder.append(nn.Sequential(*encode)) + + decode = [] + if index > 0: + out_channels = in_channels + else: + out_channels = len(self.sources) * audio_channels + if rewrite: + decode += [nn.Conv1d(channels, ch_scale * channels, 2 * context + 1, padding=context), norm_fn(ch_scale * channels), activation] + if dconv_mode & 2: + decode += [DConv(channels, depth=dconv_depth, init=dconv_init, compress=dconv_comp, attn=attn, lstm=lstm)] + decode += [nn.ConvTranspose1d(channels, out_channels, kernel_size, stride, padding=padding)] + if index > 0: + decode += [norm_fn(out_channels), act2()] + self.decoder.insert(0, nn.Sequential(*decode)) + in_channels = channels + channels = int(growth * channels) + + channels = in_channels + if lstm_layers: + self.lstm = BLSTM(channels, lstm_layers) + else: + self.lstm = None + + if rescale: + rescale_module(self, reference=rescale) + + def valid_length(self, length): + """ + Return the nearest valid length to use with the model so that + there is no time steps left over in a convolution, e.g. for all + layers, size of the input - kernel_size % stride = 0. + + Note that input are automatically padded if necessary to ensure that the output + has the same length as the input. + """ + if self.resample: + length *= 2 + + for _ in range(self.depth): + length = math.ceil((length - self.kernel_size) / self.stride) + 1 + length = max(1, length) + + for idx in range(self.depth): + length = (length - 1) * self.stride + self.kernel_size + + if self.resample: + length = math.ceil(length / 2) + return int(length) + + def forward(self, mix): + x = mix + length = x.shape[-1] + + if self.normalize: + mono = mix.mean(dim=1, keepdim=True) + mean = mono.mean(dim=-1, keepdim=True) + std = mono.std(dim=-1, keepdim=True) + x = (x - mean) / (1e-5 + std) + else: + mean = 0 + std = 1 + + delta = self.valid_length(length) - length + x = F.pad(x, (delta // 2, delta - delta // 2)) + + if self.resample: + x = julius.resample_frac(x, 1, 2) + + saved = [] + for encode in self.encoder: + x = encode(x) + saved.append(x) + + if self.lstm: + x = self.lstm(x) + + for decode in self.decoder: + skip = saved.pop(-1) + skip = center_trim(skip, x) + x = decode(x + skip) + + if self.resample: + x = julius.resample_frac(x, 2, 1) + x = x * std + mean + x = center_trim(x, length) + x = x.view(x.size(0), len(self.sources), self.audio_channels, x.size(-1)) + return x + + def load_state_dict(self, state, strict=True): + # fix a mismatch with previous generation Demucs models. + for idx in range(self.depth): + for a in ["encoder", "decoder"]: + for b in ["bias", "weight"]: + new = f"{a}.{idx}.3.{b}" + old = f"{a}.{idx}.2.{b}" + if old in state and new not in state: + state[new] = state.pop(old) + super().load_state_dict(state, strict=strict) diff --git a/audio_separator/separator/uvr_lib_v5/demucs/filtering.py b/audio_separator/separator/uvr_lib_v5/demucs/filtering.py new file mode 100644 index 0000000000000000000000000000000000000000..9ddec82d3da4df39da68a6dc4c60332f69d3f31b --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/filtering.py @@ -0,0 +1,451 @@ +from typing import Optional +import torch +import torch.nn as nn +from torch import Tensor +from torch.utils.data import DataLoader + + +def atan2(y, x): + r"""Element-wise arctangent function of y/x. + Returns a new tensor with signed angles in radians. + It is an alternative implementation of torch.atan2 + + Args: + y (Tensor): First input tensor + x (Tensor): Second input tensor [shape=y.shape] + + Returns: + Tensor: [shape=y.shape]. + """ + pi = 2 * torch.asin(torch.tensor(1.0)) + x += ((x == 0) & (y == 0)) * 1.0 + out = torch.atan(y / x) + out += ((y >= 0) & (x < 0)) * pi + out -= ((y < 0) & (x < 0)) * pi + out *= 1 - ((y > 0) & (x == 0)) * 1.0 + out += ((y > 0) & (x == 0)) * (pi / 2) + out *= 1 - ((y < 0) & (x == 0)) * 1.0 + out += ((y < 0) & (x == 0)) * (-pi / 2) + return out + + +# Define basic complex operations on torch.Tensor objects whose last dimension +# consists in the concatenation of the real and imaginary parts. + + +def _norm(x: torch.Tensor) -> torch.Tensor: + r"""Computes the norm value of a torch Tensor, assuming that it + comes as real and imaginary part in its last dimension. + + Args: + x (Tensor): Input Tensor of shape [shape=(..., 2)] + + Returns: + Tensor: shape as x excluding the last dimension. + """ + return torch.abs(x[..., 0]) ** 2 + torch.abs(x[..., 1]) ** 2 + + +def _mul_add(a: torch.Tensor, b: torch.Tensor, out: Optional[torch.Tensor] = None) -> torch.Tensor: + """Element-wise multiplication of two complex Tensors described + through their real and imaginary parts. + The result is added to the `out` tensor""" + + # check `out` and allocate it if needed + target_shape = torch.Size([max(sa, sb) for (sa, sb) in zip(a.shape, b.shape)]) + if out is None or out.shape != target_shape: + out = torch.zeros(target_shape, dtype=a.dtype, device=a.device) + if out is a: + real_a = a[..., 0] + out[..., 0] = out[..., 0] + (real_a * b[..., 0] - a[..., 1] * b[..., 1]) + out[..., 1] = out[..., 1] + (real_a * b[..., 1] + a[..., 1] * b[..., 0]) + else: + out[..., 0] = out[..., 0] + (a[..., 0] * b[..., 0] - a[..., 1] * b[..., 1]) + out[..., 1] = out[..., 1] + (a[..., 0] * b[..., 1] + a[..., 1] * b[..., 0]) + return out + + +def _mul(a: torch.Tensor, b: torch.Tensor, out: Optional[torch.Tensor] = None) -> torch.Tensor: + """Element-wise multiplication of two complex Tensors described + through their real and imaginary parts + can work in place in case out is a only""" + target_shape = torch.Size([max(sa, sb) for (sa, sb) in zip(a.shape, b.shape)]) + if out is None or out.shape != target_shape: + out = torch.zeros(target_shape, dtype=a.dtype, device=a.device) + if out is a: + real_a = a[..., 0] + out[..., 0] = real_a * b[..., 0] - a[..., 1] * b[..., 1] + out[..., 1] = real_a * b[..., 1] + a[..., 1] * b[..., 0] + else: + out[..., 0] = a[..., 0] * b[..., 0] - a[..., 1] * b[..., 1] + out[..., 1] = a[..., 0] * b[..., 1] + a[..., 1] * b[..., 0] + return out + + +def _inv(z: torch.Tensor, out: Optional[torch.Tensor] = None) -> torch.Tensor: + """Element-wise multiplicative inverse of a Tensor with complex + entries described through their real and imaginary parts. + can work in place in case out is z""" + ez = _norm(z) + if out is None or out.shape != z.shape: + out = torch.zeros_like(z) + out[..., 0] = z[..., 0] / ez + out[..., 1] = -z[..., 1] / ez + return out + + +def _conj(z, out: Optional[torch.Tensor] = None) -> torch.Tensor: + """Element-wise complex conjugate of a Tensor with complex entries + described through their real and imaginary parts. + can work in place in case out is z""" + if out is None or out.shape != z.shape: + out = torch.zeros_like(z) + out[..., 0] = z[..., 0] + out[..., 1] = -z[..., 1] + return out + + +def _invert(M: torch.Tensor, out: Optional[torch.Tensor] = None) -> torch.Tensor: + """ + Invert 1x1 or 2x2 matrices + + Will generate errors if the matrices are singular: user must handle this + through his own regularization schemes. + + Args: + M (Tensor): [shape=(..., nb_channels, nb_channels, 2)] + matrices to invert: must be square along dimensions -3 and -2 + + Returns: + invM (Tensor): [shape=M.shape] + inverses of M + """ + nb_channels = M.shape[-2] + + if out is None or out.shape != M.shape: + out = torch.empty_like(M) + + if nb_channels == 1: + # scalar case + out = _inv(M, out) + elif nb_channels == 2: + # two channels case: analytical expression + + # first compute the determinent + det = _mul(M[..., 0, 0, :], M[..., 1, 1, :]) + det = det - _mul(M[..., 0, 1, :], M[..., 1, 0, :]) + # invert it + invDet = _inv(det) + + # then fill out the matrix with the inverse + out[..., 0, 0, :] = _mul(invDet, M[..., 1, 1, :], out[..., 0, 0, :]) + out[..., 1, 0, :] = _mul(-invDet, M[..., 1, 0, :], out[..., 1, 0, :]) + out[..., 0, 1, :] = _mul(-invDet, M[..., 0, 1, :], out[..., 0, 1, :]) + out[..., 1, 1, :] = _mul(invDet, M[..., 0, 0, :], out[..., 1, 1, :]) + else: + raise Exception("Only 2 channels are supported for the torch version.") + return out + + +# Now define the signal-processing low-level functions used by the Separator + + +def expectation_maximization(y: torch.Tensor, x: torch.Tensor, iterations: int = 2, eps: float = 1e-10, batch_size: int = 200): + r"""Expectation maximization algorithm, for refining source separation + estimates. + + This algorithm allows to make source separation results better by + enforcing multichannel consistency for the estimates. This usually means + a better perceptual quality in terms of spatial artifacts. + + The implementation follows the details presented in [1]_, taking + inspiration from the original EM algorithm proposed in [2]_ and its + weighted refinement proposed in [3]_, [4]_. + It works by iteratively: + + * Re-estimate source parameters (power spectral densities and spatial + covariance matrices) through :func:`get_local_gaussian_model`. + + * Separate again the mixture with the new parameters by first computing + the new modelled mixture covariance matrices with :func:`get_mix_model`, + prepare the Wiener filters through :func:`wiener_gain` and apply them + with :func:`apply_filter``. + + References + ---------- + .. [1] S. Uhlich and M. Porcu and F. Giron and M. Enenkl and T. Kemp and + N. Takahashi and Y. Mitsufuji, "Improving music source separation based + on deep neural networks through data augmentation and network + blending." 2017 IEEE International Conference on Acoustics, Speech + and Signal Processing (ICASSP). IEEE, 2017. + + .. [2] N.Q. Duong and E. Vincent and R.Gribonval. "Under-determined + reverberant audio source separation using a full-rank spatial + covariance model." IEEE Transactions on Audio, Speech, and Language + Processing 18.7 (2010): 1830-1840. + + .. [3] A. Nugraha and A. Liutkus and E. Vincent. "Multichannel audio source + separation with deep neural networks." IEEE/ACM Transactions on Audio, + Speech, and Language Processing 24.9 (2016): 1652-1664. + + .. [4] A. Nugraha and A. Liutkus and E. Vincent. "Multichannel music + separation with deep neural networks." 2016 24th European Signal + Processing Conference (EUSIPCO). IEEE, 2016. + + .. [5] A. Liutkus and R. Badeau and G. Richard "Kernel additive models for + source separation." IEEE Transactions on Signal Processing + 62.16 (2014): 4298-4310. + + Args: + y (Tensor): [shape=(nb_frames, nb_bins, nb_channels, 2, nb_sources)] + initial estimates for the sources + x (Tensor): [shape=(nb_frames, nb_bins, nb_channels, 2)] + complex STFT of the mixture signal + iterations (int): [scalar] + number of iterations for the EM algorithm. + eps (float or None): [scalar] + The epsilon value to use for regularization and filters. + + Returns: + y (Tensor): [shape=(nb_frames, nb_bins, nb_channels, 2, nb_sources)] + estimated sources after iterations + v (Tensor): [shape=(nb_frames, nb_bins, nb_sources)] + estimated power spectral densities + R (Tensor): [shape=(nb_bins, nb_channels, nb_channels, 2, nb_sources)] + estimated spatial covariance matrices + + Notes: + * You need an initial estimate for the sources to apply this + algorithm. This is precisely what the :func:`wiener` function does. + * This algorithm *is not* an implementation of the "exact" EM + proposed in [1]_. In particular, it does compute the posterior + covariance matrices the same (exact) way. Instead, it uses the + simplified approximate scheme initially proposed in [5]_ and further + refined in [3]_, [4]_, that boils down to just take the empirical + covariance of the recent source estimates, followed by a weighted + average for the update of the spatial covariance matrix. It has been + empirically demonstrated that this simplified algorithm is more + robust for music separation. + + Warning: + It is *very* important to make sure `x.dtype` is `torch.float64` + if you want double precision, because this function will **not** + do such conversion for you from `torch.complex32`, in case you want the + smaller RAM usage on purpose. + + It is usually always better in terms of quality to have double + precision, by e.g. calling :func:`expectation_maximization` + with ``x.to(torch.float64)``. + """ + # dimensions + (nb_frames, nb_bins, nb_channels) = x.shape[:-1] + nb_sources = y.shape[-1] + + regularization = torch.cat((torch.eye(nb_channels, dtype=x.dtype, device=x.device)[..., None], torch.zeros((nb_channels, nb_channels, 1), dtype=x.dtype, device=x.device)), dim=2) + regularization = torch.sqrt(torch.as_tensor(eps)) * (regularization[None, None, ...].expand((-1, nb_bins, -1, -1, -1))) + + # allocate the spatial covariance matrices + R = [torch.zeros((nb_bins, nb_channels, nb_channels, 2), dtype=x.dtype, device=x.device) for j in range(nb_sources)] + weight: torch.Tensor = torch.zeros((nb_bins,), dtype=x.dtype, device=x.device) + + v: torch.Tensor = torch.zeros((nb_frames, nb_bins, nb_sources), dtype=x.dtype, device=x.device) + for it in range(iterations): + # constructing the mixture covariance matrix. Doing it with a loop + # to avoid storing anytime in RAM the whole 6D tensor + + # update the PSD as the average spectrogram over channels + v = torch.mean(torch.abs(y[..., 0, :]) ** 2 + torch.abs(y[..., 1, :]) ** 2, dim=-2) + + # update spatial covariance matrices (weighted update) + for j in range(nb_sources): + R[j] = torch.tensor(0.0, device=x.device) + weight = torch.tensor(eps, device=x.device) + pos: int = 0 + batch_size = batch_size if batch_size else nb_frames + while pos < nb_frames: + t = torch.arange(pos, min(nb_frames, pos + batch_size)) + pos = int(t[-1]) + 1 + + R[j] = R[j] + torch.sum(_covariance(y[t, ..., j]), dim=0) + weight = weight + torch.sum(v[t, ..., j], dim=0) + R[j] = R[j] / weight[..., None, None, None] + weight = torch.zeros_like(weight) + + # cloning y if we track gradient, because we're going to update it + if y.requires_grad: + y = y.clone() + + pos = 0 + while pos < nb_frames: + t = torch.arange(pos, min(nb_frames, pos + batch_size)) + pos = int(t[-1]) + 1 + + y[t, ...] = torch.tensor(0.0, device=x.device, dtype=x.dtype) + + # compute mix covariance matrix + Cxx = regularization + for j in range(nb_sources): + Cxx = Cxx + (v[t, ..., j, None, None, None] * R[j][None, ...].clone()) + + # invert it + inv_Cxx = _invert(Cxx) + + # separate the sources + for j in range(nb_sources): + + # create a wiener gain for this source + gain = torch.zeros_like(inv_Cxx) + + # computes multichannel Wiener gain as v_j R_j inv_Cxx + indices = torch.cartesian_prod(torch.arange(nb_channels), torch.arange(nb_channels), torch.arange(nb_channels)) + for index in indices: + gain[:, :, index[0], index[1], :] = _mul_add(R[j][None, :, index[0], index[2], :].clone(), inv_Cxx[:, :, index[2], index[1], :], gain[:, :, index[0], index[1], :]) + gain = gain * v[t, ..., None, None, None, j] + + # apply it to the mixture + for i in range(nb_channels): + y[t, ..., j] = _mul_add(gain[..., i, :], x[t, ..., i, None, :], y[t, ..., j]) + + return y, v, R + + +def wiener(targets_spectrograms: torch.Tensor, mix_stft: torch.Tensor, iterations: int = 1, softmask: bool = False, residual: bool = False, scale_factor: float = 10.0, eps: float = 1e-10): + """Wiener-based separation for multichannel audio. + + The method uses the (possibly multichannel) spectrograms of the + sources to separate the (complex) Short Term Fourier Transform of the + mix. Separation is done in a sequential way by: + + * Getting an initial estimate. This can be done in two ways: either by + directly using the spectrograms with the mixture phase, or + by using a softmasking strategy. This initial phase is controlled + by the `softmask` flag. + + * If required, adding an additional residual target as the mix minus + all targets. + + * Refinining these initial estimates through a call to + :func:`expectation_maximization` if the number of iterations is nonzero. + + This implementation also allows to specify the epsilon value used for + regularization. It is based on [1]_, [2]_, [3]_, [4]_. + + References + ---------- + .. [1] S. Uhlich and M. Porcu and F. Giron and M. Enenkl and T. Kemp and + N. Takahashi and Y. Mitsufuji, "Improving music source separation based + on deep neural networks through data augmentation and network + blending." 2017 IEEE International Conference on Acoustics, Speech + and Signal Processing (ICASSP). IEEE, 2017. + + .. [2] A. Nugraha and A. Liutkus and E. Vincent. "Multichannel audio source + separation with deep neural networks." IEEE/ACM Transactions on Audio, + Speech, and Language Processing 24.9 (2016): 1652-1664. + + .. [3] A. Nugraha and A. Liutkus and E. Vincent. "Multichannel music + separation with deep neural networks." 2016 24th European Signal + Processing Conference (EUSIPCO). IEEE, 2016. + + .. [4] A. Liutkus and R. Badeau and G. Richard "Kernel additive models for + source separation." IEEE Transactions on Signal Processing + 62.16 (2014): 4298-4310. + + Args: + targets_spectrograms (Tensor): spectrograms of the sources + [shape=(nb_frames, nb_bins, nb_channels, nb_sources)]. + This is a nonnegative tensor that is + usually the output of the actual separation method of the user. The + spectrograms may be mono, but they need to be 4-dimensional in all + cases. + mix_stft (Tensor): [shape=(nb_frames, nb_bins, nb_channels, complex=2)] + STFT of the mixture signal. + iterations (int): [scalar] + number of iterations for the EM algorithm + softmask (bool): Describes how the initial estimates are obtained. + * if `False`, then the mixture phase will directly be used with the + spectrogram as initial estimates. + * if `True`, initial estimates are obtained by multiplying the + complex mix element-wise with the ratio of each target spectrogram + with the sum of them all. This strategy is better if the model are + not really good, and worse otherwise. + residual (bool): if `True`, an additional target is created, which is + equal to the mixture minus the other targets, before application of + expectation maximization + eps (float): Epsilon value to use for computing the separations. + This is used whenever division with a model energy is + performed, i.e. when softmasking and when iterating the EM. + It can be understood as the energy of the additional white noise + that is taken out when separating. + + Returns: + Tensor: shape=(nb_frames, nb_bins, nb_channels, complex=2, nb_sources) + STFT of estimated sources + + Notes: + * Be careful that you need *magnitude spectrogram estimates* for the + case `softmask==False`. + * `softmask=False` is recommended + * The epsilon value will have a huge impact on performance. If it's + large, only the parts of the signal with a significant energy will + be kept in the sources. This epsilon then directly controls the + energy of the reconstruction error. + + Warning: + As in :func:`expectation_maximization`, we recommend converting the + mixture `x` to double precision `torch.float64` *before* calling + :func:`wiener`. + """ + if softmask: + # if we use softmask, we compute the ratio mask for all targets and + # multiply by the mix stft + y = mix_stft[..., None] * (targets_spectrograms / (eps + torch.sum(targets_spectrograms, dim=-1, keepdim=True).to(mix_stft.dtype)))[..., None, :] + else: + # otherwise, we just multiply the targets spectrograms with mix phase + # we tacitly assume that we have magnitude estimates. + angle = atan2(mix_stft[..., 1], mix_stft[..., 0])[..., None] + nb_sources = targets_spectrograms.shape[-1] + y = torch.zeros(mix_stft.shape + (nb_sources,), dtype=mix_stft.dtype, device=mix_stft.device) + y[..., 0, :] = targets_spectrograms * torch.cos(angle) + y[..., 1, :] = targets_spectrograms * torch.sin(angle) + + if residual: + # if required, adding an additional target as the mix minus + # available targets + y = torch.cat([y, mix_stft[..., None] - y.sum(dim=-1, keepdim=True)], dim=-1) + + if iterations == 0: + return y + + # we need to refine the estimates. Scales down the estimates for + # numerical stability + max_abs = torch.max(torch.as_tensor(1.0, dtype=mix_stft.dtype, device=mix_stft.device), torch.sqrt(_norm(mix_stft)).max() / scale_factor) + + mix_stft = mix_stft / max_abs + y = y / max_abs + + # call expectation maximization + y = expectation_maximization(y, mix_stft, iterations, eps=eps)[0] + + # scale estimates up again + y = y * max_abs + return y + + +def _covariance(y_j): + """ + Compute the empirical covariance for a source. + + Args: + y_j (Tensor): complex stft of the source. + [shape=(nb_frames, nb_bins, nb_channels, 2)]. + + Returns: + Cj (Tensor): [shape=(nb_frames, nb_bins, nb_channels, nb_channels, 2)] + just y_j * conj(y_j.T): empirical covariance for each TF bin. + """ + (nb_frames, nb_bins, nb_channels) = y_j.shape[:-1] + Cj = torch.zeros((nb_frames, nb_bins, nb_channels, nb_channels, 2), dtype=y_j.dtype, device=y_j.device) + indices = torch.cartesian_prod(torch.arange(nb_channels), torch.arange(nb_channels)) + for index in indices: + Cj[:, :, index[0], index[1], :] = _mul_add(y_j[:, :, index[0], :], _conj(y_j[:, :, index[1], :]), Cj[:, :, index[0], index[1], :]) + return Cj diff --git a/audio_separator/separator/uvr_lib_v5/demucs/hdemucs.py b/audio_separator/separator/uvr_lib_v5/demucs/hdemucs.py new file mode 100644 index 0000000000000000000000000000000000000000..9e299d47d5c567ca95e037270701e05b97aeaaf6 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/hdemucs.py @@ -0,0 +1,783 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +""" +This code contains the spectrogram and Hybrid version of Demucs. +""" +from copy import deepcopy +import math +import typing as tp +import torch +from torch import nn +from torch.nn import functional as F +from .filtering import wiener +from .demucs import DConv, rescale_module +from .states import capture_init +from .spec import spectro, ispectro + + +def pad1d(x: torch.Tensor, paddings: tp.Tuple[int, int], mode: str = "constant", value: float = 0.0): + """Tiny wrapper around F.pad, just to allow for reflect padding on small input. + If this is the case, we insert extra 0 padding to the right before the reflection happen.""" + x0 = x + length = x.shape[-1] + padding_left, padding_right = paddings + if mode == "reflect": + max_pad = max(padding_left, padding_right) + if length <= max_pad: + extra_pad = max_pad - length + 1 + extra_pad_right = min(padding_right, extra_pad) + extra_pad_left = extra_pad - extra_pad_right + paddings = (padding_left - extra_pad_left, padding_right - extra_pad_right) + x = F.pad(x, (extra_pad_left, extra_pad_right)) + out = F.pad(x, paddings, mode, value) + assert out.shape[-1] == length + padding_left + padding_right + assert (out[..., padding_left : padding_left + length] == x0).all() + return out + + +class ScaledEmbedding(nn.Module): + """ + Boost learning rate for embeddings (with `scale`). + Also, can make embeddings continuous with `smooth`. + """ + + def __init__(self, num_embeddings: int, embedding_dim: int, scale: float = 10.0, smooth=False): + super().__init__() + self.embedding = nn.Embedding(num_embeddings, embedding_dim) + if smooth: + weight = torch.cumsum(self.embedding.weight.data, dim=0) + # when summing gaussian, overscale raises as sqrt(n), so we nornalize by that. + weight = weight / torch.arange(1, num_embeddings + 1).to(weight).sqrt()[:, None] + self.embedding.weight.data[:] = weight + self.embedding.weight.data /= scale + self.scale = scale + + @property + def weight(self): + return self.embedding.weight * self.scale + + def forward(self, x): + out = self.embedding(x) * self.scale + return out + + +class HEncLayer(nn.Module): + def __init__(self, chin, chout, kernel_size=8, stride=4, norm_groups=1, empty=False, freq=True, dconv=True, norm=True, context=0, dconv_kw={}, pad=True, rewrite=True): + """Encoder layer. This used both by the time and the frequency branch. + + Args: + chin: number of input channels. + chout: number of output channels. + norm_groups: number of groups for group norm. + empty: used to make a layer with just the first conv. this is used + before merging the time and freq. branches. + freq: this is acting on frequencies. + dconv: insert DConv residual branches. + norm: use GroupNorm. + context: context size for the 1x1 conv. + dconv_kw: list of kwargs for the DConv class. + pad: pad the input. Padding is done so that the output size is + always the input size / stride. + rewrite: add 1x1 conv at the end of the layer. + """ + super().__init__() + norm_fn = lambda d: nn.Identity() # noqa + if norm: + norm_fn = lambda d: nn.GroupNorm(norm_groups, d) # noqa + if pad: + pad = kernel_size // 4 + else: + pad = 0 + klass = nn.Conv1d + self.freq = freq + self.kernel_size = kernel_size + self.stride = stride + self.empty = empty + self.norm = norm + self.pad = pad + if freq: + kernel_size = [kernel_size, 1] + stride = [stride, 1] + pad = [pad, 0] + klass = nn.Conv2d + self.conv = klass(chin, chout, kernel_size, stride, pad) + if self.empty: + return + self.norm1 = norm_fn(chout) + self.rewrite = None + if rewrite: + self.rewrite = klass(chout, 2 * chout, 1 + 2 * context, 1, context) + self.norm2 = norm_fn(2 * chout) + + self.dconv = None + if dconv: + self.dconv = DConv(chout, **dconv_kw) + + def forward(self, x, inject=None): + """ + `inject` is used to inject the result from the time branch into the frequency branch, + when both have the same stride. + """ + if not self.freq and x.dim() == 4: + B, C, Fr, T = x.shape + x = x.view(B, -1, T) + + if not self.freq: + le = x.shape[-1] + if not le % self.stride == 0: + x = F.pad(x, (0, self.stride - (le % self.stride))) + y = self.conv(x) + if self.empty: + return y + if inject is not None: + assert inject.shape[-1] == y.shape[-1], (inject.shape, y.shape) + if inject.dim() == 3 and y.dim() == 4: + inject = inject[:, :, None] + y = y + inject + y = F.gelu(self.norm1(y)) + if self.dconv: + if self.freq: + B, C, Fr, T = y.shape + y = y.permute(0, 2, 1, 3).reshape(-1, C, T) + y = self.dconv(y) + if self.freq: + y = y.view(B, Fr, C, T).permute(0, 2, 1, 3) + if self.rewrite: + z = self.norm2(self.rewrite(y)) + z = F.glu(z, dim=1) + else: + z = y + return z + + +class MultiWrap(nn.Module): + """ + Takes one layer and replicate it N times. each replica will act + on a frequency band. All is done so that if the N replica have the same weights, + then this is exactly equivalent to applying the original module on all frequencies. + + This is a bit over-engineered to avoid edge artifacts when splitting + the frequency bands, but it is possible the naive implementation would work as well... + """ + + def __init__(self, layer, split_ratios): + """ + Args: + layer: module to clone, must be either HEncLayer or HDecLayer. + split_ratios: list of float indicating which ratio to keep for each band. + """ + super().__init__() + self.split_ratios = split_ratios + self.layers = nn.ModuleList() + self.conv = isinstance(layer, HEncLayer) + assert not layer.norm + assert layer.freq + assert layer.pad + if not self.conv: + assert not layer.context_freq + for k in range(len(split_ratios) + 1): + lay = deepcopy(layer) + if self.conv: + lay.conv.padding = (0, 0) + else: + lay.pad = False + for m in lay.modules(): + if hasattr(m, "reset_parameters"): + m.reset_parameters() + self.layers.append(lay) + + def forward(self, x, skip=None, length=None): + B, C, Fr, T = x.shape + + ratios = list(self.split_ratios) + [1] + start = 0 + outs = [] + for ratio, layer in zip(ratios, self.layers): + if self.conv: + pad = layer.kernel_size // 4 + if ratio == 1: + limit = Fr + frames = -1 + else: + limit = int(round(Fr * ratio)) + le = limit - start + if start == 0: + le += pad + frames = round((le - layer.kernel_size) / layer.stride + 1) + limit = start + (frames - 1) * layer.stride + layer.kernel_size + if start == 0: + limit -= pad + assert limit - start > 0, (limit, start) + assert limit <= Fr, (limit, Fr) + y = x[:, :, start:limit, :] + if start == 0: + y = F.pad(y, (0, 0, pad, 0)) + if ratio == 1: + y = F.pad(y, (0, 0, 0, pad)) + outs.append(layer(y)) + start = limit - layer.kernel_size + layer.stride + else: + if ratio == 1: + limit = Fr + else: + limit = int(round(Fr * ratio)) + last = layer.last + layer.last = True + + y = x[:, :, start:limit] + s = skip[:, :, start:limit] + out, _ = layer(y, s, None) + if outs: + outs[-1][:, :, -layer.stride :] += out[:, :, : layer.stride] - layer.conv_tr.bias.view(1, -1, 1, 1) + out = out[:, :, layer.stride :] + if ratio == 1: + out = out[:, :, : -layer.stride // 2, :] + if start == 0: + out = out[:, :, layer.stride // 2 :, :] + outs.append(out) + layer.last = last + start = limit + out = torch.cat(outs, dim=2) + if not self.conv and not last: + out = F.gelu(out) + if self.conv: + return out + else: + return out, None + + +class HDecLayer(nn.Module): + def __init__( + self, chin, chout, last=False, kernel_size=8, stride=4, norm_groups=1, empty=False, freq=True, dconv=True, norm=True, context=1, dconv_kw={}, pad=True, context_freq=True, rewrite=True + ): + """ + Same as HEncLayer but for decoder. See `HEncLayer` for documentation. + """ + super().__init__() + norm_fn = lambda d: nn.Identity() # noqa + if norm: + norm_fn = lambda d: nn.GroupNorm(norm_groups, d) # noqa + if pad: + pad = kernel_size // 4 + else: + pad = 0 + self.pad = pad + self.last = last + self.freq = freq + self.chin = chin + self.empty = empty + self.stride = stride + self.kernel_size = kernel_size + self.norm = norm + self.context_freq = context_freq + klass = nn.Conv1d + klass_tr = nn.ConvTranspose1d + if freq: + kernel_size = [kernel_size, 1] + stride = [stride, 1] + klass = nn.Conv2d + klass_tr = nn.ConvTranspose2d + self.conv_tr = klass_tr(chin, chout, kernel_size, stride) + self.norm2 = norm_fn(chout) + if self.empty: + return + self.rewrite = None + if rewrite: + if context_freq: + self.rewrite = klass(chin, 2 * chin, 1 + 2 * context, 1, context) + else: + self.rewrite = klass(chin, 2 * chin, [1, 1 + 2 * context], 1, [0, context]) + self.norm1 = norm_fn(2 * chin) + + self.dconv = None + if dconv: + self.dconv = DConv(chin, **dconv_kw) + + def forward(self, x, skip, length): + if self.freq and x.dim() == 3: + B, C, T = x.shape + x = x.view(B, self.chin, -1, T) + + if not self.empty: + x = x + skip + + if self.rewrite: + y = F.glu(self.norm1(self.rewrite(x)), dim=1) + else: + y = x + if self.dconv: + if self.freq: + B, C, Fr, T = y.shape + y = y.permute(0, 2, 1, 3).reshape(-1, C, T) + y = self.dconv(y) + if self.freq: + y = y.view(B, Fr, C, T).permute(0, 2, 1, 3) + else: + y = x + assert skip is None + z = self.norm2(self.conv_tr(y)) + if self.freq: + if self.pad: + z = z[..., self.pad : -self.pad, :] + else: + z = z[..., self.pad : self.pad + length] + assert z.shape[-1] == length, (z.shape[-1], length) + if not self.last: + z = F.gelu(z) + return z, y + + +class HDemucs(nn.Module): + """ + Spectrogram and hybrid Demucs model. + The spectrogram model has the same structure as Demucs, except the first few layers are over the + frequency axis, until there is only 1 frequency, and then it moves to time convolutions. + Frequency layers can still access information across time steps thanks to the DConv residual. + + Hybrid model have a parallel time branch. At some layer, the time branch has the same stride + as the frequency branch and then the two are combined. The opposite happens in the decoder. + + Models can either use naive iSTFT from masking, Wiener filtering ([Ulhih et al. 2017]), + or complex as channels (CaC) [Choi et al. 2020]. Wiener filtering is based on + Open Unmix implementation [Stoter et al. 2019]. + + The loss is always on the temporal domain, by backpropagating through the above + output methods and iSTFT. This allows to define hybrid models nicely. However, this breaks + a bit Wiener filtering, as doing more iteration at test time will change the spectrogram + contribution, without changing the one from the waveform, which will lead to worse performance. + I tried using the residual option in OpenUnmix Wiener implementation, but it didn't improve. + CaC on the other hand provides similar performance for hybrid, and works naturally with + hybrid models. + + This model also uses frequency embeddings are used to improve efficiency on convolutions + over the freq. axis, following [Isik et al. 2020] (https://arxiv.org/pdf/2008.04470.pdf). + + Unlike classic Demucs, there is no resampling here, and normalization is always applied. + """ + + @capture_init + def __init__( + self, + sources, + # Channels + audio_channels=2, + channels=48, + channels_time=None, + growth=2, + # STFT + nfft=4096, + wiener_iters=0, + end_iters=0, + wiener_residual=False, + cac=True, + # Main structure + depth=6, + rewrite=True, + hybrid=True, + hybrid_old=False, + # Frequency branch + multi_freqs=None, + multi_freqs_depth=2, + freq_emb=0.2, + emb_scale=10, + emb_smooth=True, + # Convolutions + kernel_size=8, + time_stride=2, + stride=4, + context=1, + context_enc=0, + # Normalization + norm_starts=4, + norm_groups=4, + # DConv residual branch + dconv_mode=1, + dconv_depth=2, + dconv_comp=4, + dconv_attn=4, + dconv_lstm=4, + dconv_init=1e-4, + # Weight init + rescale=0.1, + # Metadata + samplerate=44100, + segment=4 * 10, + ): + """ + Args: + sources (list[str]): list of source names. + audio_channels (int): input/output audio channels. + channels (int): initial number of hidden channels. + channels_time: if not None, use a different `channels` value for the time branch. + growth: increase the number of hidden channels by this factor at each layer. + nfft: number of fft bins. Note that changing this require careful computation of + various shape parameters and will not work out of the box for hybrid models. + wiener_iters: when using Wiener filtering, number of iterations at test time. + end_iters: same but at train time. For a hybrid model, must be equal to `wiener_iters`. + wiener_residual: add residual source before wiener filtering. + cac: uses complex as channels, i.e. complex numbers are 2 channels each + in input and output. no further processing is done before ISTFT. + depth (int): number of layers in the encoder and in the decoder. + rewrite (bool): add 1x1 convolution to each layer. + hybrid (bool): make a hybrid time/frequency domain, otherwise frequency only. + hybrid_old: some models trained for MDX had a padding bug. This replicates + this bug to avoid retraining them. + multi_freqs: list of frequency ratios for splitting frequency bands with `MultiWrap`. + multi_freqs_depth: how many layers to wrap with `MultiWrap`. Only the outermost + layers will be wrapped. + freq_emb: add frequency embedding after the first frequency layer if > 0, + the actual value controls the weight of the embedding. + emb_scale: equivalent to scaling the embedding learning rate + emb_smooth: initialize the embedding with a smooth one (with respect to frequencies). + kernel_size: kernel_size for encoder and decoder layers. + stride: stride for encoder and decoder layers. + time_stride: stride for the final time layer, after the merge. + context: context for 1x1 conv in the decoder. + context_enc: context for 1x1 conv in the encoder. + norm_starts: layer at which group norm starts being used. + decoder layers are numbered in reverse order. + norm_groups: number of groups for group norm. + dconv_mode: if 1: dconv in encoder only, 2: decoder only, 3: both. + dconv_depth: depth of residual DConv branch. + dconv_comp: compression of DConv branch. + dconv_attn: adds attention layers in DConv branch starting at this layer. + dconv_lstm: adds a LSTM layer in DConv branch starting at this layer. + dconv_init: initial scale for the DConv branch LayerScale. + rescale: weight recaling trick + + """ + super().__init__() + + self.cac = cac + self.wiener_residual = wiener_residual + self.audio_channels = audio_channels + self.sources = sources + self.kernel_size = kernel_size + self.context = context + self.stride = stride + self.depth = depth + self.channels = channels + self.samplerate = samplerate + self.segment = segment + + self.nfft = nfft + self.hop_length = nfft // 4 + self.wiener_iters = wiener_iters + self.end_iters = end_iters + self.freq_emb = None + self.hybrid = hybrid + self.hybrid_old = hybrid_old + if hybrid_old: + assert hybrid, "hybrid_old must come with hybrid=True" + if hybrid: + assert wiener_iters == end_iters + + self.encoder = nn.ModuleList() + self.decoder = nn.ModuleList() + + if hybrid: + self.tencoder = nn.ModuleList() + self.tdecoder = nn.ModuleList() + + chin = audio_channels + chin_z = chin # number of channels for the freq branch + if self.cac: + chin_z *= 2 + chout = channels_time or channels + chout_z = channels + freqs = nfft // 2 + + for index in range(depth): + lstm = index >= dconv_lstm + attn = index >= dconv_attn + norm = index >= norm_starts + freq = freqs > 1 + stri = stride + ker = kernel_size + if not freq: + assert freqs == 1 + ker = time_stride * 2 + stri = time_stride + + pad = True + last_freq = False + if freq and freqs <= kernel_size: + ker = freqs + pad = False + last_freq = True + + kw = { + "kernel_size": ker, + "stride": stri, + "freq": freq, + "pad": pad, + "norm": norm, + "rewrite": rewrite, + "norm_groups": norm_groups, + "dconv_kw": {"lstm": lstm, "attn": attn, "depth": dconv_depth, "compress": dconv_comp, "init": dconv_init, "gelu": True}, + } + kwt = dict(kw) + kwt["freq"] = 0 + kwt["kernel_size"] = kernel_size + kwt["stride"] = stride + kwt["pad"] = True + kw_dec = dict(kw) + multi = False + if multi_freqs and index < multi_freqs_depth: + multi = True + kw_dec["context_freq"] = False + + if last_freq: + chout_z = max(chout, chout_z) + chout = chout_z + + enc = HEncLayer(chin_z, chout_z, dconv=dconv_mode & 1, context=context_enc, **kw) + if hybrid and freq: + tenc = HEncLayer(chin, chout, dconv=dconv_mode & 1, context=context_enc, empty=last_freq, **kwt) + self.tencoder.append(tenc) + + if multi: + enc = MultiWrap(enc, multi_freqs) + self.encoder.append(enc) + if index == 0: + chin = self.audio_channels * len(self.sources) + chin_z = chin + if self.cac: + chin_z *= 2 + dec = HDecLayer(chout_z, chin_z, dconv=dconv_mode & 2, last=index == 0, context=context, **kw_dec) + if multi: + dec = MultiWrap(dec, multi_freqs) + if hybrid and freq: + tdec = HDecLayer(chout, chin, dconv=dconv_mode & 2, empty=last_freq, last=index == 0, context=context, **kwt) + self.tdecoder.insert(0, tdec) + self.decoder.insert(0, dec) + + chin = chout + chin_z = chout_z + chout = int(growth * chout) + chout_z = int(growth * chout_z) + if freq: + if freqs <= kernel_size: + freqs = 1 + else: + freqs //= stride + if index == 0 and freq_emb: + self.freq_emb = ScaledEmbedding(freqs, chin_z, smooth=emb_smooth, scale=emb_scale) + self.freq_emb_scale = freq_emb + + if rescale: + rescale_module(self, reference=rescale) + + def _spec(self, x): + hl = self.hop_length + nfft = self.nfft + x0 = x # noqa + + if self.hybrid: + # We re-pad the signal in order to keep the property + # that the size of the output is exactly the size of the input + # divided by the stride (here hop_length), when divisible. + # This is achieved by padding by 1/4th of the kernel size (here nfft). + # which is not supported by torch.stft. + # Having all convolution operations follow this convention allow to easily + # align the time and frequency branches later on. + assert hl == nfft // 4 + le = int(math.ceil(x.shape[-1] / hl)) + pad = hl // 2 * 3 + if not self.hybrid_old: + x = pad1d(x, (pad, pad + le * hl - x.shape[-1]), mode="reflect") + else: + x = pad1d(x, (pad, pad + le * hl - x.shape[-1])) + + z = spectro(x, nfft, hl)[..., :-1, :] + if self.hybrid: + assert z.shape[-1] == le + 4, (z.shape, x.shape, le) + z = z[..., 2 : 2 + le] + return z + + def _ispec(self, z, length=None, scale=0): + hl = self.hop_length // (4**scale) + z = F.pad(z, (0, 0, 0, 1)) + if self.hybrid: + z = F.pad(z, (2, 2)) + pad = hl // 2 * 3 + if not self.hybrid_old: + le = hl * int(math.ceil(length / hl)) + 2 * pad + else: + le = hl * int(math.ceil(length / hl)) + x = ispectro(z, hl, length=le) + if not self.hybrid_old: + x = x[..., pad : pad + length] + else: + x = x[..., :length] + else: + x = ispectro(z, hl, length) + return x + + def _magnitude(self, z): + # return the magnitude of the spectrogram, except when cac is True, + # in which case we just move the complex dimension to the channel one. + if self.cac: + B, C, Fr, T = z.shape + m = torch.view_as_real(z).permute(0, 1, 4, 2, 3) + m = m.reshape(B, C * 2, Fr, T) + else: + m = z.abs() + return m + + def _mask(self, z, m): + # Apply masking given the mixture spectrogram `z` and the estimated mask `m`. + # If `cac` is True, `m` is actually a full spectrogram and `z` is ignored. + niters = self.wiener_iters + if self.cac: + B, S, C, Fr, T = m.shape + out = m.view(B, S, -1, 2, Fr, T).permute(0, 1, 2, 4, 5, 3) + out = torch.view_as_complex(out.contiguous()) + return out + if self.training: + niters = self.end_iters + if niters < 0: + z = z[:, None] + return z / (1e-8 + z.abs()) * m + else: + return self._wiener(m, z, niters) + + def _wiener(self, mag_out, mix_stft, niters): + # apply wiener filtering from OpenUnmix. + init = mix_stft.dtype + wiener_win_len = 300 + residual = self.wiener_residual + + B, S, C, Fq, T = mag_out.shape + mag_out = mag_out.permute(0, 4, 3, 2, 1) + mix_stft = torch.view_as_real(mix_stft.permute(0, 3, 2, 1)) + + outs = [] + for sample in range(B): + pos = 0 + out = [] + for pos in range(0, T, wiener_win_len): + frame = slice(pos, pos + wiener_win_len) + z_out = wiener(mag_out[sample, frame], mix_stft[sample, frame], niters, residual=residual) + out.append(z_out.transpose(-1, -2)) + outs.append(torch.cat(out, dim=0)) + out = torch.view_as_complex(torch.stack(outs, 0)) + out = out.permute(0, 4, 3, 2, 1).contiguous() + if residual: + out = out[:, :-1] + assert list(out.shape) == [B, S, C, Fq, T] + return out.to(init) + + def forward(self, mix): + x = mix + length = x.shape[-1] + + z = self._spec(mix) + mag = self._magnitude(z).to(mix.device) + x = mag + + B, C, Fq, T = x.shape + + # unlike previous Demucs, we always normalize because it is easier. + mean = x.mean(dim=(1, 2, 3), keepdim=True) + std = x.std(dim=(1, 2, 3), keepdim=True) + x = (x - mean) / (1e-5 + std) + # x will be the freq. branch input. + + if self.hybrid: + # Prepare the time branch input. + xt = mix + meant = xt.mean(dim=(1, 2), keepdim=True) + stdt = xt.std(dim=(1, 2), keepdim=True) + xt = (xt - meant) / (1e-5 + stdt) + + # okay, this is a giant mess I know... + saved = [] # skip connections, freq. + saved_t = [] # skip connections, time. + lengths = [] # saved lengths to properly remove padding, freq branch. + lengths_t = [] # saved lengths for time branch. + for idx, encode in enumerate(self.encoder): + lengths.append(x.shape[-1]) + inject = None + if self.hybrid and idx < len(self.tencoder): + # we have not yet merged branches. + lengths_t.append(xt.shape[-1]) + tenc = self.tencoder[idx] + xt = tenc(xt) + if not tenc.empty: + # save for skip connection + saved_t.append(xt) + else: + # tenc contains just the first conv., so that now time and freq. + # branches have the same shape and can be merged. + inject = xt + x = encode(x, inject) + if idx == 0 and self.freq_emb is not None: + # add frequency embedding to allow for non equivariant convolutions + # over the frequency axis. + frs = torch.arange(x.shape[-2], device=x.device) + emb = self.freq_emb(frs).t()[None, :, :, None].expand_as(x) + x = x + self.freq_emb_scale * emb + + saved.append(x) + + x = torch.zeros_like(x) + if self.hybrid: + xt = torch.zeros_like(x) + # initialize everything to zero (signal will go through u-net skips). + + for idx, decode in enumerate(self.decoder): + skip = saved.pop(-1) + x, pre = decode(x, skip, lengths.pop(-1)) + # `pre` contains the output just before final transposed convolution, + # which is used when the freq. and time branch separate. + + if self.hybrid: + offset = self.depth - len(self.tdecoder) + if self.hybrid and idx >= offset: + tdec = self.tdecoder[idx - offset] + length_t = lengths_t.pop(-1) + if tdec.empty: + assert pre.shape[2] == 1, pre.shape + pre = pre[:, :, 0] + xt, _ = tdec(pre, None, length_t) + else: + skip = saved_t.pop(-1) + xt, _ = tdec(xt, skip, length_t) + + # Let's make sure we used all stored skip connections. + assert len(saved) == 0 + assert len(lengths_t) == 0 + assert len(saved_t) == 0 + + S = len(self.sources) + x = x.view(B, S, -1, Fq, T) + x = x * std[:, None] + mean[:, None] + + # to cpu as non-cuda GPUs don't support complex numbers + # demucs issue #435 ##432 + # NOTE: in this case z already is on cpu + # TODO: remove this when mps supports complex numbers + + device_type = x.device.type + device_load = f"{device_type}:{x.device.index}" if not device_type == "mps" else device_type + x_is_other_gpu = not device_type in ["cuda", "cpu"] + + if x_is_other_gpu: + x = x.cpu() + + zout = self._mask(z, x) + x = self._ispec(zout, length) + + # back to other device + if x_is_other_gpu: + x = x.to(device_load) + + if self.hybrid: + xt = xt.view(B, S, -1, length) + xt = xt * stdt[:, None] + meant[:, None] + x = xt + x + return x diff --git a/audio_separator/separator/uvr_lib_v5/demucs/htdemucs.py b/audio_separator/separator/uvr_lib_v5/demucs/htdemucs.py new file mode 100644 index 0000000000000000000000000000000000000000..f3d7a2732a94d52ec189d92bc4d035c42522eebe --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/htdemucs.py @@ -0,0 +1,620 @@ +# Copyright (c) Meta, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# First author is Simon Rouard. +""" +This code contains the spectrogram and Hybrid version of Demucs. +""" +import math + +from .filtering import wiener +import torch +from torch import nn +from torch.nn import functional as F +from fractions import Fraction +from einops import rearrange + +from .transformer import CrossTransformerEncoder + +from .demucs import rescale_module +from .states import capture_init +from .spec import spectro, ispectro +from .hdemucs import pad1d, ScaledEmbedding, HEncLayer, MultiWrap, HDecLayer + + +class HTDemucs(nn.Module): + """ + Spectrogram and hybrid Demucs model. + The spectrogram model has the same structure as Demucs, except the first few layers are over the + frequency axis, until there is only 1 frequency, and then it moves to time convolutions. + Frequency layers can still access information across time steps thanks to the DConv residual. + + Hybrid model have a parallel time branch. At some layer, the time branch has the same stride + as the frequency branch and then the two are combined. The opposite happens in the decoder. + + Models can either use naive iSTFT from masking, Wiener filtering ([Ulhih et al. 2017]), + or complex as channels (CaC) [Choi et al. 2020]. Wiener filtering is based on + Open Unmix implementation [Stoter et al. 2019]. + + The loss is always on the temporal domain, by backpropagating through the above + output methods and iSTFT. This allows to define hybrid models nicely. However, this breaks + a bit Wiener filtering, as doing more iteration at test time will change the spectrogram + contribution, without changing the one from the waveform, which will lead to worse performance. + I tried using the residual option in OpenUnmix Wiener implementation, but it didn't improve. + CaC on the other hand provides similar performance for hybrid, and works naturally with + hybrid models. + + This model also uses frequency embeddings are used to improve efficiency on convolutions + over the freq. axis, following [Isik et al. 2020] (https://arxiv.org/pdf/2008.04470.pdf). + + Unlike classic Demucs, there is no resampling here, and normalization is always applied. + """ + + @capture_init + def __init__( + self, + sources, + # Channels + audio_channels=2, + channels=48, + channels_time=None, + growth=2, + # STFT + nfft=4096, + wiener_iters=0, + end_iters=0, + wiener_residual=False, + cac=True, + # Main structure + depth=4, + rewrite=True, + # Frequency branch + multi_freqs=None, + multi_freqs_depth=3, + freq_emb=0.2, + emb_scale=10, + emb_smooth=True, + # Convolutions + kernel_size=8, + time_stride=2, + stride=4, + context=1, + context_enc=0, + # Normalization + norm_starts=4, + norm_groups=4, + # DConv residual branch + dconv_mode=1, + dconv_depth=2, + dconv_comp=8, + dconv_init=1e-3, + # Before the Transformer + bottom_channels=0, + # Transformer + t_layers=5, + t_emb="sin", + t_hidden_scale=4.0, + t_heads=8, + t_dropout=0.0, + t_max_positions=10000, + t_norm_in=True, + t_norm_in_group=False, + t_group_norm=False, + t_norm_first=True, + t_norm_out=True, + t_max_period=10000.0, + t_weight_decay=0.0, + t_lr=None, + t_layer_scale=True, + t_gelu=True, + t_weight_pos_embed=1.0, + t_sin_random_shift=0, + t_cape_mean_normalize=True, + t_cape_augment=True, + t_cape_glob_loc_scale=[5000.0, 1.0, 1.4], + t_sparse_self_attn=False, + t_sparse_cross_attn=False, + t_mask_type="diag", + t_mask_random_seed=42, + t_sparse_attn_window=500, + t_global_window=100, + t_sparsity=0.95, + t_auto_sparsity=False, + # ------ Particuliar parameters + t_cross_first=False, + # Weight init + rescale=0.1, + # Metadata + samplerate=44100, + segment=10, + use_train_segment=True, + ): + """ + Args: + sources (list[str]): list of source names. + audio_channels (int): input/output audio channels. + channels (int): initial number of hidden channels. + channels_time: if not None, use a different `channels` value for the time branch. + growth: increase the number of hidden channels by this factor at each layer. + nfft: number of fft bins. Note that changing this require careful computation of + various shape parameters and will not work out of the box for hybrid models. + wiener_iters: when using Wiener filtering, number of iterations at test time. + end_iters: same but at train time. For a hybrid model, must be equal to `wiener_iters`. + wiener_residual: add residual source before wiener filtering. + cac: uses complex as channels, i.e. complex numbers are 2 channels each + in input and output. no further processing is done before ISTFT. + depth (int): number of layers in the encoder and in the decoder. + rewrite (bool): add 1x1 convolution to each layer. + multi_freqs: list of frequency ratios for splitting frequency bands with `MultiWrap`. + multi_freqs_depth: how many layers to wrap with `MultiWrap`. Only the outermost + layers will be wrapped. + freq_emb: add frequency embedding after the first frequency layer if > 0, + the actual value controls the weight of the embedding. + emb_scale: equivalent to scaling the embedding learning rate + emb_smooth: initialize the embedding with a smooth one (with respect to frequencies). + kernel_size: kernel_size for encoder and decoder layers. + stride: stride for encoder and decoder layers. + time_stride: stride for the final time layer, after the merge. + context: context for 1x1 conv in the decoder. + context_enc: context for 1x1 conv in the encoder. + norm_starts: layer at which group norm starts being used. + decoder layers are numbered in reverse order. + norm_groups: number of groups for group norm. + dconv_mode: if 1: dconv in encoder only, 2: decoder only, 3: both. + dconv_depth: depth of residual DConv branch. + dconv_comp: compression of DConv branch. + dconv_attn: adds attention layers in DConv branch starting at this layer. + dconv_lstm: adds a LSTM layer in DConv branch starting at this layer. + dconv_init: initial scale for the DConv branch LayerScale. + bottom_channels: if >0 it adds a linear layer (1x1 Conv) before and after the + transformer in order to change the number of channels + t_layers: number of layers in each branch (waveform and spec) of the transformer + t_emb: "sin", "cape" or "scaled" + t_hidden_scale: the hidden scale of the Feedforward parts of the transformer + for instance if C = 384 (the number of channels in the transformer) and + t_hidden_scale = 4.0 then the intermediate layer of the FFN has dimension + 384 * 4 = 1536 + t_heads: number of heads for the transformer + t_dropout: dropout in the transformer + t_max_positions: max_positions for the "scaled" positional embedding, only + useful if t_emb="scaled" + t_norm_in: (bool) norm before addinf positional embedding and getting into the + transformer layers + t_norm_in_group: (bool) if True while t_norm_in=True, the norm is on all the + timesteps (GroupNorm with group=1) + t_group_norm: (bool) if True, the norms of the Encoder Layers are on all the + timesteps (GroupNorm with group=1) + t_norm_first: (bool) if True the norm is before the attention and before the FFN + t_norm_out: (bool) if True, there is a GroupNorm (group=1) at the end of each layer + t_max_period: (float) denominator in the sinusoidal embedding expression + t_weight_decay: (float) weight decay for the transformer + t_lr: (float) specific learning rate for the transformer + t_layer_scale: (bool) Layer Scale for the transformer + t_gelu: (bool) activations of the transformer are GeLU if True, ReLU else + t_weight_pos_embed: (float) weighting of the positional embedding + t_cape_mean_normalize: (bool) if t_emb="cape", normalisation of positional embeddings + see: https://arxiv.org/abs/2106.03143 + t_cape_augment: (bool) if t_emb="cape", must be True during training and False + during the inference, see: https://arxiv.org/abs/2106.03143 + t_cape_glob_loc_scale: (list of 3 floats) if t_emb="cape", CAPE parameters + see: https://arxiv.org/abs/2106.03143 + t_sparse_self_attn: (bool) if True, the self attentions are sparse + t_sparse_cross_attn: (bool) if True, the cross-attentions are sparse (don't use it + unless you designed really specific masks) + t_mask_type: (str) can be "diag", "jmask", "random", "global" or any combination + with '_' between: i.e. "diag_jmask_random" (note that this is permutation + invariant i.e. "diag_jmask_random" is equivalent to "jmask_random_diag") + t_mask_random_seed: (int) if "random" is in t_mask_type, controls the seed + that generated the random part of the mask + t_sparse_attn_window: (int) if "diag" is in t_mask_type, for a query (i), and + a key (j), the mask is True id |i-j|<=t_sparse_attn_window + t_global_window: (int) if "global" is in t_mask_type, mask[:t_global_window, :] + and mask[:, :t_global_window] will be True + t_sparsity: (float) if "random" is in t_mask_type, t_sparsity is the sparsity + level of the random part of the mask. + t_cross_first: (bool) if True cross attention is the first layer of the + transformer (False seems to be better) + rescale: weight rescaling trick + use_train_segment: (bool) if True, the actual size that is used during the + training is used during inference. + """ + super().__init__() + self.cac = cac + self.wiener_residual = wiener_residual + self.audio_channels = audio_channels + self.sources = sources + self.kernel_size = kernel_size + self.context = context + self.stride = stride + self.depth = depth + self.bottom_channels = bottom_channels + self.channels = channels + self.samplerate = samplerate + self.segment = segment + self.use_train_segment = use_train_segment + self.nfft = nfft + self.hop_length = nfft // 4 + self.wiener_iters = wiener_iters + self.end_iters = end_iters + self.freq_emb = None + assert wiener_iters == end_iters + + self.encoder = nn.ModuleList() + self.decoder = nn.ModuleList() + + self.tencoder = nn.ModuleList() + self.tdecoder = nn.ModuleList() + + chin = audio_channels + chin_z = chin # number of channels for the freq branch + if self.cac: + chin_z *= 2 + chout = channels_time or channels + chout_z = channels + freqs = nfft // 2 + + for index in range(depth): + norm = index >= norm_starts + freq = freqs > 1 + stri = stride + ker = kernel_size + if not freq: + assert freqs == 1 + ker = time_stride * 2 + stri = time_stride + + pad = True + last_freq = False + if freq and freqs <= kernel_size: + ker = freqs + pad = False + last_freq = True + + kw = { + "kernel_size": ker, + "stride": stri, + "freq": freq, + "pad": pad, + "norm": norm, + "rewrite": rewrite, + "norm_groups": norm_groups, + "dconv_kw": {"depth": dconv_depth, "compress": dconv_comp, "init": dconv_init, "gelu": True}, + } + kwt = dict(kw) + kwt["freq"] = 0 + kwt["kernel_size"] = kernel_size + kwt["stride"] = stride + kwt["pad"] = True + kw_dec = dict(kw) + multi = False + if multi_freqs and index < multi_freqs_depth: + multi = True + kw_dec["context_freq"] = False + + if last_freq: + chout_z = max(chout, chout_z) + chout = chout_z + + enc = HEncLayer(chin_z, chout_z, dconv=dconv_mode & 1, context=context_enc, **kw) + if freq: + tenc = HEncLayer(chin, chout, dconv=dconv_mode & 1, context=context_enc, empty=last_freq, **kwt) + self.tencoder.append(tenc) + + if multi: + enc = MultiWrap(enc, multi_freqs) + self.encoder.append(enc) + if index == 0: + chin = self.audio_channels * len(self.sources) + chin_z = chin + if self.cac: + chin_z *= 2 + dec = HDecLayer(chout_z, chin_z, dconv=dconv_mode & 2, last=index == 0, context=context, **kw_dec) + if multi: + dec = MultiWrap(dec, multi_freqs) + if freq: + tdec = HDecLayer(chout, chin, dconv=dconv_mode & 2, empty=last_freq, last=index == 0, context=context, **kwt) + self.tdecoder.insert(0, tdec) + self.decoder.insert(0, dec) + + chin = chout + chin_z = chout_z + chout = int(growth * chout) + chout_z = int(growth * chout_z) + if freq: + if freqs <= kernel_size: + freqs = 1 + else: + freqs //= stride + if index == 0 and freq_emb: + self.freq_emb = ScaledEmbedding(freqs, chin_z, smooth=emb_smooth, scale=emb_scale) + self.freq_emb_scale = freq_emb + + if rescale: + rescale_module(self, reference=rescale) + + transformer_channels = channels * growth ** (depth - 1) + if bottom_channels: + self.channel_upsampler = nn.Conv1d(transformer_channels, bottom_channels, 1) + self.channel_downsampler = nn.Conv1d(bottom_channels, transformer_channels, 1) + self.channel_upsampler_t = nn.Conv1d(transformer_channels, bottom_channels, 1) + self.channel_downsampler_t = nn.Conv1d(bottom_channels, transformer_channels, 1) + + transformer_channels = bottom_channels + + if t_layers > 0: + self.crosstransformer = CrossTransformerEncoder( + dim=transformer_channels, + emb=t_emb, + hidden_scale=t_hidden_scale, + num_heads=t_heads, + num_layers=t_layers, + cross_first=t_cross_first, + dropout=t_dropout, + max_positions=t_max_positions, + norm_in=t_norm_in, + norm_in_group=t_norm_in_group, + group_norm=t_group_norm, + norm_first=t_norm_first, + norm_out=t_norm_out, + max_period=t_max_period, + weight_decay=t_weight_decay, + lr=t_lr, + layer_scale=t_layer_scale, + gelu=t_gelu, + sin_random_shift=t_sin_random_shift, + weight_pos_embed=t_weight_pos_embed, + cape_mean_normalize=t_cape_mean_normalize, + cape_augment=t_cape_augment, + cape_glob_loc_scale=t_cape_glob_loc_scale, + sparse_self_attn=t_sparse_self_attn, + sparse_cross_attn=t_sparse_cross_attn, + mask_type=t_mask_type, + mask_random_seed=t_mask_random_seed, + sparse_attn_window=t_sparse_attn_window, + global_window=t_global_window, + sparsity=t_sparsity, + auto_sparsity=t_auto_sparsity, + ) + else: + self.crosstransformer = None + + def _spec(self, x): + hl = self.hop_length + nfft = self.nfft + x0 = x # noqa + + # We re-pad the signal in order to keep the property + # that the size of the output is exactly the size of the input + # divided by the stride (here hop_length), when divisible. + # This is achieved by padding by 1/4th of the kernel size (here nfft). + # which is not supported by torch.stft. + # Having all convolution operations follow this convention allow to easily + # align the time and frequency branches later on. + assert hl == nfft // 4 + le = int(math.ceil(x.shape[-1] / hl)) + pad = hl // 2 * 3 + x = pad1d(x, (pad, pad + le * hl - x.shape[-1]), mode="reflect") + + z = spectro(x, nfft, hl)[..., :-1, :] + assert z.shape[-1] == le + 4, (z.shape, x.shape, le) + z = z[..., 2 : 2 + le] + return z + + def _ispec(self, z, length=None, scale=0): + hl = self.hop_length // (4**scale) + z = F.pad(z, (0, 0, 0, 1)) + z = F.pad(z, (2, 2)) + pad = hl // 2 * 3 + le = hl * int(math.ceil(length / hl)) + 2 * pad + x = ispectro(z, hl, length=le) + x = x[..., pad : pad + length] + return x + + def _magnitude(self, z): + # return the magnitude of the spectrogram, except when cac is True, + # in which case we just move the complex dimension to the channel one. + if self.cac: + B, C, Fr, T = z.shape + m = torch.view_as_real(z).permute(0, 1, 4, 2, 3) + m = m.reshape(B, C * 2, Fr, T) + else: + m = z.abs() + return m + + def _mask(self, z, m): + # Apply masking given the mixture spectrogram `z` and the estimated mask `m`. + # If `cac` is True, `m` is actually a full spectrogram and `z` is ignored. + niters = self.wiener_iters + if self.cac: + B, S, C, Fr, T = m.shape + out = m.view(B, S, -1, 2, Fr, T).permute(0, 1, 2, 4, 5, 3) + out = torch.view_as_complex(out.contiguous()) + return out + if self.training: + niters = self.end_iters + if niters < 0: + z = z[:, None] + return z / (1e-8 + z.abs()) * m + else: + return self._wiener(m, z, niters) + + def _wiener(self, mag_out, mix_stft, niters): + # apply wiener filtering from OpenUnmix. + init = mix_stft.dtype + wiener_win_len = 300 + residual = self.wiener_residual + + B, S, C, Fq, T = mag_out.shape + mag_out = mag_out.permute(0, 4, 3, 2, 1) + mix_stft = torch.view_as_real(mix_stft.permute(0, 3, 2, 1)) + + outs = [] + for sample in range(B): + pos = 0 + out = [] + for pos in range(0, T, wiener_win_len): + frame = slice(pos, pos + wiener_win_len) + z_out = wiener(mag_out[sample, frame], mix_stft[sample, frame], niters, residual=residual) + out.append(z_out.transpose(-1, -2)) + outs.append(torch.cat(out, dim=0)) + out = torch.view_as_complex(torch.stack(outs, 0)) + out = out.permute(0, 4, 3, 2, 1).contiguous() + if residual: + out = out[:, :-1] + assert list(out.shape) == [B, S, C, Fq, T] + return out.to(init) + + def valid_length(self, length: int): + """ + Return a length that is appropriate for evaluation. + In our case, always return the training length, unless + it is smaller than the given length, in which case this + raises an error. + """ + if not self.use_train_segment: + return length + training_length = int(self.segment * self.samplerate) + if training_length < length: + raise ValueError(f"Given length {length} is longer than " f"training length {training_length}") + return training_length + + def forward(self, mix): + length = mix.shape[-1] + length_pre_pad = None + if self.use_train_segment: + if self.training: + self.segment = Fraction(mix.shape[-1], self.samplerate) + else: + training_length = int(self.segment * self.samplerate) + if mix.shape[-1] < training_length: + length_pre_pad = mix.shape[-1] + mix = F.pad(mix, (0, training_length - length_pre_pad)) + z = self._spec(mix) + mag = self._magnitude(z).to(mix.device) + x = mag + + B, C, Fq, T = x.shape + + # unlike previous Demucs, we always normalize because it is easier. + mean = x.mean(dim=(1, 2, 3), keepdim=True) + std = x.std(dim=(1, 2, 3), keepdim=True) + x = (x - mean) / (1e-5 + std) + # x will be the freq. branch input. + + # Prepare the time branch input. + xt = mix + meant = xt.mean(dim=(1, 2), keepdim=True) + stdt = xt.std(dim=(1, 2), keepdim=True) + xt = (xt - meant) / (1e-5 + stdt) + + # okay, this is a giant mess I know... + saved = [] # skip connections, freq. + saved_t = [] # skip connections, time. + lengths = [] # saved lengths to properly remove padding, freq branch. + lengths_t = [] # saved lengths for time branch. + for idx, encode in enumerate(self.encoder): + lengths.append(x.shape[-1]) + inject = None + if idx < len(self.tencoder): + # we have not yet merged branches. + lengths_t.append(xt.shape[-1]) + tenc = self.tencoder[idx] + xt = tenc(xt) + if not tenc.empty: + # save for skip connection + saved_t.append(xt) + else: + # tenc contains just the first conv., so that now time and freq. + # branches have the same shape and can be merged. + inject = xt + x = encode(x, inject) + if idx == 0 and self.freq_emb is not None: + # add frequency embedding to allow for non equivariant convolutions + # over the frequency axis. + frs = torch.arange(x.shape[-2], device=x.device) + emb = self.freq_emb(frs).t()[None, :, :, None].expand_as(x) + x = x + self.freq_emb_scale * emb + + saved.append(x) + if self.crosstransformer: + if self.bottom_channels: + b, c, f, t = x.shape + x = rearrange(x, "b c f t-> b c (f t)") + x = self.channel_upsampler(x) + x = rearrange(x, "b c (f t)-> b c f t", f=f) + xt = self.channel_upsampler_t(xt) + + x, xt = self.crosstransformer(x, xt) + + if self.bottom_channels: + x = rearrange(x, "b c f t-> b c (f t)") + x = self.channel_downsampler(x) + x = rearrange(x, "b c (f t)-> b c f t", f=f) + xt = self.channel_downsampler_t(xt) + + for idx, decode in enumerate(self.decoder): + skip = saved.pop(-1) + x, pre = decode(x, skip, lengths.pop(-1)) + # `pre` contains the output just before final transposed convolution, + # which is used when the freq. and time branch separate. + + offset = self.depth - len(self.tdecoder) + if idx >= offset: + tdec = self.tdecoder[idx - offset] + length_t = lengths_t.pop(-1) + if tdec.empty: + assert pre.shape[2] == 1, pre.shape + pre = pre[:, :, 0] + xt, _ = tdec(pre, None, length_t) + else: + skip = saved_t.pop(-1) + xt, _ = tdec(xt, skip, length_t) + + # Let's make sure we used all stored skip connections. + assert len(saved) == 0 + assert len(lengths_t) == 0 + assert len(saved_t) == 0 + + S = len(self.sources) + x = x.view(B, S, -1, Fq, T) + x = x * std[:, None] + mean[:, None] + + # to cpu as non-cuda GPUs don't support complex numbers + # demucs issue #435 ##432 + # NOTE: in this case z already is on cpu + # TODO: remove this when mps supports complex numbers + + device_type = x.device.type + device_load = f"{device_type}:{x.device.index}" if not device_type == "mps" else device_type + x_is_other_gpu = not device_type in ["cuda", "cpu"] + + if x_is_other_gpu: + x = x.cpu() + + zout = self._mask(z, x) + if self.use_train_segment: + if self.training: + x = self._ispec(zout, length) + else: + x = self._ispec(zout, training_length) + else: + x = self._ispec(zout, length) + + # back to other device + if x_is_other_gpu: + x = x.to(device_load) + + if self.use_train_segment: + if self.training: + xt = xt.view(B, S, -1, length) + else: + xt = xt.view(B, S, -1, training_length) + else: + xt = xt.view(B, S, -1, length) + xt = xt * stdt[:, None] + meant[:, None] + x = xt + x + if length_pre_pad: + x = x[..., :length_pre_pad] + return x diff --git a/audio_separator/separator/uvr_lib_v5/demucs/model.py b/audio_separator/separator/uvr_lib_v5/demucs/model.py new file mode 100644 index 0000000000000000000000000000000000000000..d9205edfa5802413c954fe850e540559b2ba5d7b --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/model.py @@ -0,0 +1,204 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch as th +from torch import nn + +from .utils import capture_init, center_trim + + +class BLSTM(nn.Module): + def __init__(self, dim, layers=1): + super().__init__() + self.lstm = nn.LSTM(bidirectional=True, num_layers=layers, hidden_size=dim, input_size=dim) + self.linear = nn.Linear(2 * dim, dim) + + def forward(self, x): + x = x.permute(2, 0, 1) + x = self.lstm(x)[0] + x = self.linear(x) + x = x.permute(1, 2, 0) + return x + + +def rescale_conv(conv, reference): + std = conv.weight.std().detach() + scale = (std / reference) ** 0.5 + conv.weight.data /= scale + if conv.bias is not None: + conv.bias.data /= scale + + +def rescale_module(module, reference): + for sub in module.modules(): + if isinstance(sub, (nn.Conv1d, nn.ConvTranspose1d)): + rescale_conv(sub, reference) + + +def upsample(x, stride): + """ + Linear upsampling, the output will be `stride` times longer. + """ + batch, channels, time = x.size() + weight = th.arange(stride, device=x.device, dtype=th.float) / stride + x = x.view(batch, channels, time, 1) + out = x[..., :-1, :] * (1 - weight) + x[..., 1:, :] * weight + return out.reshape(batch, channels, -1) + + +def downsample(x, stride): + """ + Downsample x by decimation. + """ + return x[:, :, ::stride] + + +class Demucs(nn.Module): + @capture_init + def __init__( + self, sources=4, audio_channels=2, channels=64, depth=6, rewrite=True, glu=True, upsample=False, rescale=0.1, kernel_size=8, stride=4, growth=2.0, lstm_layers=2, context=3, samplerate=44100 + ): + """ + Args: + sources (int): number of sources to separate + audio_channels (int): stereo or mono + channels (int): first convolution channels + depth (int): number of encoder/decoder layers + rewrite (bool): add 1x1 convolution to each encoder layer + and a convolution to each decoder layer. + For the decoder layer, `context` gives the kernel size. + glu (bool): use glu instead of ReLU + upsample (bool): use linear upsampling with convolutions + Wave-U-Net style, instead of transposed convolutions + rescale (int): rescale initial weights of convolutions + to get their standard deviation closer to `rescale` + kernel_size (int): kernel size for convolutions + stride (int): stride for convolutions + growth (float): multiply (resp divide) number of channels by that + for each layer of the encoder (resp decoder) + lstm_layers (int): number of lstm layers, 0 = no lstm + context (int): kernel size of the convolution in the + decoder before the transposed convolution. If > 1, + will provide some context from neighboring time + steps. + """ + + super().__init__() + self.audio_channels = audio_channels + self.sources = sources + self.kernel_size = kernel_size + self.context = context + self.stride = stride + self.depth = depth + self.upsample = upsample + self.channels = channels + self.samplerate = samplerate + + self.encoder = nn.ModuleList() + self.decoder = nn.ModuleList() + + self.final = None + if upsample: + self.final = nn.Conv1d(channels + audio_channels, sources * audio_channels, 1) + stride = 1 + + if glu: + activation = nn.GLU(dim=1) + ch_scale = 2 + else: + activation = nn.ReLU() + ch_scale = 1 + in_channels = audio_channels + for index in range(depth): + encode = [] + encode += [nn.Conv1d(in_channels, channels, kernel_size, stride), nn.ReLU()] + if rewrite: + encode += [nn.Conv1d(channels, ch_scale * channels, 1), activation] + self.encoder.append(nn.Sequential(*encode)) + + decode = [] + if index > 0: + out_channels = in_channels + else: + if upsample: + out_channels = channels + else: + out_channels = sources * audio_channels + if rewrite: + decode += [nn.Conv1d(channels, ch_scale * channels, context), activation] + if upsample: + decode += [nn.Conv1d(channels, out_channels, kernel_size, stride=1)] + else: + decode += [nn.ConvTranspose1d(channels, out_channels, kernel_size, stride)] + if index > 0: + decode.append(nn.ReLU()) + self.decoder.insert(0, nn.Sequential(*decode)) + in_channels = channels + channels = int(growth * channels) + + channels = in_channels + + if lstm_layers: + self.lstm = BLSTM(channels, lstm_layers) + else: + self.lstm = None + + if rescale: + rescale_module(self, reference=rescale) + + def valid_length(self, length): + """ + Return the nearest valid length to use with the model so that + there is no time steps left over in a convolutions, e.g. for all + layers, size of the input - kernel_size % stride = 0. + + If the mixture has a valid length, the estimated sources + will have exactly the same length when context = 1. If context > 1, + the two signals can be center trimmed to match. + + For training, extracts should have a valid length.For evaluation + on full tracks we recommend passing `pad = True` to :method:`forward`. + """ + for _ in range(self.depth): + if self.upsample: + length = math.ceil(length / self.stride) + self.kernel_size - 1 + else: + length = math.ceil((length - self.kernel_size) / self.stride) + 1 + length = max(1, length) + length += self.context - 1 + for _ in range(self.depth): + if self.upsample: + length = length * self.stride + self.kernel_size - 1 + else: + length = (length - 1) * self.stride + self.kernel_size + + return int(length) + + def forward(self, mix): + x = mix + saved = [x] + for encode in self.encoder: + x = encode(x) + saved.append(x) + if self.upsample: + x = downsample(x, self.stride) + if self.lstm: + x = self.lstm(x) + for decode in self.decoder: + if self.upsample: + x = upsample(x, stride=self.stride) + skip = center_trim(saved.pop(-1), x) + x = x + skip + x = decode(x) + if self.final: + skip = center_trim(saved.pop(-1), x) + x = th.cat([x, skip], dim=1) + x = self.final(x) + + x = x.view(x.size(0), self.sources, self.audio_channels, x.size(-1)) + return x diff --git a/audio_separator/separator/uvr_lib_v5/demucs/model_v2.py b/audio_separator/separator/uvr_lib_v5/demucs/model_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..b1fee3523a8323b9c03675474773ceb8325a0c68 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/model_v2.py @@ -0,0 +1,222 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import julius +from torch import nn +from .tasnet_v2 import ConvTasNet + +from .utils import capture_init, center_trim + + +class BLSTM(nn.Module): + def __init__(self, dim, layers=1): + super().__init__() + self.lstm = nn.LSTM(bidirectional=True, num_layers=layers, hidden_size=dim, input_size=dim) + self.linear = nn.Linear(2 * dim, dim) + + def forward(self, x): + x = x.permute(2, 0, 1) + x = self.lstm(x)[0] + x = self.linear(x) + x = x.permute(1, 2, 0) + return x + + +def rescale_conv(conv, reference): + std = conv.weight.std().detach() + scale = (std / reference) ** 0.5 + conv.weight.data /= scale + if conv.bias is not None: + conv.bias.data /= scale + + +def rescale_module(module, reference): + for sub in module.modules(): + if isinstance(sub, (nn.Conv1d, nn.ConvTranspose1d)): + rescale_conv(sub, reference) + + +def auto_load_demucs_model_v2(sources, demucs_model_name): + + if "48" in demucs_model_name: + channels = 48 + elif "unittest" in demucs_model_name: + channels = 4 + else: + channels = 64 + + if "tasnet" in demucs_model_name: + init_demucs_model = ConvTasNet(sources, X=10) + else: + init_demucs_model = Demucs(sources, channels=channels) + + return init_demucs_model + + +class Demucs(nn.Module): + @capture_init + def __init__( + self, + sources, + audio_channels=2, + channels=64, + depth=6, + rewrite=True, + glu=True, + rescale=0.1, + resample=True, + kernel_size=8, + stride=4, + growth=2.0, + lstm_layers=2, + context=3, + normalize=False, + samplerate=44100, + segment_length=4 * 10 * 44100, + ): + """ + Args: + sources (list[str]): list of source names + audio_channels (int): stereo or mono + channels (int): first convolution channels + depth (int): number of encoder/decoder layers + rewrite (bool): add 1x1 convolution to each encoder layer + and a convolution to each decoder layer. + For the decoder layer, `context` gives the kernel size. + glu (bool): use glu instead of ReLU + resample_input (bool): upsample x2 the input and downsample /2 the output. + rescale (int): rescale initial weights of convolutions + to get their standard deviation closer to `rescale` + kernel_size (int): kernel size for convolutions + stride (int): stride for convolutions + growth (float): multiply (resp divide) number of channels by that + for each layer of the encoder (resp decoder) + lstm_layers (int): number of lstm layers, 0 = no lstm + context (int): kernel size of the convolution in the + decoder before the transposed convolution. If > 1, + will provide some context from neighboring time + steps. + samplerate (int): stored as meta information for easing + future evaluations of the model. + segment_length (int): stored as meta information for easing + future evaluations of the model. Length of the segments on which + the model was trained. + """ + + super().__init__() + self.audio_channels = audio_channels + self.sources = sources + self.kernel_size = kernel_size + self.context = context + self.stride = stride + self.depth = depth + self.resample = resample + self.channels = channels + self.normalize = normalize + self.samplerate = samplerate + self.segment_length = segment_length + + self.encoder = nn.ModuleList() + self.decoder = nn.ModuleList() + + if glu: + activation = nn.GLU(dim=1) + ch_scale = 2 + else: + activation = nn.ReLU() + ch_scale = 1 + in_channels = audio_channels + for index in range(depth): + encode = [] + encode += [nn.Conv1d(in_channels, channels, kernel_size, stride), nn.ReLU()] + if rewrite: + encode += [nn.Conv1d(channels, ch_scale * channels, 1), activation] + self.encoder.append(nn.Sequential(*encode)) + + decode = [] + if index > 0: + out_channels = in_channels + else: + out_channels = len(self.sources) * audio_channels + if rewrite: + decode += [nn.Conv1d(channels, ch_scale * channels, context), activation] + decode += [nn.ConvTranspose1d(channels, out_channels, kernel_size, stride)] + if index > 0: + decode.append(nn.ReLU()) + self.decoder.insert(0, nn.Sequential(*decode)) + in_channels = channels + channels = int(growth * channels) + + channels = in_channels + + if lstm_layers: + self.lstm = BLSTM(channels, lstm_layers) + else: + self.lstm = None + + if rescale: + rescale_module(self, reference=rescale) + + def valid_length(self, length): + """ + Return the nearest valid length to use with the model so that + there is no time steps left over in a convolutions, e.g. for all + layers, size of the input - kernel_size % stride = 0. + + If the mixture has a valid length, the estimated sources + will have exactly the same length when context = 1. If context > 1, + the two signals can be center trimmed to match. + + For training, extracts should have a valid length.For evaluation + on full tracks we recommend passing `pad = True` to :method:`forward`. + """ + if self.resample: + length *= 2 + for _ in range(self.depth): + length = math.ceil((length - self.kernel_size) / self.stride) + 1 + length = max(1, length) + length += self.context - 1 + for _ in range(self.depth): + length = (length - 1) * self.stride + self.kernel_size + + if self.resample: + length = math.ceil(length / 2) + return int(length) + + def forward(self, mix): + x = mix + + if self.normalize: + mono = mix.mean(dim=1, keepdim=True) + mean = mono.mean(dim=-1, keepdim=True) + std = mono.std(dim=-1, keepdim=True) + else: + mean = 0 + std = 1 + + x = (x - mean) / (1e-5 + std) + + if self.resample: + x = julius.resample_frac(x, 1, 2) + + saved = [] + for encode in self.encoder: + x = encode(x) + saved.append(x) + if self.lstm: + x = self.lstm(x) + for decode in self.decoder: + skip = center_trim(saved.pop(-1), x) + x = x + skip + x = decode(x) + + if self.resample: + x = julius.resample_frac(x, 2, 1) + x = x * std + mean + x = x.view(x.size(0), len(self.sources), self.audio_channels, x.size(-1)) + return x diff --git a/audio_separator/separator/uvr_lib_v5/demucs/pretrained.py b/audio_separator/separator/uvr_lib_v5/demucs/pretrained.py new file mode 100644 index 0000000000000000000000000000000000000000..feafa86ec0c6ba9d333e210d3aa7faddcc12847b --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/pretrained.py @@ -0,0 +1,181 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +"""Loading pretrained models. +""" + +import logging +from pathlib import Path +import typing as tp + +# from dora.log import fatal + +import logging + +from diffq import DiffQuantizer +import torch.hub + +from .model import Demucs +from .tasnet_v2 import ConvTasNet +from .utils import set_state + +from .hdemucs import HDemucs +from .repo import RemoteRepo, LocalRepo, ModelOnlyRepo, BagOnlyRepo, AnyModelRepo, ModelLoadingError # noqa + +logger = logging.getLogger(__name__) +ROOT_URL = "https://dl.fbaipublicfiles.com/demucs/mdx_final/" +REMOTE_ROOT = Path(__file__).parent / "remote" + +SOURCES = ["drums", "bass", "other", "vocals"] + + +def demucs_unittest(): + model = HDemucs(channels=4, sources=SOURCES) + return model + + +def add_model_flags(parser): + group = parser.add_mutually_exclusive_group(required=False) + group.add_argument("-s", "--sig", help="Locally trained XP signature.") + group.add_argument("-n", "--name", default="mdx_extra_q", help="Pretrained model name or signature. Default is mdx_extra_q.") + parser.add_argument("--repo", type=Path, help="Folder containing all pre-trained models for use with -n.") + + +def _parse_remote_files(remote_file_list) -> tp.Dict[str, str]: + root: str = "" + models: tp.Dict[str, str] = {} + for line in remote_file_list.read_text().split("\n"): + line = line.strip() + if line.startswith("#"): + continue + elif line.startswith("root:"): + root = line.split(":", 1)[1].strip() + else: + sig = line.split("-", 1)[0] + assert sig not in models + models[sig] = ROOT_URL + root + line + return models + + +def get_model(name: str, repo: tp.Optional[Path] = None): + """`name` must be a bag of models name or a pretrained signature + from the remote AWS model repo or the specified local repo if `repo` is not None. + """ + if name == "demucs_unittest": + return demucs_unittest() + model_repo: ModelOnlyRepo + if repo is None: + models = _parse_remote_files(REMOTE_ROOT / "files.txt") + model_repo = RemoteRepo(models) + bag_repo = BagOnlyRepo(REMOTE_ROOT, model_repo) + else: + if not repo.is_dir(): + fatal(f"{repo} must exist and be a directory.") + model_repo = LocalRepo(repo) + bag_repo = BagOnlyRepo(repo, model_repo) + any_repo = AnyModelRepo(model_repo, bag_repo) + model = any_repo.get_model(name) + model.eval() + return model + + +def get_model_from_args(args): + """ + Load local model package or pre-trained model. + """ + return get_model(name=args.name, repo=args.repo) + + +logger = logging.getLogger(__name__) +ROOT = "https://dl.fbaipublicfiles.com/demucs/v3.0/" + +PRETRAINED_MODELS = { + "demucs": "e07c671f", + "demucs48_hq": "28a1282c", + "demucs_extra": "3646af93", + "demucs_quantized": "07afea75", + "tasnet": "beb46fac", + "tasnet_extra": "df3777b2", + "demucs_unittest": "09ebc15f", +} + +SOURCES = ["drums", "bass", "other", "vocals"] + + +def get_url(name): + sig = PRETRAINED_MODELS[name] + return ROOT + name + "-" + sig[:8] + ".th" + + +def is_pretrained(name): + return name in PRETRAINED_MODELS + + +def load_pretrained(name): + if name == "demucs": + return demucs(pretrained=True) + elif name == "demucs48_hq": + return demucs(pretrained=True, hq=True, channels=48) + elif name == "demucs_extra": + return demucs(pretrained=True, extra=True) + elif name == "demucs_quantized": + return demucs(pretrained=True, quantized=True) + elif name == "demucs_unittest": + return demucs_unittest(pretrained=True) + elif name == "tasnet": + return tasnet(pretrained=True) + elif name == "tasnet_extra": + return tasnet(pretrained=True, extra=True) + else: + raise ValueError(f"Invalid pretrained name {name}") + + +def _load_state(name, model, quantizer=None): + url = get_url(name) + state = torch.hub.load_state_dict_from_url(url, map_location="cpu", check_hash=True) + set_state(model, quantizer, state) + if quantizer: + quantizer.detach() + + +def demucs_unittest(pretrained=True): + model = Demucs(channels=4, sources=SOURCES) + if pretrained: + _load_state("demucs_unittest", model) + return model + + +def demucs(pretrained=True, extra=False, quantized=False, hq=False, channels=64): + if not pretrained and (extra or quantized or hq): + raise ValueError("if extra or quantized is True, pretrained must be True.") + model = Demucs(sources=SOURCES, channels=channels) + if pretrained: + name = "demucs" + if channels != 64: + name += str(channels) + quantizer = None + if sum([extra, quantized, hq]) > 1: + raise ValueError("Only one of extra, quantized, hq, can be True.") + if quantized: + quantizer = DiffQuantizer(model, group_size=8, min_size=1) + name += "_quantized" + if extra: + name += "_extra" + if hq: + name += "_hq" + _load_state(name, model, quantizer) + return model + + +def tasnet(pretrained=True, extra=False): + if not pretrained and extra: + raise ValueError("if extra is True, pretrained must be True.") + model = ConvTasNet(X=10, sources=SOURCES) + if pretrained: + name = "tasnet" + if extra: + name = "tasnet_extra" + _load_state(name, model) + return model diff --git a/audio_separator/separator/uvr_lib_v5/demucs/repo.py b/audio_separator/separator/uvr_lib_v5/demucs/repo.py new file mode 100644 index 0000000000000000000000000000000000000000..40b84c9c84cc6ce4afd18bca1a05190140b477df --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/repo.py @@ -0,0 +1,146 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +"""Represents a model repository, including pre-trained models and bags of models. +A repo can either be the main remote repository stored in AWS, or a local repository +with your own models. +""" + +from hashlib import sha256 +from pathlib import Path +import typing as tp + +import torch +import yaml + +from .apply import BagOfModels, Model +from .states import load_model + + +AnyModel = tp.Union[Model, BagOfModels] + + +class ModelLoadingError(RuntimeError): + pass + + +def check_checksum(path: Path, checksum: str): + sha = sha256() + with open(path, "rb") as file: + while True: + buf = file.read(2**20) + if not buf: + break + sha.update(buf) + actual_checksum = sha.hexdigest()[: len(checksum)] + if actual_checksum != checksum: + raise ModelLoadingError(f"Invalid checksum for file {path}, " f"expected {checksum} but got {actual_checksum}") + + +class ModelOnlyRepo: + """Base class for all model only repos.""" + + def has_model(self, sig: str) -> bool: + raise NotImplementedError() + + def get_model(self, sig: str) -> Model: + raise NotImplementedError() + + +class RemoteRepo(ModelOnlyRepo): + def __init__(self, models: tp.Dict[str, str]): + self._models = models + + def has_model(self, sig: str) -> bool: + return sig in self._models + + def get_model(self, sig: str) -> Model: + try: + url = self._models[sig] + except KeyError: + raise ModelLoadingError(f"Could not find a pre-trained model with signature {sig}.") + pkg = torch.hub.load_state_dict_from_url(url, map_location="cpu", check_hash=True) + return load_model(pkg) + + +class LocalRepo(ModelOnlyRepo): + def __init__(self, root: Path): + self.root = root + self.scan() + + def scan(self): + self._models = {} + self._checksums = {} + for file in self.root.iterdir(): + if file.suffix == ".th": + if "-" in file.stem: + xp_sig, checksum = file.stem.split("-") + self._checksums[xp_sig] = checksum + else: + xp_sig = file.stem + if xp_sig in self._models: + print("Whats xp? ", xp_sig) + raise ModelLoadingError(f"Duplicate pre-trained model exist for signature {xp_sig}. " "Please delete all but one.") + self._models[xp_sig] = file + + def has_model(self, sig: str) -> bool: + return sig in self._models + + def get_model(self, sig: str) -> Model: + try: + file = self._models[sig] + except KeyError: + raise ModelLoadingError(f"Could not find pre-trained model with signature {sig}.") + if sig in self._checksums: + check_checksum(file, self._checksums[sig]) + return load_model(file) + + +class BagOnlyRepo: + """Handles only YAML files containing bag of models, leaving the actual + model loading to some Repo. + """ + + def __init__(self, root: Path, model_repo: ModelOnlyRepo): + self.root = root + self.model_repo = model_repo + self.scan() + + def scan(self): + self._bags = {} + for file in self.root.iterdir(): + if file.suffix == ".yaml": + self._bags[file.stem] = file + + def has_model(self, name: str) -> bool: + return name in self._bags + + def get_model(self, name: str) -> BagOfModels: + try: + yaml_file = self._bags[name] + except KeyError: + raise ModelLoadingError(f"{name} is neither a single pre-trained model or " "a bag of models.") + bag = yaml.safe_load(open(yaml_file)) + signatures = bag["models"] + models = [self.model_repo.get_model(sig) for sig in signatures] + weights = bag.get("weights") + segment = bag.get("segment") + return BagOfModels(models, weights, segment) + + +class AnyModelRepo: + def __init__(self, model_repo: ModelOnlyRepo, bag_repo: BagOnlyRepo): + self.model_repo = model_repo + self.bag_repo = bag_repo + + def has_model(self, name_or_sig: str) -> bool: + return self.model_repo.has_model(name_or_sig) or self.bag_repo.has_model(name_or_sig) + + def get_model(self, name_or_sig: str) -> AnyModel: + # print('name_or_sig: ', name_or_sig) + if self.model_repo.has_model(name_or_sig): + return self.model_repo.get_model(name_or_sig) + else: + return self.bag_repo.get_model(name_or_sig) diff --git a/audio_separator/separator/uvr_lib_v5/demucs/spec.py b/audio_separator/separator/uvr_lib_v5/demucs/spec.py new file mode 100644 index 0000000000000000000000000000000000000000..36a4a2e8e92e772f73cebeaeff316fd7476cfd02 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/spec.py @@ -0,0 +1,38 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +"""Conveniance wrapper to perform STFT and iSTFT""" + +import torch as th + + +def spectro(x, n_fft=512, hop_length=None, pad=0): + *other, length = x.shape + x = x.reshape(-1, length) + + device_type = x.device.type + is_other_gpu = not device_type in ["cuda", "cpu"] + + if is_other_gpu: + x = x.cpu() + z = th.stft(x, n_fft * (1 + pad), hop_length or n_fft // 4, window=th.hann_window(n_fft).to(x), win_length=n_fft, normalized=True, center=True, return_complex=True, pad_mode="reflect") + _, freqs, frame = z.shape + return z.view(*other, freqs, frame) + + +def ispectro(z, hop_length=None, length=None, pad=0): + *other, freqs, frames = z.shape + n_fft = 2 * freqs - 2 + z = z.view(-1, freqs, frames) + win_length = n_fft // (1 + pad) + + device_type = z.device.type + is_other_gpu = not device_type in ["cuda", "cpu"] + + if is_other_gpu: + z = z.cpu() + x = th.istft(z, n_fft, hop_length, window=th.hann_window(win_length).to(z.real), win_length=win_length, normalized=True, length=length, center=True) + _, length = x.shape + return x.view(*other, length) diff --git a/audio_separator/separator/uvr_lib_v5/demucs/states.py b/audio_separator/separator/uvr_lib_v5/demucs/states.py new file mode 100644 index 0000000000000000000000000000000000000000..9bf1a8af0f0e396965bc78f6c0f2db9b0c1484ad --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/states.py @@ -0,0 +1,131 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +""" +Utilities to save and load models. +""" +from contextlib import contextmanager + +import functools +import hashlib +import inspect +import io +from pathlib import Path +import warnings + +from diffq import DiffQuantizer, UniformQuantizer, restore_quantized_state +import torch + + +def get_quantizer(model, args, optimizer=None): + """Return the quantizer given the XP quantization args.""" + quantizer = None + if args.diffq: + quantizer = DiffQuantizer(model, min_size=args.min_size, group_size=args.group_size) + if optimizer is not None: + quantizer.setup_optimizer(optimizer) + elif args.qat: + quantizer = UniformQuantizer(model, bits=args.qat, min_size=args.min_size) + return quantizer + + +def load_model(path_or_package, strict=False): + """Load a model from the given serialized model, either given as a dict (already loaded) + or a path to a file on disk.""" + if isinstance(path_or_package, dict): + package = path_or_package + elif isinstance(path_or_package, (str, Path)): + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + path = path_or_package + package = torch.load(path, "cpu", weights_only=False) + else: + raise ValueError(f"Invalid type for {path_or_package}.") + + klass = package["klass"] + args = package["args"] + kwargs = package["kwargs"] + + if strict: + model = klass(*args, **kwargs) + else: + sig = inspect.signature(klass) + for key in list(kwargs): + if key not in sig.parameters: + warnings.warn("Dropping inexistant parameter " + key) + del kwargs[key] + model = klass(*args, **kwargs) + + state = package["state"] + + set_state(model, state) + return model + + +def get_state(model, quantizer, half=False): + """Get the state from a model, potentially with quantization applied. + If `half` is True, model are stored as half precision, which shouldn't impact performance + but half the state size.""" + if quantizer is None: + dtype = torch.half if half else None + state = {k: p.data.to(device="cpu", dtype=dtype) for k, p in model.state_dict().items()} + else: + state = quantizer.get_quantized_state() + state["__quantized"] = True + return state + + +def set_state(model, state, quantizer=None): + """Set the state on a given model.""" + if state.get("__quantized"): + if quantizer is not None: + quantizer.restore_quantized_state(model, state["quantized"]) + else: + restore_quantized_state(model, state) + else: + model.load_state_dict(state) + return state + + +def save_with_checksum(content, path): + """Save the given value on disk, along with a sha256 hash. + Should be used with the output of either `serialize_model` or `get_state`.""" + buf = io.BytesIO() + torch.save(content, buf) + sig = hashlib.sha256(buf.getvalue()).hexdigest()[:8] + + path = path.parent / (path.stem + "-" + sig + path.suffix) + path.write_bytes(buf.getvalue()) + + +def copy_state(state): + return {k: v.cpu().clone() for k, v in state.items()} + + +@contextmanager +def swap_state(model, state): + """ + Context manager that swaps the state of a model, e.g: + + # model is in old state + with swap_state(model, new_state): + # model in new state + # model back to old state + """ + old_state = copy_state(model.state_dict()) + model.load_state_dict(state, strict=False) + try: + yield + finally: + model.load_state_dict(old_state) + + +def capture_init(init): + @functools.wraps(init) + def __init__(self, *args, **kwargs): + self._init_args_kwargs = (args, kwargs) + init(self, *args, **kwargs) + + return __init__ diff --git a/audio_separator/separator/uvr_lib_v5/demucs/tasnet.py b/audio_separator/separator/uvr_lib_v5/demucs/tasnet.py new file mode 100644 index 0000000000000000000000000000000000000000..6e415b904989dc863c34a8983f66b66982bcd86e --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/tasnet.py @@ -0,0 +1,401 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# +# Created on 2018/12 +# Author: Kaituo XU +# Modified on 2019/11 by Alexandre Defossez, added support for multiple output channels +# Here is the original license: +# The MIT License (MIT) +# +# Copyright (c) 2018 Kaituo XU +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from .utils import capture_init + +EPS = 1e-8 + + +def overlap_and_add(signal, frame_step): + outer_dimensions = signal.size()[:-2] + frames, frame_length = signal.size()[-2:] + + subframe_length = math.gcd(frame_length, frame_step) # gcd=Greatest Common Divisor + subframe_step = frame_step // subframe_length + subframes_per_frame = frame_length // subframe_length + output_size = frame_step * (frames - 1) + frame_length + output_subframes = output_size // subframe_length + + subframe_signal = signal.view(*outer_dimensions, -1, subframe_length) + + frame = torch.arange(0, output_subframes, device=signal.device).unfold(0, subframes_per_frame, subframe_step) + frame = frame.long() # signal may in GPU or CPU + frame = frame.contiguous().view(-1) + + result = signal.new_zeros(*outer_dimensions, output_subframes, subframe_length) + result.index_add_(-2, frame, subframe_signal) + result = result.view(*outer_dimensions, -1) + return result + + +class ConvTasNet(nn.Module): + @capture_init + def __init__(self, N=256, L=20, B=256, H=512, P=3, X=8, R=4, C=4, audio_channels=1, samplerate=44100, norm_type="gLN", causal=False, mask_nonlinear="relu"): + """ + Args: + N: Number of filters in autoencoder + L: Length of the filters (in samples) + B: Number of channels in bottleneck 1 × 1-conv block + H: Number of channels in convolutional blocks + P: Kernel size in convolutional blocks + X: Number of convolutional blocks in each repeat + R: Number of repeats + C: Number of speakers + norm_type: BN, gLN, cLN + causal: causal or non-causal + mask_nonlinear: use which non-linear function to generate mask + """ + super(ConvTasNet, self).__init__() + # Hyper-parameter + self.N, self.L, self.B, self.H, self.P, self.X, self.R, self.C = N, L, B, H, P, X, R, C + self.norm_type = norm_type + self.causal = causal + self.mask_nonlinear = mask_nonlinear + self.audio_channels = audio_channels + self.samplerate = samplerate + # Components + self.encoder = Encoder(L, N, audio_channels) + self.separator = TemporalConvNet(N, B, H, P, X, R, C, norm_type, causal, mask_nonlinear) + self.decoder = Decoder(N, L, audio_channels) + # init + for p in self.parameters(): + if p.dim() > 1: + nn.init.xavier_normal_(p) + + def valid_length(self, length): + return length + + def forward(self, mixture): + """ + Args: + mixture: [M, T], M is batch size, T is #samples + Returns: + est_source: [M, C, T] + """ + mixture_w = self.encoder(mixture) + est_mask = self.separator(mixture_w) + est_source = self.decoder(mixture_w, est_mask) + + # T changed after conv1d in encoder, fix it here + T_origin = mixture.size(-1) + T_conv = est_source.size(-1) + est_source = F.pad(est_source, (0, T_origin - T_conv)) + return est_source + + +class Encoder(nn.Module): + """Estimation of the nonnegative mixture weight by a 1-D conv layer.""" + + def __init__(self, L, N, audio_channels): + super(Encoder, self).__init__() + # Hyper-parameter + self.L, self.N = L, N + # Components + # 50% overlap + self.conv1d_U = nn.Conv1d(audio_channels, N, kernel_size=L, stride=L // 2, bias=False) + + def forward(self, mixture): + """ + Args: + mixture: [M, T], M is batch size, T is #samples + Returns: + mixture_w: [M, N, K], where K = (T-L)/(L/2)+1 = 2T/L-1 + """ + mixture_w = F.relu(self.conv1d_U(mixture)) # [M, N, K] + return mixture_w + + +class Decoder(nn.Module): + def __init__(self, N, L, audio_channels): + super(Decoder, self).__init__() + # Hyper-parameter + self.N, self.L = N, L + self.audio_channels = audio_channels + # Components + self.basis_signals = nn.Linear(N, audio_channels * L, bias=False) + + def forward(self, mixture_w, est_mask): + """ + Args: + mixture_w: [M, N, K] + est_mask: [M, C, N, K] + Returns: + est_source: [M, C, T] + """ + # D = W * M + source_w = torch.unsqueeze(mixture_w, 1) * est_mask # [M, C, N, K] + source_w = torch.transpose(source_w, 2, 3) # [M, C, K, N] + # S = DV + est_source = self.basis_signals(source_w) # [M, C, K, ac * L] + m, c, k, _ = est_source.size() + est_source = est_source.view(m, c, k, self.audio_channels, -1).transpose(2, 3).contiguous() + est_source = overlap_and_add(est_source, self.L // 2) # M x C x ac x T + return est_source + + +class TemporalConvNet(nn.Module): + def __init__(self, N, B, H, P, X, R, C, norm_type="gLN", causal=False, mask_nonlinear="relu"): + """ + Args: + N: Number of filters in autoencoder + B: Number of channels in bottleneck 1 × 1-conv block + H: Number of channels in convolutional blocks + P: Kernel size in convolutional blocks + X: Number of convolutional blocks in each repeat + R: Number of repeats + C: Number of speakers + norm_type: BN, gLN, cLN + causal: causal or non-causal + mask_nonlinear: use which non-linear function to generate mask + """ + super(TemporalConvNet, self).__init__() + # Hyper-parameter + self.C = C + self.mask_nonlinear = mask_nonlinear + # Components + # [M, N, K] -> [M, N, K] + layer_norm = ChannelwiseLayerNorm(N) + # [M, N, K] -> [M, B, K] + bottleneck_conv1x1 = nn.Conv1d(N, B, 1, bias=False) + # [M, B, K] -> [M, B, K] + repeats = [] + for r in range(R): + blocks = [] + for x in range(X): + dilation = 2**x + padding = (P - 1) * dilation if causal else (P - 1) * dilation // 2 + blocks += [TemporalBlock(B, H, P, stride=1, padding=padding, dilation=dilation, norm_type=norm_type, causal=causal)] + repeats += [nn.Sequential(*blocks)] + temporal_conv_net = nn.Sequential(*repeats) + # [M, B, K] -> [M, C*N, K] + mask_conv1x1 = nn.Conv1d(B, C * N, 1, bias=False) + # Put together + self.network = nn.Sequential(layer_norm, bottleneck_conv1x1, temporal_conv_net, mask_conv1x1) + + def forward(self, mixture_w): + """ + Keep this API same with TasNet + Args: + mixture_w: [M, N, K], M is batch size + returns: + est_mask: [M, C, N, K] + """ + M, N, K = mixture_w.size() + score = self.network(mixture_w) # [M, N, K] -> [M, C*N, K] + score = score.view(M, self.C, N, K) # [M, C*N, K] -> [M, C, N, K] + if self.mask_nonlinear == "softmax": + est_mask = F.softmax(score, dim=1) + elif self.mask_nonlinear == "relu": + est_mask = F.relu(score) + else: + raise ValueError("Unsupported mask non-linear function") + return est_mask + + +class TemporalBlock(nn.Module): + def __init__(self, in_channels, out_channels, kernel_size, stride, padding, dilation, norm_type="gLN", causal=False): + super(TemporalBlock, self).__init__() + # [M, B, K] -> [M, H, K] + conv1x1 = nn.Conv1d(in_channels, out_channels, 1, bias=False) + prelu = nn.PReLU() + norm = chose_norm(norm_type, out_channels) + # [M, H, K] -> [M, B, K] + dsconv = DepthwiseSeparableConv(out_channels, in_channels, kernel_size, stride, padding, dilation, norm_type, causal) + # Put together + self.net = nn.Sequential(conv1x1, prelu, norm, dsconv) + + def forward(self, x): + """ + Args: + x: [M, B, K] + Returns: + [M, B, K] + """ + residual = x + out = self.net(x) + # TODO: when P = 3 here works fine, but when P = 2 maybe need to pad? + return out + residual # look like w/o F.relu is better than w/ F.relu + # return F.relu(out + residual) + + +class DepthwiseSeparableConv(nn.Module): + def __init__(self, in_channels, out_channels, kernel_size, stride, padding, dilation, norm_type="gLN", causal=False): + super(DepthwiseSeparableConv, self).__init__() + # Use `groups` option to implement depthwise convolution + # [M, H, K] -> [M, H, K] + depthwise_conv = nn.Conv1d(in_channels, in_channels, kernel_size, stride=stride, padding=padding, dilation=dilation, groups=in_channels, bias=False) + if causal: + chomp = Chomp1d(padding) + prelu = nn.PReLU() + norm = chose_norm(norm_type, in_channels) + # [M, H, K] -> [M, B, K] + pointwise_conv = nn.Conv1d(in_channels, out_channels, 1, bias=False) + # Put together + if causal: + self.net = nn.Sequential(depthwise_conv, chomp, prelu, norm, pointwise_conv) + else: + self.net = nn.Sequential(depthwise_conv, prelu, norm, pointwise_conv) + + def forward(self, x): + """ + Args: + x: [M, H, K] + Returns: + result: [M, B, K] + """ + return self.net(x) + + +class Chomp1d(nn.Module): + """To ensure the output length is the same as the input.""" + + def __init__(self, chomp_size): + super(Chomp1d, self).__init__() + self.chomp_size = chomp_size + + def forward(self, x): + """ + Args: + x: [M, H, Kpad] + Returns: + [M, H, K] + """ + return x[:, :, : -self.chomp_size].contiguous() + + +def chose_norm(norm_type, channel_size): + """The input of normlization will be (M, C, K), where M is batch size, + C is channel size and K is sequence length. + """ + if norm_type == "gLN": + return GlobalLayerNorm(channel_size) + elif norm_type == "cLN": + return ChannelwiseLayerNorm(channel_size) + elif norm_type == "id": + return nn.Identity() + else: # norm_type == "BN": + # Given input (M, C, K), nn.BatchNorm1d(C) will accumulate statics + # along M and K, so this BN usage is right. + return nn.BatchNorm1d(channel_size) + + +# TODO: Use nn.LayerNorm to impl cLN to speed up +class ChannelwiseLayerNorm(nn.Module): + """Channel-wise Layer Normalization (cLN)""" + + def __init__(self, channel_size): + super(ChannelwiseLayerNorm, self).__init__() + self.gamma = nn.Parameter(torch.Tensor(1, channel_size, 1)) # [1, N, 1] + self.beta = nn.Parameter(torch.Tensor(1, channel_size, 1)) # [1, N, 1] + self.reset_parameters() + + def reset_parameters(self): + self.gamma.data.fill_(1) + self.beta.data.zero_() + + def forward(self, y): + """ + Args: + y: [M, N, K], M is batch size, N is channel size, K is length + Returns: + cLN_y: [M, N, K] + """ + mean = torch.mean(y, dim=1, keepdim=True) # [M, 1, K] + var = torch.var(y, dim=1, keepdim=True, unbiased=False) # [M, 1, K] + cLN_y = self.gamma * (y - mean) / torch.pow(var + EPS, 0.5) + self.beta + return cLN_y + + +class GlobalLayerNorm(nn.Module): + """Global Layer Normalization (gLN)""" + + def __init__(self, channel_size): + super(GlobalLayerNorm, self).__init__() + self.gamma = nn.Parameter(torch.Tensor(1, channel_size, 1)) # [1, N, 1] + self.beta = nn.Parameter(torch.Tensor(1, channel_size, 1)) # [1, N, 1] + self.reset_parameters() + + def reset_parameters(self): + self.gamma.data.fill_(1) + self.beta.data.zero_() + + def forward(self, y): + """ + Args: + y: [M, N, K], M is batch size, N is channel size, K is length + Returns: + gLN_y: [M, N, K] + """ + # TODO: in torch 1.0, torch.mean() support dim list + mean = y.mean(dim=1, keepdim=True).mean(dim=2, keepdim=True) # [M, 1, 1] + var = (torch.pow(y - mean, 2)).mean(dim=1, keepdim=True).mean(dim=2, keepdim=True) + gLN_y = self.gamma * (y - mean) / torch.pow(var + EPS, 0.5) + self.beta + return gLN_y + + +if __name__ == "__main__": + torch.manual_seed(123) + M, N, L, T = 2, 3, 4, 12 + K = 2 * T // L - 1 + B, H, P, X, R, C, norm_type, causal = 2, 3, 3, 3, 2, 2, "gLN", False + mixture = torch.randint(3, (M, T)) + # test Encoder + encoder = Encoder(L, N) + encoder.conv1d_U.weight.data = torch.randint(2, encoder.conv1d_U.weight.size()) + mixture_w = encoder(mixture) + print("mixture", mixture) + print("U", encoder.conv1d_U.weight) + print("mixture_w", mixture_w) + print("mixture_w size", mixture_w.size()) + + # test TemporalConvNet + separator = TemporalConvNet(N, B, H, P, X, R, C, norm_type=norm_type, causal=causal) + est_mask = separator(mixture_w) + print("est_mask", est_mask) + + # test Decoder + decoder = Decoder(N, L) + est_mask = torch.randint(2, (B, K, C, N)) + est_source = decoder(mixture_w, est_mask) + print("est_source", est_source) + + # test Conv-TasNet + conv_tasnet = ConvTasNet(N, L, B, H, P, X, R, C, norm_type=norm_type) + est_source = conv_tasnet(mixture) + print("est_source", est_source) + print("est_source size", est_source.size()) diff --git a/audio_separator/separator/uvr_lib_v5/demucs/tasnet_v2.py b/audio_separator/separator/uvr_lib_v5/demucs/tasnet_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..8eb8f38ddec5884cf383d47aa3f3e388b9a84098 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/tasnet_v2.py @@ -0,0 +1,404 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# +# Created on 2018/12 +# Author: Kaituo XU +# Modified on 2019/11 by Alexandre Defossez, added support for multiple output channels +# Here is the original license: +# The MIT License (MIT) +# +# Copyright (c) 2018 Kaituo XU +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from .utils import capture_init + +EPS = 1e-8 + + +def overlap_and_add(signal, frame_step): + outer_dimensions = signal.size()[:-2] + frames, frame_length = signal.size()[-2:] + + subframe_length = math.gcd(frame_length, frame_step) # gcd=Greatest Common Divisor + subframe_step = frame_step // subframe_length + subframes_per_frame = frame_length // subframe_length + output_size = frame_step * (frames - 1) + frame_length + output_subframes = output_size // subframe_length + + subframe_signal = signal.view(*outer_dimensions, -1, subframe_length) + + frame = torch.arange(0, output_subframes, device=signal.device).unfold(0, subframes_per_frame, subframe_step) + frame = frame.long() # signal may in GPU or CPU + frame = frame.contiguous().view(-1) + + result = signal.new_zeros(*outer_dimensions, output_subframes, subframe_length) + result.index_add_(-2, frame, subframe_signal) + result = result.view(*outer_dimensions, -1) + return result + + +class ConvTasNet(nn.Module): + @capture_init + def __init__(self, sources, N=256, L=20, B=256, H=512, P=3, X=8, R=4, audio_channels=2, norm_type="gLN", causal=False, mask_nonlinear="relu", samplerate=44100, segment_length=44100 * 2 * 4): + """ + Args: + sources: list of sources + N: Number of filters in autoencoder + L: Length of the filters (in samples) + B: Number of channels in bottleneck 1 × 1-conv block + H: Number of channels in convolutional blocks + P: Kernel size in convolutional blocks + X: Number of convolutional blocks in each repeat + R: Number of repeats + norm_type: BN, gLN, cLN + causal: causal or non-causal + mask_nonlinear: use which non-linear function to generate mask + """ + super(ConvTasNet, self).__init__() + # Hyper-parameter + self.sources = sources + self.C = len(sources) + self.N, self.L, self.B, self.H, self.P, self.X, self.R = N, L, B, H, P, X, R + self.norm_type = norm_type + self.causal = causal + self.mask_nonlinear = mask_nonlinear + self.audio_channels = audio_channels + self.samplerate = samplerate + self.segment_length = segment_length + # Components + self.encoder = Encoder(L, N, audio_channels) + self.separator = TemporalConvNet(N, B, H, P, X, R, self.C, norm_type, causal, mask_nonlinear) + self.decoder = Decoder(N, L, audio_channels) + # init + for p in self.parameters(): + if p.dim() > 1: + nn.init.xavier_normal_(p) + + def valid_length(self, length): + return length + + def forward(self, mixture): + """ + Args: + mixture: [M, T], M is batch size, T is #samples + Returns: + est_source: [M, C, T] + """ + mixture_w = self.encoder(mixture) + est_mask = self.separator(mixture_w) + est_source = self.decoder(mixture_w, est_mask) + + # T changed after conv1d in encoder, fix it here + T_origin = mixture.size(-1) + T_conv = est_source.size(-1) + est_source = F.pad(est_source, (0, T_origin - T_conv)) + return est_source + + +class Encoder(nn.Module): + """Estimation of the nonnegative mixture weight by a 1-D conv layer.""" + + def __init__(self, L, N, audio_channels): + super(Encoder, self).__init__() + # Hyper-parameter + self.L, self.N = L, N + # Components + # 50% overlap + self.conv1d_U = nn.Conv1d(audio_channels, N, kernel_size=L, stride=L // 2, bias=False) + + def forward(self, mixture): + """ + Args: + mixture: [M, T], M is batch size, T is #samples + Returns: + mixture_w: [M, N, K], where K = (T-L)/(L/2)+1 = 2T/L-1 + """ + mixture_w = F.relu(self.conv1d_U(mixture)) # [M, N, K] + return mixture_w + + +class Decoder(nn.Module): + def __init__(self, N, L, audio_channels): + super(Decoder, self).__init__() + # Hyper-parameter + self.N, self.L = N, L + self.audio_channels = audio_channels + # Components + self.basis_signals = nn.Linear(N, audio_channels * L, bias=False) + + def forward(self, mixture_w, est_mask): + """ + Args: + mixture_w: [M, N, K] + est_mask: [M, C, N, K] + Returns: + est_source: [M, C, T] + """ + # D = W * M + source_w = torch.unsqueeze(mixture_w, 1) * est_mask # [M, C, N, K] + source_w = torch.transpose(source_w, 2, 3) # [M, C, K, N] + # S = DV + est_source = self.basis_signals(source_w) # [M, C, K, ac * L] + m, c, k, _ = est_source.size() + est_source = est_source.view(m, c, k, self.audio_channels, -1).transpose(2, 3).contiguous() + est_source = overlap_and_add(est_source, self.L // 2) # M x C x ac x T + return est_source + + +class TemporalConvNet(nn.Module): + def __init__(self, N, B, H, P, X, R, C, norm_type="gLN", causal=False, mask_nonlinear="relu"): + """ + Args: + N: Number of filters in autoencoder + B: Number of channels in bottleneck 1 × 1-conv block + H: Number of channels in convolutional blocks + P: Kernel size in convolutional blocks + X: Number of convolutional blocks in each repeat + R: Number of repeats + C: Number of speakers + norm_type: BN, gLN, cLN + causal: causal or non-causal + mask_nonlinear: use which non-linear function to generate mask + """ + super(TemporalConvNet, self).__init__() + # Hyper-parameter + self.C = C + self.mask_nonlinear = mask_nonlinear + # Components + # [M, N, K] -> [M, N, K] + layer_norm = ChannelwiseLayerNorm(N) + # [M, N, K] -> [M, B, K] + bottleneck_conv1x1 = nn.Conv1d(N, B, 1, bias=False) + # [M, B, K] -> [M, B, K] + repeats = [] + for r in range(R): + blocks = [] + for x in range(X): + dilation = 2**x + padding = (P - 1) * dilation if causal else (P - 1) * dilation // 2 + blocks += [TemporalBlock(B, H, P, stride=1, padding=padding, dilation=dilation, norm_type=norm_type, causal=causal)] + repeats += [nn.Sequential(*blocks)] + temporal_conv_net = nn.Sequential(*repeats) + # [M, B, K] -> [M, C*N, K] + mask_conv1x1 = nn.Conv1d(B, C * N, 1, bias=False) + # Put together + self.network = nn.Sequential(layer_norm, bottleneck_conv1x1, temporal_conv_net, mask_conv1x1) + + def forward(self, mixture_w): + """ + Keep this API same with TasNet + Args: + mixture_w: [M, N, K], M is batch size + returns: + est_mask: [M, C, N, K] + """ + M, N, K = mixture_w.size() + score = self.network(mixture_w) # [M, N, K] -> [M, C*N, K] + score = score.view(M, self.C, N, K) # [M, C*N, K] -> [M, C, N, K] + if self.mask_nonlinear == "softmax": + est_mask = F.softmax(score, dim=1) + elif self.mask_nonlinear == "relu": + est_mask = F.relu(score) + else: + raise ValueError("Unsupported mask non-linear function") + return est_mask + + +class TemporalBlock(nn.Module): + def __init__(self, in_channels, out_channels, kernel_size, stride, padding, dilation, norm_type="gLN", causal=False): + super(TemporalBlock, self).__init__() + # [M, B, K] -> [M, H, K] + conv1x1 = nn.Conv1d(in_channels, out_channels, 1, bias=False) + prelu = nn.PReLU() + norm = chose_norm(norm_type, out_channels) + # [M, H, K] -> [M, B, K] + dsconv = DepthwiseSeparableConv(out_channels, in_channels, kernel_size, stride, padding, dilation, norm_type, causal) + # Put together + self.net = nn.Sequential(conv1x1, prelu, norm, dsconv) + + def forward(self, x): + """ + Args: + x: [M, B, K] + Returns: + [M, B, K] + """ + residual = x + out = self.net(x) + # TODO: when P = 3 here works fine, but when P = 2 maybe need to pad? + return out + residual # look like w/o F.relu is better than w/ F.relu + # return F.relu(out + residual) + + +class DepthwiseSeparableConv(nn.Module): + def __init__(self, in_channels, out_channels, kernel_size, stride, padding, dilation, norm_type="gLN", causal=False): + super(DepthwiseSeparableConv, self).__init__() + # Use `groups` option to implement depthwise convolution + # [M, H, K] -> [M, H, K] + depthwise_conv = nn.Conv1d(in_channels, in_channels, kernel_size, stride=stride, padding=padding, dilation=dilation, groups=in_channels, bias=False) + if causal: + chomp = Chomp1d(padding) + prelu = nn.PReLU() + norm = chose_norm(norm_type, in_channels) + # [M, H, K] -> [M, B, K] + pointwise_conv = nn.Conv1d(in_channels, out_channels, 1, bias=False) + # Put together + if causal: + self.net = nn.Sequential(depthwise_conv, chomp, prelu, norm, pointwise_conv) + else: + self.net = nn.Sequential(depthwise_conv, prelu, norm, pointwise_conv) + + def forward(self, x): + """ + Args: + x: [M, H, K] + Returns: + result: [M, B, K] + """ + return self.net(x) + + +class Chomp1d(nn.Module): + """To ensure the output length is the same as the input.""" + + def __init__(self, chomp_size): + super(Chomp1d, self).__init__() + self.chomp_size = chomp_size + + def forward(self, x): + """ + Args: + x: [M, H, Kpad] + Returns: + [M, H, K] + """ + return x[:, :, : -self.chomp_size].contiguous() + + +def chose_norm(norm_type, channel_size): + """The input of normlization will be (M, C, K), where M is batch size, + C is channel size and K is sequence length. + """ + if norm_type == "gLN": + return GlobalLayerNorm(channel_size) + elif norm_type == "cLN": + return ChannelwiseLayerNorm(channel_size) + elif norm_type == "id": + return nn.Identity() + else: # norm_type == "BN": + # Given input (M, C, K), nn.BatchNorm1d(C) will accumulate statics + # along M and K, so this BN usage is right. + return nn.BatchNorm1d(channel_size) + + +# TODO: Use nn.LayerNorm to impl cLN to speed up +class ChannelwiseLayerNorm(nn.Module): + """Channel-wise Layer Normalization (cLN)""" + + def __init__(self, channel_size): + super(ChannelwiseLayerNorm, self).__init__() + self.gamma = nn.Parameter(torch.Tensor(1, channel_size, 1)) # [1, N, 1] + self.beta = nn.Parameter(torch.Tensor(1, channel_size, 1)) # [1, N, 1] + self.reset_parameters() + + def reset_parameters(self): + self.gamma.data.fill_(1) + self.beta.data.zero_() + + def forward(self, y): + """ + Args: + y: [M, N, K], M is batch size, N is channel size, K is length + Returns: + cLN_y: [M, N, K] + """ + mean = torch.mean(y, dim=1, keepdim=True) # [M, 1, K] + var = torch.var(y, dim=1, keepdim=True, unbiased=False) # [M, 1, K] + cLN_y = self.gamma * (y - mean) / torch.pow(var + EPS, 0.5) + self.beta + return cLN_y + + +class GlobalLayerNorm(nn.Module): + """Global Layer Normalization (gLN)""" + + def __init__(self, channel_size): + super(GlobalLayerNorm, self).__init__() + self.gamma = nn.Parameter(torch.Tensor(1, channel_size, 1)) # [1, N, 1] + self.beta = nn.Parameter(torch.Tensor(1, channel_size, 1)) # [1, N, 1] + self.reset_parameters() + + def reset_parameters(self): + self.gamma.data.fill_(1) + self.beta.data.zero_() + + def forward(self, y): + """ + Args: + y: [M, N, K], M is batch size, N is channel size, K is length + Returns: + gLN_y: [M, N, K] + """ + # TODO: in torch 1.0, torch.mean() support dim list + mean = y.mean(dim=1, keepdim=True).mean(dim=2, keepdim=True) # [M, 1, 1] + var = (torch.pow(y - mean, 2)).mean(dim=1, keepdim=True).mean(dim=2, keepdim=True) + gLN_y = self.gamma * (y - mean) / torch.pow(var + EPS, 0.5) + self.beta + return gLN_y + + +if __name__ == "__main__": + torch.manual_seed(123) + M, N, L, T = 2, 3, 4, 12 + K = 2 * T // L - 1 + B, H, P, X, R, C, norm_type, causal = 2, 3, 3, 3, 2, 2, "gLN", False + mixture = torch.randint(3, (M, T)) + # test Encoder + encoder = Encoder(L, N) + encoder.conv1d_U.weight.data = torch.randint(2, encoder.conv1d_U.weight.size()) + mixture_w = encoder(mixture) + print("mixture", mixture) + print("U", encoder.conv1d_U.weight) + print("mixture_w", mixture_w) + print("mixture_w size", mixture_w.size()) + + # test TemporalConvNet + separator = TemporalConvNet(N, B, H, P, X, R, C, norm_type=norm_type, causal=causal) + est_mask = separator(mixture_w) + print("est_mask", est_mask) + + # test Decoder + decoder = Decoder(N, L) + est_mask = torch.randint(2, (B, K, C, N)) + est_source = decoder(mixture_w, est_mask) + print("est_source", est_source) + + # test Conv-TasNet + conv_tasnet = ConvTasNet(N, L, B, H, P, X, R, C, norm_type=norm_type) + est_source = conv_tasnet(mixture) + print("est_source", est_source) + print("est_source size", est_source.size()) diff --git a/audio_separator/separator/uvr_lib_v5/demucs/transformer.py b/audio_separator/separator/uvr_lib_v5/demucs/transformer.py new file mode 100644 index 0000000000000000000000000000000000000000..f631c3fa94b2f0d65e386e34c6044527b2881dd9 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/transformer.py @@ -0,0 +1,675 @@ +# Copyright (c) 2019-present, Meta, Inc. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# First author is Simon Rouard. + +import random +import typing as tp + +import torch +import torch.nn as nn +import torch.nn.functional as F +import numpy as np +import math +from einops import rearrange + + +def create_sin_embedding(length: int, dim: int, shift: int = 0, device="cpu", max_period=10000): + # We aim for TBC format + assert dim % 2 == 0 + pos = shift + torch.arange(length, device=device).view(-1, 1, 1) + half_dim = dim // 2 + adim = torch.arange(dim // 2, device=device).view(1, 1, -1) + phase = pos / (max_period ** (adim / (half_dim - 1))) + return torch.cat([torch.cos(phase), torch.sin(phase)], dim=-1) + + +def create_2d_sin_embedding(d_model, height, width, device="cpu", max_period=10000): + """ + :param d_model: dimension of the model + :param height: height of the positions + :param width: width of the positions + :return: d_model*height*width position matrix + """ + if d_model % 4 != 0: + raise ValueError("Cannot use sin/cos positional encoding with " "odd dimension (got dim={:d})".format(d_model)) + pe = torch.zeros(d_model, height, width) + # Each dimension use half of d_model + d_model = int(d_model / 2) + div_term = torch.exp(torch.arange(0.0, d_model, 2) * -(math.log(max_period) / d_model)) + pos_w = torch.arange(0.0, width).unsqueeze(1) + pos_h = torch.arange(0.0, height).unsqueeze(1) + pe[0:d_model:2, :, :] = torch.sin(pos_w * div_term).transpose(0, 1).unsqueeze(1).repeat(1, height, 1) + pe[1:d_model:2, :, :] = torch.cos(pos_w * div_term).transpose(0, 1).unsqueeze(1).repeat(1, height, 1) + pe[d_model::2, :, :] = torch.sin(pos_h * div_term).transpose(0, 1).unsqueeze(2).repeat(1, 1, width) + pe[d_model + 1 :: 2, :, :] = torch.cos(pos_h * div_term).transpose(0, 1).unsqueeze(2).repeat(1, 1, width) + + return pe[None, :].to(device) + + +def create_sin_embedding_cape( + length: int, + dim: int, + batch_size: int, + mean_normalize: bool, + augment: bool, # True during training + max_global_shift: float = 0.0, # delta max + max_local_shift: float = 0.0, # epsilon max + max_scale: float = 1.0, + device: str = "cpu", + max_period: float = 10000.0, +): + # We aim for TBC format + assert dim % 2 == 0 + pos = 1.0 * torch.arange(length).view(-1, 1, 1) # (length, 1, 1) + pos = pos.repeat(1, batch_size, 1) # (length, batch_size, 1) + if mean_normalize: + pos -= torch.nanmean(pos, dim=0, keepdim=True) + + if augment: + delta = np.random.uniform(-max_global_shift, +max_global_shift, size=[1, batch_size, 1]) + delta_local = np.random.uniform(-max_local_shift, +max_local_shift, size=[length, batch_size, 1]) + log_lambdas = np.random.uniform(-np.log(max_scale), +np.log(max_scale), size=[1, batch_size, 1]) + pos = (pos + delta + delta_local) * np.exp(log_lambdas) + + pos = pos.to(device) + + half_dim = dim // 2 + adim = torch.arange(dim // 2, device=device).view(1, 1, -1) + phase = pos / (max_period ** (adim / (half_dim - 1))) + return torch.cat([torch.cos(phase), torch.sin(phase)], dim=-1).float() + + +def get_causal_mask(length): + pos = torch.arange(length) + return pos > pos[:, None] + + +def get_elementary_mask(T1, T2, mask_type, sparse_attn_window, global_window, mask_random_seed, sparsity, device): + """ + When the input of the Decoder has length T1 and the output T2 + The mask matrix has shape (T2, T1) + """ + assert mask_type in ["diag", "jmask", "random", "global"] + + if mask_type == "global": + mask = torch.zeros(T2, T1, dtype=torch.bool) + mask[:, :global_window] = True + line_window = int(global_window * T2 / T1) + mask[:line_window, :] = True + + if mask_type == "diag": + + mask = torch.zeros(T2, T1, dtype=torch.bool) + rows = torch.arange(T2)[:, None] + cols = (T1 / T2 * rows + torch.arange(-sparse_attn_window, sparse_attn_window + 1)).long().clamp(0, T1 - 1) + mask.scatter_(1, cols, torch.ones(1, dtype=torch.bool).expand_as(cols)) + + elif mask_type == "jmask": + mask = torch.zeros(T2 + 2, T1 + 2, dtype=torch.bool) + rows = torch.arange(T2 + 2)[:, None] + t = torch.arange(0, int((2 * T1) ** 0.5 + 1)) + t = (t * (t + 1) / 2).int() + t = torch.cat([-t.flip(0)[:-1], t]) + cols = (T1 / T2 * rows + t).long().clamp(0, T1 + 1) + mask.scatter_(1, cols, torch.ones(1, dtype=torch.bool).expand_as(cols)) + mask = mask[1:-1, 1:-1] + + elif mask_type == "random": + gene = torch.Generator(device=device) + gene.manual_seed(mask_random_seed) + mask = torch.rand(T1 * T2, generator=gene, device=device).reshape(T2, T1) > sparsity + + mask = mask.to(device) + return mask + + +def get_mask(T1, T2, mask_type, sparse_attn_window, global_window, mask_random_seed, sparsity, device): + """ + Return a SparseCSRTensor mask that is a combination of elementary masks + mask_type can be a combination of multiple masks: for instance "diag_jmask_random" + """ + from xformers.sparse import SparseCSRTensor + + # create a list + mask_types = mask_type.split("_") + + all_masks = [get_elementary_mask(T1, T2, mask, sparse_attn_window, global_window, mask_random_seed, sparsity, device) for mask in mask_types] + + final_mask = torch.stack(all_masks).sum(axis=0) > 0 + + return SparseCSRTensor.from_dense(final_mask[None]) + + +class ScaledEmbedding(nn.Module): + def __init__(self, num_embeddings: int, embedding_dim: int, scale: float = 1.0, boost: float = 3.0): + super().__init__() + self.embedding = nn.Embedding(num_embeddings, embedding_dim) + self.embedding.weight.data *= scale / boost + self.boost = boost + + @property + def weight(self): + return self.embedding.weight * self.boost + + def forward(self, x): + return self.embedding(x) * self.boost + + +class LayerScale(nn.Module): + """Layer scale from [Touvron et al 2021] (https://arxiv.org/pdf/2103.17239.pdf). + This rescales diagonaly residual outputs close to 0 initially, then learnt. + """ + + def __init__(self, channels: int, init: float = 0, channel_last=False): + """ + channel_last = False corresponds to (B, C, T) tensors + channel_last = True corresponds to (T, B, C) tensors + """ + super().__init__() + self.channel_last = channel_last + self.scale = nn.Parameter(torch.zeros(channels, requires_grad=True)) + self.scale.data[:] = init + + def forward(self, x): + if self.channel_last: + return self.scale * x + else: + return self.scale[:, None] * x + + +class MyGroupNorm(nn.GroupNorm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def forward(self, x): + """ + x: (B, T, C) + if num_groups=1: Normalisation on all T and C together for each B + """ + x = x.transpose(1, 2) + return super().forward(x).transpose(1, 2) + + +class MyTransformerEncoderLayer(nn.TransformerEncoderLayer): + def __init__( + self, + d_model, + nhead, + dim_feedforward=2048, + dropout=0.1, + activation=F.relu, + group_norm=0, + norm_first=False, + norm_out=False, + layer_norm_eps=1e-5, + layer_scale=False, + init_values=1e-4, + device=None, + dtype=None, + sparse=False, + mask_type="diag", + mask_random_seed=42, + sparse_attn_window=500, + global_window=50, + auto_sparsity=False, + sparsity=0.95, + batch_first=False, + ): + factory_kwargs = {"device": device, "dtype": dtype} + super().__init__( + d_model=d_model, + nhead=nhead, + dim_feedforward=dim_feedforward, + dropout=dropout, + activation=activation, + layer_norm_eps=layer_norm_eps, + batch_first=batch_first, + norm_first=norm_first, + device=device, + dtype=dtype, + ) + self.sparse = sparse + self.auto_sparsity = auto_sparsity + if sparse: + if not auto_sparsity: + self.mask_type = mask_type + self.sparse_attn_window = sparse_attn_window + self.global_window = global_window + self.sparsity = sparsity + if group_norm: + self.norm1 = MyGroupNorm(int(group_norm), d_model, eps=layer_norm_eps, **factory_kwargs) + self.norm2 = MyGroupNorm(int(group_norm), d_model, eps=layer_norm_eps, **factory_kwargs) + + self.norm_out = None + if self.norm_first & norm_out: + self.norm_out = MyGroupNorm(num_groups=int(norm_out), num_channels=d_model) + self.gamma_1 = LayerScale(d_model, init_values, True) if layer_scale else nn.Identity() + self.gamma_2 = LayerScale(d_model, init_values, True) if layer_scale else nn.Identity() + + if sparse: + self.self_attn = MultiheadAttention(d_model, nhead, dropout=dropout, batch_first=batch_first, auto_sparsity=sparsity if auto_sparsity else 0) + self.__setattr__("src_mask", torch.zeros(1, 1)) + self.mask_random_seed = mask_random_seed + + def forward(self, src, src_mask=None, src_key_padding_mask=None): + """ + if batch_first = False, src shape is (T, B, C) + the case where batch_first=True is not covered + """ + device = src.device + x = src + T, B, C = x.shape + if self.sparse and not self.auto_sparsity: + assert src_mask is None + src_mask = self.src_mask + if src_mask.shape[-1] != T: + src_mask = get_mask(T, T, self.mask_type, self.sparse_attn_window, self.global_window, self.mask_random_seed, self.sparsity, device) + self.__setattr__("src_mask", src_mask) + + if self.norm_first: + x = x + self.gamma_1(self._sa_block(self.norm1(x), src_mask, src_key_padding_mask)) + x = x + self.gamma_2(self._ff_block(self.norm2(x))) + + if self.norm_out: + x = self.norm_out(x) + else: + x = self.norm1(x + self.gamma_1(self._sa_block(x, src_mask, src_key_padding_mask))) + x = self.norm2(x + self.gamma_2(self._ff_block(x))) + + return x + + +class CrossTransformerEncoderLayer(nn.Module): + def __init__( + self, + d_model: int, + nhead: int, + dim_feedforward: int = 2048, + dropout: float = 0.1, + activation=F.relu, + layer_norm_eps: float = 1e-5, + layer_scale: bool = False, + init_values: float = 1e-4, + norm_first: bool = False, + group_norm: bool = False, + norm_out: bool = False, + sparse=False, + mask_type="diag", + mask_random_seed=42, + sparse_attn_window=500, + global_window=50, + sparsity=0.95, + auto_sparsity=None, + device=None, + dtype=None, + batch_first=False, + ): + factory_kwargs = {"device": device, "dtype": dtype} + super().__init__() + + self.sparse = sparse + self.auto_sparsity = auto_sparsity + if sparse: + if not auto_sparsity: + self.mask_type = mask_type + self.sparse_attn_window = sparse_attn_window + self.global_window = global_window + self.sparsity = sparsity + + self.cross_attn: nn.Module + self.cross_attn = nn.MultiheadAttention(d_model, nhead, dropout=dropout, batch_first=batch_first) + # Implementation of Feedforward model + self.linear1 = nn.Linear(d_model, dim_feedforward, **factory_kwargs) + self.dropout = nn.Dropout(dropout) + self.linear2 = nn.Linear(dim_feedforward, d_model, **factory_kwargs) + + self.norm_first = norm_first + self.norm1: nn.Module + self.norm2: nn.Module + self.norm3: nn.Module + if group_norm: + self.norm1 = MyGroupNorm(int(group_norm), d_model, eps=layer_norm_eps, **factory_kwargs) + self.norm2 = MyGroupNorm(int(group_norm), d_model, eps=layer_norm_eps, **factory_kwargs) + self.norm3 = MyGroupNorm(int(group_norm), d_model, eps=layer_norm_eps, **factory_kwargs) + else: + self.norm1 = nn.LayerNorm(d_model, eps=layer_norm_eps, **factory_kwargs) + self.norm2 = nn.LayerNorm(d_model, eps=layer_norm_eps, **factory_kwargs) + self.norm3 = nn.LayerNorm(d_model, eps=layer_norm_eps, **factory_kwargs) + + self.norm_out = None + if self.norm_first & norm_out: + self.norm_out = MyGroupNorm(num_groups=int(norm_out), num_channels=d_model) + + self.gamma_1 = LayerScale(d_model, init_values, True) if layer_scale else nn.Identity() + self.gamma_2 = LayerScale(d_model, init_values, True) if layer_scale else nn.Identity() + + self.dropout1 = nn.Dropout(dropout) + self.dropout2 = nn.Dropout(dropout) + + # Legacy string support for activation function. + if isinstance(activation, str): + self.activation = self._get_activation_fn(activation) + else: + self.activation = activation + + if sparse: + self.cross_attn = MultiheadAttention(d_model, nhead, dropout=dropout, batch_first=batch_first, auto_sparsity=sparsity if auto_sparsity else 0) + if not auto_sparsity: + self.__setattr__("mask", torch.zeros(1, 1)) + self.mask_random_seed = mask_random_seed + + def forward(self, q, k, mask=None): + """ + Args: + q: tensor of shape (T, B, C) + k: tensor of shape (S, B, C) + mask: tensor of shape (T, S) + + """ + device = q.device + T, B, C = q.shape + S, B, C = k.shape + if self.sparse and not self.auto_sparsity: + assert mask is None + mask = self.mask + if mask.shape[-1] != S or mask.shape[-2] != T: + mask = get_mask(S, T, self.mask_type, self.sparse_attn_window, self.global_window, self.mask_random_seed, self.sparsity, device) + self.__setattr__("mask", mask) + + if self.norm_first: + x = q + self.gamma_1(self._ca_block(self.norm1(q), self.norm2(k), mask)) + x = x + self.gamma_2(self._ff_block(self.norm3(x))) + if self.norm_out: + x = self.norm_out(x) + else: + x = self.norm1(q + self.gamma_1(self._ca_block(q, k, mask))) + x = self.norm2(x + self.gamma_2(self._ff_block(x))) + + return x + + # self-attention block + def _ca_block(self, q, k, attn_mask=None): + x = self.cross_attn(q, k, k, attn_mask=attn_mask, need_weights=False)[0] + return self.dropout1(x) + + # feed forward block + def _ff_block(self, x): + x = self.linear2(self.dropout(self.activation(self.linear1(x)))) + return self.dropout2(x) + + def _get_activation_fn(self, activation): + if activation == "relu": + return F.relu + elif activation == "gelu": + return F.gelu + + raise RuntimeError("activation should be relu/gelu, not {}".format(activation)) + + +# ----------------- MULTI-BLOCKS MODELS: ----------------------- + + +class CrossTransformerEncoder(nn.Module): + def __init__( + self, + dim: int, + emb: str = "sin", + hidden_scale: float = 4.0, + num_heads: int = 8, + num_layers: int = 6, + cross_first: bool = False, + dropout: float = 0.0, + max_positions: int = 1000, + norm_in: bool = True, + norm_in_group: bool = False, + group_norm: int = False, + norm_first: bool = False, + norm_out: bool = False, + max_period: float = 10000.0, + weight_decay: float = 0.0, + lr: tp.Optional[float] = None, + layer_scale: bool = False, + gelu: bool = True, + sin_random_shift: int = 0, + weight_pos_embed: float = 1.0, + cape_mean_normalize: bool = True, + cape_augment: bool = True, + cape_glob_loc_scale: list = [5000.0, 1.0, 1.4], + sparse_self_attn: bool = False, + sparse_cross_attn: bool = False, + mask_type: str = "diag", + mask_random_seed: int = 42, + sparse_attn_window: int = 500, + global_window: int = 50, + auto_sparsity: bool = False, + sparsity: float = 0.95, + ): + super().__init__() + """ + """ + assert dim % num_heads == 0 + + hidden_dim = int(dim * hidden_scale) + + self.num_layers = num_layers + # classic parity = 1 means that if idx%2 == 1 there is a + # classical encoder else there is a cross encoder + self.classic_parity = 1 if cross_first else 0 + self.emb = emb + self.max_period = max_period + self.weight_decay = weight_decay + self.weight_pos_embed = weight_pos_embed + self.sin_random_shift = sin_random_shift + if emb == "cape": + self.cape_mean_normalize = cape_mean_normalize + self.cape_augment = cape_augment + self.cape_glob_loc_scale = cape_glob_loc_scale + if emb == "scaled": + self.position_embeddings = ScaledEmbedding(max_positions, dim, scale=0.2) + + self.lr = lr + + activation: tp.Any = F.gelu if gelu else F.relu + + self.norm_in: nn.Module + self.norm_in_t: nn.Module + if norm_in: + self.norm_in = nn.LayerNorm(dim) + self.norm_in_t = nn.LayerNorm(dim) + elif norm_in_group: + self.norm_in = MyGroupNorm(int(norm_in_group), dim) + self.norm_in_t = MyGroupNorm(int(norm_in_group), dim) + else: + self.norm_in = nn.Identity() + self.norm_in_t = nn.Identity() + + # spectrogram layers + self.layers = nn.ModuleList() + # temporal layers + self.layers_t = nn.ModuleList() + + kwargs_common = { + "d_model": dim, + "nhead": num_heads, + "dim_feedforward": hidden_dim, + "dropout": dropout, + "activation": activation, + "group_norm": group_norm, + "norm_first": norm_first, + "norm_out": norm_out, + "layer_scale": layer_scale, + "mask_type": mask_type, + "mask_random_seed": mask_random_seed, + "sparse_attn_window": sparse_attn_window, + "global_window": global_window, + "sparsity": sparsity, + "auto_sparsity": auto_sparsity, + "batch_first": True, + } + + kwargs_classic_encoder = dict(kwargs_common) + kwargs_classic_encoder.update({"sparse": sparse_self_attn}) + kwargs_cross_encoder = dict(kwargs_common) + kwargs_cross_encoder.update({"sparse": sparse_cross_attn}) + + for idx in range(num_layers): + if idx % 2 == self.classic_parity: + + self.layers.append(MyTransformerEncoderLayer(**kwargs_classic_encoder)) + self.layers_t.append(MyTransformerEncoderLayer(**kwargs_classic_encoder)) + + else: + self.layers.append(CrossTransformerEncoderLayer(**kwargs_cross_encoder)) + + self.layers_t.append(CrossTransformerEncoderLayer(**kwargs_cross_encoder)) + + def forward(self, x, xt): + B, C, Fr, T1 = x.shape + pos_emb_2d = create_2d_sin_embedding(C, Fr, T1, x.device, self.max_period) # (1, C, Fr, T1) + pos_emb_2d = rearrange(pos_emb_2d, "b c fr t1 -> b (t1 fr) c") + x = rearrange(x, "b c fr t1 -> b (t1 fr) c") + x = self.norm_in(x) + x = x + self.weight_pos_embed * pos_emb_2d + + B, C, T2 = xt.shape + xt = rearrange(xt, "b c t2 -> b t2 c") # now T2, B, C + pos_emb = self._get_pos_embedding(T2, B, C, x.device) + pos_emb = rearrange(pos_emb, "t2 b c -> b t2 c") + xt = self.norm_in_t(xt) + xt = xt + self.weight_pos_embed * pos_emb + + for idx in range(self.num_layers): + if idx % 2 == self.classic_parity: + x = self.layers[idx](x) + xt = self.layers_t[idx](xt) + else: + old_x = x + x = self.layers[idx](x, xt) + xt = self.layers_t[idx](xt, old_x) + + x = rearrange(x, "b (t1 fr) c -> b c fr t1", t1=T1) + xt = rearrange(xt, "b t2 c -> b c t2") + return x, xt + + def _get_pos_embedding(self, T, B, C, device): + if self.emb == "sin": + shift = random.randrange(self.sin_random_shift + 1) + pos_emb = create_sin_embedding(T, C, shift=shift, device=device, max_period=self.max_period) + elif self.emb == "cape": + if self.training: + pos_emb = create_sin_embedding_cape( + T, + C, + B, + device=device, + max_period=self.max_period, + mean_normalize=self.cape_mean_normalize, + augment=self.cape_augment, + max_global_shift=self.cape_glob_loc_scale[0], + max_local_shift=self.cape_glob_loc_scale[1], + max_scale=self.cape_glob_loc_scale[2], + ) + else: + pos_emb = create_sin_embedding_cape(T, C, B, device=device, max_period=self.max_period, mean_normalize=self.cape_mean_normalize, augment=False) + + elif self.emb == "scaled": + pos = torch.arange(T, device=device) + pos_emb = self.position_embeddings(pos)[:, None] + + return pos_emb + + def make_optim_group(self): + group = {"params": list(self.parameters()), "weight_decay": self.weight_decay} + if self.lr is not None: + group["lr"] = self.lr + return group + + +# Attention Modules + + +class MultiheadAttention(nn.Module): + def __init__(self, embed_dim, num_heads, dropout=0.0, bias=True, add_bias_kv=False, add_zero_attn=False, kdim=None, vdim=None, batch_first=False, auto_sparsity=None): + super().__init__() + assert auto_sparsity is not None, "sanity check" + self.num_heads = num_heads + self.q = torch.nn.Linear(embed_dim, embed_dim, bias=bias) + self.k = torch.nn.Linear(embed_dim, embed_dim, bias=bias) + self.v = torch.nn.Linear(embed_dim, embed_dim, bias=bias) + self.attn_drop = torch.nn.Dropout(dropout) + self.proj = torch.nn.Linear(embed_dim, embed_dim, bias) + self.proj_drop = torch.nn.Dropout(dropout) + self.batch_first = batch_first + self.auto_sparsity = auto_sparsity + + def forward(self, query, key, value, key_padding_mask=None, need_weights=True, attn_mask=None, average_attn_weights=True): + + if not self.batch_first: # N, B, C + query = query.permute(1, 0, 2) # B, N_q, C + key = key.permute(1, 0, 2) # B, N_k, C + value = value.permute(1, 0, 2) # B, N_k, C + B, N_q, C = query.shape + B, N_k, C = key.shape + + q = self.q(query).reshape(B, N_q, self.num_heads, C // self.num_heads).permute(0, 2, 1, 3) + q = q.flatten(0, 1) + k = self.k(key).reshape(B, N_k, self.num_heads, C // self.num_heads).permute(0, 2, 1, 3) + k = k.flatten(0, 1) + v = self.v(value).reshape(B, N_k, self.num_heads, C // self.num_heads).permute(0, 2, 1, 3) + v = v.flatten(0, 1) + + if self.auto_sparsity: + assert attn_mask is None + x = dynamic_sparse_attention(q, k, v, sparsity=self.auto_sparsity) + else: + x = scaled_dot_product_attention(q, k, v, attn_mask, dropout=self.attn_drop) + x = x.reshape(B, self.num_heads, N_q, C // self.num_heads) + + x = x.transpose(1, 2).reshape(B, N_q, C) + x = self.proj(x) + x = self.proj_drop(x) + if not self.batch_first: + x = x.permute(1, 0, 2) + return x, None + + +def scaled_query_key_softmax(q, k, att_mask): + from xformers.ops import masked_matmul + + q = q / (k.size(-1)) ** 0.5 + att = masked_matmul(q, k.transpose(-2, -1), att_mask) + att = torch.nn.functional.softmax(att, -1) + return att + + +def scaled_dot_product_attention(q, k, v, att_mask, dropout): + att = scaled_query_key_softmax(q, k, att_mask=att_mask) + att = dropout(att) + y = att @ v + return y + + +def _compute_buckets(x, R): + qq = torch.einsum("btf,bfhi->bhti", x, R) + qq = torch.cat([qq, -qq], dim=-1) + buckets = qq.argmax(dim=-1) + + return buckets.permute(0, 2, 1).byte().contiguous() + + +def dynamic_sparse_attention(query, key, value, sparsity, infer_sparsity=True, attn_bias=None): + # assert False, "The code for the custom sparse kernel is not ready for release yet." + from xformers.ops import find_locations, sparse_memory_efficient_attention + + n_hashes = 32 + proj_size = 4 + query, key, value = [x.contiguous() for x in [query, key, value]] + with torch.no_grad(): + R = torch.randn(1, query.shape[-1], n_hashes, proj_size // 2, device=query.device) + bucket_query = _compute_buckets(query, R) + bucket_key = _compute_buckets(key, R) + row_offsets, column_indices = find_locations(bucket_query, bucket_key, sparsity, infer_sparsity) + return sparse_memory_efficient_attention(query, key, value, row_offsets, column_indices, attn_bias) diff --git a/audio_separator/separator/uvr_lib_v5/demucs/utils.py b/audio_separator/separator/uvr_lib_v5/demucs/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..51217aa571e0d8f7bc83633037fa0396c706e221 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/demucs/utils.py @@ -0,0 +1,496 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from collections import defaultdict +from contextlib import contextmanager +import math +import os +import tempfile +import typing as tp + +import errno +import functools +import hashlib +import inspect +import io +import os +import random +import socket +import tempfile +import warnings +import zlib + +from diffq import UniformQuantizer, DiffQuantizer +import torch as th +import tqdm +from torch import distributed +from torch.nn import functional as F + +import torch + + +def unfold(a, kernel_size, stride): + """Given input of size [*OT, T], output Tensor of size [*OT, F, K] + with K the kernel size, by extracting frames with the given stride. + + This will pad the input so that `F = ceil(T / K)`. + + see https://github.com/pytorch/pytorch/issues/60466 + """ + *shape, length = a.shape + n_frames = math.ceil(length / stride) + tgt_length = (n_frames - 1) * stride + kernel_size + a = F.pad(a, (0, tgt_length - length)) + strides = list(a.stride()) + assert strides[-1] == 1, "data should be contiguous" + strides = strides[:-1] + [stride, 1] + return a.as_strided([*shape, n_frames, kernel_size], strides) + + +def center_trim(tensor: torch.Tensor, reference: tp.Union[torch.Tensor, int]): + """ + Center trim `tensor` with respect to `reference`, along the last dimension. + `reference` can also be a number, representing the length to trim to. + If the size difference != 0 mod 2, the extra sample is removed on the right side. + """ + ref_size: int + if isinstance(reference, torch.Tensor): + ref_size = reference.size(-1) + else: + ref_size = reference + delta = tensor.size(-1) - ref_size + if delta < 0: + raise ValueError("tensor must be larger than reference. " f"Delta is {delta}.") + if delta: + tensor = tensor[..., delta // 2 : -(delta - delta // 2)] + return tensor + + +def pull_metric(history: tp.List[dict], name: str): + out = [] + for metrics in history: + metric = metrics + for part in name.split("."): + metric = metric[part] + out.append(metric) + return out + + +def EMA(beta: float = 1): + """ + Exponential Moving Average callback. + Returns a single function that can be called to repeatidly update the EMA + with a dict of metrics. The callback will return + the new averaged dict of metrics. + + Note that for `beta=1`, this is just plain averaging. + """ + fix: tp.Dict[str, float] = defaultdict(float) + total: tp.Dict[str, float] = defaultdict(float) + + def _update(metrics: dict, weight: float = 1) -> dict: + nonlocal total, fix + for key, value in metrics.items(): + total[key] = total[key] * beta + weight * float(value) + fix[key] = fix[key] * beta + weight + return {key: tot / fix[key] for key, tot in total.items()} + + return _update + + +def sizeof_fmt(num: float, suffix: str = "B"): + """ + Given `num` bytes, return human readable size. + Taken from https://stackoverflow.com/a/1094933 + """ + for unit in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]: + if abs(num) < 1024.0: + return "%3.1f%s%s" % (num, unit, suffix) + num /= 1024.0 + return "%.1f%s%s" % (num, "Yi", suffix) + + +@contextmanager +def temp_filenames(count: int, delete=True): + names = [] + try: + for _ in range(count): + names.append(tempfile.NamedTemporaryFile(delete=False).name) + yield names + finally: + if delete: + for name in names: + os.unlink(name) + + +def average_metric(metric, count=1.0): + """ + Average `metric` which should be a float across all hosts. `count` should be + the weight for this particular host (i.e. number of examples). + """ + metric = th.tensor([count, count * metric], dtype=th.float32, device="cuda") + distributed.all_reduce(metric, op=distributed.ReduceOp.SUM) + return metric[1].item() / metric[0].item() + + +def free_port(host="", low=20000, high=40000): + """ + Return a port number that is most likely free. + This could suffer from a race condition although + it should be quite rare. + """ + sock = socket.socket() + while True: + port = random.randint(low, high) + try: + sock.bind((host, port)) + except OSError as error: + if error.errno == errno.EADDRINUSE: + continue + raise + return port + + +def sizeof_fmt(num, suffix="B"): + """ + Given `num` bytes, return human readable size. + Taken from https://stackoverflow.com/a/1094933 + """ + for unit in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]: + if abs(num) < 1024.0: + return "%3.1f%s%s" % (num, unit, suffix) + num /= 1024.0 + return "%.1f%s%s" % (num, "Yi", suffix) + + +def human_seconds(seconds, display=".2f"): + """ + Given `seconds` seconds, return human readable duration. + """ + value = seconds * 1e6 + ratios = [1e3, 1e3, 60, 60, 24] + names = ["us", "ms", "s", "min", "hrs", "days"] + last = names.pop(0) + for name, ratio in zip(names, ratios): + if value / ratio < 0.3: + break + value /= ratio + last = name + return f"{format(value, display)} {last}" + + +class TensorChunk: + def __init__(self, tensor, offset=0, length=None): + total_length = tensor.shape[-1] + assert offset >= 0 + assert offset < total_length + + if length is None: + length = total_length - offset + else: + length = min(total_length - offset, length) + + self.tensor = tensor + self.offset = offset + self.length = length + self.device = tensor.device + + @property + def shape(self): + shape = list(self.tensor.shape) + shape[-1] = self.length + return shape + + def padded(self, target_length): + delta = target_length - self.length + total_length = self.tensor.shape[-1] + assert delta >= 0 + + start = self.offset - delta // 2 + end = start + target_length + + correct_start = max(0, start) + correct_end = min(total_length, end) + + pad_left = correct_start - start + pad_right = end - correct_end + + out = F.pad(self.tensor[..., correct_start:correct_end], (pad_left, pad_right)) + assert out.shape[-1] == target_length + return out + + +def tensor_chunk(tensor_or_chunk): + if isinstance(tensor_or_chunk, TensorChunk): + return tensor_or_chunk + else: + assert isinstance(tensor_or_chunk, th.Tensor) + return TensorChunk(tensor_or_chunk) + + +def apply_model_v1(model, mix, shifts=None, split=False, progress=False, set_progress_bar=None): + """ + Apply model to a given mixture. + + Args: + shifts (int): if > 0, will shift in time `mix` by a random amount between 0 and 0.5 sec + and apply the oppositve shift to the output. This is repeated `shifts` time and + all predictions are averaged. This effectively makes the model time equivariant + and improves SDR by up to 0.2 points. + split (bool): if True, the input will be broken down in 8 seconds extracts + and predictions will be performed individually on each and concatenated. + Useful for model with large memory footprint like Tasnet. + progress (bool): if True, show a progress bar (requires split=True) + """ + + channels, length = mix.size() + device = mix.device + progress_value = 0 + + if split: + out = th.zeros(4, channels, length, device=device) + shift = model.samplerate * 10 + offsets = range(0, length, shift) + scale = 10 + if progress: + offsets = tqdm.tqdm(offsets, unit_scale=scale, ncols=120, unit="seconds") + for offset in offsets: + chunk = mix[..., offset : offset + shift] + if set_progress_bar: + progress_value += 1 + set_progress_bar(0.1, (0.8 / len(offsets) * progress_value)) + chunk_out = apply_model_v1(model, chunk, shifts=shifts, set_progress_bar=set_progress_bar) + else: + chunk_out = apply_model_v1(model, chunk, shifts=shifts) + out[..., offset : offset + shift] = chunk_out + offset += shift + return out + elif shifts: + max_shift = int(model.samplerate / 2) + mix = F.pad(mix, (max_shift, max_shift)) + offsets = list(range(max_shift)) + random.shuffle(offsets) + out = 0 + for offset in offsets[:shifts]: + shifted = mix[..., offset : offset + length + max_shift] + if set_progress_bar: + shifted_out = apply_model_v1(model, shifted, set_progress_bar=set_progress_bar) + else: + shifted_out = apply_model_v1(model, shifted) + out += shifted_out[..., max_shift - offset : max_shift - offset + length] + out /= shifts + return out + else: + valid_length = model.valid_length(length) + delta = valid_length - length + padded = F.pad(mix, (delta // 2, delta - delta // 2)) + with th.no_grad(): + out = model(padded.unsqueeze(0))[0] + return center_trim(out, mix) + + +def apply_model_v2(model, mix, shifts=None, split=False, overlap=0.25, transition_power=1.0, progress=False, set_progress_bar=None): + """ + Apply model to a given mixture. + + Args: + shifts (int): if > 0, will shift in time `mix` by a random amount between 0 and 0.5 sec + and apply the oppositve shift to the output. This is repeated `shifts` time and + all predictions are averaged. This effectively makes the model time equivariant + and improves SDR by up to 0.2 points. + split (bool): if True, the input will be broken down in 8 seconds extracts + and predictions will be performed individually on each and concatenated. + Useful for model with large memory footprint like Tasnet. + progress (bool): if True, show a progress bar (requires split=True) + """ + + assert transition_power >= 1, "transition_power < 1 leads to weird behavior." + device = mix.device + channels, length = mix.shape + progress_value = 0 + + if split: + out = th.zeros(len(model.sources), channels, length, device=device) + sum_weight = th.zeros(length, device=device) + segment = model.segment_length + stride = int((1 - overlap) * segment) + offsets = range(0, length, stride) + scale = stride / model.samplerate + if progress: + offsets = tqdm.tqdm(offsets, unit_scale=scale, ncols=120, unit="seconds") + # We start from a triangle shaped weight, with maximal weight in the middle + # of the segment. Then we normalize and take to the power `transition_power`. + # Large values of transition power will lead to sharper transitions. + weight = th.cat([th.arange(1, segment // 2 + 1), th.arange(segment - segment // 2, 0, -1)]).to(device) + assert len(weight) == segment + # If the overlap < 50%, this will translate to linear transition when + # transition_power is 1. + weight = (weight / weight.max()) ** transition_power + for offset in offsets: + chunk = TensorChunk(mix, offset, segment) + if set_progress_bar: + progress_value += 1 + set_progress_bar(0.1, (0.8 / len(offsets) * progress_value)) + chunk_out = apply_model_v2(model, chunk, shifts=shifts, set_progress_bar=set_progress_bar) + else: + chunk_out = apply_model_v2(model, chunk, shifts=shifts) + chunk_length = chunk_out.shape[-1] + out[..., offset : offset + segment] += weight[:chunk_length] * chunk_out + sum_weight[offset : offset + segment] += weight[:chunk_length] + offset += segment + assert sum_weight.min() > 0 + out /= sum_weight + return out + elif shifts: + max_shift = int(0.5 * model.samplerate) + mix = tensor_chunk(mix) + padded_mix = mix.padded(length + 2 * max_shift) + out = 0 + for _ in range(shifts): + offset = random.randint(0, max_shift) + shifted = TensorChunk(padded_mix, offset, length + max_shift - offset) + + if set_progress_bar: + progress_value += 1 + shifted_out = apply_model_v2(model, shifted, set_progress_bar=set_progress_bar) + else: + shifted_out = apply_model_v2(model, shifted) + out += shifted_out[..., max_shift - offset :] + out /= shifts + return out + else: + valid_length = model.valid_length(length) + mix = tensor_chunk(mix) + padded_mix = mix.padded(valid_length) + with th.no_grad(): + out = model(padded_mix.unsqueeze(0))[0] + return center_trim(out, length) + + +@contextmanager +def temp_filenames(count, delete=True): + names = [] + try: + for _ in range(count): + names.append(tempfile.NamedTemporaryFile(delete=False).name) + yield names + finally: + if delete: + for name in names: + os.unlink(name) + + +def get_quantizer(model, args, optimizer=None): + quantizer = None + if args.diffq: + quantizer = DiffQuantizer(model, min_size=args.q_min_size, group_size=8) + if optimizer is not None: + quantizer.setup_optimizer(optimizer) + elif args.qat: + quantizer = UniformQuantizer(model, bits=args.qat, min_size=args.q_min_size) + return quantizer + + +def load_model(path, strict=False): + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + load_from = path + package = th.load(load_from, "cpu") + + klass = package["klass"] + args = package["args"] + kwargs = package["kwargs"] + + if strict: + model = klass(*args, **kwargs) + else: + sig = inspect.signature(klass) + for key in list(kwargs): + if key not in sig.parameters: + warnings.warn("Dropping inexistant parameter " + key) + del kwargs[key] + model = klass(*args, **kwargs) + + state = package["state"] + training_args = package["training_args"] + quantizer = get_quantizer(model, training_args) + + set_state(model, quantizer, state) + return model + + +def get_state(model, quantizer): + if quantizer is None: + state = {k: p.data.to("cpu") for k, p in model.state_dict().items()} + else: + state = quantizer.get_quantized_state() + buf = io.BytesIO() + th.save(state, buf) + state = {"compressed": zlib.compress(buf.getvalue())} + return state + + +def set_state(model, quantizer, state): + if quantizer is None: + model.load_state_dict(state) + else: + buf = io.BytesIO(zlib.decompress(state["compressed"])) + state = th.load(buf, "cpu") + quantizer.restore_quantized_state(state) + + return state + + +def save_state(state, path): + buf = io.BytesIO() + th.save(state, buf) + sig = hashlib.sha256(buf.getvalue()).hexdigest()[:8] + + path = path.parent / (path.stem + "-" + sig + path.suffix) + path.write_bytes(buf.getvalue()) + + +def save_model(model, quantizer, training_args, path): + args, kwargs = model._init_args_kwargs + klass = model.__class__ + + state = get_state(model, quantizer) + + save_to = path + package = {"klass": klass, "args": args, "kwargs": kwargs, "state": state, "training_args": training_args} + th.save(package, save_to) + + +def capture_init(init): + @functools.wraps(init) + def __init__(self, *args, **kwargs): + self._init_args_kwargs = (args, kwargs) + init(self, *args, **kwargs) + + return __init__ + + +class DummyPoolExecutor: + class DummyResult: + def __init__(self, func, *args, **kwargs): + self.func = func + self.args = args + self.kwargs = kwargs + + def result(self): + return self.func(*self.args, **self.kwargs) + + def __init__(self, workers=0): + pass + + def submit(self, func, *args, **kwargs): + return DummyPoolExecutor.DummyResult(func, *args, **kwargs) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, exc_tb): + return diff --git a/audio_separator/separator/uvr_lib_v5/mdxnet.py b/audio_separator/separator/uvr_lib_v5/mdxnet.py new file mode 100644 index 0000000000000000000000000000000000000000..3293c89f08067e06cb02656f147987a32214e40d --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/mdxnet.py @@ -0,0 +1,136 @@ +import torch +import torch.nn as nn +from .modules import TFC_TDF +from pytorch_lightning import LightningModule + +dim_s = 4 + +class AbstractMDXNet(LightningModule): + def __init__(self, target_name, lr, optimizer, dim_c, dim_f, dim_t, n_fft, hop_length, overlap): + super().__init__() + self.target_name = target_name + self.lr = lr + self.optimizer = optimizer + self.dim_c = dim_c + self.dim_f = dim_f + self.dim_t = dim_t + self.n_fft = n_fft + self.n_bins = n_fft // 2 + 1 + self.hop_length = hop_length + self.window = nn.Parameter(torch.hann_window(window_length=self.n_fft, periodic=True), requires_grad=False) + self.freq_pad = nn.Parameter(torch.zeros([1, dim_c, self.n_bins - self.dim_f, self.dim_t]), requires_grad=False) + + def get_optimizer(self): + if self.optimizer == 'rmsprop': + return torch.optim.RMSprop(self.parameters(), self.lr) + + if self.optimizer == 'adamw': + return torch.optim.AdamW(self.parameters(), self.lr) + +class ConvTDFNet(AbstractMDXNet): + def __init__(self, target_name, lr, optimizer, dim_c, dim_f, dim_t, n_fft, hop_length, + num_blocks, l, g, k, bn, bias, overlap): + + super(ConvTDFNet, self).__init__( + target_name, lr, optimizer, dim_c, dim_f, dim_t, n_fft, hop_length, overlap) + #self.save_hyperparameters() + + self.num_blocks = num_blocks + self.l = l + self.g = g + self.k = k + self.bn = bn + self.bias = bias + + if optimizer == 'rmsprop': + norm = nn.BatchNorm2d + + if optimizer == 'adamw': + norm = lambda input:nn.GroupNorm(2, input) + + self.n = num_blocks // 2 + scale = (2, 2) + + self.first_conv = nn.Sequential( + nn.Conv2d(in_channels=self.dim_c, out_channels=g, kernel_size=(1, 1)), + norm(g), + nn.ReLU(), + ) + + f = self.dim_f + c = g + self.encoding_blocks = nn.ModuleList() + self.ds = nn.ModuleList() + for i in range(self.n): + self.encoding_blocks.append(TFC_TDF(c, l, f, k, bn, bias=bias, norm=norm)) + self.ds.append( + nn.Sequential( + nn.Conv2d(in_channels=c, out_channels=c + g, kernel_size=scale, stride=scale), + norm(c + g), + nn.ReLU() + ) + ) + f = f // 2 + c += g + + self.bottleneck_block = TFC_TDF(c, l, f, k, bn, bias=bias, norm=norm) + + self.decoding_blocks = nn.ModuleList() + self.us = nn.ModuleList() + for i in range(self.n): + self.us.append( + nn.Sequential( + nn.ConvTranspose2d(in_channels=c, out_channels=c - g, kernel_size=scale, stride=scale), + norm(c - g), + nn.ReLU() + ) + ) + f = f * 2 + c -= g + + self.decoding_blocks.append(TFC_TDF(c, l, f, k, bn, bias=bias, norm=norm)) + + self.final_conv = nn.Sequential( + nn.Conv2d(in_channels=c, out_channels=self.dim_c, kernel_size=(1, 1)), + ) + + def forward(self, x): + + x = self.first_conv(x) + + x = x.transpose(-1, -2) + + ds_outputs = [] + for i in range(self.n): + x = self.encoding_blocks[i](x) + ds_outputs.append(x) + x = self.ds[i](x) + + x = self.bottleneck_block(x) + + for i in range(self.n): + x = self.us[i](x) + x *= ds_outputs[-i - 1] + x = self.decoding_blocks[i](x) + + x = x.transpose(-1, -2) + + x = self.final_conv(x) + + return x + +class Mixer(nn.Module): + def __init__(self, device, mixer_path): + + super(Mixer, self).__init__() + + self.linear = nn.Linear((dim_s+1)*2, dim_s*2, bias=False) + + self.load_state_dict( + torch.load(mixer_path, map_location=device) + ) + + def forward(self, x): + x = x.reshape(1,(dim_s+1)*2,-1).transpose(-1,-2) + x = self.linear(x) + return x.transpose(-1,-2).reshape(dim_s,2,-1) \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/mixer.ckpt b/audio_separator/separator/uvr_lib_v5/mixer.ckpt new file mode 100644 index 0000000000000000000000000000000000000000..29b4612c8173cc88b9f9def198933e7a49d4cf92 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/mixer.ckpt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea781bd52c6a523b825fa6cdbb6189f52e318edd8b17e6fe404f76f7af8caa9c +size 1208 diff --git a/audio_separator/separator/uvr_lib_v5/modules.py b/audio_separator/separator/uvr_lib_v5/modules.py new file mode 100644 index 0000000000000000000000000000000000000000..4e77d2fb5b97c4ca0e6f6011e012f43e03a70b14 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/modules.py @@ -0,0 +1,74 @@ +import torch +import torch.nn as nn + + +class TFC(nn.Module): + def __init__(self, c, l, k, norm): + super(TFC, self).__init__() + + self.H = nn.ModuleList() + for i in range(l): + self.H.append( + nn.Sequential( + nn.Conv2d(in_channels=c, out_channels=c, kernel_size=k, stride=1, padding=k // 2), + norm(c), + nn.ReLU(), + ) + ) + + def forward(self, x): + for h in self.H: + x = h(x) + return x + + +class DenseTFC(nn.Module): + def __init__(self, c, l, k, norm): + super(DenseTFC, self).__init__() + + self.conv = nn.ModuleList() + for i in range(l): + self.conv.append( + nn.Sequential( + nn.Conv2d(in_channels=c, out_channels=c, kernel_size=k, stride=1, padding=k // 2), + norm(c), + nn.ReLU(), + ) + ) + + def forward(self, x): + for layer in self.conv[:-1]: + x = torch.cat([layer(x), x], 1) + return self.conv[-1](x) + + +class TFC_TDF(nn.Module): + def __init__(self, c, l, f, k, bn, dense=False, bias=True, norm=nn.BatchNorm2d): + + super(TFC_TDF, self).__init__() + + self.use_tdf = bn is not None + + self.tfc = DenseTFC(c, l, k, norm) if dense else TFC(c, l, k, norm) + + if self.use_tdf: + if bn == 0: + self.tdf = nn.Sequential( + nn.Linear(f, f, bias=bias), + norm(c), + nn.ReLU() + ) + else: + self.tdf = nn.Sequential( + nn.Linear(f, f // bn, bias=bias), + norm(c), + nn.ReLU(), + nn.Linear(f // bn, f, bias=bias), + norm(c), + nn.ReLU() + ) + + def forward(self, x): + x = self.tfc(x) + return x + self.tdf(x) if self.use_tdf else x + diff --git a/audio_separator/separator/uvr_lib_v5/playsound.py b/audio_separator/separator/uvr_lib_v5/playsound.py new file mode 100644 index 0000000000000000000000000000000000000000..96baff6861a9c0d3be74ae44d6f1ab0b8c524db5 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/playsound.py @@ -0,0 +1,241 @@ +import logging +logger = logging.getLogger(__name__) + +class PlaysoundException(Exception): + pass + +def _canonicalizePath(path): + """ + Support passing in a pathlib.Path-like object by converting to str. + """ + import sys + if sys.version_info[0] >= 3: + return str(path) + else: + # On earlier Python versions, str is a byte string, so attempting to + # convert a unicode string to str will fail. Leave it alone in this case. + return path + +def _playsoundWin(sound, block = True): + ''' + Utilizes windll.winmm. Tested and known to work with MP3 and WAVE on + Windows 7 with Python 2.7. Probably works with more file formats. + Probably works on Windows XP thru Windows 10. Probably works with all + versions of Python. + + Inspired by (but not copied from) Michael Gundlach 's mp3play: + https://github.com/michaelgundlach/mp3play + + I never would have tried using windll.winmm without seeing his code. + ''' + sound = '"' + _canonicalizePath(sound) + '"' + + from ctypes import create_unicode_buffer, windll, wintypes + windll.winmm.mciSendStringW.argtypes = [wintypes.LPCWSTR, wintypes.LPWSTR, wintypes.UINT, wintypes.HANDLE] + windll.winmm.mciGetErrorStringW.argtypes = [wintypes.DWORD, wintypes.LPWSTR, wintypes.UINT] + + def winCommand(*command): + bufLen = 600 + buf = create_unicode_buffer(bufLen) + command = ' '.join(command) + errorCode = int(windll.winmm.mciSendStringW(command, buf, bufLen - 1, 0)) # use widestring version of the function + if errorCode: + errorBuffer = create_unicode_buffer(bufLen) + windll.winmm.mciGetErrorStringW(errorCode, errorBuffer, bufLen - 1) # use widestring version of the function + exceptionMessage = ('\n Error ' + str(errorCode) + ' for command:' + '\n ' + command + + '\n ' + errorBuffer.value) + logger.error(exceptionMessage) + raise PlaysoundException(exceptionMessage) + return buf.value + + try: + logger.debug('Starting') + winCommand(u'open {}'.format(sound)) + winCommand(u'play {}{}'.format(sound, ' wait' if block else '')) + logger.debug('Returning') + finally: + try: + winCommand(u'close {}'.format(sound)) + except PlaysoundException: + logger.warning(u'Failed to close the file: {}'.format(sound)) + # If it fails, there's nothing more that can be done... + pass + +def _handlePathOSX(sound): + sound = _canonicalizePath(sound) + + if '://' not in sound: + if not sound.startswith('/'): + from os import getcwd + sound = getcwd() + '/' + sound + sound = 'file://' + sound + + try: + # Don't double-encode it. + sound.encode('ascii') + return sound.replace(' ', '%20') + except UnicodeEncodeError: + try: + from urllib.parse import quote # Try the Python 3 import first... + except ImportError: + from urllib import quote # Try using the Python 2 import before giving up entirely... + + parts = sound.split('://', 1) + return parts[0] + '://' + quote(parts[1].encode('utf-8')).replace(' ', '%20') + + +def _playsoundOSX(sound, block = True): + ''' + Utilizes AppKit.NSSound. Tested and known to work with MP3 and WAVE on + OS X 10.11 with Python 2.7. Probably works with anything QuickTime supports. + Probably works on OS X 10.5 and newer. Probably works with all versions of + Python. + + Inspired by (but not copied from) Aaron's Stack Overflow answer here: + http://stackoverflow.com/a/34568298/901641 + + I never would have tried using AppKit.NSSound without seeing his code. + ''' + try: + from AppKit import NSSound + except ImportError: + logger.warning("playsound could not find a copy of AppKit - falling back to using macOS's system copy.") + sys.path.append('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC') + from AppKit import NSSound + + from Foundation import NSURL + from time import sleep + + sound = _handlePathOSX(sound) + url = NSURL.URLWithString_(sound) + if not url: + raise PlaysoundException('Cannot find a sound with filename: ' + sound) + + for i in range(5): + nssound = NSSound.alloc().initWithContentsOfURL_byReference_(url, True) + if nssound: + break + else: + logger.debug('Failed to load sound, although url was good... ' + sound) + else: + raise PlaysoundException('Could not load sound with filename, although URL was good... ' + sound) + nssound.play() + + if block: + sleep(nssound.duration()) + +def _playsoundNix(sound, block = True): + """Play a sound using GStreamer. + + Inspired by this: + https://gstreamer.freedesktop.org/documentation/tutorials/playback/playbin-usage.html + """ + sound = _canonicalizePath(sound) + + # pathname2url escapes non-URL-safe characters + from os.path import abspath, exists + try: + from urllib.request import pathname2url + except ImportError: + # python 2 + from urllib import pathname2url + + import gi + gi.require_version('Gst', '1.0') + from gi.repository import Gst + + Gst.init(None) + + playbin = Gst.ElementFactory.make('playbin', 'playbin') + if sound.startswith(('http://', 'https://')): + playbin.props.uri = sound + else: + path = abspath(sound) + if not exists(path): + raise PlaysoundException(u'File not found: {}'.format(path)) + playbin.props.uri = 'file://' + pathname2url(path) + + + set_result = playbin.set_state(Gst.State.PLAYING) + if set_result != Gst.StateChangeReturn.ASYNC: + raise PlaysoundException( + "playbin.set_state returned " + repr(set_result)) + + # FIXME: use some other bus method than poll() with block=False + # https://lazka.github.io/pgi-docs/#Gst-1.0/classes/Bus.html + logger.debug('Starting play') + if block: + bus = playbin.get_bus() + try: + bus.poll(Gst.MessageType.EOS, Gst.CLOCK_TIME_NONE) + finally: + playbin.set_state(Gst.State.NULL) + + logger.debug('Finishing play') + +def _playsoundAnotherPython(otherPython, sound, block = True, macOS = False): + ''' + Mostly written so that when this is run on python3 on macOS, it can invoke + python2 on macOS... but maybe this idea could be useful on linux, too. + ''' + from inspect import getsourcefile + from os.path import abspath, exists + from subprocess import check_call + from threading import Thread + + sound = _canonicalizePath(sound) + + class PropogatingThread(Thread): + def run(self): + self.exc = None + try: + self.ret = self._target(*self._args, **self._kwargs) + except BaseException as e: + self.exc = e + + def join(self, timeout = None): + super().join(timeout) + if self.exc: + raise self.exc + return self.ret + + # Check if the file exists... + if not exists(abspath(sound)): + raise PlaysoundException('Cannot find a sound with filename: ' + sound) + + playsoundPath = abspath(getsourcefile(lambda: 0)) + t = PropogatingThread(target = lambda: check_call([otherPython, playsoundPath, _handlePathOSX(sound) if macOS else sound])) + t.start() + if block: + t.join() + +from platform import system +system = system() + +if system == 'Windows': + playsound_func = _playsoundWin +elif system == 'Darwin': + playsound_func = _playsoundOSX + import sys + if sys.version_info[0] > 2: + try: + from AppKit import NSSound + except ImportError: + logger.warning("playsound is relying on a python 2 subprocess. Please use `pip3 install PyObjC` if you want playsound to run more efficiently.") + playsound_func = lambda sound, block = True: _playsoundAnotherPython('/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python', sound, block, macOS = True) +else: + playsound_func = _playsoundNix + if __name__ != '__main__': # Ensure we don't infinitely recurse trying to get another python instance. + try: + import gi + gi.require_version('Gst', '1.0') + from gi.repository import Gst + except: + logger.warning("playsound is relying on another python subprocess. Please use `pip install pygobject` if you want playsound to run more efficiently.") + playsound_func = lambda sound, block = True: _playsoundAnotherPython('/usr/bin/python3', sound, block, macOS = False) + +del system + +def play(audio_filepath): + playsound_func(audio_filepath) diff --git a/audio_separator/separator/uvr_lib_v5/pyrb.py b/audio_separator/separator/uvr_lib_v5/pyrb.py new file mode 100644 index 0000000000000000000000000000000000000000..883a525ee28351b2d99f674dcc721af3f852f87f --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/pyrb.py @@ -0,0 +1,92 @@ +import os +import subprocess +import tempfile +import six +import numpy as np +import soundfile as sf +import sys + +if getattr(sys, 'frozen', False): + BASE_PATH_RUB = sys._MEIPASS +else: + BASE_PATH_RUB = os.path.dirname(os.path.abspath(__file__)) + +__all__ = ['time_stretch', 'pitch_shift'] + +__RUBBERBAND_UTIL = os.path.join(BASE_PATH_RUB, 'rubberband') + +if six.PY2: + DEVNULL = open(os.devnull, 'w') +else: + DEVNULL = subprocess.DEVNULL + +def __rubberband(y, sr, **kwargs): + + assert sr > 0 + + # Get the input and output tempfile + fd, infile = tempfile.mkstemp(suffix='.wav') + os.close(fd) + fd, outfile = tempfile.mkstemp(suffix='.wav') + os.close(fd) + + # dump the audio + sf.write(infile, y, sr) + + try: + # Execute rubberband + arguments = [__RUBBERBAND_UTIL, '-q'] + + for key, value in six.iteritems(kwargs): + arguments.append(str(key)) + arguments.append(str(value)) + + arguments.extend([infile, outfile]) + + subprocess.check_call(arguments, stdout=DEVNULL, stderr=DEVNULL) + + # Load the processed audio. + y_out, _ = sf.read(outfile, always_2d=True) + + # make sure that output dimensions matches input + if y.ndim == 1: + y_out = np.squeeze(y_out) + + except OSError as exc: + six.raise_from(RuntimeError('Failed to execute rubberband. ' + 'Please verify that rubberband-cli ' + 'is installed.'), + exc) + + finally: + # Remove temp files + os.unlink(infile) + os.unlink(outfile) + + return y_out + +def time_stretch(y, sr, rate, rbargs=None): + if rate <= 0: + raise ValueError('rate must be strictly positive') + + if rate == 1.0: + return y + + if rbargs is None: + rbargs = dict() + + rbargs.setdefault('--tempo', rate) + + return __rubberband(y, sr, **rbargs) + +def pitch_shift(y, sr, n_steps, rbargs=None): + + if n_steps == 0: + return y + + if rbargs is None: + rbargs = dict() + + rbargs.setdefault('--pitch', n_steps) + + return __rubberband(y, sr, **rbargs) diff --git a/audio_separator/separator/uvr_lib_v5/results.py b/audio_separator/separator/uvr_lib_v5/results.py new file mode 100644 index 0000000000000000000000000000000000000000..476f2d1ef420e97b7a8a9d0f1416eb8d99a1fdb2 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/results.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +""" +Matchering - Audio Matching and Mastering Python Library +Copyright (C) 2016-2022 Sergree + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + +import os +import soundfile as sf + + +class Result: + def __init__( + self, file: str, subtype: str, use_limiter: bool = True, normalize: bool = True + ): + _, file_ext = os.path.splitext(file) + file_ext = file_ext[1:].upper() + if not sf.check_format(file_ext): + raise TypeError(f"{file_ext} format is not supported") + if not sf.check_format(file_ext, subtype): + raise TypeError(f"{file_ext} format does not have {subtype} subtype") + self.file = file + self.subtype = subtype + self.use_limiter = use_limiter + self.normalize = normalize + + +def pcm16(file: str) -> Result: + return Result(file, "PCM_16") + +def pcm24(file: str) -> Result: + return Result(file, "FLOAT") + +def save_audiofile(file: str, wav_set="PCM_16") -> Result: + return Result(file, wav_set) diff --git a/audio_separator/separator/uvr_lib_v5/roformer/attend.py b/audio_separator/separator/uvr_lib_v5/roformer/attend.py new file mode 100644 index 0000000000000000000000000000000000000000..cc01093790e51a09da8d125692bf3887b97a3549 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/roformer/attend.py @@ -0,0 +1,112 @@ +from functools import wraps +from packaging import version +from collections import namedtuple + +import torch +from torch import nn, einsum +import torch.nn.functional as F + +from einops import rearrange, reduce + +# constants + +FlashAttentionConfig = namedtuple("FlashAttentionConfig", ["enable_flash", "enable_math", "enable_mem_efficient"]) + +# helpers + + +def exists(val): + return val is not None + + +def once(fn): + called = False + + @wraps(fn) + def inner(x): + nonlocal called + if called: + return + called = True + return fn(x) + + return inner + + +print_once = once(print) + +# main class + + +class Attend(nn.Module): + def __init__(self, dropout=0.0, flash=False): + super().__init__() + self.dropout = dropout + self.attn_dropout = nn.Dropout(dropout) + + self.flash = flash + assert not (flash and version.parse(torch.__version__) < version.parse("2.0.0")), "in order to use flash attention, you must be using pytorch 2.0 or above" + + # determine efficient attention configs for cuda and cpu + + self.cpu_config = FlashAttentionConfig(True, True, True) + self.cuda_config = None + + if not torch.cuda.is_available() or not flash: + return + + device_properties = torch.cuda.get_device_properties(torch.device("cuda")) + + if device_properties.major == 8 and device_properties.minor == 0: + print_once("A100 GPU detected, using flash attention if input tensor is on cuda") + self.cuda_config = FlashAttentionConfig(True, False, False) + else: + self.cuda_config = FlashAttentionConfig(False, True, True) + + def flash_attn(self, q, k, v): + _, heads, q_len, _, k_len, is_cuda, device = *q.shape, k.shape[-2], q.is_cuda, q.device + + # Check if there is a compatible device for flash attention + + config = self.cuda_config if is_cuda else self.cpu_config + + # sdpa_flash kernel only supports float16 on sm80+ architecture gpu + if is_cuda and q.dtype != torch.float16: + config = FlashAttentionConfig(False, True, True) + + # pytorch 2.0 flash attn: q, k, v, mask, dropout, softmax_scale + with torch.backends.cuda.sdp_kernel(**config._asdict()): + out = F.scaled_dot_product_attention(q, k, v, dropout_p=self.dropout if self.training else 0.0) + + return out + + def forward(self, q, k, v): + """ + einstein notation + b - batch + h - heads + n, i, j - sequence length (base sequence length, source, target) + d - feature dimension + """ + + q_len, k_len, device = q.shape[-2], k.shape[-2], q.device + + scale = q.shape[-1] ** -0.5 + + if self.flash: + return self.flash_attn(q, k, v) + + # similarity + + sim = einsum(f"b h i d, b h j d -> b h i j", q, k) * scale + + # attention + + attn = sim.softmax(dim=-1) + attn = self.attn_dropout(attn) + + # aggregate values + + out = einsum(f"b h i j, b h j d -> b h i d", attn, v) + + return out diff --git a/audio_separator/separator/uvr_lib_v5/roformer/bs_roformer.py b/audio_separator/separator/uvr_lib_v5/roformer/bs_roformer.py new file mode 100644 index 0000000000000000000000000000000000000000..2677924697ee6f9444da4527cd58b5f62fc7f54a --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/roformer/bs_roformer.py @@ -0,0 +1,535 @@ +from functools import partial + +import torch +from torch import nn, einsum, Tensor +from torch.nn import Module, ModuleList +import torch.nn.functional as F + +from .attend import Attend + +from beartype.typing import Tuple, Optional, List, Callable +from beartype import beartype + +from rotary_embedding_torch import RotaryEmbedding + +from einops import rearrange, pack, unpack +from einops.layers.torch import Rearrange + +# helper functions + + +def exists(val): + return val is not None + + +def default(v, d): + return v if exists(v) else d + + +def pack_one(t, pattern): + return pack([t], pattern) + + +def unpack_one(t, ps, pattern): + return unpack(t, ps, pattern)[0] + + +# norm + + +def l2norm(t): + return F.normalize(t, dim=-1, p=2) + + +class RMSNorm(Module): + def __init__(self, dim): + super().__init__() + self.scale = dim**0.5 + self.gamma = nn.Parameter(torch.ones(dim)) + + def forward(self, x): + x = x.to(self.gamma.device) + return F.normalize(x, dim=-1) * self.scale * self.gamma + + +# attention + + +class FeedForward(Module): + def __init__(self, dim, mult=4, dropout=0.0): + super().__init__() + dim_inner = int(dim * mult) + self.net = nn.Sequential(RMSNorm(dim), nn.Linear(dim, dim_inner), nn.GELU(), nn.Dropout(dropout), nn.Linear(dim_inner, dim), nn.Dropout(dropout)) + + def forward(self, x): + return self.net(x) + + +class Attention(Module): + def __init__(self, dim, heads=8, dim_head=64, dropout=0.0, rotary_embed=None, flash=True): + super().__init__() + self.heads = heads + self.scale = dim_head**-0.5 + dim_inner = heads * dim_head + + self.rotary_embed = rotary_embed + + self.attend = Attend(flash=flash, dropout=dropout) + + self.norm = RMSNorm(dim) + self.to_qkv = nn.Linear(dim, dim_inner * 3, bias=False) + + self.to_gates = nn.Linear(dim, heads) + + self.to_out = nn.Sequential(nn.Linear(dim_inner, dim, bias=False), nn.Dropout(dropout)) + + def forward(self, x): + x = self.norm(x) + + q, k, v = rearrange(self.to_qkv(x), "b n (qkv h d) -> qkv b h n d", qkv=3, h=self.heads) + + if exists(self.rotary_embed): + q = self.rotary_embed.rotate_queries_or_keys(q) + k = self.rotary_embed.rotate_queries_or_keys(k) + + out = self.attend(q, k, v) + + gates = self.to_gates(x) + out = out * rearrange(gates, "b n h -> b h n 1").sigmoid() + + out = rearrange(out, "b h n d -> b n (h d)") + return self.to_out(out) + + +class LinearAttention(Module): + """ + this flavor of linear attention proposed in https://arxiv.org/abs/2106.09681 by El-Nouby et al. + """ + + @beartype + def __init__(self, *, dim, dim_head=32, heads=8, scale=8, flash=False, dropout=0.0): + super().__init__() + dim_inner = dim_head * heads + self.norm = RMSNorm(dim) + + self.to_qkv = nn.Sequential(nn.Linear(dim, dim_inner * 3, bias=False), Rearrange("b n (qkv h d) -> qkv b h d n", qkv=3, h=heads)) + + self.temperature = nn.Parameter(torch.ones(heads, 1, 1)) + + self.attend = Attend(scale=scale, dropout=dropout, flash=flash) + + self.to_out = nn.Sequential(Rearrange("b h d n -> b n (h d)"), nn.Linear(dim_inner, dim, bias=False)) + + def forward(self, x): + x = self.norm(x) + + q, k, v = self.to_qkv(x) + + q, k = map(l2norm, (q, k)) + q = q * self.temperature.exp() + + out = self.attend(q, k, v) + + return self.to_out(out) + + +class Transformer(Module): + def __init__(self, *, dim, depth, dim_head=64, heads=8, attn_dropout=0.0, ff_dropout=0.0, ff_mult=4, norm_output=True, rotary_embed=None, flash_attn=True, linear_attn=False): + super().__init__() + self.layers = ModuleList([]) + + for _ in range(depth): + if linear_attn: + attn = LinearAttention(dim=dim, dim_head=dim_head, heads=heads, dropout=attn_dropout, flash=flash_attn) + else: + attn = Attention(dim=dim, dim_head=dim_head, heads=heads, dropout=attn_dropout, rotary_embed=rotary_embed, flash=flash_attn) + + self.layers.append(ModuleList([attn, FeedForward(dim=dim, mult=ff_mult, dropout=ff_dropout)])) + + self.norm = RMSNorm(dim) if norm_output else nn.Identity() + + def forward(self, x): + + for attn, ff in self.layers: + x = attn(x) + x + x = ff(x) + x + + return self.norm(x) + + +# bandsplit module + + +class BandSplit(Module): + @beartype + def __init__(self, dim, dim_inputs: Tuple[int, ...]): + super().__init__() + self.dim_inputs = dim_inputs + self.to_features = ModuleList([]) + + for dim_in in dim_inputs: + net = nn.Sequential(RMSNorm(dim_in), nn.Linear(dim_in, dim)) + + self.to_features.append(net) + + def forward(self, x): + x = x.split(self.dim_inputs, dim=-1) + + outs = [] + for split_input, to_feature in zip(x, self.to_features): + split_output = to_feature(split_input) + outs.append(split_output) + + return torch.stack(outs, dim=-2) + + +def MLP(dim_in, dim_out, dim_hidden=None, depth=1, activation=nn.Tanh): + dim_hidden = default(dim_hidden, dim_in) + + net = [] + dims = (dim_in, *((dim_hidden,) * (depth - 1)), dim_out) + + for ind, (layer_dim_in, layer_dim_out) in enumerate(zip(dims[:-1], dims[1:])): + is_last = ind == (len(dims) - 2) + + net.append(nn.Linear(layer_dim_in, layer_dim_out)) + + if is_last: + continue + + net.append(activation()) + + return nn.Sequential(*net) + + +class MaskEstimator(Module): + @beartype + def __init__(self, dim, dim_inputs: Tuple[int, ...], depth, mlp_expansion_factor=4): + super().__init__() + self.dim_inputs = dim_inputs + self.to_freqs = ModuleList([]) + dim_hidden = dim * mlp_expansion_factor + + for dim_in in dim_inputs: + net = [] + + mlp = nn.Sequential(MLP(dim, dim_in * 2, dim_hidden=dim_hidden, depth=depth), nn.GLU(dim=-1)) + + self.to_freqs.append(mlp) + + def forward(self, x): + x = x.unbind(dim=-2) + + outs = [] + + for band_features, mlp in zip(x, self.to_freqs): + freq_out = mlp(band_features) + outs.append(freq_out) + + return torch.cat(outs, dim=-1) + + +# main class + +DEFAULT_FREQS_PER_BANDS = ( + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 12, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 24, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 48, + 128, + 129, +) + + +class BSRoformer(Module): + + @beartype + def __init__( + self, + dim, + *, + depth, + stereo=False, + num_stems=1, + time_transformer_depth=2, + freq_transformer_depth=2, + linear_transformer_depth=0, + freqs_per_bands: Tuple[int, ...] = DEFAULT_FREQS_PER_BANDS, + # in the paper, they divide into ~60 bands, test with 1 for starters + dim_head=64, + heads=8, + attn_dropout=0.0, + ff_dropout=0.0, + flash_attn=True, + dim_freqs_in=1025, + stft_n_fft=2048, + stft_hop_length=512, + # 10ms at 44100Hz, from sections 4.1, 4.4 in the paper - @faroit recommends // 2 or // 4 for better reconstruction + stft_win_length=2048, + stft_normalized=False, + stft_window_fn: Optional[Callable] = None, + mask_estimator_depth=2, + multi_stft_resolution_loss_weight=1.0, + multi_stft_resolutions_window_sizes: Tuple[int, ...] = (4096, 2048, 1024, 512, 256), + multi_stft_hop_size=147, + multi_stft_normalized=False, + multi_stft_window_fn: Callable = torch.hann_window, + ): + super().__init__() + + self.stereo = stereo + self.audio_channels = 2 if stereo else 1 + self.num_stems = num_stems + + self.layers = ModuleList([]) + + transformer_kwargs = dict(dim=dim, heads=heads, dim_head=dim_head, attn_dropout=attn_dropout, ff_dropout=ff_dropout, flash_attn=flash_attn, norm_output=False) + + time_rotary_embed = RotaryEmbedding(dim=dim_head) + freq_rotary_embed = RotaryEmbedding(dim=dim_head) + + for _ in range(depth): + tran_modules = [] + if linear_transformer_depth > 0: + tran_modules.append(Transformer(depth=linear_transformer_depth, linear_attn=True, **transformer_kwargs)) + tran_modules.append(Transformer(depth=time_transformer_depth, rotary_embed=time_rotary_embed, **transformer_kwargs)) + tran_modules.append(Transformer(depth=freq_transformer_depth, rotary_embed=freq_rotary_embed, **transformer_kwargs)) + self.layers.append(nn.ModuleList(tran_modules)) + + self.final_norm = RMSNorm(dim) + + self.stft_kwargs = dict(n_fft=stft_n_fft, hop_length=stft_hop_length, win_length=stft_win_length, normalized=stft_normalized) + + self.stft_window_fn = partial(default(stft_window_fn, torch.hann_window), stft_win_length) + + freqs = torch.stft(torch.randn(1, 4096), **self.stft_kwargs, return_complex=True).shape[1] + + assert len(freqs_per_bands) > 1 + assert sum(freqs_per_bands) == freqs, f"the number of freqs in the bands must equal {freqs} based on the STFT settings, but got {sum(freqs_per_bands)}" + + freqs_per_bands_with_complex = tuple(2 * f * self.audio_channels for f in freqs_per_bands) + + self.band_split = BandSplit(dim=dim, dim_inputs=freqs_per_bands_with_complex) + + self.mask_estimators = nn.ModuleList([]) + + for _ in range(num_stems): + mask_estimator = MaskEstimator(dim=dim, dim_inputs=freqs_per_bands_with_complex, depth=mask_estimator_depth) + + self.mask_estimators.append(mask_estimator) + + # for the multi-resolution stft loss + + self.multi_stft_resolution_loss_weight = multi_stft_resolution_loss_weight + self.multi_stft_resolutions_window_sizes = multi_stft_resolutions_window_sizes + self.multi_stft_n_fft = stft_n_fft + self.multi_stft_window_fn = multi_stft_window_fn + + self.multi_stft_kwargs = dict(hop_length=multi_stft_hop_size, normalized=multi_stft_normalized) + + def forward(self, raw_audio, target=None, return_loss_breakdown=False): + """ + einops + + b - batch + f - freq + t - time + s - audio channel (1 for mono, 2 for stereo) + n - number of 'stems' + c - complex (2) + d - feature dimension + """ + + original_device = raw_audio.device + x_is_mps = True if original_device.type == "mps" else False + + # if x_is_mps: + # raw_audio = raw_audio.cpu() + + device = raw_audio.device + + if raw_audio.ndim == 2: + raw_audio = rearrange(raw_audio, "b t -> b 1 t") + + channels = raw_audio.shape[1] + assert (not self.stereo and channels == 1) or ( + self.stereo and channels == 2 + ), "stereo needs to be set to True if passing in audio signal that is stereo (channel dimension of 2). also need to be False if mono (channel dimension of 1)" + + # to stft + + raw_audio, batch_audio_channel_packed_shape = pack_one(raw_audio, "* t") + + stft_window = self.stft_window_fn().to(device) + + stft_repr = torch.stft(raw_audio, **self.stft_kwargs, window=stft_window, return_complex=True) + stft_repr = torch.view_as_real(stft_repr) + + stft_repr = unpack_one(stft_repr, batch_audio_channel_packed_shape, "* f t c") + stft_repr = rearrange(stft_repr, "b s f t c -> b (f s) t c") # merge stereo / mono into the frequency, with frequency leading dimension, for band splitting + + x = rearrange(stft_repr, "b f t c -> b t (f c)") + + x = self.band_split(x) + + # axial / hierarchical attention + + for transformer_block in self.layers: + + if len(transformer_block) == 3: + linear_transformer, time_transformer, freq_transformer = transformer_block + + x, ft_ps = pack([x], "b * d") + x = linear_transformer(x) + (x,) = unpack(x, ft_ps, "b * d") + else: + time_transformer, freq_transformer = transformer_block + + x = rearrange(x, "b t f d -> b f t d") + x, ps = pack([x], "* t d") + + x = time_transformer(x) + + (x,) = unpack(x, ps, "* t d") + x = rearrange(x, "b f t d -> b t f d") + x, ps = pack([x], "* f d") + + x = freq_transformer(x) + + (x,) = unpack(x, ps, "* f d") + + x = self.final_norm(x) + + mask = torch.stack([fn(x) for fn in self.mask_estimators], dim=1) + mask = rearrange(mask, "b n t (f c) -> b n f t c", c=2) + + # if x_is_mps: + # mask = mask.to('cpu') + + # modulate frequency representation + + stft_repr = rearrange(stft_repr, "b f t c -> b 1 f t c") + + # complex number multiplication + + stft_repr = torch.view_as_complex(stft_repr) + mask = torch.view_as_complex(mask) + + stft_repr = stft_repr * mask + + # istft + + stft_repr = rearrange(stft_repr, "b n (f s) t -> (b n s) f t", s=self.audio_channels) + + recon_audio = torch.istft(stft_repr.cpu() if x_is_mps else stft_repr, **self.stft_kwargs, window=stft_window.cpu() if x_is_mps else stft_window, return_complex=False).to(device) + + recon_audio = rearrange(recon_audio, "(b n s) t -> b n s t", s=self.audio_channels, n=self.num_stems) + + if self.num_stems == 1: + recon_audio = rearrange(recon_audio, "b 1 s t -> b s t") + + # if a target is passed in, calculate loss for learning + + if not exists(target): + return recon_audio + + if self.num_stems > 1: + assert target.ndim == 4 and target.shape[1] == self.num_stems + + if target.ndim == 2: + target = rearrange(target, "... t -> ... 1 t") + + target = target[..., : recon_audio.shape[-1]] + + loss = F.l1_loss(recon_audio, target) + + multi_stft_resolution_loss = 0.0 + + for window_size in self.multi_stft_resolutions_window_sizes: + res_stft_kwargs = dict( + n_fft=max(window_size, self.multi_stft_n_fft), win_length=window_size, return_complex=True, window=self.multi_stft_window_fn(window_size, device=device), **self.multi_stft_kwargs + ) + + recon_Y = torch.stft(rearrange(recon_audio, "... s t -> (... s) t"), **res_stft_kwargs) + target_Y = torch.stft(rearrange(target, "... s t -> (... s) t"), **res_stft_kwargs) + + multi_stft_resolution_loss = multi_stft_resolution_loss + F.l1_loss(recon_Y, target_Y) + + weighted_multi_resolution_loss = multi_stft_resolution_loss * self.multi_stft_resolution_loss_weight + + total_loss = loss + weighted_multi_resolution_loss + + if not return_loss_breakdown: + # Move the result back to the original device if it was moved to CPU for MPS compatibility + # if x_is_mps: + # total_loss = total_loss.to(original_device) + return total_loss + + # For detailed loss breakdown, ensure all components are moved back to the original device for MPS + # if x_is_mps: + # loss = loss.to(original_device) + # multi_stft_resolution_loss = multi_stft_resolution_loss.to(original_device) + # weighted_multi_resolution_loss = weighted_multi_resolution_loss.to(original_device) + + return total_loss, (loss, multi_stft_resolution_loss) + + # if not return_loss_breakdown: + # return total_loss + + # return total_loss, (loss, multi_stft_resolution_loss) diff --git a/audio_separator/separator/uvr_lib_v5/roformer/mel_band_roformer.py b/audio_separator/separator/uvr_lib_v5/roformer/mel_band_roformer.py new file mode 100644 index 0000000000000000000000000000000000000000..2cb52cf2c518413df6d016d9f7ac1b9cb753a7da --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/roformer/mel_band_roformer.py @@ -0,0 +1,445 @@ +from functools import partial + +import torch +from torch import nn, einsum, Tensor +from torch.nn import Module, ModuleList +import torch.nn.functional as F + +from .attend import Attend + +from beartype.typing import Tuple, Optional, List, Callable +from beartype import beartype + +from rotary_embedding_torch import RotaryEmbedding + +from einops import rearrange, pack, unpack, reduce, repeat + +from librosa import filters + + +def exists(val): + return val is not None + + +def default(v, d): + return v if exists(v) else d + + +def pack_one(t, pattern): + return pack([t], pattern) + + +def unpack_one(t, ps, pattern): + return unpack(t, ps, pattern)[0] + + +def pad_at_dim(t, pad, dim=-1, value=0.0): + dims_from_right = (-dim - 1) if dim < 0 else (t.ndim - dim - 1) + zeros = (0, 0) * dims_from_right + return F.pad(t, (*zeros, *pad), value=value) + + +class RMSNorm(Module): + def __init__(self, dim): + super().__init__() + self.scale = dim**0.5 + self.gamma = nn.Parameter(torch.ones(dim)) + + def forward(self, x): + x = x.to(self.gamma.device) + return F.normalize(x, dim=-1) * self.scale * self.gamma + + +class FeedForward(Module): + def __init__(self, dim, mult=4, dropout=0.0): + super().__init__() + dim_inner = int(dim * mult) + self.net = nn.Sequential(RMSNorm(dim), nn.Linear(dim, dim_inner), nn.GELU(), nn.Dropout(dropout), nn.Linear(dim_inner, dim), nn.Dropout(dropout)) + + def forward(self, x): + return self.net(x) + + +class Attention(Module): + def __init__(self, dim, heads=8, dim_head=64, dropout=0.0, rotary_embed=None, flash=True): + super().__init__() + self.heads = heads + self.scale = dim_head**-0.5 + dim_inner = heads * dim_head + + self.rotary_embed = rotary_embed + + self.attend = Attend(flash=flash, dropout=dropout) + + self.norm = RMSNorm(dim) + self.to_qkv = nn.Linear(dim, dim_inner * 3, bias=False) + + self.to_gates = nn.Linear(dim, heads) + + self.to_out = nn.Sequential(nn.Linear(dim_inner, dim, bias=False), nn.Dropout(dropout)) + + def forward(self, x): + x = self.norm(x) + + q, k, v = rearrange(self.to_qkv(x), "b n (qkv h d) -> qkv b h n d", qkv=3, h=self.heads) + + if exists(self.rotary_embed): + q = self.rotary_embed.rotate_queries_or_keys(q) + k = self.rotary_embed.rotate_queries_or_keys(k) + + out = self.attend(q, k, v) + + gates = self.to_gates(x) + out = out * rearrange(gates, "b n h -> b h n 1").sigmoid() + + out = rearrange(out, "b h n d -> b n (h d)") + return self.to_out(out) + + +class Transformer(Module): + def __init__(self, *, dim, depth, dim_head=64, heads=8, attn_dropout=0.0, ff_dropout=0.0, ff_mult=4, norm_output=True, rotary_embed=None, flash_attn=True): + super().__init__() + self.layers = ModuleList([]) + + for _ in range(depth): + self.layers.append( + ModuleList( + [Attention(dim=dim, dim_head=dim_head, heads=heads, dropout=attn_dropout, rotary_embed=rotary_embed, flash=flash_attn), FeedForward(dim=dim, mult=ff_mult, dropout=ff_dropout)] + ) + ) + + self.norm = RMSNorm(dim) if norm_output else nn.Identity() + + def forward(self, x): + + for attn, ff in self.layers: + x = attn(x) + x + x = ff(x) + x + + return self.norm(x) + + +class BandSplit(Module): + @beartype + def __init__(self, dim, dim_inputs: Tuple[int, ...]): + super().__init__() + self.dim_inputs = dim_inputs + self.to_features = ModuleList([]) + + for dim_in in dim_inputs: + net = nn.Sequential(RMSNorm(dim_in), nn.Linear(dim_in, dim)) + + self.to_features.append(net) + + def forward(self, x): + x = x.split(self.dim_inputs, dim=-1) + + outs = [] + for split_input, to_feature in zip(x, self.to_features): + split_output = to_feature(split_input) + outs.append(split_output) + + return torch.stack(outs, dim=-2) + + +def MLP(dim_in, dim_out, dim_hidden=None, depth=1, activation=nn.Tanh): + dim_hidden = default(dim_hidden, dim_in) + + net = [] + dims = (dim_in, *((dim_hidden,) * depth), dim_out) + + for ind, (layer_dim_in, layer_dim_out) in enumerate(zip(dims[:-1], dims[1:])): + is_last = ind == (len(dims) - 2) + + net.append(nn.Linear(layer_dim_in, layer_dim_out)) + + if is_last: + continue + + net.append(activation()) + + return nn.Sequential(*net) + + +class MaskEstimator(Module): + @beartype + def __init__(self, dim, dim_inputs: Tuple[int, ...], depth, mlp_expansion_factor=4): + super().__init__() + self.dim_inputs = dim_inputs + self.to_freqs = ModuleList([]) + dim_hidden = dim * mlp_expansion_factor + + for dim_in in dim_inputs: + net = [] + + mlp = nn.Sequential(MLP(dim, dim_in * 2, dim_hidden=dim_hidden, depth=depth), nn.GLU(dim=-1)) + + self.to_freqs.append(mlp) + + def forward(self, x): + x = x.unbind(dim=-2) + + outs = [] + + for band_features, mlp in zip(x, self.to_freqs): + freq_out = mlp(band_features) + outs.append(freq_out) + + return torch.cat(outs, dim=-1) + + +class MelBandRoformer(Module): + + @beartype + def __init__( + self, + dim, + *, + depth, + stereo=False, + num_stems=1, + time_transformer_depth=2, + freq_transformer_depth=2, + num_bands=60, + dim_head=64, + heads=8, + attn_dropout=0.1, + ff_dropout=0.1, + flash_attn=True, + dim_freqs_in=1025, + sample_rate=44100, + stft_n_fft=2048, + stft_hop_length=512, + stft_win_length=2048, + stft_normalized=False, + stft_window_fn: Optional[Callable] = None, + mask_estimator_depth=1, + multi_stft_resolution_loss_weight=1.0, + multi_stft_resolutions_window_sizes: Tuple[int, ...] = (4096, 2048, 1024, 512, 256), + multi_stft_hop_size=147, + multi_stft_normalized=False, + multi_stft_window_fn: Callable = torch.hann_window, + match_input_audio_length=False, + ): + super().__init__() + + self.stereo = stereo + self.audio_channels = 2 if stereo else 1 + self.num_stems = num_stems + + self.layers = ModuleList([]) + + transformer_kwargs = dict(dim=dim, heads=heads, dim_head=dim_head, attn_dropout=attn_dropout, ff_dropout=ff_dropout, flash_attn=flash_attn) + + time_rotary_embed = RotaryEmbedding(dim=dim_head) + freq_rotary_embed = RotaryEmbedding(dim=dim_head) + + for _ in range(depth): + self.layers.append( + nn.ModuleList( + [ + Transformer(depth=time_transformer_depth, rotary_embed=time_rotary_embed, **transformer_kwargs), + Transformer(depth=freq_transformer_depth, rotary_embed=freq_rotary_embed, **transformer_kwargs), + ] + ) + ) + + self.stft_window_fn = partial(default(stft_window_fn, torch.hann_window), stft_win_length) + + self.stft_kwargs = dict(n_fft=stft_n_fft, hop_length=stft_hop_length, win_length=stft_win_length, normalized=stft_normalized) + + freqs = torch.stft(torch.randn(1, 4096), **self.stft_kwargs, return_complex=True).shape[1] + + mel_filter_bank_numpy = filters.mel(sr=sample_rate, n_fft=stft_n_fft, n_mels=num_bands) + + mel_filter_bank = torch.from_numpy(mel_filter_bank_numpy) + + mel_filter_bank[0][0] = 1.0 + + mel_filter_bank[-1, -1] = 1.0 + + freqs_per_band = mel_filter_bank > 0 + assert freqs_per_band.any(dim=0).all(), "all frequencies need to be covered by all bands for now" + + repeated_freq_indices = repeat(torch.arange(freqs), "f -> b f", b=num_bands) + freq_indices = repeated_freq_indices[freqs_per_band] + + if stereo: + freq_indices = repeat(freq_indices, "f -> f s", s=2) + freq_indices = freq_indices * 2 + torch.arange(2) + freq_indices = rearrange(freq_indices, "f s -> (f s)") + + self.register_buffer("freq_indices", freq_indices, persistent=False) + self.register_buffer("freqs_per_band", freqs_per_band, persistent=False) + + num_freqs_per_band = reduce(freqs_per_band, "b f -> b", "sum") + num_bands_per_freq = reduce(freqs_per_band, "b f -> f", "sum") + + self.register_buffer("num_freqs_per_band", num_freqs_per_band, persistent=False) + self.register_buffer("num_bands_per_freq", num_bands_per_freq, persistent=False) + + freqs_per_bands_with_complex = tuple(2 * f * self.audio_channels for f in num_freqs_per_band.tolist()) + + self.band_split = BandSplit(dim=dim, dim_inputs=freqs_per_bands_with_complex) + + self.mask_estimators = nn.ModuleList([]) + + for _ in range(num_stems): + mask_estimator = MaskEstimator(dim=dim, dim_inputs=freqs_per_bands_with_complex, depth=mask_estimator_depth) + + self.mask_estimators.append(mask_estimator) + + self.multi_stft_resolution_loss_weight = multi_stft_resolution_loss_weight + self.multi_stft_resolutions_window_sizes = multi_stft_resolutions_window_sizes + self.multi_stft_n_fft = stft_n_fft + self.multi_stft_window_fn = multi_stft_window_fn + + self.multi_stft_kwargs = dict(hop_length=multi_stft_hop_size, normalized=multi_stft_normalized) + + self.match_input_audio_length = match_input_audio_length + + def forward(self, raw_audio, target=None, return_loss_breakdown=False): + """ + einops + + b - batch + f - freq + t - time + s - audio channel (1 for mono, 2 for stereo) + n - number of 'stems' + c - complex (2) + d - feature dimension + """ + + original_device = raw_audio.device + x_is_mps = True if original_device.type == "mps" else False + + if x_is_mps: + raw_audio = raw_audio.cpu() + + device = raw_audio.device + + if raw_audio.ndim == 2: + raw_audio = rearrange(raw_audio, "b t -> b 1 t") + + batch, channels, raw_audio_length = raw_audio.shape + + istft_length = raw_audio_length if self.match_input_audio_length else None + + assert (not self.stereo and channels == 1) or ( + self.stereo and channels == 2 + ), "stereo needs to be set to True if passing in audio signal that is stereo (channel dimension of 2). also need to be False if mono (channel dimension of 1)" + + raw_audio, batch_audio_channel_packed_shape = pack_one(raw_audio, "* t") + + stft_window = self.stft_window_fn().to(device) + + stft_repr = torch.stft(raw_audio, **self.stft_kwargs, window=stft_window, return_complex=True) + stft_repr = torch.view_as_real(stft_repr) + + stft_repr = unpack_one(stft_repr, batch_audio_channel_packed_shape, "* f t c") + stft_repr = rearrange(stft_repr, "b s f t c -> b (f s) t c") # merge stereo / mono into the frequency, with frequency leading dimension, for band splitting + + batch_arange = torch.arange(batch, device=device)[..., None] + + x = stft_repr[batch_arange, self.freq_indices.cpu()] if x_is_mps else stft_repr[batch_arange, self.freq_indices] + + x = rearrange(x, "b f t c -> b t (f c)") + + x = self.band_split(x) + + for time_transformer, freq_transformer in self.layers: + x = rearrange(x, "b t f d -> b f t d") + x, ps = pack([x], "* t d") + + x = time_transformer(x) + + (x,) = unpack(x, ps, "* t d") + x = rearrange(x, "b f t d -> b t f d") + x, ps = pack([x], "* f d") + + x = freq_transformer(x) + + (x,) = unpack(x, ps, "* f d") + + masks = torch.stack([fn(x) for fn in self.mask_estimators], dim=1) + masks = rearrange(masks, "b n t (f c) -> b n f t c", c=2) + + if x_is_mps: + masks = masks.cpu() + + stft_repr = rearrange(stft_repr, "b f t c -> b 1 f t c") + + stft_repr = torch.view_as_complex(stft_repr) + masks = torch.view_as_complex(masks) + + masks = masks.type(stft_repr.dtype) + + if x_is_mps: + scatter_indices = repeat(self.freq_indices.cpu(), "f -> b n f t", b=batch, n=self.num_stems, t=stft_repr.shape[-1]) + else: + scatter_indices = repeat(self.freq_indices, "f -> b n f t", b=batch, n=self.num_stems, t=stft_repr.shape[-1]) + + stft_repr_expanded_stems = repeat(stft_repr, "b 1 ... -> b n ...", n=self.num_stems) + masks_summed = ( + torch.zeros_like(stft_repr_expanded_stems.cpu() if x_is_mps else stft_repr_expanded_stems) + .scatter_add_(2, scatter_indices.cpu() if x_is_mps else scatter_indices, masks.cpu() if x_is_mps else masks) + .to(device) + ) + + denom = repeat(self.num_bands_per_freq, "f -> (f r) 1", r=channels) + + if x_is_mps: + denom = denom.cpu() + + masks_averaged = masks_summed / denom.clamp(min=1e-8) + + stft_repr = stft_repr * masks_averaged + + stft_repr = rearrange(stft_repr, "b n (f s) t -> (b n s) f t", s=self.audio_channels) + + recon_audio = torch.istft(stft_repr.cpu() if x_is_mps else stft_repr, **self.stft_kwargs, window=stft_window.cpu() if x_is_mps else stft_window, return_complex=False, length=istft_length) + + recon_audio = rearrange(recon_audio, "(b n s) t -> b n s t", b=batch, s=self.audio_channels, n=self.num_stems) + + if self.num_stems == 1: + recon_audio = rearrange(recon_audio, "b 1 s t -> b s t") + + if not exists(target): + return recon_audio + + if self.num_stems > 1: + assert target.ndim == 4 and target.shape[1] == self.num_stems + + if target.ndim == 2: + target = rearrange(target, "... t -> ... 1 t") + + target = target[..., : recon_audio.shape[-1]] + + loss = F.l1_loss(recon_audio, target) + + multi_stft_resolution_loss = 0.0 + + for window_size in self.multi_stft_resolutions_window_sizes: + res_stft_kwargs = dict( + n_fft=max(window_size, self.multi_stft_n_fft), win_length=window_size, return_complex=True, window=self.multi_stft_window_fn(window_size, device=device), **self.multi_stft_kwargs + ) + + recon_Y = torch.stft(rearrange(recon_audio, "... s t -> (... s) t"), **res_stft_kwargs) + target_Y = torch.stft(rearrange(target, "... s t -> (... s) t"), **res_stft_kwargs) + + multi_stft_resolution_loss = multi_stft_resolution_loss + F.l1_loss(recon_Y, target_Y) + + weighted_multi_resolution_loss = multi_stft_resolution_loss * self.multi_stft_resolution_loss_weight + + total_loss = loss + weighted_multi_resolution_loss + + # Move the total loss back to the original device if necessary + if x_is_mps: + total_loss = total_loss.to(original_device) + + if not return_loss_breakdown: + return total_loss + + # If detailed loss breakdown is requested, ensure all components are on the original device + return total_loss, (loss.to(original_device) if x_is_mps else loss, multi_stft_resolution_loss.to(original_device) if x_is_mps else multi_stft_resolution_loss) diff --git a/audio_separator/separator/uvr_lib_v5/spec_utils.py b/audio_separator/separator/uvr_lib_v5/spec_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..f33d40d23ae9052c395633c1ef67564f5975ecac --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/spec_utils.py @@ -0,0 +1,1327 @@ +import audioread +import librosa +import numpy as np +import soundfile as sf +import math +import platform +import traceback +from audio_separator.separator.uvr_lib_v5 import pyrb +from scipy.signal import correlate, hilbert +import io + +OPERATING_SYSTEM = platform.system() +SYSTEM_ARCH = platform.platform() +SYSTEM_PROC = platform.processor() +ARM = "arm" + +AUTO_PHASE = "Automatic" +POSITIVE_PHASE = "Positive Phase" +NEGATIVE_PHASE = "Negative Phase" +NONE_P = ("None",) +LOW_P = ("Shifts: Low",) +MED_P = ("Shifts: Medium",) +HIGH_P = ("Shifts: High",) +VHIGH_P = "Shifts: Very High" +MAXIMUM_P = "Shifts: Maximum" + +progress_value = 0 +last_update_time = 0 +is_macos = False + + +if OPERATING_SYSTEM == "Darwin": + wav_resolution = "polyphase" if SYSTEM_PROC == ARM or ARM in SYSTEM_ARCH else "sinc_fastest" + wav_resolution_float_resampling = "kaiser_best" if SYSTEM_PROC == ARM or ARM in SYSTEM_ARCH else wav_resolution + is_macos = True +else: + wav_resolution = "sinc_fastest" + wav_resolution_float_resampling = wav_resolution + +MAX_SPEC = "Max Spec" +MIN_SPEC = "Min Spec" +LIN_ENSE = "Linear Ensemble" + +MAX_WAV = MAX_SPEC +MIN_WAV = MIN_SPEC + +AVERAGE = "Average" + + +def crop_center(h1, h2): + """ + This function crops the center of the first input tensor to match the size of the second input tensor. + It is used to ensure that the two tensors have the same size in the time dimension. + """ + h1_shape = h1.size() + h2_shape = h2.size() + + # If the time dimensions are already equal, return the first tensor as is + if h1_shape[3] == h2_shape[3]: + return h1 + # If the time dimension of the first tensor is smaller, raise an error + elif h1_shape[3] < h2_shape[3]: + raise ValueError("h1_shape[3] must be greater than h2_shape[3]") + + # Calculate the start and end indices for cropping + s_time = (h1_shape[3] - h2_shape[3]) // 2 + e_time = s_time + h2_shape[3] + # Crop the first tensor + h1 = h1[:, :, :, s_time:e_time] + + return h1 + + +def preprocess(X_spec): + """ + This function preprocesses a spectrogram by separating it into magnitude and phase components. + This is a common preprocessing step in audio processing tasks. + """ + X_mag = np.abs(X_spec) + X_phase = np.angle(X_spec) + + return X_mag, X_phase + + +def make_padding(width, cropsize, offset): + """ + This function calculates the padding needed to make the width of an image divisible by the crop size. + It is used in the process of splitting an image into smaller patches. + """ + left = offset + roi_size = cropsize - offset * 2 + if roi_size == 0: + roi_size = cropsize + right = roi_size - (width % roi_size) + left + + return left, right, roi_size + + +def normalize(wave, max_peak=1.0, min_peak=None): + """Normalize (or amplify) audio waveform to a specified peak value. + + Args: + wave (array-like): Audio waveform. + max_peak (float): Maximum peak value for normalization. + + Returns: + array-like: Normalized or original waveform. + """ + maxv = np.abs(wave).max() + if maxv > max_peak: + wave *= max_peak / maxv + elif min_peak is not None and maxv < min_peak: + wave *= min_peak / maxv + + return wave + + +def auto_transpose(audio_array: np.ndarray): + """ + Ensure that the audio array is in the (channels, samples) format. + + Parameters: + audio_array (ndarray): Input audio array. + + Returns: + ndarray: Transposed audio array if necessary. + """ + + # If the second dimension is 2 (indicating stereo channels), transpose the array + if audio_array.shape[1] == 2: + return audio_array.T + return audio_array + + +def write_array_to_mem(audio_data, subtype): + if isinstance(audio_data, np.ndarray): + audio_buffer = io.BytesIO() + sf.write(audio_buffer, audio_data, 44100, subtype=subtype, format="WAV") + audio_buffer.seek(0) + return audio_buffer + else: + return audio_data + + +def spectrogram_to_image(spec, mode="magnitude"): + if mode == "magnitude": + if np.iscomplexobj(spec): + y = np.abs(spec) + else: + y = spec + y = np.log10(y**2 + 1e-8) + elif mode == "phase": + if np.iscomplexobj(spec): + y = np.angle(spec) + else: + y = spec + + y -= y.min() + y *= 255 / y.max() + img = np.uint8(y) + + if y.ndim == 3: + img = img.transpose(1, 2, 0) + img = np.concatenate([np.max(img, axis=2, keepdims=True), img], axis=2) + + return img + + +def reduce_vocal_aggressively(X, y, softmask): + v = X - y + y_mag_tmp = np.abs(y) + v_mag_tmp = np.abs(v) + + v_mask = v_mag_tmp > y_mag_tmp + y_mag = np.clip(y_mag_tmp - v_mag_tmp * v_mask * softmask, 0, np.inf) + + return y_mag * np.exp(1.0j * np.angle(y)) + + +def merge_artifacts(y_mask, thres=0.01, min_range=64, fade_size=32): + mask = y_mask + + try: + if min_range < fade_size * 2: + raise ValueError("min_range must be >= fade_size * 2") + + idx = np.where(y_mask.min(axis=(0, 1)) > thres)[0] + start_idx = np.insert(idx[np.where(np.diff(idx) != 1)[0] + 1], 0, idx[0]) + end_idx = np.append(idx[np.where(np.diff(idx) != 1)[0]], idx[-1]) + artifact_idx = np.where(end_idx - start_idx > min_range)[0] + weight = np.zeros_like(y_mask) + if len(artifact_idx) > 0: + start_idx = start_idx[artifact_idx] + end_idx = end_idx[artifact_idx] + old_e = None + for s, e in zip(start_idx, end_idx): + if old_e is not None and s - old_e < fade_size: + s = old_e - fade_size * 2 + + if s != 0: + weight[:, :, s : s + fade_size] = np.linspace(0, 1, fade_size) + else: + s -= fade_size + + if e != y_mask.shape[2]: + weight[:, :, e - fade_size : e] = np.linspace(1, 0, fade_size) + else: + e += fade_size + + weight[:, :, s + fade_size : e - fade_size] = 1 + old_e = e + + v_mask = 1 - y_mask + y_mask += weight * v_mask + + mask = y_mask + except Exception as e: + error_name = f"{type(e).__name__}" + traceback_text = "".join(traceback.format_tb(e.__traceback__)) + message = f'{error_name}: "{e}"\n{traceback_text}"' + print("Post Process Failed: ", message) + + return mask + + +def align_wave_head_and_tail(a, b): + l = min([a[0].size, b[0].size]) + + return a[:l, :l], b[:l, :l] + + +def convert_channels(spec, mp, band): + cc = mp.param["band"][band].get("convert_channels") + + if "mid_side_c" == cc: + spec_left = np.add(spec[0], spec[1] * 0.25) + spec_right = np.subtract(spec[1], spec[0] * 0.25) + elif "mid_side" == cc: + spec_left = np.add(spec[0], spec[1]) / 2 + spec_right = np.subtract(spec[0], spec[1]) + elif "stereo_n" == cc: + spec_left = np.add(spec[0], spec[1] * 0.25) / 0.9375 + spec_right = np.add(spec[1], spec[0] * 0.25) / 0.9375 + else: + return spec + + return np.asfortranarray([spec_left, spec_right]) + + +def combine_spectrograms(specs, mp, is_v51_model=False): + l = min([specs[i].shape[2] for i in specs]) + spec_c = np.zeros(shape=(2, mp.param["bins"] + 1, l), dtype=np.complex64) + offset = 0 + bands_n = len(mp.param["band"]) + + for d in range(1, bands_n + 1): + h = mp.param["band"][d]["crop_stop"] - mp.param["band"][d]["crop_start"] + spec_c[:, offset : offset + h, :l] = specs[d][:, mp.param["band"][d]["crop_start"] : mp.param["band"][d]["crop_stop"], :l] + offset += h + + if offset > mp.param["bins"]: + raise ValueError("Too much bins") + + # lowpass fiter + + if mp.param["pre_filter_start"] > 0: + if is_v51_model: + spec_c *= get_lp_filter_mask(spec_c.shape[1], mp.param["pre_filter_start"], mp.param["pre_filter_stop"]) + else: + if bands_n == 1: + spec_c = fft_lp_filter(spec_c, mp.param["pre_filter_start"], mp.param["pre_filter_stop"]) + else: + gp = 1 + for b in range(mp.param["pre_filter_start"] + 1, mp.param["pre_filter_stop"]): + g = math.pow(10, -(b - mp.param["pre_filter_start"]) * (3.5 - gp) / 20.0) + gp = g + spec_c[:, b, :] *= g + + return np.asfortranarray(spec_c) + + +def wave_to_spectrogram(wave, hop_length, n_fft, mp, band, is_v51_model=False): + + if wave.ndim == 1: + wave = np.asfortranarray([wave, wave]) + + if not is_v51_model: + if mp.param["reverse"]: + wave_left = np.flip(np.asfortranarray(wave[0])) + wave_right = np.flip(np.asfortranarray(wave[1])) + elif mp.param["mid_side"]: + wave_left = np.asfortranarray(np.add(wave[0], wave[1]) / 2) + wave_right = np.asfortranarray(np.subtract(wave[0], wave[1])) + elif mp.param["mid_side_b2"]: + wave_left = np.asfortranarray(np.add(wave[1], wave[0] * 0.5)) + wave_right = np.asfortranarray(np.subtract(wave[0], wave[1] * 0.5)) + else: + wave_left = np.asfortranarray(wave[0]) + wave_right = np.asfortranarray(wave[1]) + else: + wave_left = np.asfortranarray(wave[0]) + wave_right = np.asfortranarray(wave[1]) + + spec_left = librosa.stft(wave_left, n_fft=n_fft, hop_length=hop_length) + spec_right = librosa.stft(wave_right, n_fft=n_fft, hop_length=hop_length) + + spec = np.asfortranarray([spec_left, spec_right]) + + if is_v51_model: + spec = convert_channels(spec, mp, band) + + return spec + + +def spectrogram_to_wave(spec, hop_length=1024, mp={}, band=0, is_v51_model=True): + spec_left = np.asfortranarray(spec[0]) + spec_right = np.asfortranarray(spec[1]) + + wave_left = librosa.istft(spec_left, hop_length=hop_length) + wave_right = librosa.istft(spec_right, hop_length=hop_length) + + if is_v51_model: + cc = mp.param["band"][band].get("convert_channels") + if "mid_side_c" == cc: + return np.asfortranarray([np.subtract(wave_left / 1.0625, wave_right / 4.25), np.add(wave_right / 1.0625, wave_left / 4.25)]) + elif "mid_side" == cc: + return np.asfortranarray([np.add(wave_left, wave_right / 2), np.subtract(wave_left, wave_right / 2)]) + elif "stereo_n" == cc: + return np.asfortranarray([np.subtract(wave_left, wave_right * 0.25), np.subtract(wave_right, wave_left * 0.25)]) + else: + if mp.param["reverse"]: + return np.asfortranarray([np.flip(wave_left), np.flip(wave_right)]) + elif mp.param["mid_side"]: + return np.asfortranarray([np.add(wave_left, wave_right / 2), np.subtract(wave_left, wave_right / 2)]) + elif mp.param["mid_side_b2"]: + return np.asfortranarray([np.add(wave_right / 1.25, 0.4 * wave_left), np.subtract(wave_left / 1.25, 0.4 * wave_right)]) + + return np.asfortranarray([wave_left, wave_right]) + + +def cmb_spectrogram_to_wave(spec_m, mp, extra_bins_h=None, extra_bins=None, is_v51_model=False): + bands_n = len(mp.param["band"]) + offset = 0 + + for d in range(1, bands_n + 1): + bp = mp.param["band"][d] + spec_s = np.zeros(shape=(2, bp["n_fft"] // 2 + 1, spec_m.shape[2]), dtype=complex) + h = bp["crop_stop"] - bp["crop_start"] + spec_s[:, bp["crop_start"] : bp["crop_stop"], :] = spec_m[:, offset : offset + h, :] + + offset += h + if d == bands_n: # higher + if extra_bins_h: # if --high_end_process bypass + max_bin = bp["n_fft"] // 2 + spec_s[:, max_bin - extra_bins_h : max_bin, :] = extra_bins[:, :extra_bins_h, :] + if bp["hpf_start"] > 0: + if is_v51_model: + spec_s *= get_hp_filter_mask(spec_s.shape[1], bp["hpf_start"], bp["hpf_stop"] - 1) + else: + spec_s = fft_hp_filter(spec_s, bp["hpf_start"], bp["hpf_stop"] - 1) + if bands_n == 1: + wave = spectrogram_to_wave(spec_s, bp["hl"], mp, d, is_v51_model) + else: + wave = np.add(wave, spectrogram_to_wave(spec_s, bp["hl"], mp, d, is_v51_model)) + else: + sr = mp.param["band"][d + 1]["sr"] + if d == 1: # lower + if is_v51_model: + spec_s *= get_lp_filter_mask(spec_s.shape[1], bp["lpf_start"], bp["lpf_stop"]) + else: + spec_s = fft_lp_filter(spec_s, bp["lpf_start"], bp["lpf_stop"]) + + try: + wave = librosa.resample(spectrogram_to_wave(spec_s, bp["hl"], mp, d, is_v51_model), orig_sr=bp["sr"], target_sr=sr, res_type=wav_resolution) + except ValueError as e: + print(f"Error during resampling: {e}") + print(f"Spec_s shape: {spec_s.shape}, SR: {sr}, Res type: {wav_resolution}") + + else: # mid + if is_v51_model: + spec_s *= get_hp_filter_mask(spec_s.shape[1], bp["hpf_start"], bp["hpf_stop"] - 1) + spec_s *= get_lp_filter_mask(spec_s.shape[1], bp["lpf_start"], bp["lpf_stop"]) + else: + spec_s = fft_hp_filter(spec_s, bp["hpf_start"], bp["hpf_stop"] - 1) + spec_s = fft_lp_filter(spec_s, bp["lpf_start"], bp["lpf_stop"]) + + wave2 = np.add(wave, spectrogram_to_wave(spec_s, bp["hl"], mp, d, is_v51_model)) + + try: + wave = librosa.resample(wave2, orig_sr=bp["sr"], target_sr=sr, res_type=wav_resolution) + except ValueError as e: + print(f"Error during resampling: {e}") + print(f"Spec_s shape: {spec_s.shape}, SR: {sr}, Res type: {wav_resolution}") + + return wave + + +def get_lp_filter_mask(n_bins, bin_start, bin_stop): + mask = np.concatenate([np.ones((bin_start - 1, 1)), np.linspace(1, 0, bin_stop - bin_start + 1)[:, None], np.zeros((n_bins - bin_stop, 1))], axis=0) + + return mask + + +def get_hp_filter_mask(n_bins, bin_start, bin_stop): + mask = np.concatenate([np.zeros((bin_stop + 1, 1)), np.linspace(0, 1, 1 + bin_start - bin_stop)[:, None], np.ones((n_bins - bin_start - 2, 1))], axis=0) + + return mask + + +def fft_lp_filter(spec, bin_start, bin_stop): + g = 1.0 + for b in range(bin_start, bin_stop): + g -= 1 / (bin_stop - bin_start) + spec[:, b, :] = g * spec[:, b, :] + + spec[:, bin_stop:, :] *= 0 + + return spec + + +def fft_hp_filter(spec, bin_start, bin_stop): + g = 1.0 + for b in range(bin_start, bin_stop, -1): + g -= 1 / (bin_start - bin_stop) + spec[:, b, :] = g * spec[:, b, :] + + spec[:, 0 : bin_stop + 1, :] *= 0 + + return spec + + +def spectrogram_to_wave_old(spec, hop_length=1024): + if spec.ndim == 2: + wave = librosa.istft(spec, hop_length=hop_length) + elif spec.ndim == 3: + spec_left = np.asfortranarray(spec[0]) + spec_right = np.asfortranarray(spec[1]) + + wave_left = librosa.istft(spec_left, hop_length=hop_length) + wave_right = librosa.istft(spec_right, hop_length=hop_length) + wave = np.asfortranarray([wave_left, wave_right]) + + return wave + + +def wave_to_spectrogram_old(wave, hop_length, n_fft): + wave_left = np.asfortranarray(wave[0]) + wave_right = np.asfortranarray(wave[1]) + + spec_left = librosa.stft(wave_left, n_fft=n_fft, hop_length=hop_length) + spec_right = librosa.stft(wave_right, n_fft=n_fft, hop_length=hop_length) + + spec = np.asfortranarray([spec_left, spec_right]) + + return spec + + +def mirroring(a, spec_m, input_high_end, mp): + if "mirroring" == a: + mirror = np.flip(np.abs(spec_m[:, mp.param["pre_filter_start"] - 10 - input_high_end.shape[1] : mp.param["pre_filter_start"] - 10, :]), 1) + mirror = mirror * np.exp(1.0j * np.angle(input_high_end)) + + return np.where(np.abs(input_high_end) <= np.abs(mirror), input_high_end, mirror) + + if "mirroring2" == a: + mirror = np.flip(np.abs(spec_m[:, mp.param["pre_filter_start"] - 10 - input_high_end.shape[1] : mp.param["pre_filter_start"] - 10, :]), 1) + mi = np.multiply(mirror, input_high_end * 1.7) + + return np.where(np.abs(input_high_end) <= np.abs(mi), input_high_end, mi) + + +def adjust_aggr(mask, is_non_accom_stem, aggressiveness): + aggr = aggressiveness["value"] * 2 + + if aggr != 0: + if is_non_accom_stem: + aggr = 1 - aggr + + if np.any(aggr > 10) or np.any(aggr < -10): + print(f"Warning: Extreme aggressiveness values detected: {aggr}") + + aggr = [aggr, aggr] + + if aggressiveness["aggr_correction"] is not None: + aggr[0] += aggressiveness["aggr_correction"]["left"] + aggr[1] += aggressiveness["aggr_correction"]["right"] + + for ch in range(2): + mask[ch, : aggressiveness["split_bin"]] = np.power(mask[ch, : aggressiveness["split_bin"]], 1 + aggr[ch] / 3) + mask[ch, aggressiveness["split_bin"] :] = np.power(mask[ch, aggressiveness["split_bin"] :], 1 + aggr[ch]) + + return mask + + +def stft(wave, nfft, hl): + wave_left = np.asfortranarray(wave[0]) + wave_right = np.asfortranarray(wave[1]) + spec_left = librosa.stft(wave_left, n_fft=nfft, hop_length=hl) + spec_right = librosa.stft(wave_right, n_fft=nfft, hop_length=hl) + spec = np.asfortranarray([spec_left, spec_right]) + + return spec + + +def istft(spec, hl): + spec_left = np.asfortranarray(spec[0]) + spec_right = np.asfortranarray(spec[1]) + wave_left = librosa.istft(spec_left, hop_length=hl) + wave_right = librosa.istft(spec_right, hop_length=hl) + wave = np.asfortranarray([wave_left, wave_right]) + + return wave + + +def spec_effects(wave, algorithm="Default", value=None): + if np.isnan(wave).any() or np.isinf(wave).any(): + print(f"Warning: Detected NaN or infinite values in wave input. Shape: {wave.shape}") + + spec = [stft(wave[0], 2048, 1024), stft(wave[1], 2048, 1024)] + if algorithm == "Min_Mag": + v_spec_m = np.where(np.abs(spec[1]) <= np.abs(spec[0]), spec[1], spec[0]) + wave = istft(v_spec_m, 1024) + elif algorithm == "Max_Mag": + v_spec_m = np.where(np.abs(spec[1]) >= np.abs(spec[0]), spec[1], spec[0]) + wave = istft(v_spec_m, 1024) + elif algorithm == "Default": + wave = (wave[1] * value) + (wave[0] * (1 - value)) + elif algorithm == "Invert_p": + X_mag = np.abs(spec[0]) + y_mag = np.abs(spec[1]) + max_mag = np.where(X_mag >= y_mag, X_mag, y_mag) + v_spec = spec[1] - max_mag * np.exp(1.0j * np.angle(spec[0])) + wave = istft(v_spec, 1024) + + return wave + + +def spectrogram_to_wave_no_mp(spec, n_fft=2048, hop_length=1024): + wave = librosa.istft(spec, n_fft=n_fft, hop_length=hop_length) + + if wave.ndim == 1: + wave = np.asfortranarray([wave, wave]) + + return wave + + +def wave_to_spectrogram_no_mp(wave): + + spec = librosa.stft(wave, n_fft=2048, hop_length=1024) + + if spec.ndim == 1: + spec = np.asfortranarray([spec, spec]) + + return spec + + +def invert_audio(specs, invert_p=True): + + ln = min([specs[0].shape[2], specs[1].shape[2]]) + specs[0] = specs[0][:, :, :ln] + specs[1] = specs[1][:, :, :ln] + + if invert_p: + X_mag = np.abs(specs[0]) + y_mag = np.abs(specs[1]) + max_mag = np.where(X_mag >= y_mag, X_mag, y_mag) + v_spec = specs[1] - max_mag * np.exp(1.0j * np.angle(specs[0])) + else: + specs[1] = reduce_vocal_aggressively(specs[0], specs[1], 0.2) + v_spec = specs[0] - specs[1] + + return v_spec + + +def invert_stem(mixture, stem): + mixture = wave_to_spectrogram_no_mp(mixture) + stem = wave_to_spectrogram_no_mp(stem) + output = spectrogram_to_wave_no_mp(invert_audio([mixture, stem])) + + return -output.T + + +def ensembling(a, inputs, is_wavs=False): + + for i in range(1, len(inputs)): + if i == 1: + input = inputs[0] + + if is_wavs: + ln = min([input.shape[1], inputs[i].shape[1]]) + input = input[:, :ln] + inputs[i] = inputs[i][:, :ln] + else: + ln = min([input.shape[2], inputs[i].shape[2]]) + input = input[:, :, :ln] + inputs[i] = inputs[i][:, :, :ln] + + if MIN_SPEC == a: + input = np.where(np.abs(inputs[i]) <= np.abs(input), inputs[i], input) + if MAX_SPEC == a: + #input = np.array(np.where(np.greater_equal(np.abs(inputs[i]), np.abs(input)), inputs[i], input), dtype=object) + input = np.where(np.abs(inputs[i]) >= np.abs(input), inputs[i], input) + #max_spec = np.array([np.where(np.greater_equal(np.abs(inputs[i]), np.abs(input)), s, specs[0]) for s in specs[1:]], dtype=object)[-1] + + # linear_ensemble + # input = ensemble_wav(inputs, split_size=1) + + return input + + +def ensemble_for_align(waves): + + specs = [] + + for wav in waves: + spec = wave_to_spectrogram_no_mp(wav.T) + specs.append(spec) + + wav_aligned = spectrogram_to_wave_no_mp(ensembling(MIN_SPEC, specs)).T + wav_aligned = match_array_shapes(wav_aligned, waves[1], is_swap=True) + + return wav_aligned + + +def ensemble_inputs(audio_input, algorithm, is_normalization, wav_type_set, save_path, is_wave=False, is_array=False): + + wavs_ = [] + + if algorithm == AVERAGE: + output = average_audio(audio_input) + samplerate = 44100 + else: + specs = [] + + for i in range(len(audio_input)): + wave, samplerate = librosa.load(audio_input[i], mono=False, sr=44100) + wavs_.append(wave) + spec = wave if is_wave else wave_to_spectrogram_no_mp(wave) + specs.append(spec) + + wave_shapes = [w.shape[1] for w in wavs_] + target_shape = wavs_[wave_shapes.index(max(wave_shapes))] + + if is_wave: + output = ensembling(algorithm, specs, is_wavs=True) + else: + output = spectrogram_to_wave_no_mp(ensembling(algorithm, specs)) + + output = to_shape(output, target_shape.shape) + + sf.write(save_path, normalize(output.T, is_normalization), samplerate, subtype=wav_type_set) + + +def to_shape(x, target_shape): + padding_list = [] + for x_dim, target_dim in zip(x.shape, target_shape): + pad_value = target_dim - x_dim + pad_tuple = (0, pad_value) + padding_list.append(pad_tuple) + + return np.pad(x, tuple(padding_list), mode="constant") + + +def to_shape_minimize(x: np.ndarray, target_shape): + + padding_list = [] + for x_dim, target_dim in zip(x.shape, target_shape): + pad_value = target_dim - x_dim + pad_tuple = (0, pad_value) + padding_list.append(pad_tuple) + + return np.pad(x, tuple(padding_list), mode="constant") + + +def detect_leading_silence(audio, sr, silence_threshold=0.007, frame_length=1024): + """ + Detect silence at the beginning of an audio signal. + + :param audio: np.array, audio signal + :param sr: int, sample rate + :param silence_threshold: float, magnitude threshold below which is considered silence + :param frame_length: int, the number of samples to consider for each check + + :return: float, duration of the leading silence in milliseconds + """ + + if len(audio.shape) == 2: + # If stereo, pick the channel with more energy to determine the silence + channel = np.argmax(np.sum(np.abs(audio), axis=1)) + audio = audio[channel] + + for i in range(0, len(audio), frame_length): + if np.max(np.abs(audio[i : i + frame_length])) > silence_threshold: + return (i / sr) * 1000 + + return (len(audio) / sr) * 1000 + + +def adjust_leading_silence(target_audio, reference_audio, silence_threshold=0.01, frame_length=1024): + """ + Adjust the leading silence of the target_audio to match the leading silence of the reference_audio. + + :param target_audio: np.array, audio signal that will have its silence adjusted + :param reference_audio: np.array, audio signal used as a reference + :param sr: int, sample rate + :param silence_threshold: float, magnitude threshold below which is considered silence + :param frame_length: int, the number of samples to consider for each check + + :return: np.array, target_audio adjusted to have the same leading silence as reference_audio + """ + + def find_silence_end(audio): + if len(audio.shape) == 2: + # If stereo, pick the channel with more energy to determine the silence + channel = np.argmax(np.sum(np.abs(audio), axis=1)) + audio_mono = audio[channel] + else: + audio_mono = audio + + for i in range(0, len(audio_mono), frame_length): + if np.max(np.abs(audio_mono[i : i + frame_length])) > silence_threshold: + return i + return len(audio_mono) + + ref_silence_end = find_silence_end(reference_audio) + target_silence_end = find_silence_end(target_audio) + silence_difference = ref_silence_end - target_silence_end + + try: + ref_silence_end_p = (ref_silence_end / 44100) * 1000 + target_silence_end_p = (target_silence_end / 44100) * 1000 + silence_difference_p = ref_silence_end_p - target_silence_end_p + print("silence_difference: ", silence_difference_p) + except Exception as e: + pass + + if silence_difference > 0: # Add silence to target_audio + if len(target_audio.shape) == 2: # stereo + silence_to_add = np.zeros((target_audio.shape[0], silence_difference)) + else: # mono + silence_to_add = np.zeros(silence_difference) + return np.hstack((silence_to_add, target_audio)) + elif silence_difference < 0: # Remove silence from target_audio + if len(target_audio.shape) == 2: # stereo + return target_audio[:, -silence_difference:] + else: # mono + return target_audio[-silence_difference:] + else: # No adjustment needed + return target_audio + + +def match_array_shapes(array_1: np.ndarray, array_2: np.ndarray, is_swap=False): + + if is_swap: + array_1, array_2 = array_1.T, array_2.T + + # print("before", array_1.shape, array_2.shape) + if array_1.shape[1] > array_2.shape[1]: + array_1 = array_1[:, : array_2.shape[1]] + elif array_1.shape[1] < array_2.shape[1]: + padding = array_2.shape[1] - array_1.shape[1] + array_1 = np.pad(array_1, ((0, 0), (0, padding)), "constant", constant_values=0) + + # print("after", array_1.shape, array_2.shape) + + if is_swap: + array_1, array_2 = array_1.T, array_2.T + + return array_1 + + +def match_mono_array_shapes(array_1: np.ndarray, array_2: np.ndarray): + + if len(array_1) > len(array_2): + array_1 = array_1[: len(array_2)] + elif len(array_1) < len(array_2): + padding = len(array_2) - len(array_1) + array_1 = np.pad(array_1, (0, padding), "constant", constant_values=0) + + return array_1 + + +def change_pitch_semitones(y, sr, semitone_shift): + factor = 2 ** (semitone_shift / 12) # Convert semitone shift to factor for resampling + y_pitch_tuned = [] + for y_channel in y: + y_pitch_tuned.append(librosa.resample(y_channel, orig_sr=sr, target_sr=sr * factor, res_type=wav_resolution_float_resampling)) + y_pitch_tuned = np.array(y_pitch_tuned) + new_sr = sr * factor + return y_pitch_tuned, new_sr + + +def augment_audio(export_path, audio_file, rate, is_normalization, wav_type_set, save_format=None, is_pitch=False, is_time_correction=True): + + wav, sr = librosa.load(audio_file, sr=44100, mono=False) + + if wav.ndim == 1: + wav = np.asfortranarray([wav, wav]) + + if not is_time_correction: + wav_mix = change_pitch_semitones(wav, 44100, semitone_shift=-rate)[0] + else: + if is_pitch: + wav_1 = pyrb.pitch_shift(wav[0], sr, rate, rbargs=None) + wav_2 = pyrb.pitch_shift(wav[1], sr, rate, rbargs=None) + else: + wav_1 = pyrb.time_stretch(wav[0], sr, rate, rbargs=None) + wav_2 = pyrb.time_stretch(wav[1], sr, rate, rbargs=None) + + if wav_1.shape > wav_2.shape: + wav_2 = to_shape(wav_2, wav_1.shape) + if wav_1.shape < wav_2.shape: + wav_1 = to_shape(wav_1, wav_2.shape) + + wav_mix = np.asfortranarray([wav_1, wav_2]) + + sf.write(export_path, normalize(wav_mix.T, is_normalization), sr, subtype=wav_type_set) + save_format(export_path) + + +def average_audio(audio): + + waves = [] + wave_shapes = [] + final_waves = [] + + for i in range(len(audio)): + wave = librosa.load(audio[i], sr=44100, mono=False) + waves.append(wave[0]) + wave_shapes.append(wave[0].shape[1]) + + wave_shapes_index = wave_shapes.index(max(wave_shapes)) + target_shape = waves[wave_shapes_index] + waves.pop(wave_shapes_index) + final_waves.append(target_shape) + + for n_array in waves: + wav_target = to_shape(n_array, target_shape.shape) + final_waves.append(wav_target) + + waves = sum(final_waves) + waves = waves / len(audio) + + return waves + + +def average_dual_sources(wav_1, wav_2, value): + + if wav_1.shape > wav_2.shape: + wav_2 = to_shape(wav_2, wav_1.shape) + if wav_1.shape < wav_2.shape: + wav_1 = to_shape(wav_1, wav_2.shape) + + wave = (wav_1 * value) + (wav_2 * (1 - value)) + + return wave + + +def reshape_sources(wav_1: np.ndarray, wav_2: np.ndarray): + + if wav_1.shape > wav_2.shape: + wav_2 = to_shape(wav_2, wav_1.shape) + if wav_1.shape < wav_2.shape: + ln = min([wav_1.shape[1], wav_2.shape[1]]) + wav_2 = wav_2[:, :ln] + + ln = min([wav_1.shape[1], wav_2.shape[1]]) + wav_1 = wav_1[:, :ln] + wav_2 = wav_2[:, :ln] + + return wav_2 + + +def reshape_sources_ref(wav_1_shape, wav_2: np.ndarray): + + if wav_1_shape > wav_2.shape: + wav_2 = to_shape(wav_2, wav_1_shape) + + return wav_2 + + +def combine_arrarys(audio_sources, is_swap=False): + source = np.zeros_like(max(audio_sources, key=np.size)) + + for v in audio_sources: + v = match_array_shapes(v, source, is_swap=is_swap) + source += v + + return source + + +def combine_audio(paths: list, audio_file_base=None, wav_type_set="FLOAT", save_format=None): + + source = combine_arrarys([load_audio(i) for i in paths]) + save_path = f"{audio_file_base}_combined.wav" + sf.write(save_path, source.T, 44100, subtype=wav_type_set) + save_format(save_path) + + +def reduce_mix_bv(inst_source, voc_source, reduction_rate=0.9): + # Reduce the volume + inst_source = inst_source * (1 - reduction_rate) + + mix_reduced = combine_arrarys([inst_source, voc_source], is_swap=True) + + return mix_reduced + + +def organize_inputs(inputs): + input_list = {"target": None, "reference": None, "reverb": None, "inst": None} + + for i in inputs: + if i.endswith("_(Vocals).wav"): + input_list["reference"] = i + elif "_RVC_" in i: + input_list["target"] = i + elif i.endswith("reverbed_stem.wav"): + input_list["reverb"] = i + elif i.endswith("_(Instrumental).wav"): + input_list["inst"] = i + + return input_list + + +def check_if_phase_inverted(wav1, wav2, is_mono=False): + # Load the audio files + if not is_mono: + wav1 = np.mean(wav1, axis=0) + wav2 = np.mean(wav2, axis=0) + + # Compute the correlation + correlation = np.corrcoef(wav1[:1000], wav2[:1000]) + + return correlation[0, 1] < 0 + + +def align_audio( + file1, + file2, + file2_aligned, + file_subtracted, + wav_type_set, + is_save_aligned, + command_Text, + save_format, + align_window: list, + align_intro_val: list, + db_analysis: tuple, + set_progress_bar, + phase_option, + phase_shifts, + is_match_silence, + is_spec_match, +): + + global progress_value + progress_value = 0 + is_mono = False + + def get_diff(a, b): + corr = np.correlate(a, b, "full") + diff = corr.argmax() - (b.shape[0] - 1) + + return diff + + def progress_bar(length): + global progress_value + progress_value += 1 + + if (0.90 / length * progress_value) >= 0.9: + length = progress_value + 1 + + set_progress_bar(0.1, (0.9 / length * progress_value)) + + # read tracks + + if file1.endswith(".mp3") and is_macos: + length1 = rerun_mp3(file1) + wav1, sr1 = librosa.load(file1, duration=length1, sr=44100, mono=False) + else: + wav1, sr1 = librosa.load(file1, sr=44100, mono=False) + + if file2.endswith(".mp3") and is_macos: + length2 = rerun_mp3(file2) + wav2, sr2 = librosa.load(file2, duration=length2, sr=44100, mono=False) + else: + wav2, sr2 = librosa.load(file2, sr=44100, mono=False) + + if wav1.ndim == 1 and wav2.ndim == 1: + is_mono = True + elif wav1.ndim == 1: + wav1 = np.asfortranarray([wav1, wav1]) + elif wav2.ndim == 1: + wav2 = np.asfortranarray([wav2, wav2]) + + # Check if phase is inverted + if phase_option == AUTO_PHASE: + if check_if_phase_inverted(wav1, wav2, is_mono=is_mono): + wav2 = -wav2 + elif phase_option == POSITIVE_PHASE: + wav2 = +wav2 + elif phase_option == NEGATIVE_PHASE: + wav2 = -wav2 + + if is_match_silence: + wav2 = adjust_leading_silence(wav2, wav1) + + wav1_length = int(librosa.get_duration(y=wav1, sr=44100)) + wav2_length = int(librosa.get_duration(y=wav2, sr=44100)) + + if not is_mono: + wav1 = wav1.transpose() + wav2 = wav2.transpose() + + wav2_org = wav2.copy() + + command_Text("Processing files... \n") + seconds_length = min(wav1_length, wav2_length) + + wav2_aligned_sources = [] + + for sec_len in align_intro_val: + # pick a position at 1 second in and get diff + sec_seg = 1 if sec_len == 1 else int(seconds_length // sec_len) + index = sr1 * sec_seg # 1 second in, assuming sr1 = sr2 = 44100 + + if is_mono: + samp1, samp2 = wav1[index : index + sr1], wav2[index : index + sr1] + diff = get_diff(samp1, samp2) + # print(f"Estimated difference: {diff}\n") + else: + index = sr1 * sec_seg # 1 second in, assuming sr1 = sr2 = 44100 + samp1, samp2 = wav1[index : index + sr1, 0], wav2[index : index + sr1, 0] + samp1_r, samp2_r = wav1[index : index + sr1, 1], wav2[index : index + sr1, 1] + diff, diff_r = get_diff(samp1, samp2), get_diff(samp1_r, samp2_r) + # print(f"Estimated difference Left Channel: {diff}\nEstimated difference Right Channel: {diff_r}\n") + + # make aligned track 2 + if diff > 0: + zeros_to_append = np.zeros(diff) if is_mono else np.zeros((diff, 2)) + wav2_aligned = np.append(zeros_to_append, wav2_org, axis=0) + elif diff < 0: + wav2_aligned = wav2_org[-diff:] + else: + wav2_aligned = wav2_org + # command_Text(f"Audio files already aligned.\n") + + if not any(np.array_equal(wav2_aligned, source) for source in wav2_aligned_sources): + wav2_aligned_sources.append(wav2_aligned) + + # print("Unique Sources: ", len(wav2_aligned_sources)) + + unique_sources = len(wav2_aligned_sources) + + sub_mapper_big_mapper = {} + + for s in wav2_aligned_sources: + wav2_aligned = match_mono_array_shapes(s, wav1) if is_mono else match_array_shapes(s, wav1, is_swap=True) + + if align_window: + wav_sub = time_correction( + wav1, wav2_aligned, seconds_length, align_window=align_window, db_analysis=db_analysis, progress_bar=progress_bar, unique_sources=unique_sources, phase_shifts=phase_shifts + ) + wav_sub_size = np.abs(wav_sub).mean() + sub_mapper_big_mapper = {**sub_mapper_big_mapper, **{wav_sub_size: wav_sub}} + else: + wav2_aligned = wav2_aligned * np.power(10, db_analysis[0] / 20) + db_range = db_analysis[1] + + for db_adjustment in db_range: + # Adjust the dB of track2 + s_adjusted = wav2_aligned * (10 ** (db_adjustment / 20)) + wav_sub = wav1 - s_adjusted + wav_sub_size = np.abs(wav_sub).mean() + sub_mapper_big_mapper = {**sub_mapper_big_mapper, **{wav_sub_size: wav_sub}} + + # print(sub_mapper_big_mapper.keys(), min(sub_mapper_big_mapper.keys())) + + sub_mapper_value_list = list(sub_mapper_big_mapper.values()) + + if is_spec_match and len(sub_mapper_value_list) >= 2: + # print("using spec ensemble with align") + wav_sub = ensemble_for_align(list(sub_mapper_big_mapper.values())) + else: + # print("using linear ensemble with align") + wav_sub = ensemble_wav(list(sub_mapper_big_mapper.values())) + + # print(f"Mix Mean: {np.abs(wav1).mean()}\nInst Mean: {np.abs(wav2).mean()}") + # print('Final: ', np.abs(wav_sub).mean()) + wav_sub = np.clip(wav_sub, -1, +1) + + command_Text(f"Saving inverted track... ") + + if is_save_aligned or is_spec_match: + wav1 = match_mono_array_shapes(wav1, wav_sub) if is_mono else match_array_shapes(wav1, wav_sub, is_swap=True) + wav2_aligned = wav1 - wav_sub + + if is_spec_match: + if wav1.ndim == 1 and wav2.ndim == 1: + wav2_aligned = np.asfortranarray([wav2_aligned, wav2_aligned]).T + wav1 = np.asfortranarray([wav1, wav1]).T + + wav2_aligned = ensemble_for_align([wav2_aligned, wav1]) + wav_sub = wav1 - wav2_aligned + + if is_save_aligned: + sf.write(file2_aligned, wav2_aligned, sr1, subtype=wav_type_set) + save_format(file2_aligned) + + sf.write(file_subtracted, wav_sub, sr1, subtype=wav_type_set) + save_format(file_subtracted) + + +def phase_shift_hilbert(signal, degree): + analytic_signal = hilbert(signal) + return np.cos(np.radians(degree)) * analytic_signal.real - np.sin(np.radians(degree)) * analytic_signal.imag + + +def get_phase_shifted_tracks(track, phase_shift): + if phase_shift == 180: + return [track, -track] + + step = phase_shift + end = 180 - (180 % step) if 180 % step == 0 else 181 + phase_range = range(step, end, step) + + flipped_list = [track, -track] + for i in phase_range: + flipped_list.extend([phase_shift_hilbert(track, i), phase_shift_hilbert(track, -i)]) + + return flipped_list + + +def time_correction(mix: np.ndarray, instrumental: np.ndarray, seconds_length, align_window, db_analysis, sr=44100, progress_bar=None, unique_sources=None, phase_shifts=NONE_P): + # Function to align two tracks using cross-correlation + + def align_tracks(track1, track2): + # A dictionary to store each version of track2_shifted and its mean absolute value + shifted_tracks = {} + + # Loop to adjust dB of track2 + track2 = track2 * np.power(10, db_analysis[0] / 20) + db_range = db_analysis[1] + + if phase_shifts == 190: + track2_flipped = [track2] + else: + track2_flipped = get_phase_shifted_tracks(track2, phase_shifts) + + for db_adjustment in db_range: + for t in track2_flipped: + # Adjust the dB of track2 + track2_adjusted = t * (10 ** (db_adjustment / 20)) + corr = correlate(track1, track2_adjusted) + delay = np.argmax(np.abs(corr)) - (len(track1) - 1) + track2_shifted = np.roll(track2_adjusted, shift=delay) + + # Compute the mean absolute value of track2_shifted + track2_shifted_sub = track1 - track2_shifted + mean_abs_value = np.abs(track2_shifted_sub).mean() + + # Store track2_shifted and its mean absolute value in the dictionary + shifted_tracks[mean_abs_value] = track2_shifted + + # Return the version of track2_shifted with the smallest mean absolute value + + return shifted_tracks[min(shifted_tracks.keys())] + + # Make sure the audio files have the same shape + + assert mix.shape == instrumental.shape, f"Audio files must have the same shape - Mix: {mix.shape}, Inst: {instrumental.shape}" + + seconds_length = seconds_length // 2 + + sub_mapper = {} + + progress_update_interval = 120 + total_iterations = 0 + + if len(align_window) > 2: + progress_update_interval = 320 + + for secs in align_window: + step = secs / 2 + window_size = int(sr * secs) + step_size = int(sr * step) + + if len(mix.shape) == 1: + total_mono = (len(range(0, len(mix) - window_size, step_size)) // progress_update_interval) * unique_sources + total_iterations += total_mono + else: + total_stereo_ = len(range(0, len(mix[:, 0]) - window_size, step_size)) * 2 + total_stereo = (total_stereo_ // progress_update_interval) * unique_sources + total_iterations += total_stereo + + # print(total_iterations) + + for secs in align_window: + sub = np.zeros_like(mix) + divider = np.zeros_like(mix) + step = secs / 2 + window_size = int(sr * secs) + step_size = int(sr * step) + window = np.hanning(window_size) + + # For the mono case: + if len(mix.shape) == 1: + # The files are mono + counter = 0 + for i in range(0, len(mix) - window_size, step_size): + counter += 1 + if counter % progress_update_interval == 0: + progress_bar(total_iterations) + window_mix = mix[i : i + window_size] * window + window_instrumental = instrumental[i : i + window_size] * window + window_instrumental_aligned = align_tracks(window_mix, window_instrumental) + sub[i : i + window_size] += window_mix - window_instrumental_aligned + divider[i : i + window_size] += window + else: + # The files are stereo + counter = 0 + for ch in range(mix.shape[1]): + for i in range(0, len(mix[:, ch]) - window_size, step_size): + counter += 1 + if counter % progress_update_interval == 0: + progress_bar(total_iterations) + window_mix = mix[i : i + window_size, ch] * window + window_instrumental = instrumental[i : i + window_size, ch] * window + window_instrumental_aligned = align_tracks(window_mix, window_instrumental) + sub[i : i + window_size, ch] += window_mix - window_instrumental_aligned + divider[i : i + window_size, ch] += window + + # Normalize the result by the overlap count + sub = np.where(divider > 1e-6, sub / divider, sub) + sub_size = np.abs(sub).mean() + sub_mapper = {**sub_mapper, **{sub_size: sub}} + + # print("SUB_LEN", len(list(sub_mapper.values()))) + + sub = ensemble_wav(list(sub_mapper.values()), split_size=12) + + return sub + + +def ensemble_wav(waveforms, split_size=240): + # Create a dictionary to hold the thirds of each waveform and their mean absolute values + waveform_thirds = {i: np.array_split(waveform, split_size) for i, waveform in enumerate(waveforms)} + + # Initialize the final waveform + final_waveform = [] + + # For chunk + for third_idx in range(split_size): + # Compute the mean absolute value of each third from each waveform + means = [np.abs(waveform_thirds[i][third_idx]).mean() for i in range(len(waveforms))] + + # Find the index of the waveform with the lowest mean absolute value for this third + min_index = np.argmin(means) + + # Add the least noisy third to the final waveform + final_waveform.append(waveform_thirds[min_index][third_idx]) + + # Concatenate all the thirds to create the final waveform + final_waveform = np.concatenate(final_waveform) + + return final_waveform + + +def ensemble_wav_min(waveforms): + for i in range(1, len(waveforms)): + if i == 1: + wave = waveforms[0] + + ln = min(len(wave), len(waveforms[i])) + wave = wave[:ln] + waveforms[i] = waveforms[i][:ln] + + wave = np.where(np.abs(waveforms[i]) <= np.abs(wave), waveforms[i], wave) + + return wave + + +def align_audio_test(wav1, wav2, sr1=44100): + def get_diff(a, b): + corr = np.correlate(a, b, "full") + diff = corr.argmax() - (b.shape[0] - 1) + return diff + + # read tracks + wav1 = wav1.transpose() + wav2 = wav2.transpose() + + # print(f"Audio file shapes: {wav1.shape} / {wav2.shape}\n") + + wav2_org = wav2.copy() + + # pick a position at 1 second in and get diff + index = sr1 # *seconds_length # 1 second in, assuming sr1 = sr2 = 44100 + samp1 = wav1[index : index + sr1, 0] # currently use left channel + samp2 = wav2[index : index + sr1, 0] + diff = get_diff(samp1, samp2) + + # make aligned track 2 + if diff > 0: + wav2_aligned = np.append(np.zeros((diff, 1)), wav2_org, axis=0) + elif diff < 0: + wav2_aligned = wav2_org[-diff:] + else: + wav2_aligned = wav2_org + + return wav2_aligned + + +def load_audio(audio_file): + wav, sr = librosa.load(audio_file, sr=44100, mono=False) + + if wav.ndim == 1: + wav = np.asfortranarray([wav, wav]) + + return wav + + +def rerun_mp3(audio_file): + with audioread.audio_open(audio_file) as f: + track_length = int(f.duration) + + return track_length diff --git a/audio_separator/separator/uvr_lib_v5/stft.py b/audio_separator/separator/uvr_lib_v5/stft.py new file mode 100644 index 0000000000000000000000000000000000000000..f4403958f9f3d52be59beef9fe52d989fccb8e95 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/stft.py @@ -0,0 +1,126 @@ +import torch + + +class STFT: + """ + This class performs the Short-Time Fourier Transform (STFT) and its inverse (ISTFT). + These functions are essential for converting the audio between the time domain and the frequency domain, + which is a crucial aspect of audio processing in neural networks. + """ + + def __init__(self, logger, n_fft, hop_length, dim_f, device): + self.logger = logger + self.n_fft = n_fft + self.hop_length = hop_length + self.dim_f = dim_f + self.device = device + # Create a Hann window tensor for use in the STFT. + self.hann_window = torch.hann_window(window_length=self.n_fft, periodic=True) + + def __call__(self, input_tensor): + # Determine if the input tensor's device is not a standard computing device (i.e., not CPU or CUDA). + is_non_standard_device = not input_tensor.device.type in ["cuda", "cpu"] + + # If on a non-standard device, temporarily move the tensor to CPU for processing. + if is_non_standard_device: + input_tensor = input_tensor.cpu() + + # Transfer the pre-defined window tensor to the same device as the input tensor. + stft_window = self.hann_window.to(input_tensor.device) + + # Extract batch dimensions (all dimensions except the last two which are channel and time). + batch_dimensions = input_tensor.shape[:-2] + + # Extract channel and time dimensions (last two dimensions of the tensor). + channel_dim, time_dim = input_tensor.shape[-2:] + + # Reshape the tensor to merge batch and channel dimensions for STFT processing. + reshaped_tensor = input_tensor.reshape([-1, time_dim]) + + # Perform the Short-Time Fourier Transform (STFT) on the reshaped tensor. + stft_output = torch.stft(reshaped_tensor, n_fft=self.n_fft, hop_length=self.hop_length, window=stft_window, center=True, return_complex=False) + + # Rearrange the dimensions of the STFT output to bring the frequency dimension forward. + permuted_stft_output = stft_output.permute([0, 3, 1, 2]) + + # Reshape the output to restore the original batch and channel dimensions, while keeping the newly formed frequency and time dimensions. + final_output = permuted_stft_output.reshape([*batch_dimensions, channel_dim, 2, -1, permuted_stft_output.shape[-1]]).reshape( + [*batch_dimensions, channel_dim * 2, -1, permuted_stft_output.shape[-1]] + ) + + # If the original tensor was on a non-standard device, move the processed tensor back to that device. + if is_non_standard_device: + final_output = final_output.to(self.device) + + # Return the transformed tensor, sliced to retain only the required frequency dimension (`dim_f`). + return final_output[..., : self.dim_f, :] + + def pad_frequency_dimension(self, input_tensor, batch_dimensions, channel_dim, freq_dim, time_dim, num_freq_bins): + """ + Adds zero padding to the frequency dimension of the input tensor. + """ + # Create a padding tensor for the frequency dimension + freq_padding = torch.zeros([*batch_dimensions, channel_dim, num_freq_bins - freq_dim, time_dim]).to(input_tensor.device) + + # Concatenate the padding to the input tensor along the frequency dimension. + padded_tensor = torch.cat([input_tensor, freq_padding], -2) + + return padded_tensor + + def calculate_inverse_dimensions(self, input_tensor): + # Extract batch dimensions and frequency-time dimensions. + batch_dimensions = input_tensor.shape[:-3] + channel_dim, freq_dim, time_dim = input_tensor.shape[-3:] + + # Calculate the number of frequency bins for the inverse STFT. + num_freq_bins = self.n_fft // 2 + 1 + + return batch_dimensions, channel_dim, freq_dim, time_dim, num_freq_bins + + def prepare_for_istft(self, padded_tensor, batch_dimensions, channel_dim, num_freq_bins, time_dim): + """ + Prepares the tensor for Inverse Short-Time Fourier Transform (ISTFT) by reshaping + and creating a complex tensor from the real and imaginary parts. + """ + # Reshape the tensor to separate real and imaginary parts and prepare for ISTFT. + reshaped_tensor = padded_tensor.reshape([*batch_dimensions, channel_dim // 2, 2, num_freq_bins, time_dim]) + + # Flatten batch dimensions and rearrange for ISTFT. + flattened_tensor = reshaped_tensor.reshape([-1, 2, num_freq_bins, time_dim]) + + # Rearrange the dimensions of the tensor to bring the frequency dimension forward. + permuted_tensor = flattened_tensor.permute([0, 2, 3, 1]) + + # Combine real and imaginary parts into a complex tensor. + complex_tensor = permuted_tensor[..., 0] + permuted_tensor[..., 1] * 1.0j + + return complex_tensor + + def inverse(self, input_tensor): + # Determine if the input tensor's device is not a standard computing device (i.e., not CPU or CUDA). + is_non_standard_device = not input_tensor.device.type in ["cuda", "cpu"] + + # If on a non-standard device, temporarily move the tensor to CPU for processing. + if is_non_standard_device: + input_tensor = input_tensor.cpu() + + # Transfer the pre-defined Hann window tensor to the same device as the input tensor. + stft_window = self.hann_window.to(input_tensor.device) + + batch_dimensions, channel_dim, freq_dim, time_dim, num_freq_bins = self.calculate_inverse_dimensions(input_tensor) + + padded_tensor = self.pad_frequency_dimension(input_tensor, batch_dimensions, channel_dim, freq_dim, time_dim, num_freq_bins) + + complex_tensor = self.prepare_for_istft(padded_tensor, batch_dimensions, channel_dim, num_freq_bins, time_dim) + + # Perform the Inverse Short-Time Fourier Transform (ISTFT). + istft_result = torch.istft(complex_tensor, n_fft=self.n_fft, hop_length=self.hop_length, window=stft_window, center=True) + + # Reshape ISTFT result to restore original batch and channel dimensions. + final_output = istft_result.reshape([*batch_dimensions, 2, -1]) + + # If the original tensor was on a non-standard device, move the processed tensor back to that device. + if is_non_standard_device: + final_output = final_output.to(self.device) + + return final_output diff --git a/audio_separator/separator/uvr_lib_v5/tfc_tdf_v3.py b/audio_separator/separator/uvr_lib_v5/tfc_tdf_v3.py new file mode 100644 index 0000000000000000000000000000000000000000..eba006c98249c1730c50fae2ac8dcd42a9be3453 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/tfc_tdf_v3.py @@ -0,0 +1,253 @@ +import torch +import torch.nn as nn +from functools import partial + +class STFT: + def __init__(self, n_fft, hop_length, dim_f, device): + self.n_fft = n_fft + self.hop_length = hop_length + self.window = torch.hann_window(window_length=self.n_fft, periodic=True) + self.dim_f = dim_f + self.device = device + + def __call__(self, x): + + x_is_mps = not x.device.type in ["cuda", "cpu"] + if x_is_mps: + x = x.cpu() + + window = self.window.to(x.device) + batch_dims = x.shape[:-2] + c, t = x.shape[-2:] + x = x.reshape([-1, t]) + x = torch.stft(x, n_fft=self.n_fft, hop_length=self.hop_length, window=window, center=True,return_complex=False) + x = x.permute([0, 3, 1, 2]) + x = x.reshape([*batch_dims, c, 2, -1, x.shape[-1]]).reshape([*batch_dims, c * 2, -1, x.shape[-1]]) + + if x_is_mps: + x = x.to(self.device) + + return x[..., :self.dim_f, :] + + def inverse(self, x): + + x_is_mps = not x.device.type in ["cuda", "cpu"] + if x_is_mps: + x = x.cpu() + + window = self.window.to(x.device) + batch_dims = x.shape[:-3] + c, f, t = x.shape[-3:] + n = self.n_fft // 2 + 1 + f_pad = torch.zeros([*batch_dims, c, n - f, t]).to(x.device) + x = torch.cat([x, f_pad], -2) + x = x.reshape([*batch_dims, c // 2, 2, n, t]).reshape([-1, 2, n, t]) + x = x.permute([0, 2, 3, 1]) + x = x[..., 0] + x[..., 1] * 1.j + x = torch.istft(x, n_fft=self.n_fft, hop_length=self.hop_length, window=window, center=True) + x = x.reshape([*batch_dims, 2, -1]) + + if x_is_mps: + x = x.to(self.device) + + return x + +def get_norm(norm_type): + def norm(c, norm_type): + if norm_type == 'BatchNorm': + return nn.BatchNorm2d(c) + elif norm_type == 'InstanceNorm': + return nn.InstanceNorm2d(c, affine=True) + elif 'GroupNorm' in norm_type: + g = int(norm_type.replace('GroupNorm', '')) + return nn.GroupNorm(num_groups=g, num_channels=c) + else: + return nn.Identity() + + return partial(norm, norm_type=norm_type) + + +def get_act(act_type): + if act_type == 'gelu': + return nn.GELU() + elif act_type == 'relu': + return nn.ReLU() + elif act_type[:3] == 'elu': + alpha = float(act_type.replace('elu', '')) + return nn.ELU(alpha) + else: + raise Exception + + +class Upscale(nn.Module): + def __init__(self, in_c, out_c, scale, norm, act): + super().__init__() + self.conv = nn.Sequential( + norm(in_c), + act, + nn.ConvTranspose2d(in_channels=in_c, out_channels=out_c, kernel_size=scale, stride=scale, bias=False) + ) + + def forward(self, x): + return self.conv(x) + + +class Downscale(nn.Module): + def __init__(self, in_c, out_c, scale, norm, act): + super().__init__() + self.conv = nn.Sequential( + norm(in_c), + act, + nn.Conv2d(in_channels=in_c, out_channels=out_c, kernel_size=scale, stride=scale, bias=False) + ) + + def forward(self, x): + return self.conv(x) + + +class TFC_TDF(nn.Module): + def __init__(self, in_c, c, l, f, bn, norm, act): + super().__init__() + + self.blocks = nn.ModuleList() + for i in range(l): + block = nn.Module() + + block.tfc1 = nn.Sequential( + norm(in_c), + act, + nn.Conv2d(in_c, c, 3, 1, 1, bias=False), + ) + block.tdf = nn.Sequential( + norm(c), + act, + nn.Linear(f, f // bn, bias=False), + norm(c), + act, + nn.Linear(f // bn, f, bias=False), + ) + block.tfc2 = nn.Sequential( + norm(c), + act, + nn.Conv2d(c, c, 3, 1, 1, bias=False), + ) + block.shortcut = nn.Conv2d(in_c, c, 1, 1, 0, bias=False) + + self.blocks.append(block) + in_c = c + + def forward(self, x): + for block in self.blocks: + s = block.shortcut(x) + x = block.tfc1(x) + x = x + block.tdf(x) + x = block.tfc2(x) + x = x + s + return x + + +class TFC_TDF_net(nn.Module): + def __init__(self, config, device): + super().__init__() + self.config = config + self.device = device + + norm = get_norm(norm_type=config.model.norm) + act = get_act(act_type=config.model.act) + + self.num_target_instruments = 1 if config.training.target_instrument else len(config.training.instruments) + self.num_subbands = config.model.num_subbands + + dim_c = self.num_subbands * config.audio.num_channels * 2 + n = config.model.num_scales + scale = config.model.scale + l = config.model.num_blocks_per_scale + c = config.model.num_channels + g = config.model.growth + bn = config.model.bottleneck_factor + f = config.audio.dim_f // self.num_subbands + + self.first_conv = nn.Conv2d(dim_c, c, 1, 1, 0, bias=False) + + self.encoder_blocks = nn.ModuleList() + for i in range(n): + block = nn.Module() + block.tfc_tdf = TFC_TDF(c, c, l, f, bn, norm, act) + block.downscale = Downscale(c, c + g, scale, norm, act) + f = f // scale[1] + c += g + self.encoder_blocks.append(block) + + self.bottleneck_block = TFC_TDF(c, c, l, f, bn, norm, act) + + self.decoder_blocks = nn.ModuleList() + for i in range(n): + block = nn.Module() + block.upscale = Upscale(c, c - g, scale, norm, act) + f = f * scale[1] + c -= g + block.tfc_tdf = TFC_TDF(2 * c, c, l, f, bn, norm, act) + self.decoder_blocks.append(block) + + self.final_conv = nn.Sequential( + nn.Conv2d(c + dim_c, c, 1, 1, 0, bias=False), + act, + nn.Conv2d(c, self.num_target_instruments * dim_c, 1, 1, 0, bias=False) + ) + + self.stft = STFT(config.audio.n_fft, config.audio.hop_length, config.audio.dim_f, self.device) + + def cac2cws(self, x): + k = self.num_subbands + b, c, f, t = x.shape + x = x.reshape(b, c, k, f // k, t) + x = x.reshape(b, c * k, f // k, t) + return x + + def cws2cac(self, x): + k = self.num_subbands + b, c, f, t = x.shape + x = x.reshape(b, c // k, k, f, t) + x = x.reshape(b, c // k, f * k, t) + return x + + def forward(self, x): + + x = self.stft(x) + + mix = x = self.cac2cws(x) + + first_conv_out = x = self.first_conv(x) + + x = x.transpose(-1, -2) + + encoder_outputs = [] + for block in self.encoder_blocks: + x = block.tfc_tdf(x) + encoder_outputs.append(x) + x = block.downscale(x) + + x = self.bottleneck_block(x) + + for block in self.decoder_blocks: + x = block.upscale(x) + x = torch.cat([x, encoder_outputs.pop()], 1) + x = block.tfc_tdf(x) + + x = x.transpose(-1, -2) + + x = x * first_conv_out # reduce artifacts + + x = self.final_conv(torch.cat([mix, x], 1)) + + x = self.cws2cac(x) + + if self.num_target_instruments > 1: + b, c, f, t = x.shape + x = x.reshape(b, self.num_target_instruments, -1, f, t) + + x = self.stft.inverse(x) + + return x + + diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/__init__.py b/audio_separator/separator/uvr_lib_v5/vr_network/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..361b7086d3bebd02a4eb7b20582f2fc5ab299cf2 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/__init__.py @@ -0,0 +1 @@ +# VR init. diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/layers.py b/audio_separator/separator/uvr_lib_v5/vr_network/layers.py new file mode 100644 index 0000000000000000000000000000000000000000..7526447d2438092c807254d1b7cbfd221e1c707c --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/layers.py @@ -0,0 +1,294 @@ +import torch +from torch import nn +import torch.nn.functional as F + +from audio_separator.separator.uvr_lib_v5 import spec_utils + + +class Conv2DBNActiv(nn.Module): + """ + This class implements a convolutional layer followed by batch normalization and an activation function. + It is a common pattern in deep learning for processing images or feature maps. The convolutional layer + applies a set of learnable filters to the input. Batch normalization then normalizes the output of the + convolution, and finally, an activation function introduces non-linearity to the model, allowing it to + learn more complex patterns. + + Attributes: + conv (nn.Sequential): A sequential container of Conv2d, BatchNorm2d, and an activation layer. + + Args: + num_input_channels (int): Number of input channels. + num_output_channels (int): Number of output channels. + kernel_size (int, optional): Size of the kernel. Defaults to 3. + stride_length (int, optional): Stride of the convolution. Defaults to 1. + padding_size (int, optional): Padding added to all sides of the input. Defaults to 1. + dilation_rate (int, optional): Spacing between kernel elements. Defaults to 1. + activation_function (callable, optional): The activation function to use. Defaults to nn.ReLU. + """ + + def __init__(self, nin, nout, ksize=3, stride=1, pad=1, dilation=1, activ=nn.ReLU): + super(Conv2DBNActiv, self).__init__() + + # The nn.Sequential container allows us to stack the Conv2d, BatchNorm2d, and activation layers + # into a single module, simplifying the forward pass. + self.conv = nn.Sequential(nn.Conv2d(nin, nout, kernel_size=ksize, stride=stride, padding=pad, dilation=dilation, bias=False), nn.BatchNorm2d(nout), activ()) + + def __call__(self, input_tensor): + # Defines the computation performed at every call. + # Simply passes the input through the sequential container. + return self.conv(input_tensor) + + +class SeperableConv2DBNActiv(nn.Module): + """ + This class implements a separable convolutional layer followed by batch normalization and an activation function. + Separable convolutions are a type of convolution that splits the convolution operation into two simpler operations: + a depthwise convolution and a pointwise convolution. This can reduce the number of parameters and computational cost, + making the network more efficient while maintaining similar performance. + + The depthwise convolution applies a single filter per input channel (input depth). The pointwise convolution, + which follows, applies a 1x1 convolution to combine the outputs of the depthwise convolution across channels. + Batch normalization is then applied to stabilize learning and reduce internal covariate shift. Finally, + an activation function introduces non-linearity, allowing the network to learn complex patterns. + Attributes: + conv (nn.Sequential): A sequential container of depthwise Conv2d, pointwise Conv2d, BatchNorm2d, and an activation layer. + + Args: + num_input_channels (int): Number of input channels. + num_output_channels (int): Number of output channels. + kernel_size (int, optional): Size of the kernel for the depthwise convolution. Defaults to 3. + stride_length (int, optional): Stride of the convolution. Defaults to 1. + padding_size (int, optional): Padding added to all sides of the input for the depthwise convolution. Defaults to 1. + dilation_rate (int, optional): Spacing between kernel elements for the depthwise convolution. Defaults to 1. + activation_function (callable, optional): The activation function to use. Defaults to nn.ReLU. + """ + + def __init__(self, nin, nout, ksize=3, stride=1, pad=1, dilation=1, activ=nn.ReLU): + super(SeperableConv2DBNActiv, self).__init__() + + # Initialize the sequential container with the depthwise convolution. + # The number of groups in the depthwise convolution is set to num_input_channels, which means each input channel is treated separately. + # The pointwise convolution then combines these separate channels into num_output_channels channels. + # Batch normalization is applied to the output of the pointwise convolution. + # Finally, the activation function is applied to introduce non-linearity. + self.conv = nn.Sequential( + nn.Conv2d( + nin, + nin, # For depthwise convolution, in_channels = out_channels = num_input_channels + kernel_size=ksize, + stride=stride, + padding=pad, + dilation=dilation, + groups=nin, # This makes it a depthwise convolution + bias=False, # Bias is not used because it will be handled by BatchNorm2d + ), + nn.Conv2d( + nin, + nout, # Pointwise convolution to combine channels + kernel_size=1, # Kernel size of 1 for pointwise convolution + bias=False, # Bias is not used because it will be handled by BatchNorm2d + ), + nn.BatchNorm2d(nout), # Normalize the output of the pointwise convolution + activ(), # Apply the activation function + ) + + def __call__(self, input_tensor): + # Pass the input through the sequential container. + # This performs the depthwise convolution, followed by the pointwise convolution, + # batch normalization, and finally applies the activation function. + return self.conv(input_tensor) + + +class Encoder(nn.Module): + """ + The Encoder class is a part of the neural network architecture that is responsible for processing the input data. + It consists of two convolutional layers, each followed by batch normalization and an activation function. + The purpose of the Encoder is to transform the input data into a higher-level, abstract representation. + This is achieved by applying filters (through convolutions) that can capture patterns or features in the data. + The Encoder can be thought of as a feature extractor that prepares the data for further processing by the network. + Attributes: + conv1 (Conv2DBNActiv): The first convolutional layer in the encoder. + conv2 (Conv2DBNActiv): The second convolutional layer in the encoder. + + Args: + number_of_input_channels (int): Number of input channels for the first convolutional layer. + number_of_output_channels (int): Number of output channels for the convolutional layers. + kernel_size (int): Kernel size for the convolutional layers. + stride_length (int): Stride for the convolutional operations. + padding_size (int): Padding added to all sides of the input for the convolutional layers. + activation_function (callable): The activation function to use after each convolutional layer. + """ + + def __init__(self, nin, nout, ksize=3, stride=1, pad=1, activ=nn.LeakyReLU): + super(Encoder, self).__init__() + + # The first convolutional layer takes the input and applies a convolution, + # followed by batch normalization and an activation function specified by `activation_function`. + # This layer is responsible for capturing the initial set of features from the input data. + self.conv1 = Conv2DBNActiv(nin, nout, ksize, 1, pad, activ=activ) + + # The second convolutional layer further processes the output from the first layer, + # applying another set of convolution, batch normalization, and activation. + # This layer helps in capturing more complex patterns in the data by building upon the initial features extracted by conv1. + self.conv2 = Conv2DBNActiv(nout, nout, ksize, stride, pad, activ=activ) + + def __call__(self, input_tensor): + # The input data `input_tensor` is passed through the first convolutional layer. + # The output of this layer serves as a 'skip connection' that can be used later in the network to preserve spatial information. + skip = self.conv1(input_tensor) + + # The output from the first layer is then passed through the second convolutional layer. + # This processed data `hidden` is the final output of the Encoder, representing the abstracted features of the input. + hidden = self.conv2(skip) + + # The Encoder returns two outputs: `hidden`, the abstracted feature representation, and `skip`, the intermediate representation from conv1. + return hidden, skip + + +class Decoder(nn.Module): + """ + The Decoder class is part of the neural network architecture, specifically designed to perform the inverse operation of an encoder. + Its main role is to reconstruct or generate data from encoded representations, which is crucial in tasks like image segmentation or audio processing. + This class uses upsampling, convolution, optional dropout for regularization, and concatenation of skip connections to achieve its goal. + + Attributes: + convolution (Conv2DBNActiv): A convolutional layer with batch normalization and activation function. + dropout_layer (nn.Dropout2d): An optional dropout layer for regularization to prevent overfitting. + + Args: + input_channels (int): Number of input channels for the convolutional layer. + output_channels (int): Number of output channels for the convolutional layer. + kernel_size (int): Kernel size for the convolutional layer. + stride (int): Stride for the convolutional operations. + padding (int): Padding added to all sides of the input for the convolutional layer. + activation_function (callable): The activation function to use after the convolutional layer. + include_dropout (bool): Whether to include a dropout layer for regularization. + """ + + def __init__(self, nin, nout, ksize=3, stride=1, pad=1, activ=nn.ReLU, dropout=False): + super(Decoder, self).__init__() + + # Initialize the convolutional layer with specified parameters. + self.conv = Conv2DBNActiv(nin, nout, ksize, 1, pad, activ=activ) + + # Initialize the dropout layer if include_dropout is set to True + self.dropout = nn.Dropout2d(0.1) if dropout else None + + def __call__(self, input_tensor, skip=None): + # Upsample the input tensor to a higher resolution using bilinear interpolation. + input_tensor = F.interpolate(input_tensor, scale_factor=2, mode="bilinear", align_corners=True) + # If a skip connection is provided, crop it to match the size of input_tensor and concatenate them along the channel dimension. + if skip is not None: + skip = spec_utils.crop_center(skip, input_tensor) # Crop skip_connection to match input_tensor's dimensions. + input_tensor = torch.cat([input_tensor, skip], dim=1) # Concatenate input_tensor and skip_connection along the channel dimension. + + # Pass the concatenated tensor (or just input_tensor if no skip_connection is provided) through the convolutional layer. + output_tensor = self.conv(input_tensor) + + # If dropout is enabled, apply it to the output of the convolutional layer. + if self.dropout is not None: + output_tensor = self.dropout(output_tensor) + + # Return the final output tensor. + return output_tensor + + +class ASPPModule(nn.Module): + """ + Atrous Spatial Pyramid Pooling (ASPP) Module is designed for capturing multi-scale context by applying + atrous convolution at multiple rates. This is particularly useful in segmentation tasks where capturing + objects at various scales is beneficial. The module applies several parallel dilated convolutions with + different dilation rates to the input feature map, allowing it to efficiently capture information at + multiple scales. + + Attributes: + conv1 (nn.Sequential): Applies adaptive average pooling followed by a 1x1 convolution. + nn_architecture (int): Identifier for the neural network architecture being used. + six_layer (list): List containing architecture identifiers that require six layers. + seven_layer (list): List containing architecture identifiers that require seven layers. + conv2-conv7 (nn.Module): Convolutional layers with varying dilation rates for multi-scale feature extraction. + bottleneck (nn.Sequential): A 1x1 convolutional layer that combines all features followed by dropout for regularization. + """ + + def __init__(self, nn_architecture, nin, nout, dilations=(4, 8, 16), activ=nn.ReLU): + """ + Initializes the ASPP module with specified parameters. + + Args: + nn_architecture (int): Identifier for the neural network architecture. + input_channels (int): Number of input channels. + output_channels (int): Number of output channels. + dilations (tuple): Tuple of dilation rates for the atrous convolutions. + activation (callable): Activation function to use after convolutional layers. + """ + super(ASPPModule, self).__init__() + + # Adaptive average pooling reduces the spatial dimensions to 1x1, focusing on global context, + # followed by a 1x1 convolution to project back to the desired channel dimension. + self.conv1 = nn.Sequential(nn.AdaptiveAvgPool2d((1, None)), Conv2DBNActiv(nin, nin, 1, 1, 0, activ=activ)) + + self.nn_architecture = nn_architecture + # Architecture identifiers for models requiring additional layers. + self.six_layer = [129605] + self.seven_layer = [537238, 537227, 33966] + + # Extra convolutional layer used for six and seven layer configurations. + extra_conv = SeperableConv2DBNActiv(nin, nin, 3, 1, dilations[2], dilations[2], activ=activ) + + # Standard 1x1 convolution for channel reduction. + self.conv2 = Conv2DBNActiv(nin, nin, 1, 1, 0, activ=activ) + + # Separable convolutions with different dilation rates for multi-scale feature extraction. + self.conv3 = SeperableConv2DBNActiv(nin, nin, 3, 1, dilations[0], dilations[0], activ=activ) + self.conv4 = SeperableConv2DBNActiv(nin, nin, 3, 1, dilations[1], dilations[1], activ=activ) + self.conv5 = SeperableConv2DBNActiv(nin, nin, 3, 1, dilations[2], dilations[2], activ=activ) + + # Depending on the architecture, include the extra convolutional layers. + if self.nn_architecture in self.six_layer: + self.conv6 = extra_conv + nin_x = 6 + elif self.nn_architecture in self.seven_layer: + self.conv6 = extra_conv + self.conv7 = extra_conv + nin_x = 7 + else: + nin_x = 5 + + # Bottleneck layer combines all the multi-scale features into the desired number of output channels. + self.bottleneck = nn.Sequential(Conv2DBNActiv(nin * nin_x, nout, 1, 1, 0, activ=activ), nn.Dropout2d(0.1)) + + def forward(self, input_tensor): + """ + Forward pass of the ASPP module. + + Args: + input_tensor (Tensor): Input tensor. + + Returns: + Tensor: Output tensor after applying ASPP. + """ + _, _, h, w = input_tensor.size() + + # Apply the first convolutional sequence and upsample to the original resolution. + feat1 = F.interpolate(self.conv1(input_tensor), size=(h, w), mode="bilinear", align_corners=True) + + # Apply the remaining convolutions directly on the input. + feat2 = self.conv2(input_tensor) + feat3 = self.conv3(input_tensor) + feat4 = self.conv4(input_tensor) + feat5 = self.conv5(input_tensor) + + # Concatenate features from all layers. Depending on the architecture, include the extra features. + if self.nn_architecture in self.six_layer: + feat6 = self.conv6(input_tensor) + out = torch.cat((feat1, feat2, feat3, feat4, feat5, feat6), dim=1) + elif self.nn_architecture in self.seven_layer: + feat6 = self.conv6(input_tensor) + feat7 = self.conv7(input_tensor) + out = torch.cat((feat1, feat2, feat3, feat4, feat5, feat6, feat7), dim=1) + else: + out = torch.cat((feat1, feat2, feat3, feat4, feat5), dim=1) + + # Apply the bottleneck layer to combine and reduce the channel dimensions. + bottleneck_output = self.bottleneck(out) + return bottleneck_output diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/layers_new.py b/audio_separator/separator/uvr_lib_v5/vr_network/layers_new.py new file mode 100644 index 0000000000000000000000000000000000000000..35b69e92c3eb446e9cea2e29dc2a7b74d510b15a --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/layers_new.py @@ -0,0 +1,149 @@ +import torch +from torch import nn +import torch.nn.functional as F + +from audio_separator.separator.uvr_lib_v5 import spec_utils + + +class Conv2DBNActiv(nn.Module): + """ + Conv2DBNActiv Class: + This class implements a convolutional layer followed by batch normalization and an activation function. + It is a fundamental building block for constructing neural networks, especially useful in image and audio processing tasks. + The class encapsulates the pattern of applying a convolution, normalizing the output, and then applying a non-linear activation. + """ + + def __init__(self, nin, nout, ksize=3, stride=1, pad=1, dilation=1, activ=nn.ReLU): + super(Conv2DBNActiv, self).__init__() + + # Sequential model combining Conv2D, BatchNorm, and activation function into a single module + self.conv = nn.Sequential(nn.Conv2d(nin, nout, kernel_size=ksize, stride=stride, padding=pad, dilation=dilation, bias=False), nn.BatchNorm2d(nout), activ()) + + def __call__(self, input_tensor): + # Forward pass through the sequential model + return self.conv(input_tensor) + + +class Encoder(nn.Module): + """ + Encoder Class: + This class defines an encoder module typically used in autoencoder architectures. + It consists of two convolutional layers, each followed by batch normalization and an activation function. + """ + + def __init__(self, nin, nout, ksize=3, stride=1, pad=1, activ=nn.LeakyReLU): + super(Encoder, self).__init__() + + # First convolutional layer of the encoder + self.conv1 = Conv2DBNActiv(nin, nout, ksize, stride, pad, activ=activ) + # Second convolutional layer of the encoder + self.conv2 = Conv2DBNActiv(nout, nout, ksize, 1, pad, activ=activ) + + def __call__(self, input_tensor): + # Applying the first and then the second convolutional layers + hidden = self.conv1(input_tensor) + hidden = self.conv2(hidden) + + return hidden + + +class Decoder(nn.Module): + """ + Decoder Class: + This class defines a decoder module, which is the counterpart of the Encoder class in autoencoder architectures. + It applies a convolutional layer followed by batch normalization and an activation function, with an optional dropout layer for regularization. + """ + + def __init__(self, nin, nout, ksize=3, stride=1, pad=1, activ=nn.ReLU, dropout=False): + super(Decoder, self).__init__() + # Convolutional layer with optional dropout for regularization + self.conv1 = Conv2DBNActiv(nin, nout, ksize, 1, pad, activ=activ) + # self.conv2 = Conv2DBNActiv(nout, nout, ksize, 1, pad, activ=activ) + self.dropout = nn.Dropout2d(0.1) if dropout else None + + def __call__(self, input_tensor, skip=None): + # Forward pass through the convolutional layer and optional dropout + input_tensor = F.interpolate(input_tensor, scale_factor=2, mode="bilinear", align_corners=True) + + if skip is not None: + skip = spec_utils.crop_center(skip, input_tensor) + input_tensor = torch.cat([input_tensor, skip], dim=1) + + hidden = self.conv1(input_tensor) + # hidden = self.conv2(hidden) + + if self.dropout is not None: + hidden = self.dropout(hidden) + + return hidden + + +class ASPPModule(nn.Module): + """ + ASPPModule Class: + This class implements the Atrous Spatial Pyramid Pooling (ASPP) module, which is useful for semantic image segmentation tasks. + It captures multi-scale contextual information by applying convolutions at multiple dilation rates. + """ + + def __init__(self, nin, nout, dilations=(4, 8, 12), activ=nn.ReLU, dropout=False): + super(ASPPModule, self).__init__() + + # Global context convolution captures the overall context + self.conv1 = nn.Sequential(nn.AdaptiveAvgPool2d((1, None)), Conv2DBNActiv(nin, nout, 1, 1, 0, activ=activ)) + self.conv2 = Conv2DBNActiv(nin, nout, 1, 1, 0, activ=activ) + self.conv3 = Conv2DBNActiv(nin, nout, 3, 1, dilations[0], dilations[0], activ=activ) + self.conv4 = Conv2DBNActiv(nin, nout, 3, 1, dilations[1], dilations[1], activ=activ) + self.conv5 = Conv2DBNActiv(nin, nout, 3, 1, dilations[2], dilations[2], activ=activ) + self.bottleneck = Conv2DBNActiv(nout * 5, nout, 1, 1, 0, activ=activ) + self.dropout = nn.Dropout2d(0.1) if dropout else None + + def forward(self, input_tensor): + _, _, h, w = input_tensor.size() + + # Upsample global context to match input size and combine with local and multi-scale features + feat1 = F.interpolate(self.conv1(input_tensor), size=(h, w), mode="bilinear", align_corners=True) + feat2 = self.conv2(input_tensor) + feat3 = self.conv3(input_tensor) + feat4 = self.conv4(input_tensor) + feat5 = self.conv5(input_tensor) + out = torch.cat((feat1, feat2, feat3, feat4, feat5), dim=1) + out = self.bottleneck(out) + + if self.dropout is not None: + out = self.dropout(out) + + return out + + +class LSTMModule(nn.Module): + """ + LSTMModule Class: + This class defines a module that combines convolutional feature extraction with a bidirectional LSTM for sequence modeling. + It is useful for tasks that require understanding temporal dynamics in data, such as speech and audio processing. + """ + + def __init__(self, nin_conv, nin_lstm, nout_lstm): + super(LSTMModule, self).__init__() + # Convolutional layer for initial feature extraction + self.conv = Conv2DBNActiv(nin_conv, 1, 1, 1, 0) + + # Bidirectional LSTM for capturing temporal dynamics + self.lstm = nn.LSTM(input_size=nin_lstm, hidden_size=nout_lstm // 2, bidirectional=True) + + # Dense layer for output dimensionality matching + self.dense = nn.Sequential(nn.Linear(nout_lstm, nin_lstm), nn.BatchNorm1d(nin_lstm), nn.ReLU()) + + def forward(self, input_tensor): + N, _, nbins, nframes = input_tensor.size() + + # Extract features and prepare for LSTM + hidden = self.conv(input_tensor)[:, 0] # N, nbins, nframes + hidden = hidden.permute(2, 0, 1) # nframes, N, nbins + hidden, _ = self.lstm(hidden) + + # Apply dense layer and reshape to match expected output format + hidden = self.dense(hidden.reshape(-1, hidden.size()[-1])) # nframes * N, nbins + hidden = hidden.reshape(nframes, N, 1, nbins) + hidden = hidden.permute(1, 2, 3, 0) + + return hidden diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/model_param_init.py b/audio_separator/separator/uvr_lib_v5/vr_network/model_param_init.py new file mode 100644 index 0000000000000000000000000000000000000000..8bba7021f64e08223c13e20daef1f236795b8ac9 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/model_param_init.py @@ -0,0 +1,71 @@ +import json + +default_param = {} +default_param["bins"] = -1 +default_param["unstable_bins"] = -1 # training only +default_param["stable_bins"] = -1 # training only +default_param["sr"] = 44100 +default_param["pre_filter_start"] = -1 +default_param["pre_filter_stop"] = -1 +default_param["band"] = {} + +N_BINS = "n_bins" + + +def int_keys(d): + """ + Converts string keys that represent integers into actual integer keys in a list. + + This function is particularly useful when dealing with JSON data that may represent + integer keys as strings due to the nature of JSON encoding. By converting these keys + back to integers, it ensures that the data can be used in a manner consistent with + its original representation, especially in contexts where the distinction between + string and integer keys is important. + + Args: + input_list (list of tuples): A list of (key, value) pairs where keys are strings + that may represent integers. + + Returns: + dict: A dictionary with keys converted to integers where applicable. + """ + # Initialize an empty dictionary to hold the converted key-value pairs. + result_dict = {} + # Iterate through each key-value pair in the input list. + for key, value in d: + # Check if the key is a digit (i.e., represents an integer). + if key.isdigit(): + # Convert the key from a string to an integer. + key = int(key) + result_dict[key] = value + return result_dict + + +class ModelParameters(object): + """ + A class to manage model parameters, including loading from a configuration file. + + Attributes: + param (dict): Dictionary holding all parameters for the model. + """ + + def __init__(self, config_path=""): + """ + Initializes the ModelParameters object by loading parameters from a JSON configuration file. + + Args: + config_path (str): Path to the JSON configuration file. + """ + + # Load parameters from the given configuration file path. + with open(config_path, "r") as f: + self.param = json.loads(f.read(), object_pairs_hook=int_keys) + + # Ensure certain parameters are set to False if not specified in the configuration. + for k in ["mid_side", "mid_side_b", "mid_side_b2", "stereo_w", "stereo_n", "reverse"]: + if not k in self.param: + self.param[k] = False + + # If 'n_bins' is specified in the parameters, it's used as the value for 'bins'. + if N_BINS in self.param: + self.param["bins"] = self.param[N_BINS] diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr16000_hl512.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr16000_hl512.json new file mode 100644 index 0000000000000000000000000000000000000000..72cb4499867ad2827185e85687f06fb73d33eced --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr16000_hl512.json @@ -0,0 +1,19 @@ +{ + "bins": 1024, + "unstable_bins": 0, + "reduction_bins": 0, + "band": { + "1": { + "sr": 16000, + "hl": 512, + "n_fft": 2048, + "crop_start": 0, + "crop_stop": 1024, + "hpf_start": -1, + "res_type": "sinc_best" + } + }, + "sr": 16000, + "pre_filter_start": 1023, + "pre_filter_stop": 1024 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr32000_hl512.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr32000_hl512.json new file mode 100644 index 0000000000000000000000000000000000000000..3c00ecf0a105e55a6a86a3c32db301a2635b5b41 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr32000_hl512.json @@ -0,0 +1,19 @@ +{ + "bins": 1024, + "unstable_bins": 0, + "reduction_bins": 0, + "band": { + "1": { + "sr": 32000, + "hl": 512, + "n_fft": 2048, + "crop_start": 0, + "crop_stop": 1024, + "hpf_start": -1, + "res_type": "kaiser_fast" + } + }, + "sr": 32000, + "pre_filter_start": 1000, + "pre_filter_stop": 1021 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr33075_hl384.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr33075_hl384.json new file mode 100644 index 0000000000000000000000000000000000000000..55666ac9a8d0547751fb4b4d3bffb1ee2c956913 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr33075_hl384.json @@ -0,0 +1,19 @@ +{ + "bins": 1024, + "unstable_bins": 0, + "reduction_bins": 0, + "band": { + "1": { + "sr": 33075, + "hl": 384, + "n_fft": 2048, + "crop_start": 0, + "crop_stop": 1024, + "hpf_start": -1, + "res_type": "sinc_best" + } + }, + "sr": 33075, + "pre_filter_start": 1000, + "pre_filter_stop": 1021 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl1024.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl1024.json new file mode 100644 index 0000000000000000000000000000000000000000..665abe20eb3cc39fe0f8493dad8f25f6ef634a14 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl1024.json @@ -0,0 +1,19 @@ +{ + "bins": 1024, + "unstable_bins": 0, + "reduction_bins": 0, + "band": { + "1": { + "sr": 44100, + "hl": 1024, + "n_fft": 2048, + "crop_start": 0, + "crop_stop": 1024, + "hpf_start": -1, + "res_type": "sinc_best" + } + }, + "sr": 44100, + "pre_filter_start": 1023, + "pre_filter_stop": 1024 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl256.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl256.json new file mode 100644 index 0000000000000000000000000000000000000000..0e8b16f89b0231d06eabe8d2f7c2670c7caa2272 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl256.json @@ -0,0 +1,19 @@ +{ + "bins": 256, + "unstable_bins": 0, + "reduction_bins": 0, + "band": { + "1": { + "sr": 44100, + "hl": 256, + "n_fft": 512, + "crop_start": 0, + "crop_stop": 256, + "hpf_start": -1, + "res_type": "sinc_best" + } + }, + "sr": 44100, + "pre_filter_start": 256, + "pre_filter_stop": 256 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl512.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl512.json new file mode 100644 index 0000000000000000000000000000000000000000..3b38fcaf60ba204e03a47f5bd3f5bcfe75e1983a --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl512.json @@ -0,0 +1,19 @@ +{ + "bins": 1024, + "unstable_bins": 0, + "reduction_bins": 0, + "band": { + "1": { + "sr": 44100, + "hl": 512, + "n_fft": 2048, + "crop_start": 0, + "crop_stop": 1024, + "hpf_start": -1, + "res_type": "sinc_best" + } + }, + "sr": 44100, + "pre_filter_start": 1023, + "pre_filter_stop": 1024 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl512_cut.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl512_cut.json new file mode 100644 index 0000000000000000000000000000000000000000..630df3524e340f43a1ddb7b33ff02cc91fc1cb47 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl512_cut.json @@ -0,0 +1,19 @@ +{ + "bins": 1024, + "unstable_bins": 0, + "reduction_bins": 0, + "band": { + "1": { + "sr": 44100, + "hl": 512, + "n_fft": 2048, + "crop_start": 0, + "crop_stop": 700, + "hpf_start": -1, + "res_type": "sinc_best" + } + }, + "sr": 44100, + "pre_filter_start": 1023, + "pre_filter_stop": 700 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl512_nf1024.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl512_nf1024.json new file mode 100644 index 0000000000000000000000000000000000000000..120ef1a24013795c077814bd98ce18169acafac0 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/1band_sr44100_hl512_nf1024.json @@ -0,0 +1,19 @@ +{ + "bins": 512, + "unstable_bins": 0, + "reduction_bins": 0, + "band": { + "1": { + "sr": 44100, + "hl": 512, + "n_fft": 1024, + "crop_start": 0, + "crop_stop": 512, + "hpf_start": -1, + "res_type": "sinc_best" + } + }, + "sr": 44100, + "pre_filter_start": 511, + "pre_filter_stop": 512 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/2band_32000.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/2band_32000.json new file mode 100644 index 0000000000000000000000000000000000000000..ab9cf1150a818eb6252105408311be0a40d423b3 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/2band_32000.json @@ -0,0 +1,30 @@ +{ + "bins": 768, + "unstable_bins": 7, + "reduction_bins": 705, + "band": { + "1": { + "sr": 6000, + "hl": 66, + "n_fft": 512, + "crop_start": 0, + "crop_stop": 240, + "lpf_start": 60, + "lpf_stop": 118, + "res_type": "sinc_fastest" + }, + "2": { + "sr": 32000, + "hl": 352, + "n_fft": 1024, + "crop_start": 22, + "crop_stop": 505, + "hpf_start": 44, + "hpf_stop": 23, + "res_type": "sinc_medium" + } + }, + "sr": 32000, + "pre_filter_start": 710, + "pre_filter_stop": 731 +} diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/2band_44100_lofi.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/2band_44100_lofi.json new file mode 100644 index 0000000000000000000000000000000000000000..7faa216d7b49aeece24123dbdd868847a1dbc03c --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/2band_44100_lofi.json @@ -0,0 +1,30 @@ +{ + "bins": 512, + "unstable_bins": 7, + "reduction_bins": 510, + "band": { + "1": { + "sr": 11025, + "hl": 160, + "n_fft": 768, + "crop_start": 0, + "crop_stop": 192, + "lpf_start": 41, + "lpf_stop": 139, + "res_type": "sinc_fastest" + }, + "2": { + "sr": 44100, + "hl": 640, + "n_fft": 1024, + "crop_start": 10, + "crop_stop": 320, + "hpf_start": 47, + "hpf_stop": 15, + "res_type": "sinc_medium" + } + }, + "sr": 44100, + "pre_filter_start": 510, + "pre_filter_stop": 512 +} diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/2band_48000.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/2band_48000.json new file mode 100644 index 0000000000000000000000000000000000000000..be075f52e4a8ddba952cb2fc608b29e089e7f9f9 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/2band_48000.json @@ -0,0 +1,30 @@ +{ + "bins": 768, + "unstable_bins": 7, + "reduction_bins": 705, + "band": { + "1": { + "sr": 6000, + "hl": 66, + "n_fft": 512, + "crop_start": 0, + "crop_stop": 240, + "lpf_start": 60, + "lpf_stop": 240, + "res_type": "sinc_fastest" + }, + "2": { + "sr": 48000, + "hl": 528, + "n_fft": 1536, + "crop_start": 22, + "crop_stop": 505, + "hpf_start": 82, + "hpf_stop": 22, + "res_type": "sinc_medium" + } + }, + "sr": 48000, + "pre_filter_start": 710, + "pre_filter_stop": 731 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/3band_44100.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/3band_44100.json new file mode 100644 index 0000000000000000000000000000000000000000..d99e23986cf7e68be023e3cf382b5d131409095d --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/3band_44100.json @@ -0,0 +1,42 @@ +{ + "bins": 768, + "unstable_bins": 5, + "reduction_bins": 733, + "band": { + "1": { + "sr": 11025, + "hl": 128, + "n_fft": 768, + "crop_start": 0, + "crop_stop": 278, + "lpf_start": 28, + "lpf_stop": 140, + "res_type": "polyphase" + }, + "2": { + "sr": 22050, + "hl": 256, + "n_fft": 768, + "crop_start": 14, + "crop_stop": 322, + "hpf_start": 70, + "hpf_stop": 14, + "lpf_start": 283, + "lpf_stop": 314, + "res_type": "polyphase" + }, + "3": { + "sr": 44100, + "hl": 512, + "n_fft": 768, + "crop_start": 131, + "crop_stop": 313, + "hpf_start": 154, + "hpf_stop": 141, + "res_type": "sinc_medium" + } + }, + "sr": 44100, + "pre_filter_start": 757, + "pre_filter_stop": 768 +} diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/3band_44100_mid.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/3band_44100_mid.json new file mode 100644 index 0000000000000000000000000000000000000000..fc2c487dd52d91beb32d69bc36ad8e3b6124978b --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/3band_44100_mid.json @@ -0,0 +1,43 @@ +{ + "mid_side": true, + "bins": 768, + "unstable_bins": 5, + "reduction_bins": 733, + "band": { + "1": { + "sr": 11025, + "hl": 128, + "n_fft": 768, + "crop_start": 0, + "crop_stop": 278, + "lpf_start": 28, + "lpf_stop": 140, + "res_type": "polyphase" + }, + "2": { + "sr": 22050, + "hl": 256, + "n_fft": 768, + "crop_start": 14, + "crop_stop": 322, + "hpf_start": 70, + "hpf_stop": 14, + "lpf_start": 283, + "lpf_stop": 314, + "res_type": "polyphase" + }, + "3": { + "sr": 44100, + "hl": 512, + "n_fft": 768, + "crop_start": 131, + "crop_stop": 313, + "hpf_start": 154, + "hpf_stop": 141, + "res_type": "sinc_medium" + } + }, + "sr": 44100, + "pre_filter_start": 757, + "pre_filter_stop": 768 +} diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/3band_44100_msb2.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/3band_44100_msb2.json new file mode 100644 index 0000000000000000000000000000000000000000..33b0877c2e964657af2c648b71cbb84ff6b1e581 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/3band_44100_msb2.json @@ -0,0 +1,43 @@ +{ + "mid_side_b2": true, + "bins": 640, + "unstable_bins": 7, + "reduction_bins": 565, + "band": { + "1": { + "sr": 11025, + "hl": 108, + "n_fft": 1024, + "crop_start": 0, + "crop_stop": 187, + "lpf_start": 92, + "lpf_stop": 186, + "res_type": "polyphase" + }, + "2": { + "sr": 22050, + "hl": 216, + "n_fft": 768, + "crop_start": 0, + "crop_stop": 212, + "hpf_start": 68, + "hpf_stop": 34, + "lpf_start": 174, + "lpf_stop": 209, + "res_type": "polyphase" + }, + "3": { + "sr": 44100, + "hl": 432, + "n_fft": 640, + "crop_start": 66, + "crop_stop": 307, + "hpf_start": 86, + "hpf_stop": 72, + "res_type": "kaiser_fast" + } + }, + "sr": 44100, + "pre_filter_start": 639, + "pre_filter_stop": 640 +} diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100.json new file mode 100644 index 0000000000000000000000000000000000000000..4ae850a08f6fe11e7a5a0267f3be35f993cc4eb6 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100.json @@ -0,0 +1,54 @@ +{ + "bins": 768, + "unstable_bins": 7, + "reduction_bins": 668, + "band": { + "1": { + "sr": 11025, + "hl": 128, + "n_fft": 1024, + "crop_start": 0, + "crop_stop": 186, + "lpf_start": 37, + "lpf_stop": 73, + "res_type": "polyphase" + }, + "2": { + "sr": 11025, + "hl": 128, + "n_fft": 512, + "crop_start": 4, + "crop_stop": 185, + "hpf_start": 36, + "hpf_stop": 18, + "lpf_start": 93, + "lpf_stop": 185, + "res_type": "polyphase" + }, + "3": { + "sr": 22050, + "hl": 256, + "n_fft": 512, + "crop_start": 46, + "crop_stop": 186, + "hpf_start": 93, + "hpf_stop": 46, + "lpf_start": 164, + "lpf_stop": 186, + "res_type": "polyphase" + }, + "4": { + "sr": 44100, + "hl": 512, + "n_fft": 768, + "crop_start": 121, + "crop_stop": 382, + "hpf_start": 138, + "hpf_stop": 123, + "res_type": "sinc_medium" + } + }, + "sr": 44100, + "pre_filter_start": 740, + "pre_filter_stop": 768 +} diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_mid.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_mid.json new file mode 100644 index 0000000000000000000000000000000000000000..6346701543891938e69fc35754b58b8da9b561d6 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_mid.json @@ -0,0 +1,55 @@ +{ + "bins": 768, + "unstable_bins": 7, + "mid_side": true, + "reduction_bins": 668, + "band": { + "1": { + "sr": 11025, + "hl": 128, + "n_fft": 1024, + "crop_start": 0, + "crop_stop": 186, + "lpf_start": 37, + "lpf_stop": 73, + "res_type": "polyphase" + }, + "2": { + "sr": 11025, + "hl": 128, + "n_fft": 512, + "crop_start": 4, + "crop_stop": 185, + "hpf_start": 36, + "hpf_stop": 18, + "lpf_start": 93, + "lpf_stop": 185, + "res_type": "polyphase" + }, + "3": { + "sr": 22050, + "hl": 256, + "n_fft": 512, + "crop_start": 46, + "crop_stop": 186, + "hpf_start": 93, + "hpf_stop": 46, + "lpf_start": 164, + "lpf_stop": 186, + "res_type": "polyphase" + }, + "4": { + "sr": 44100, + "hl": 512, + "n_fft": 768, + "crop_start": 121, + "crop_stop": 382, + "hpf_start": 138, + "hpf_stop": 123, + "res_type": "sinc_medium" + } + }, + "sr": 44100, + "pre_filter_start": 740, + "pre_filter_stop": 768 +} diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_msb.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_msb.json new file mode 100644 index 0000000000000000000000000000000000000000..0bf477114c585236da7c48ffd81960919da38b81 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_msb.json @@ -0,0 +1,55 @@ +{ + "mid_side_b": true, + "bins": 768, + "unstable_bins": 7, + "reduction_bins": 668, + "band": { + "1": { + "sr": 11025, + "hl": 128, + "n_fft": 1024, + "crop_start": 0, + "crop_stop": 186, + "lpf_start": 37, + "lpf_stop": 73, + "res_type": "polyphase" + }, + "2": { + "sr": 11025, + "hl": 128, + "n_fft": 512, + "crop_start": 4, + "crop_stop": 185, + "hpf_start": 36, + "hpf_stop": 18, + "lpf_start": 93, + "lpf_stop": 185, + "res_type": "polyphase" + }, + "3": { + "sr": 22050, + "hl": 256, + "n_fft": 512, + "crop_start": 46, + "crop_stop": 186, + "hpf_start": 93, + "hpf_stop": 46, + "lpf_start": 164, + "lpf_stop": 186, + "res_type": "polyphase" + }, + "4": { + "sr": 44100, + "hl": 512, + "n_fft": 768, + "crop_start": 121, + "crop_stop": 382, + "hpf_start": 138, + "hpf_stop": 123, + "res_type": "sinc_medium" + } + }, + "sr": 44100, + "pre_filter_start": 740, + "pre_filter_stop": 768 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_msb2.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_msb2.json new file mode 100644 index 0000000000000000000000000000000000000000..0bf477114c585236da7c48ffd81960919da38b81 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_msb2.json @@ -0,0 +1,55 @@ +{ + "mid_side_b": true, + "bins": 768, + "unstable_bins": 7, + "reduction_bins": 668, + "band": { + "1": { + "sr": 11025, + "hl": 128, + "n_fft": 1024, + "crop_start": 0, + "crop_stop": 186, + "lpf_start": 37, + "lpf_stop": 73, + "res_type": "polyphase" + }, + "2": { + "sr": 11025, + "hl": 128, + "n_fft": 512, + "crop_start": 4, + "crop_stop": 185, + "hpf_start": 36, + "hpf_stop": 18, + "lpf_start": 93, + "lpf_stop": 185, + "res_type": "polyphase" + }, + "3": { + "sr": 22050, + "hl": 256, + "n_fft": 512, + "crop_start": 46, + "crop_stop": 186, + "hpf_start": 93, + "hpf_stop": 46, + "lpf_start": 164, + "lpf_stop": 186, + "res_type": "polyphase" + }, + "4": { + "sr": 44100, + "hl": 512, + "n_fft": 768, + "crop_start": 121, + "crop_stop": 382, + "hpf_start": 138, + "hpf_stop": 123, + "res_type": "sinc_medium" + } + }, + "sr": 44100, + "pre_filter_start": 740, + "pre_filter_stop": 768 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_reverse.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_reverse.json new file mode 100644 index 0000000000000000000000000000000000000000..779a1c908357cccedcd22b695ca68df13c1967bd --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_reverse.json @@ -0,0 +1,55 @@ +{ + "reverse": true, + "bins": 768, + "unstable_bins": 7, + "reduction_bins": 668, + "band": { + "1": { + "sr": 11025, + "hl": 128, + "n_fft": 1024, + "crop_start": 0, + "crop_stop": 186, + "lpf_start": 37, + "lpf_stop": 73, + "res_type": "polyphase" + }, + "2": { + "sr": 11025, + "hl": 128, + "n_fft": 512, + "crop_start": 4, + "crop_stop": 185, + "hpf_start": 36, + "hpf_stop": 18, + "lpf_start": 93, + "lpf_stop": 185, + "res_type": "polyphase" + }, + "3": { + "sr": 22050, + "hl": 256, + "n_fft": 512, + "crop_start": 46, + "crop_stop": 186, + "hpf_start": 93, + "hpf_stop": 46, + "lpf_start": 164, + "lpf_stop": 186, + "res_type": "polyphase" + }, + "4": { + "sr": 44100, + "hl": 512, + "n_fft": 768, + "crop_start": 121, + "crop_stop": 382, + "hpf_start": 138, + "hpf_stop": 123, + "res_type": "sinc_medium" + } + }, + "sr": 44100, + "pre_filter_start": 740, + "pre_filter_stop": 768 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_sw.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_sw.json new file mode 100644 index 0000000000000000000000000000000000000000..1fefd4aa50bf6c744294fbb305888742c96e4c4c --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_44100_sw.json @@ -0,0 +1,55 @@ +{ + "stereo_w": true, + "bins": 768, + "unstable_bins": 7, + "reduction_bins": 668, + "band": { + "1": { + "sr": 11025, + "hl": 128, + "n_fft": 1024, + "crop_start": 0, + "crop_stop": 186, + "lpf_start": 37, + "lpf_stop": 73, + "res_type": "polyphase" + }, + "2": { + "sr": 11025, + "hl": 128, + "n_fft": 512, + "crop_start": 4, + "crop_stop": 185, + "hpf_start": 36, + "hpf_stop": 18, + "lpf_start": 93, + "lpf_stop": 185, + "res_type": "polyphase" + }, + "3": { + "sr": 22050, + "hl": 256, + "n_fft": 512, + "crop_start": 46, + "crop_stop": 186, + "hpf_start": 93, + "hpf_stop": 46, + "lpf_start": 164, + "lpf_stop": 186, + "res_type": "polyphase" + }, + "4": { + "sr": 44100, + "hl": 512, + "n_fft": 768, + "crop_start": 121, + "crop_stop": 382, + "hpf_start": 138, + "hpf_stop": 123, + "res_type": "sinc_medium" + } + }, + "sr": 44100, + "pre_filter_start": 740, + "pre_filter_stop": 768 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v2.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v2.json new file mode 100644 index 0000000000000000000000000000000000000000..af798108de02a7243335e71be5c57e4094a5d7b1 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v2.json @@ -0,0 +1,54 @@ +{ + "bins": 672, + "unstable_bins": 8, + "reduction_bins": 637, + "band": { + "1": { + "sr": 7350, + "hl": 80, + "n_fft": 640, + "crop_start": 0, + "crop_stop": 85, + "lpf_start": 25, + "lpf_stop": 53, + "res_type": "polyphase" + }, + "2": { + "sr": 7350, + "hl": 80, + "n_fft": 320, + "crop_start": 4, + "crop_stop": 87, + "hpf_start": 25, + "hpf_stop": 12, + "lpf_start": 31, + "lpf_stop": 62, + "res_type": "polyphase" + }, + "3": { + "sr": 14700, + "hl": 160, + "n_fft": 512, + "crop_start": 17, + "crop_stop": 216, + "hpf_start": 48, + "hpf_stop": 24, + "lpf_start": 139, + "lpf_stop": 210, + "res_type": "polyphase" + }, + "4": { + "sr": 44100, + "hl": 480, + "n_fft": 960, + "crop_start": 78, + "crop_stop": 383, + "hpf_start": 130, + "hpf_stop": 86, + "res_type": "kaiser_fast" + } + }, + "sr": 44100, + "pre_filter_start": 668, + "pre_filter_stop": 672 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v2_sn.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v2_sn.json new file mode 100644 index 0000000000000000000000000000000000000000..319b99810f364946da7a30b15b916a5309981608 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v2_sn.json @@ -0,0 +1,55 @@ +{ + "bins": 672, + "unstable_bins": 8, + "reduction_bins": 637, + "band": { + "1": { + "sr": 7350, + "hl": 80, + "n_fft": 640, + "crop_start": 0, + "crop_stop": 85, + "lpf_start": 25, + "lpf_stop": 53, + "res_type": "polyphase" + }, + "2": { + "sr": 7350, + "hl": 80, + "n_fft": 320, + "crop_start": 4, + "crop_stop": 87, + "hpf_start": 25, + "hpf_stop": 12, + "lpf_start": 31, + "lpf_stop": 62, + "res_type": "polyphase" + }, + "3": { + "sr": 14700, + "hl": 160, + "n_fft": 512, + "crop_start": 17, + "crop_stop": 216, + "hpf_start": 48, + "hpf_stop": 24, + "lpf_start": 139, + "lpf_stop": 210, + "res_type": "polyphase" + }, + "4": { + "sr": 44100, + "hl": 480, + "n_fft": 960, + "crop_start": 78, + "crop_stop": 383, + "hpf_start": 130, + "hpf_stop": 86, + "convert_channels": "stereo_n", + "res_type": "kaiser_fast" + } + }, + "sr": 44100, + "pre_filter_start": 668, + "pre_filter_stop": 672 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v3.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v3.json new file mode 100644 index 0000000000000000000000000000000000000000..2a73bc97ac545145a75bdca7addc5d59f5b8574b --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v3.json @@ -0,0 +1,54 @@ +{ + "bins": 672, + "unstable_bins": 8, + "reduction_bins": 530, + "band": { + "1": { + "sr": 7350, + "hl": 80, + "n_fft": 640, + "crop_start": 0, + "crop_stop": 85, + "lpf_start": 25, + "lpf_stop": 53, + "res_type": "polyphase" + }, + "2": { + "sr": 7350, + "hl": 80, + "n_fft": 320, + "crop_start": 4, + "crop_stop": 87, + "hpf_start": 25, + "hpf_stop": 12, + "lpf_start": 31, + "lpf_stop": 62, + "res_type": "polyphase" + }, + "3": { + "sr": 14700, + "hl": 160, + "n_fft": 512, + "crop_start": 17, + "crop_stop": 216, + "hpf_start": 48, + "hpf_stop": 24, + "lpf_start": 139, + "lpf_stop": 210, + "res_type": "polyphase" + }, + "4": { + "sr": 44100, + "hl": 480, + "n_fft": 960, + "crop_start": 78, + "crop_stop": 383, + "hpf_start": 130, + "hpf_stop": 86, + "res_type": "kaiser_fast" + } + }, + "sr": 44100, + "pre_filter_start": 668, + "pre_filter_stop": 672 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v3_sn.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v3_sn.json new file mode 100644 index 0000000000000000000000000000000000000000..6680a06146213f4c1cc3bde7668cec496e1d0389 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v3_sn.json @@ -0,0 +1,55 @@ +{ + "n_bins": 672, + "unstable_bins": 8, + "stable_bins": 530, + "band": { + "1": { + "sr": 7350, + "hl": 80, + "n_fft": 640, + "crop_start": 0, + "crop_stop": 85, + "lpf_start": 25, + "lpf_stop": 53, + "res_type": "polyphase" + }, + "2": { + "sr": 7350, + "hl": 80, + "n_fft": 320, + "crop_start": 4, + "crop_stop": 87, + "hpf_start": 25, + "hpf_stop": 12, + "lpf_start": 31, + "lpf_stop": 62, + "res_type": "polyphase" + }, + "3": { + "sr": 14700, + "hl": 160, + "n_fft": 512, + "crop_start": 17, + "crop_stop": 216, + "hpf_start": 48, + "hpf_stop": 24, + "lpf_start": 139, + "lpf_stop": 210, + "res_type": "polyphase" + }, + "4": { + "sr": 44100, + "hl": 480, + "n_fft": 960, + "crop_start": 78, + "crop_stop": 383, + "hpf_start": 130, + "hpf_stop": 86, + "convert_channels": "stereo_n", + "res_type": "kaiser_fast" + } + }, + "sr": 44100, + "pre_filter_start": 668, + "pre_filter_stop": 672 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v4_ms_fullband.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v4_ms_fullband.json new file mode 100644 index 0000000000000000000000000000000000000000..dbfa675b568d9eeaa977dc9509606e429c15e7ad --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/4band_v4_ms_fullband.json @@ -0,0 +1,58 @@ +{ + "n_bins": 896, + "unstable_bins": 9, + "stable_bins": 530, + "band": { + "1": { + "sr": 7350, + "hl": 96, + "n_fft": 768, + "crop_start": 0, + "crop_stop": 102, + "lpf_start": 30, + "lpf_stop": 62, + "res_type": "polyphase", + "convert_channels": "mid_side" + }, + "2": { + "sr": 7350, + "hl": 96, + "n_fft": 384, + "crop_start": 5, + "crop_stop": 104, + "hpf_start": 30, + "hpf_stop": 14, + "lpf_start": 37, + "lpf_stop": 73, + "res_type": "polyphase", + "convert_channels": "mid_side" + }, + "3": { + "sr": 14700, + "hl": 192, + "n_fft": 640, + "crop_start": 20, + "crop_stop": 259, + "hpf_start": 58, + "hpf_stop": 29, + "lpf_start": 191, + "lpf_stop": 262, + "res_type": "polyphase", + "convert_channels": "mid_side" + }, + "4": { + "sr": 44100, + "hl": 576, + "n_fft": 1152, + "crop_start": 119, + "crop_stop": 575, + "hpf_start": 157, + "hpf_stop": 110, + "res_type": "kaiser_fast", + "convert_channels": "mid_side" + } + }, + "sr": 44100, + "pre_filter_start": -1, + "pre_filter_stop": -1 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/ensemble.json b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/ensemble.json new file mode 100644 index 0000000000000000000000000000000000000000..ca96bf19c593dbe127e1a013ae456ac093602e28 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/modelparams/ensemble.json @@ -0,0 +1,43 @@ +{ + "mid_side_b2": true, + "bins": 1280, + "unstable_bins": 7, + "reduction_bins": 565, + "band": { + "1": { + "sr": 11025, + "hl": 108, + "n_fft": 2048, + "crop_start": 0, + "crop_stop": 374, + "lpf_start": 92, + "lpf_stop": 186, + "res_type": "polyphase" + }, + "2": { + "sr": 22050, + "hl": 216, + "n_fft": 1536, + "crop_start": 0, + "crop_stop": 424, + "hpf_start": 68, + "hpf_stop": 34, + "lpf_start": 348, + "lpf_stop": 418, + "res_type": "polyphase" + }, + "3": { + "sr": 44100, + "hl": 432, + "n_fft": 1280, + "crop_start": 132, + "crop_stop": 614, + "hpf_start": 172, + "hpf_stop": 144, + "res_type": "polyphase" + } + }, + "sr": 44100, + "pre_filter_start": 1280, + "pre_filter_stop": 1280 +} \ No newline at end of file diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/nets.py b/audio_separator/separator/uvr_lib_v5/vr_network/nets.py new file mode 100644 index 0000000000000000000000000000000000000000..5e1cfbce8d4b46902b694cc2b508c77224085cbc --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/nets.py @@ -0,0 +1,175 @@ +import torch +from torch import nn +import torch.nn.functional as F + +from . import layers + + +class BaseASPPNet(nn.Module): + """ + BaseASPPNet Class: + This class defines the base architecture for an Atrous Spatial Pyramid Pooling (ASPP) network. + It is designed to extract features from input data at multiple scales by using dilated convolutions. + This is particularly useful for tasks that benefit from understanding context at different resolutions, + such as semantic segmentation. The network consists of a series of encoder layers for downsampling and feature extraction, + followed by an ASPP module for multi-scale feature extraction, and finally a series of decoder layers for upsampling. + """ + + def __init__(self, nn_architecture, nin, ch, dilations=(4, 8, 16)): + super(BaseASPPNet, self).__init__() + self.nn_architecture = nn_architecture + + # Encoder layers progressively increase the number of channels while reducing spatial dimensions. + self.enc1 = layers.Encoder(nin, ch, 3, 2, 1) + self.enc2 = layers.Encoder(ch, ch * 2, 3, 2, 1) + self.enc3 = layers.Encoder(ch * 2, ch * 4, 3, 2, 1) + self.enc4 = layers.Encoder(ch * 4, ch * 8, 3, 2, 1) + + # Depending on the network architecture, an additional encoder layer and a specific ASPP module are initialized. + if self.nn_architecture == 129605: + self.enc5 = layers.Encoder(ch * 8, ch * 16, 3, 2, 1) + self.aspp = layers.ASPPModule(nn_architecture, ch * 16, ch * 32, dilations) + self.dec5 = layers.Decoder(ch * (16 + 32), ch * 16, 3, 1, 1) + else: + self.aspp = layers.ASPPModule(nn_architecture, ch * 8, ch * 16, dilations) + + # Decoder layers progressively decrease the number of channels while increasing spatial dimensions. + self.dec4 = layers.Decoder(ch * (8 + 16), ch * 8, 3, 1, 1) + self.dec3 = layers.Decoder(ch * (4 + 8), ch * 4, 3, 1, 1) + self.dec2 = layers.Decoder(ch * (2 + 4), ch * 2, 3, 1, 1) + self.dec1 = layers.Decoder(ch * (1 + 2), ch, 3, 1, 1) + + def __call__(self, input_tensor): + # The input tensor is passed through a series of encoder layers. + hidden_state, encoder_output1 = self.enc1(input_tensor) + hidden_state, encoder_output2 = self.enc2(hidden_state) + hidden_state, encoder_output3 = self.enc3(hidden_state) + hidden_state, encoder_output4 = self.enc4(hidden_state) + + # Depending on the network architecture, the hidden state is processed by an additional encoder layer and the ASPP module. + if self.nn_architecture == 129605: + hidden_state, encoder_output5 = self.enc5(hidden_state) + hidden_state = self.aspp(hidden_state) + # The decoder layers use skip connections from the encoder layers for better feature integration. + hidden_state = self.dec5(hidden_state, encoder_output5) + else: + hidden_state = self.aspp(hidden_state) + + # The hidden state is further processed by the decoder layers, using skip connections for feature integration. + hidden_state = self.dec4(hidden_state, encoder_output4) + hidden_state = self.dec3(hidden_state, encoder_output3) + hidden_state = self.dec2(hidden_state, encoder_output2) + hidden_state = self.dec1(hidden_state, encoder_output1) + + return hidden_state + + +def determine_model_capacity(n_fft_bins, nn_architecture): + """ + The determine_model_capacity function is designed to select the appropriate model configuration + based on the frequency bins and network architecture. It maps specific architectures to predefined + model capacities, which dictate the structure and parameters of the CascadedASPPNet model. + """ + + # Predefined model architectures categorized by their precision level. + sp_model_arch = [31191, 33966, 129605] + hp_model_arch = [123821, 123812] + hp2_model_arch = [537238, 537227] + + # Mapping network architectures to their corresponding model capacity data. + if nn_architecture in sp_model_arch: + model_capacity_data = [(2, 16), (2, 16), (18, 8, 1, 1, 0), (8, 16), (34, 16, 1, 1, 0), (16, 32), (32, 2, 1), (16, 2, 1), (16, 2, 1)] + + if nn_architecture in hp_model_arch: + model_capacity_data = [(2, 32), (2, 32), (34, 16, 1, 1, 0), (16, 32), (66, 32, 1, 1, 0), (32, 64), (64, 2, 1), (32, 2, 1), (32, 2, 1)] + + if nn_architecture in hp2_model_arch: + model_capacity_data = [(2, 64), (2, 64), (66, 32, 1, 1, 0), (32, 64), (130, 64, 1, 1, 0), (64, 128), (128, 2, 1), (64, 2, 1), (64, 2, 1)] + + # Initializing the CascadedASPPNet model with the selected model capacity data. + cascaded = CascadedASPPNet + model = cascaded(n_fft_bins, model_capacity_data, nn_architecture) + + return model + + +class CascadedASPPNet(nn.Module): + """ + CascadedASPPNet Class: + This class implements a cascaded version of the ASPP network, designed for processing audio signals + for tasks such as vocal removal. It consists of multiple stages, each with its own ASPP network, + to process different frequency bands of the input signal. This allows the model to effectively + handle the full spectrum of audio frequencies by focusing on different frequency bands separately. + """ + + def __init__(self, n_fft, model_capacity_data, nn_architecture): + super(CascadedASPPNet, self).__init__() + # The first stage processes the low and high frequency bands separately. + self.stg1_low_band_net = BaseASPPNet(nn_architecture, *model_capacity_data[0]) + self.stg1_high_band_net = BaseASPPNet(nn_architecture, *model_capacity_data[1]) + + # Bridge layers connect different stages of the network. + self.stg2_bridge = layers.Conv2DBNActiv(*model_capacity_data[2]) + self.stg2_full_band_net = BaseASPPNet(nn_architecture, *model_capacity_data[3]) + + self.stg3_bridge = layers.Conv2DBNActiv(*model_capacity_data[4]) + self.stg3_full_band_net = BaseASPPNet(nn_architecture, *model_capacity_data[5]) + + # Output layers for the final mask prediction and auxiliary outputs. + self.out = nn.Conv2d(*model_capacity_data[6], bias=False) + self.aux1_out = nn.Conv2d(*model_capacity_data[7], bias=False) + self.aux2_out = nn.Conv2d(*model_capacity_data[8], bias=False) + + # Parameters for handling the frequency bins of the input signal. + self.max_bin = n_fft // 2 + self.output_bin = n_fft // 2 + 1 + + self.offset = 128 + + def forward(self, input_tensor): + # The forward pass processes the input tensor through each stage of the network, + # combining the outputs of different frequency bands and stages to produce the final mask. + mix = input_tensor.detach() + input_tensor = input_tensor.clone() + + # Preparing the input tensor by selecting the mainput_tensorimum frequency bin. + input_tensor = input_tensor[:, :, : self.max_bin] + + # Processing the low and high frequency bands separately in the first stage. + bandwidth = input_tensor.size()[2] // 2 + aux1 = torch.cat([self.stg1_low_band_net(input_tensor[:, :, :bandwidth]), self.stg1_high_band_net(input_tensor[:, :, bandwidth:])], dim=2) + + # Combining the outputs of the first stage and passing through the second stage. + hidden_state = torch.cat([input_tensor, aux1], dim=1) + aux2 = self.stg2_full_band_net(self.stg2_bridge(hidden_state)) + + # Further processing the combined outputs through the third stage. + hidden_state = torch.cat([input_tensor, aux1, aux2], dim=1) + hidden_state = self.stg3_full_band_net(self.stg3_bridge(hidden_state)) + + # Applying the final output layer to produce the mask. + mask = torch.sigmoid(self.out(hidden_state)) + + # Padding the mask to match the output frequency bin size. + mask = F.pad(input=mask, pad=(0, 0, 0, self.output_bin - mask.size()[2]), mode="replicate") + + # During training, auxiliary outputs are also produced and padded accordingly. + if self.training: + aux1 = torch.sigmoid(self.aux1_out(aux1)) + aux1 = F.pad(input=aux1, pad=(0, 0, 0, self.output_bin - aux1.size()[2]), mode="replicate") + aux2 = torch.sigmoid(self.aux2_out(aux2)) + aux2 = F.pad(input=aux2, pad=(0, 0, 0, self.output_bin - aux2.size()[2]), mode="replicate") + return mask * mix, aux1 * mix, aux2 * mix + else: + return mask # * mix + + def predict_mask(self, input_tensor): + # This method predicts the mask for the input tensor by calling the forward method + # and applying any necessary padding adjustments. + mask = self.forward(input_tensor) + + # Adjusting the mask by removing padding offsets if present. + if self.offset > 0: + mask = mask[:, :, :, self.offset : -self.offset] + + return mask diff --git a/audio_separator/separator/uvr_lib_v5/vr_network/nets_new.py b/audio_separator/separator/uvr_lib_v5/vr_network/nets_new.py new file mode 100644 index 0000000000000000000000000000000000000000..3ce3d490580cfbf20eb5037bea5d9e05798e5b57 --- /dev/null +++ b/audio_separator/separator/uvr_lib_v5/vr_network/nets_new.py @@ -0,0 +1,160 @@ +import torch +from torch import nn +import torch.nn.functional as F +from . import layers_new as layers + + +class BaseNet(nn.Module): + """ + BaseNet Class: + This class defines the base network architecture for vocal removal. It includes a series of encoders for feature extraction, + an ASPP module for capturing multi-scale context, and a series of decoders for reconstructing the output. Additionally, + it incorporates an LSTM module for capturing temporal dependencies. + """ + + def __init__(self, nin, nout, nin_lstm, nout_lstm, dilations=((4, 2), (8, 4), (12, 6))): + super(BaseNet, self).__init__() + # Initialize the encoder layers with increasing output channels for hierarchical feature extraction. + self.enc1 = layers.Conv2DBNActiv(nin, nout, 3, 1, 1) + self.enc2 = layers.Encoder(nout, nout * 2, 3, 2, 1) + self.enc3 = layers.Encoder(nout * 2, nout * 4, 3, 2, 1) + self.enc4 = layers.Encoder(nout * 4, nout * 6, 3, 2, 1) + self.enc5 = layers.Encoder(nout * 6, nout * 8, 3, 2, 1) + + # ASPP module for capturing multi-scale features with different dilation rates. + self.aspp = layers.ASPPModule(nout * 8, nout * 8, dilations, dropout=True) + + # Decoder layers for upscaling and merging features from different levels of the encoder and ASPP module. + self.dec4 = layers.Decoder(nout * (6 + 8), nout * 6, 3, 1, 1) + self.dec3 = layers.Decoder(nout * (4 + 6), nout * 4, 3, 1, 1) + self.dec2 = layers.Decoder(nout * (2 + 4), nout * 2, 3, 1, 1) + + # LSTM module for capturing temporal dependencies in the sequence of features. + self.lstm_dec2 = layers.LSTMModule(nout * 2, nin_lstm, nout_lstm) + self.dec1 = layers.Decoder(nout * (1 + 2) + 1, nout * 1, 3, 1, 1) + + def __call__(self, input_tensor): + # Sequentially pass the input through the encoder layers. + encoded1 = self.enc1(input_tensor) + encoded2 = self.enc2(encoded1) + encoded3 = self.enc3(encoded2) + encoded4 = self.enc4(encoded3) + encoded5 = self.enc5(encoded4) + + # Pass the deepest encoder output through the ASPP module. + bottleneck = self.aspp(encoded5) + + # Sequentially upscale and merge the features using the decoder layers. + bottleneck = self.dec4(bottleneck, encoded4) + bottleneck = self.dec3(bottleneck, encoded3) + bottleneck = self.dec2(bottleneck, encoded2) + # Concatenate the LSTM module output for temporal feature enhancement. + bottleneck = torch.cat([bottleneck, self.lstm_dec2(bottleneck)], dim=1) + bottleneck = self.dec1(bottleneck, encoded1) + + return bottleneck + + +class CascadedNet(nn.Module): + """ + CascadedNet Class: + This class defines a cascaded network architecture that processes input in multiple stages, each stage focusing on different frequency bands. + It utilizes the BaseNet for processing, and combines outputs from different stages to produce the final mask for vocal removal. + """ + + def __init__(self, n_fft, nn_arch_size=51000, nout=32, nout_lstm=128): + super(CascadedNet, self).__init__() + # Calculate frequency bins based on FFT size. + self.max_bin = n_fft // 2 + self.output_bin = n_fft // 2 + 1 + self.nin_lstm = self.max_bin // 2 + self.offset = 64 + # Adjust output channels based on the architecture size. + nout = 64 if nn_arch_size == 218409 else nout + + # print(nout, nout_lstm, n_fft) + + # Initialize the network stages, each focusing on different frequency bands and progressively refining the output. + self.stg1_low_band_net = nn.Sequential(BaseNet(2, nout // 2, self.nin_lstm // 2, nout_lstm), layers.Conv2DBNActiv(nout // 2, nout // 4, 1, 1, 0)) + self.stg1_high_band_net = BaseNet(2, nout // 4, self.nin_lstm // 2, nout_lstm // 2) + + self.stg2_low_band_net = nn.Sequential(BaseNet(nout // 4 + 2, nout, self.nin_lstm // 2, nout_lstm), layers.Conv2DBNActiv(nout, nout // 2, 1, 1, 0)) + self.stg2_high_band_net = BaseNet(nout // 4 + 2, nout // 2, self.nin_lstm // 2, nout_lstm // 2) + + self.stg3_full_band_net = BaseNet(3 * nout // 4 + 2, nout, self.nin_lstm, nout_lstm) + + # Output layer for generating the final mask. + self.out = nn.Conv2d(nout, 2, 1, bias=False) + # Auxiliary output layer for intermediate supervision during training. + self.aux_out = nn.Conv2d(3 * nout // 4, 2, 1, bias=False) + + def forward(self, input_tensor): + # Preprocess input tensor to match the maximum frequency bin. + input_tensor = input_tensor[:, :, : self.max_bin] + + # Split the input into low and high frequency bands. + bandw = input_tensor.size()[2] // 2 + l1_in = input_tensor[:, :, :bandw] + h1_in = input_tensor[:, :, bandw:] + + # Process each band through the first stage networks. + l1 = self.stg1_low_band_net(l1_in) + h1 = self.stg1_high_band_net(h1_in) + + # Combine the outputs for auxiliary supervision. + aux1 = torch.cat([l1, h1], dim=2) + + # Prepare inputs for the second stage by concatenating the original and processed bands. + l2_in = torch.cat([l1_in, l1], dim=1) + h2_in = torch.cat([h1_in, h1], dim=1) + + # Process through the second stage networks. + l2 = self.stg2_low_band_net(l2_in) + h2 = self.stg2_high_band_net(h2_in) + + # Combine the outputs for auxiliary supervision. + aux2 = torch.cat([l2, h2], dim=2) + + # Prepare input for the third stage by concatenating all previous outputs with the original input. + f3_in = torch.cat([input_tensor, aux1, aux2], dim=1) + + # Process through the third stage network. + f3 = self.stg3_full_band_net(f3_in) + + # Apply the output layer to generate the final mask and apply sigmoid for normalization. + mask = torch.sigmoid(self.out(f3)) + + # Pad the mask to match the output frequency bin size. + mask = F.pad(input=mask, pad=(0, 0, 0, self.output_bin - mask.size()[2]), mode="replicate") + + # During training, generate and pad the auxiliary output for additional supervision. + if self.training: + aux = torch.cat([aux1, aux2], dim=1) + aux = torch.sigmoid(self.aux_out(aux)) + aux = F.pad(input=aux, pad=(0, 0, 0, self.output_bin - aux.size()[2]), mode="replicate") + return mask, aux + else: + return mask + + # Method for predicting the mask given an input tensor. + def predict_mask(self, input_tensor): + mask = self.forward(input_tensor) + + # If an offset is specified, crop the mask to remove edge artifacts. + if self.offset > 0: + mask = mask[:, :, :, self.offset : -self.offset] + assert mask.size()[3] > 0 + + return mask + + # Method for applying the predicted mask to the input tensor to obtain the predicted magnitude. + def predict(self, input_tensor): + mask = self.forward(input_tensor) + pred_mag = input_tensor * mask + + # If an offset is specified, crop the predicted magnitude to remove edge artifacts. + if self.offset > 0: + pred_mag = pred_mag[:, :, :, self.offset : -self.offset] + assert pred_mag.size()[3] > 0 + + return pred_mag diff --git a/audio_separator/utils/__init__.py b/audio_separator/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/audio_separator/utils/cli.py b/audio_separator/utils/cli.py new file mode 100644 index 0000000000000000000000000000000000000000..45a6259bf37e6b475027430e3d35e6b284f77379 --- /dev/null +++ b/audio_separator/utils/cli.py @@ -0,0 +1,251 @@ +#!/usr/bin/env python +import argparse +import logging +import json +import sys +import os +from importlib import metadata + + +def main(): + """Main entry point for the CLI.""" + logger = logging.getLogger(__name__) + log_handler = logging.StreamHandler() + log_formatter = logging.Formatter(fmt="%(asctime)s.%(msecs)03d - %(levelname)s - %(module)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S") + log_handler.setFormatter(log_formatter) + logger.addHandler(log_handler) + + parser = argparse.ArgumentParser(description="Separate audio file into different stems.", formatter_class=lambda prog: argparse.RawTextHelpFormatter(prog, max_help_position=60)) + + parser.add_argument("audio_files", nargs="*", help="The audio file paths or directory to separate, in any common format.", default=argparse.SUPPRESS) + + package_version = metadata.distribution("audio-separator").version + + version_help = "Show the program's version number and exit." + debug_help = "Enable debug logging, equivalent to --log_level=debug." + env_info_help = "Print environment information and exit." + list_models_help = "List all supported models and exit. Use --list_filter to filter/sort the list and --list_limit to show only top N results." + log_level_help = "Log level, e.g. info, debug, warning (default: %(default)s)." + + info_params = parser.add_argument_group("Info and Debugging") + info_params.add_argument("-v", "--version", action="version", version=f"%(prog)s {package_version}", help=version_help) + info_params.add_argument("-d", "--debug", action="store_true", help=debug_help) + info_params.add_argument("-e", "--env_info", action="store_true", help=env_info_help) + info_params.add_argument("-l", "--list_models", action="store_true", help=list_models_help) + info_params.add_argument("--log_level", default="info", help=log_level_help) + info_params.add_argument("--list_filter", help="Filter and sort the model list by 'name', 'filename', or any stem e.g. vocals, instrumental, drums") + info_params.add_argument("--list_limit", type=int, help="Limit the number of models shown") + info_params.add_argument("--list_format", choices=["pretty", "json"], default="pretty", help="Format for listing models: 'pretty' for formatted output, 'json' for raw JSON dump") + + model_filename_help = "Model to use for separation (default: %(default)s). Example: -m 2_HP-UVR.pth" + output_format_help = "Output format for separated files, any common format (default: %(default)s). Example: --output_format=MP3" + output_bitrate_help = "Output bitrate for separated files, any ffmpeg-compatible bitrate (default: %(default)s). Example: --output_bitrate=320k" + output_dir_help = "Directory to write output files (default: ). Example: --output_dir=/app/separated" + model_file_dir_help = "Model files directory (default: %(default)s or AUDIO_SEPARATOR_MODEL_DIR env var if set). Example: --model_file_dir=/app/models" + download_model_only_help = "Download a single model file only, without performing separation." + + io_params = parser.add_argument_group("Separation I/O Params") + io_params.add_argument("-m", "--model_filename", default="model_bs_roformer_ep_317_sdr_12.9755.ckpt", help=model_filename_help) + io_params.add_argument("--output_format", default="FLAC", help=output_format_help) + io_params.add_argument("--output_bitrate", default=None, help=output_bitrate_help) + io_params.add_argument("--output_dir", default=None, help=output_dir_help) + io_params.add_argument("--model_file_dir", default="/tmp/audio-separator-models/", help=model_file_dir_help) + io_params.add_argument("--download_model_only", action="store_true", help=download_model_only_help) + + invert_spect_help = "Invert secondary stem using spectrogram (default: %(default)s). Example: --invert_spect" + normalization_help = "Max peak amplitude to normalize input and output audio to (default: %(default)s). Example: --normalization=0.7" + amplification_help = "Min peak amplitude to amplify input and output audio to (default: %(default)s). Example: --amplification=0.4" + single_stem_help = "Output only single stem, e.g. Instrumental, Vocals, Drums, Bass, Guitar, Piano, Other. Example: --single_stem=Instrumental" + sample_rate_help = "Modify the sample rate of the output audio (default: %(default)s). Example: --sample_rate=44100" + use_soundfile_help = "Use soundfile to write audio output (default: %(default)s). Example: --use_soundfile" + use_autocast_help = "Use PyTorch autocast for faster inference (default: %(default)s). Do not use for CPU inference. Example: --use_autocast" + custom_output_names_help = 'Custom names for all output files in JSON format (default: %(default)s). Example: --custom_output_names=\'{"Vocals": "vocals_output", "Drums": "drums_output"}\'' + + common_params = parser.add_argument_group("Common Separation Parameters") + common_params.add_argument("--invert_spect", action="store_true", help=invert_spect_help) + common_params.add_argument("--normalization", type=float, default=0.9, help=normalization_help) + common_params.add_argument("--amplification", type=float, default=0.0, help=amplification_help) + common_params.add_argument("--single_stem", default=None, help=single_stem_help) + common_params.add_argument("--sample_rate", type=int, default=44100, help=sample_rate_help) + common_params.add_argument("--use_soundfile", action="store_true", help=use_soundfile_help) + common_params.add_argument("--use_autocast", action="store_true", help=use_autocast_help) + common_params.add_argument("--custom_output_names", type=json.loads, default=None, help=custom_output_names_help) + + mdx_segment_size_help = "Larger consumes more resources, but may give better results (default: %(default)s). Example: --mdx_segment_size=256" + mdx_overlap_help = "Amount of overlap between prediction windows, 0.001-0.999. Higher is better but slower (default: %(default)s). Example: --mdx_overlap=0.25" + mdx_batch_size_help = "Larger consumes more RAM but may process slightly faster (default: %(default)s). Example: --mdx_batch_size=4" + mdx_hop_length_help = "Usually called stride in neural networks, only change if you know what you're doing (default: %(default)s). Example: --mdx_hop_length=1024" + mdx_enable_denoise_help = "Enable denoising during separation (default: %(default)s). Example: --mdx_enable_denoise" + + mdx_params = parser.add_argument_group("MDX Architecture Parameters") + mdx_params.add_argument("--mdx_segment_size", type=int, default=256, help=mdx_segment_size_help) + mdx_params.add_argument("--mdx_overlap", type=float, default=0.25, help=mdx_overlap_help) + mdx_params.add_argument("--mdx_batch_size", type=int, default=1, help=mdx_batch_size_help) + mdx_params.add_argument("--mdx_hop_length", type=int, default=1024, help=mdx_hop_length_help) + mdx_params.add_argument("--mdx_enable_denoise", action="store_true", help=mdx_enable_denoise_help) + + vr_batch_size_help = "Number of batches to process at a time. Higher = more RAM, slightly faster processing (default: %(default)s). Example: --vr_batch_size=16" + vr_window_size_help = "Balance quality and speed. 1024 = fast but lower, 320 = slower but better quality. (default: %(default)s). Example: --vr_window_size=320" + vr_aggression_help = "Intensity of primary stem extraction, -100 - 100. Typically, 5 for vocals & instrumentals (default: %(default)s). Example: --vr_aggression=2" + vr_enable_tta_help = "Enable Test-Time-Augmentation; slow but improves quality (default: %(default)s). Example: --vr_enable_tta" + vr_high_end_process_help = "Mirror the missing frequency range of the output (default: %(default)s). Example: --vr_high_end_process" + vr_enable_post_process_help = "Identify leftover artifacts within vocal output; may improve separation for some songs (default: %(default)s). Example: --vr_enable_post_process" + vr_post_process_threshold_help = "Threshold for post_process feature: 0.1-0.3 (default: %(default)s). Example: --vr_post_process_threshold=0.1" + + vr_params = parser.add_argument_group("VR Architecture Parameters") + vr_params.add_argument("--vr_batch_size", type=int, default=1, help=vr_batch_size_help) + vr_params.add_argument("--vr_window_size", type=int, default=512, help=vr_window_size_help) + vr_params.add_argument("--vr_aggression", type=int, default=5, help=vr_aggression_help) + vr_params.add_argument("--vr_enable_tta", action="store_true", help=vr_enable_tta_help) + vr_params.add_argument("--vr_high_end_process", action="store_true", help=vr_high_end_process_help) + vr_params.add_argument("--vr_enable_post_process", action="store_true", help=vr_enable_post_process_help) + vr_params.add_argument("--vr_post_process_threshold", type=float, default=0.2, help=vr_post_process_threshold_help) + + demucs_segment_size_help = "Size of segments into which the audio is split, 1-100. Higher = slower but better quality (default: %(default)s). Example: --demucs_segment_size=256" + demucs_shifts_help = "Number of predictions with random shifts, higher = slower but better quality (default: %(default)s). Example: --demucs_shifts=4" + demucs_overlap_help = "Overlap between prediction windows, 0.001-0.999. Higher = slower but better quality (default: %(default)s). Example: --demucs_overlap=0.25" + demucs_segments_enabled_help = "Enable segment-wise processing (default: %(default)s). Example: --demucs_segments_enabled=False" + + demucs_params = parser.add_argument_group("Demucs Architecture Parameters") + demucs_params.add_argument("--demucs_segment_size", type=str, default="Default", help=demucs_segment_size_help) + demucs_params.add_argument("--demucs_shifts", type=int, default=2, help=demucs_shifts_help) + demucs_params.add_argument("--demucs_overlap", type=float, default=0.25, help=demucs_overlap_help) + demucs_params.add_argument("--demucs_segments_enabled", type=bool, default=True, help=demucs_segments_enabled_help) + + mdxc_segment_size_help = "Larger consumes more resources, but may give better results (default: %(default)s). Example: --mdxc_segment_size=256" + mdxc_override_model_segment_size_help = "Override model default segment size instead of using the model default value. Example: --mdxc_override_model_segment_size" + mdxc_overlap_help = "Amount of overlap between prediction windows, 2-50. Higher is better but slower (default: %(default)s). Example: --mdxc_overlap=8" + mdxc_batch_size_help = "Larger consumes more RAM but may process slightly faster (default: %(default)s). Example: --mdxc_batch_size=4" + mdxc_pitch_shift_help = "Shift audio pitch by a number of semitones while processing. May improve output for deep/high vocals. (default: %(default)s). Example: --mdxc_pitch_shift=2" + + mdxc_params = parser.add_argument_group("MDXC Architecture Parameters") + mdxc_params.add_argument("--mdxc_segment_size", type=int, default=256, help=mdxc_segment_size_help) + mdxc_params.add_argument("--mdxc_override_model_segment_size", action="store_true", help=mdxc_override_model_segment_size_help) + mdxc_params.add_argument("--mdxc_overlap", type=int, default=8, help=mdxc_overlap_help) + mdxc_params.add_argument("--mdxc_batch_size", type=int, default=1, help=mdxc_batch_size_help) + mdxc_params.add_argument("--mdxc_pitch_shift", type=int, default=0, help=mdxc_pitch_shift_help) + + args = parser.parse_args() + + if args.debug: + log_level = logging.DEBUG + else: + log_level = getattr(logging, args.log_level.upper()) + logger.setLevel(log_level) + + from audio_separator.separator import Separator + + if args.env_info: + separator = Separator() + sys.exit(0) + + if args.list_models: + separator = Separator(info_only=True) + + if args.list_format == "json": + model_list = separator.list_supported_model_files() + print(json.dumps(model_list, indent=2)) + else: + models = separator.get_simplified_model_list(filter_sort_by=args.list_filter) + + # Apply limit if specified + if args.list_limit and args.list_limit > 0: + models = dict(list(models.items())[: args.list_limit]) + + # Calculate maximum widths for each column + filename_width = max(len("Model Filename"), max(len(filename) for filename in models.keys())) + arch_width = max(len("Arch"), max(len(info["Type"]) for info in models.values())) + stems_width = max(len("Output Stems (SDR)"), max(len(", ".join(info["Stems"])) for info in models.values())) + name_width = max(len("Friendly Name"), max(len(info["Name"]) for info in models.values())) + + # Calculate total width for separator line + total_width = filename_width + arch_width + stems_width + name_width + 15 # 15 accounts for spacing between columns + + # Format the output with dynamic widths and extra spacing + print("-" * total_width) + print(f"{'Model Filename':<{filename_width}} {'Arch':<{arch_width}} {'Output Stems (SDR)':<{stems_width}} {'Friendly Name'}") + print("-" * total_width) + + for filename, info in models.items(): + stems = ", ".join(info["Stems"]) + print(f"{filename:<{filename_width}} {info['Type']:<{arch_width}} {stems:<{stems_width}} {info['Name']}") + + sys.exit(0) + + if args.download_model_only: + logger.info(f"Separator version {package_version} downloading model {args.model_filename} to directory {args.model_file_dir}") + separator = Separator(log_formatter=log_formatter, log_level=log_level, model_file_dir=args.model_file_dir) + separator.download_model_and_data(args.model_filename) + logger.info(f"Model {args.model_filename} downloaded successfully.") + sys.exit(0) + + if not hasattr(args, "audio_files"): + parser.print_help() + sys.exit(1) + + # Path processing: if a directory is specified, collect all audio files from it + audio_files = [] + for path in args.audio_files: + if os.path.isdir(path): + # If the path is a directory, recursively search for all audio files + for root, dirs, files in os.walk(path): + for file in files: + # Check the file extension to ensure it's an audio file + if file.endswith((".wav", ".flac", ".mp3", ".ogg", ".opus", ".m4a", ".aiff", ".ac3")): # Add other formats if needed + audio_files.append(os.path.join(root, file)) + else: + # If the path is a file, add it to the list + audio_files.append(path) + + # If no audio files are found, log an error and exit the program + if not audio_files: + logger.error("No valid audio files found in the specified path(s).") + sys.exit(1) + + logger.info(f"Separator version {package_version} beginning with input file(s): {', '.join(audio_files)}") + + separator = Separator( + log_formatter=log_formatter, + log_level=log_level, + model_file_dir=args.model_file_dir, + output_dir=args.output_dir, + output_format=args.output_format, + output_bitrate=args.output_bitrate, + normalization_threshold=args.normalization, + amplification_threshold=args.amplification, + output_single_stem=args.single_stem, + invert_using_spec=args.invert_spect, + sample_rate=args.sample_rate, + use_soundfile=args.use_soundfile, + use_autocast=args.use_autocast, + mdx_params={ + "hop_length": args.mdx_hop_length, + "segment_size": args.mdx_segment_size, + "overlap": args.mdx_overlap, + "batch_size": args.mdx_batch_size, + "enable_denoise": args.mdx_enable_denoise, + }, + vr_params={ + "batch_size": args.vr_batch_size, + "window_size": args.vr_window_size, + "aggression": args.vr_aggression, + "enable_tta": args.vr_enable_tta, + "enable_post_process": args.vr_enable_post_process, + "post_process_threshold": args.vr_post_process_threshold, + "high_end_process": args.vr_high_end_process, + }, + demucs_params={"segment_size": args.demucs_segment_size, "shifts": args.demucs_shifts, "overlap": args.demucs_overlap, "segments_enabled": args.demucs_segments_enabled}, + mdxc_params={ + "segment_size": args.mdxc_segment_size, + "batch_size": args.mdxc_batch_size, + "overlap": args.mdxc_overlap, + "override_model_segment_size": args.mdxc_override_model_segment_size, + "pitch_shift": args.mdxc_pitch_shift, + }, + ) + + separator.load_model(model_filename=args.model_filename) + + for audio_file in audio_files: + output_files = separator.separate(audio_file, custom_output_names=args.custom_output_names) + logger.info(f"Separation complete! Output file(s): {' '.join(output_files)}") diff --git a/environment.yml b/environment.yml new file mode 100644 index 0000000000000000000000000000000000000000..a2c497a6491cde3257a1886efe10e58d373a20b1 --- /dev/null +++ b/environment.yml @@ -0,0 +1,11 @@ +name: audio-separator-dev +channels: + - conda-forge +dependencies: + - python >=3.10 + - anaconda-client + - conda-build + - conda-verify + - pip >=23.2.1 + - poetry + - hatchling diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..2dd14271b41b9976b96a222a2c45f5499e34ddd7 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,3003 @@ +# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. + +[[package]] +name = "absl-py" +version = "2.2.2" +description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "absl_py-2.2.2-py3-none-any.whl", hash = "sha256:e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092"}, + {file = "absl_py-2.2.2.tar.gz", hash = "sha256:bf25b2c2eed013ca456918c453d687eab4e8309fba81ee2f4c1a6aa2494175eb"}, +] + +[[package]] +name = "audioop-lts" +version = "0.2.1" +description = "LTS Port of Python audioop" +optional = false +python-versions = ">=3.13" +groups = ["main"] +markers = "python_version >= \"3.13\"" +files = [ + {file = "audioop_lts-0.2.1-cp313-abi3-macosx_10_13_universal2.whl", hash = "sha256:fd1345ae99e17e6910f47ce7d52673c6a1a70820d78b67de1b7abb3af29c426a"}, + {file = "audioop_lts-0.2.1-cp313-abi3-macosx_10_13_x86_64.whl", hash = "sha256:e175350da05d2087e12cea8e72a70a1a8b14a17e92ed2022952a4419689ede5e"}, + {file = "audioop_lts-0.2.1-cp313-abi3-macosx_11_0_arm64.whl", hash = "sha256:4a8dd6a81770f6ecf019c4b6d659e000dc26571b273953cef7cd1d5ce2ff3ae6"}, + {file = "audioop_lts-0.2.1-cp313-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1cd3c0b6f2ca25c7d2b1c3adeecbe23e65689839ba73331ebc7d893fcda7ffe"}, + {file = "audioop_lts-0.2.1-cp313-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff3f97b3372c97782e9c6d3d7fdbe83bce8f70de719605bd7ee1839cd1ab360a"}, + {file = "audioop_lts-0.2.1-cp313-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a351af79edefc2a1bd2234bfd8b339935f389209943043913a919df4b0f13300"}, + {file = "audioop_lts-0.2.1-cp313-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aeb6f96f7f6da80354330470b9134d81b4cf544cdd1c549f2f45fe964d28059"}, + {file = "audioop_lts-0.2.1-cp313-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c589f06407e8340e81962575fcffbba1e92671879a221186c3d4662de9fe804e"}, + {file = "audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fbae5d6925d7c26e712f0beda5ed69ebb40e14212c185d129b8dfbfcc335eb48"}, + {file = "audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_i686.whl", hash = "sha256:d2d5434717f33117f29b5691fbdf142d36573d751716249a288fbb96ba26a281"}, + {file = "audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:f626a01c0a186b08f7ff61431c01c055961ee28769591efa8800beadd27a2959"}, + {file = "audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_s390x.whl", hash = "sha256:05da64e73837f88ee5c6217d732d2584cf638003ac72df124740460531e95e47"}, + {file = "audioop_lts-0.2.1-cp313-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:56b7a0a4dba8e353436f31a932f3045d108a67b5943b30f85a5563f4d8488d77"}, + {file = "audioop_lts-0.2.1-cp313-abi3-win32.whl", hash = "sha256:6e899eb8874dc2413b11926b5fb3857ec0ab55222840e38016a6ba2ea9b7d5e3"}, + {file = "audioop_lts-0.2.1-cp313-abi3-win_amd64.whl", hash = "sha256:64562c5c771fb0a8b6262829b9b4f37a7b886c01b4d3ecdbae1d629717db08b4"}, + {file = "audioop_lts-0.2.1-cp313-abi3-win_arm64.whl", hash = "sha256:c45317debeb64002e980077642afbd977773a25fa3dfd7ed0c84dccfc1fafcb0"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:3827e3fce6fee4d69d96a3d00cd2ab07f3c0d844cb1e44e26f719b34a5b15455"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:161249db9343b3c9780ca92c0be0d1ccbfecdbccac6844f3d0d44b9c4a00a17f"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5b7b4ff9de7a44e0ad2618afdc2ac920b91f4a6d3509520ee65339d4acde5abf"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e37f416adb43b0ced93419de0122b42753ee74e87070777b53c5d2241e7fab"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:534ce808e6bab6adb65548723c8cbe189a3379245db89b9d555c4210b4aaa9b6"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2de9b6fb8b1cf9f03990b299a9112bfdf8b86b6987003ca9e8a6c4f56d39543"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f24865991b5ed4b038add5edbf424639d1358144f4e2a3e7a84bc6ba23e35074"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bdb3b7912ccd57ea53197943f1bbc67262dcf29802c4a6df79ec1c715d45a78"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:120678b208cca1158f0a12d667af592e067f7a50df9adc4dc8f6ad8d065a93fb"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:54cd4520fc830b23c7d223693ed3e1b4d464997dd3abc7c15dce9a1f9bd76ab2"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:d6bd20c7a10abcb0fb3d8aaa7508c0bf3d40dfad7515c572014da4b979d3310a"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:f0ed1ad9bd862539ea875fb339ecb18fcc4148f8d9908f4502df28f94d23491a"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e1af3ff32b8c38a7d900382646e91f2fc515fd19dea37e9392275a5cbfdbff63"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-win32.whl", hash = "sha256:f51bb55122a89f7a0817d7ac2319744b4640b5b446c4c3efcea5764ea99ae509"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f0f2f336aa2aee2bce0b0dcc32bbba9178995454c7b979cf6ce086a8801e14c7"}, + {file = "audioop_lts-0.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:78bfb3703388c780edf900be66e07de5a3d4105ca8e8720c5c4d67927e0b15d0"}, + {file = "audioop_lts-0.2.1.tar.gz", hash = "sha256:e81268da0baa880431b68b1308ab7257eb33f356e57a5f9b1f915dfb13dd1387"}, +] + +[[package]] +name = "audioread" +version = "3.0.1" +description = "Multi-library, cross-platform audio decoding." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "audioread-3.0.1-py3-none-any.whl", hash = "sha256:4cdce70b8adc0da0a3c9e0d85fb10b3ace30fbdf8d1670fd443929b61d117c33"}, + {file = "audioread-3.0.1.tar.gz", hash = "sha256:ac5460a5498c48bdf2e8e767402583a4dcd13f4414d286f42ce4379e8b35066d"}, +] + +[package.extras] +test = ["tox"] + +[[package]] +name = "beartype" +version = "0.18.5" +description = "Unbearably fast runtime type checking in pure Python." +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +files = [ + {file = "beartype-0.18.5-py3-none-any.whl", hash = "sha256:5301a14f2a9a5540fe47ec6d34d758e9cd8331d36c4760fc7a5499ab86310089"}, + {file = "beartype-0.18.5.tar.gz", hash = "sha256:264ddc2f1da9ec94ff639141fbe33d22e12a9f75aa863b83b7046ffff1381927"}, +] + +[package.extras] +all = ["typing-extensions (>=3.10.0.0)"] +dev = ["autoapi (>=0.9.0)", "coverage (>=5.5)", "equinox", "mypy (>=0.800) ; platform_python_implementation != \"PyPy\"", "numpy ; sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "pandera", "pydata-sphinx-theme (<=0.7.2)", "pytest (>=4.0.0)", "sphinx (>=4.2.0,<6.0.0)", "sphinx ; python_version >= \"3.8.0\"", "sphinxext-opengraph (>=0.7.5)", "tox (>=3.20.1)", "typing-extensions (>=3.10.0.0)"] +doc-rtd = ["autoapi (>=0.9.0)", "pydata-sphinx-theme (<=0.7.2)", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)"] +test-tox = ["equinox", "mypy (>=0.800) ; platform_python_implementation != \"PyPy\"", "numpy ; sys_platform != \"darwin\" and platform_python_implementation != \"PyPy\"", "pandera", "pytest (>=4.0.0)", "sphinx ; python_version >= \"3.8.0\"", "typing-extensions (>=3.10.0.0)"] +test-tox-coverage = ["coverage (>=5.5)"] + +[[package]] +name = "black" +version = "25.1.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"}, + {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"}, + {file = "black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7"}, + {file = "black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9"}, + {file = "black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0"}, + {file = "black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299"}, + {file = "black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096"}, + {file = "black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2"}, + {file = "black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b"}, + {file = "black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc"}, + {file = "black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f"}, + {file = "black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba"}, + {file = "black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f"}, + {file = "black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3"}, + {file = "black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171"}, + {file = "black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18"}, + {file = "black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0"}, + {file = "black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f"}, + {file = "black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e"}, + {file = "black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355"}, + {file = "black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"}, + {file = "black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.10)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "certifi" +version = "2025.4.26" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3"}, + {file = "certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6"}, +] + +[[package]] +name = "cffi" +version = "1.17.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, +] + +[[package]] +name = "click" +version = "8.1.8" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] +markers = {main = "platform_system == \"Windows\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\""} + +[[package]] +name = "coloredlogs" +version = "15.0.1" +description = "Colored terminal output for Python's logging module" +optional = true +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] +markers = "extra == \"cpu\" or extra == \"gpu\" or extra == \"dml\"" +files = [ + {file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"}, + {file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"}, +] + +[package.dependencies] +humanfriendly = ">=9.1" + +[package.extras] +cron = ["capturer (>=2.4)"] + +[[package]] +name = "contourpy" +version = "1.3.2" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934"}, + {file = "contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989"}, + {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d"}, + {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9"}, + {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512"}, + {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631"}, + {file = "contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f"}, + {file = "contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2"}, + {file = "contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0"}, + {file = "contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a"}, + {file = "contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445"}, + {file = "contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773"}, + {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1"}, + {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43"}, + {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab"}, + {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7"}, + {file = "contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83"}, + {file = "contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd"}, + {file = "contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f"}, + {file = "contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878"}, + {file = "contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2"}, + {file = "contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15"}, + {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92"}, + {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87"}, + {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415"}, + {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe"}, + {file = "contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441"}, + {file = "contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e"}, + {file = "contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912"}, + {file = "contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73"}, + {file = "contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb"}, + {file = "contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08"}, + {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c"}, + {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f"}, + {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85"}, + {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841"}, + {file = "contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422"}, + {file = "contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef"}, + {file = "contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f"}, + {file = "contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9"}, + {file = "contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f"}, + {file = "contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739"}, + {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823"}, + {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5"}, + {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532"}, + {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b"}, + {file = "contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52"}, + {file = "contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd"}, + {file = "contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1"}, + {file = "contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69"}, + {file = "contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c"}, + {file = "contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16"}, + {file = "contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad"}, + {file = "contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0"}, + {file = "contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5"}, + {file = "contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5"}, + {file = "contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54"}, +] + +[package.dependencies] +numpy = ">=1.23" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.15.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "coverage" +version = "7.8.0" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "coverage-7.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2931f66991175369859b5fd58529cd4b73582461877ecfd859b6549869287ffe"}, + {file = "coverage-7.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52a523153c568d2c0ef8826f6cc23031dc86cffb8c6aeab92c4ff776e7951b28"}, + {file = "coverage-7.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c8a5c139aae4c35cbd7cadca1df02ea8cf28a911534fc1b0456acb0b14234f3"}, + {file = "coverage-7.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a26c0c795c3e0b63ec7da6efded5f0bc856d7c0b24b2ac84b4d1d7bc578d676"}, + {file = "coverage-7.8.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821f7bcbaa84318287115d54becb1915eece6918136c6f91045bb84e2f88739d"}, + {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a321c61477ff8ee705b8a5fed370b5710c56b3a52d17b983d9215861e37b642a"}, + {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ed2144b8a78f9d94d9515963ed273d620e07846acd5d4b0a642d4849e8d91a0c"}, + {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:042e7841a26498fff7a37d6fda770d17519982f5b7d8bf5278d140b67b61095f"}, + {file = "coverage-7.8.0-cp310-cp310-win32.whl", hash = "sha256:f9983d01d7705b2d1f7a95e10bbe4091fabc03a46881a256c2787637b087003f"}, + {file = "coverage-7.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a570cd9bd20b85d1a0d7b009aaf6c110b52b5755c17be6962f8ccd65d1dbd23"}, + {file = "coverage-7.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7ac22a0bb2c7c49f441f7a6d46c9c80d96e56f5a8bc6972529ed43c8b694e27"}, + {file = "coverage-7.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf13d564d310c156d1c8e53877baf2993fb3073b2fc9f69790ca6a732eb4bfea"}, + {file = "coverage-7.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5761c70c017c1b0d21b0815a920ffb94a670c8d5d409d9b38857874c21f70d7"}, + {file = "coverage-7.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ff52d790c7e1628241ffbcaeb33e07d14b007b6eb00a19320c7b8a7024c040"}, + {file = "coverage-7.8.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d39fc4817fd67b3915256af5dda75fd4ee10621a3d484524487e33416c6f3543"}, + {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b44674870709017e4b4036e3d0d6c17f06a0e6d4436422e0ad29b882c40697d2"}, + {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8f99eb72bf27cbb167b636eb1726f590c00e1ad375002230607a844d9e9a2318"}, + {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b571bf5341ba8c6bc02e0baeaf3b061ab993bf372d982ae509807e7f112554e9"}, + {file = "coverage-7.8.0-cp311-cp311-win32.whl", hash = "sha256:e75a2ad7b647fd8046d58c3132d7eaf31b12d8a53c0e4b21fa9c4d23d6ee6d3c"}, + {file = "coverage-7.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3043ba1c88b2139126fc72cb48574b90e2e0546d4c78b5299317f61b7f718b78"}, + {file = "coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc"}, + {file = "coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6"}, + {file = "coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d"}, + {file = "coverage-7.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0915742f4c82208ebf47a2b154a5334155ed9ef9fe6190674b8a46c2fb89cb05"}, + {file = "coverage-7.8.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a40fcf208e021eb14b0fac6bdb045c0e0cab53105f93ba0d03fd934c956143a"}, + {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a1f406a8e0995d654b2ad87c62caf6befa767885301f3b8f6f73e6f3c31ec3a6"}, + {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77af0f6447a582fdc7de5e06fa3757a3ef87769fbb0fdbdeba78c23049140a47"}, + {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2d32f95922927186c6dbc8bc60df0d186b6edb828d299ab10898ef3f40052fe"}, + {file = "coverage-7.8.0-cp312-cp312-win32.whl", hash = "sha256:769773614e676f9d8e8a0980dd7740f09a6ea386d0f383db6821df07d0f08545"}, + {file = "coverage-7.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e5d2b9be5b0693cf21eb4ce0ec8d211efb43966f6657807f6859aab3814f946b"}, + {file = "coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd"}, + {file = "coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00"}, + {file = "coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64"}, + {file = "coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067"}, + {file = "coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008"}, + {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733"}, + {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323"}, + {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3"}, + {file = "coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d"}, + {file = "coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487"}, + {file = "coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25"}, + {file = "coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42"}, + {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502"}, + {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1"}, + {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4"}, + {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73"}, + {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a"}, + {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883"}, + {file = "coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada"}, + {file = "coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257"}, + {file = "coverage-7.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa260de59dfb143af06dcf30c2be0b200bed2a73737a8a59248fcb9fa601ef0f"}, + {file = "coverage-7.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96121edfa4c2dfdda409877ea8608dd01de816a4dc4a0523356067b305e4e17a"}, + {file = "coverage-7.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8af63b9afa1031c0ef05b217faa598f3069148eeee6bb24b79da9012423b82"}, + {file = "coverage-7.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89b1f4af0d4afe495cd4787a68e00f30f1d15939f550e869de90a86efa7e0814"}, + {file = "coverage-7.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ec0be97723ae72d63d3aa41961a0b9a6f5a53ff599813c324548d18e3b9e8c"}, + {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a1d96e780bdb2d0cbb297325711701f7c0b6f89199a57f2049e90064c29f6bd"}, + {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f1d8a2a57b47142b10374902777e798784abf400a004b14f1b0b9eaf1e528ba4"}, + {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cf60dd2696b457b710dd40bf17ad269d5f5457b96442f7f85722bdb16fa6c899"}, + {file = "coverage-7.8.0-cp39-cp39-win32.whl", hash = "sha256:be945402e03de47ba1872cd5236395e0f4ad635526185a930735f66710e1bd3f"}, + {file = "coverage-7.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:90e7fbc6216ecaffa5a880cdc9c77b7418c1dcb166166b78dbc630d07f278cc3"}, + {file = "coverage-7.8.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:b8194fb8e50d556d5849753de991d390c5a1edeeba50f68e3a9253fbd8bf8ccd"}, + {file = "coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7"}, + {file = "coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "cython" +version = "3.0.12" +description = "The Cython compiler for writing C extensions in the Python language." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +groups = ["main"] +files = [ + {file = "Cython-3.0.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba67eee9413b66dd9fbacd33f0bc2e028a2a120991d77b5fd4b19d0b1e4039b9"}, + {file = "Cython-3.0.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee2717e5b5f7d966d0c6e27d2efe3698c357aa4d61bb3201997c7a4f9fe485a"}, + {file = "Cython-3.0.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cffc3464f641c8d0dda942c7c53015291beea11ec4d32421bed2f13b386b819"}, + {file = "Cython-3.0.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d3a8f81980ffbd74e52f9186d8f1654e347d0c44bfea6b5997028977f481a179"}, + {file = "Cython-3.0.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8d32856716c369d01f2385ad9177cdd1a11079ac89ea0932dc4882de1aa19174"}, + {file = "Cython-3.0.12-cp310-cp310-win32.whl", hash = "sha256:712c3f31adec140dc60d064a7f84741f50e2c25a8edd7ae746d5eb4d3ef7072a"}, + {file = "Cython-3.0.12-cp310-cp310-win_amd64.whl", hash = "sha256:d6945694c5b9170cfbd5f2c0d00ef7487a2de7aba83713a64ee4ebce7fad9e05"}, + {file = "Cython-3.0.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:feb86122a823937cc06e4c029d80ff69f082ebb0b959ab52a5af6cdd271c5dc3"}, + {file = "Cython-3.0.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfdbea486e702c328338314adb8e80f5f9741f06a0ae83aaec7463bc166d12e8"}, + {file = "Cython-3.0.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563de1728c8e48869d2380a1b76bbc1b1b1d01aba948480d68c1d05e52d20c92"}, + {file = "Cython-3.0.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:398d4576c1e1f6316282aa0b4a55139254fbed965cba7813e6d9900d3092b128"}, + {file = "Cython-3.0.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1e5eadef80143026944ea8f9904715a008f5108d1d644a89f63094cc37351e73"}, + {file = "Cython-3.0.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5a93cbda00a5451175b97dea5a9440a3fcee9e54b4cba7a7dbcba9a764b22aec"}, + {file = "Cython-3.0.12-cp311-cp311-win32.whl", hash = "sha256:3109e1d44425a2639e9a677b66cd7711721a5b606b65867cb2d8ef7a97e2237b"}, + {file = "Cython-3.0.12-cp311-cp311-win_amd64.whl", hash = "sha256:d4b70fc339adba1e2111b074ee6119fe9fd6072c957d8597bce9a0dd1c3c6784"}, + {file = "Cython-3.0.12-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fe030d4a00afb2844f5f70896b7f2a1a0d7da09bf3aa3d884cbe5f73fff5d310"}, + {file = "Cython-3.0.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7fec4f052b8fe173fe70eae75091389955b9a23d5cec3d576d21c5913b49d47"}, + {file = "Cython-3.0.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0faa5e39e5c8cdf6f9c3b1c3f24972826e45911e7f5b99cf99453fca5432f45e"}, + {file = "Cython-3.0.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d53de996ed340e9ab0fc85a88aaa8932f2591a2746e1ab1c06e262bd4ec4be7"}, + {file = "Cython-3.0.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea3a0e19ab77266c738aa110684a753a04da4e709472cadeff487133354d6ab8"}, + {file = "Cython-3.0.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c151082884be468f2f405645858a857298ac7f7592729e5b54788b5c572717ba"}, + {file = "Cython-3.0.12-cp312-cp312-win32.whl", hash = "sha256:3083465749911ac3b2ce001b6bf17f404ac9dd35d8b08469d19dc7e717f5877a"}, + {file = "Cython-3.0.12-cp312-cp312-win_amd64.whl", hash = "sha256:c0b91c7ebace030dd558ea28730de8c580680b50768e5af66db2904a3716c3e3"}, + {file = "Cython-3.0.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4ee6f1ea1bead8e6cbc4e64571505b5d8dbdb3b58e679d31f3a84160cebf1a1a"}, + {file = "Cython-3.0.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57aefa6d3341109e46ec1a13e3a763aaa2cbeb14e82af2485b318194be1d9170"}, + {file = "Cython-3.0.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:879ae9023958d63c0675015369384642d0afb9c9d1f3473df9186c42f7a9d265"}, + {file = "Cython-3.0.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36fcd584dae547de6f095500a380f4a0cce72b7a7e409e9ff03cb9beed6ac7a1"}, + {file = "Cython-3.0.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62b79dcc0de49efe9e84b9d0e2ae0a6fc9b14691a65565da727aa2e2e63c6a28"}, + {file = "Cython-3.0.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4aa255781b093a8401109d8f2104bbb2e52de7639d5896aefafddc85c30e0894"}, + {file = "Cython-3.0.12-cp313-cp313-win32.whl", hash = "sha256:77d48f2d4bab9fe1236eb753d18f03e8b2619af5b6f05d51df0532a92dfb38ab"}, + {file = "Cython-3.0.12-cp313-cp313-win_amd64.whl", hash = "sha256:86c304b20bd57c727c7357e90d5ba1a2b6f1c45492de2373814d7745ef2e63b4"}, + {file = "Cython-3.0.12-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ff5c0b6a65b08117d0534941d404833d516dac422eee88c6b4fd55feb409a5ed"}, + {file = "Cython-3.0.12-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:680f1d6ed4436ae94805db264d6155ed076d2835d84f20dcb31a7a3ad7f8668c"}, + {file = "Cython-3.0.12-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc24609613fa06d0d896309f7164ba168f7e8d71c1e490ed2a08d23351c3f41"}, + {file = "Cython-3.0.12-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1879c073e2b34924ce9b7ca64c212705dcc416af4337c45f371242b2e5f6d32"}, + {file = "Cython-3.0.12-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:bfb75123dd4ff767baa37d7036da0de2dfb6781ff256eef69b11b88b9a0691d1"}, + {file = "Cython-3.0.12-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:f39640f8df0400cde6882e23c734f15bb8196de0a008ae5dc6c8d1ec5957d7c8"}, + {file = "Cython-3.0.12-cp36-cp36m-win32.whl", hash = "sha256:8c9efe9a0895abee3cadfdad4130b30f7b5e57f6e6a51ef2a44f9fc66a913880"}, + {file = "Cython-3.0.12-cp36-cp36m-win_amd64.whl", hash = "sha256:63d840f2975e44d74512f8f34f1f7cb8121c9428e26a3f6116ff273deb5e60a2"}, + {file = "Cython-3.0.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:75c5acd40b97cff16fadcf6901a91586cbca5dcdba81f738efaf1f4c6bc8dccb"}, + {file = "Cython-3.0.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e62564457851db1c40399bd95a5346b9bb99e17a819bf583b362f418d8f3457a"}, + {file = "Cython-3.0.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ccd1228cc203b1f1b8a3d403f5a20ad1c40e5879b3fbf5851ce09d948982f2c"}, + {file = "Cython-3.0.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25529ee948f44d9a165ff960c49d4903267c20b5edf2df79b45924802e4cca6e"}, + {file = "Cython-3.0.12-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:90cf599372c5a22120609f7d3a963f17814799335d56dd0dcf8fe615980a8ae1"}, + {file = "Cython-3.0.12-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:9f8c48748a9c94ea5d59c26ab49ad0fad514d36f894985879cf3c3ca0e600bf4"}, + {file = "Cython-3.0.12-cp37-cp37m-win32.whl", hash = "sha256:3e4fa855d98bc7bd6a2049e0c7dc0dcf595e2e7f571a26e808f3efd84d2db374"}, + {file = "Cython-3.0.12-cp37-cp37m-win_amd64.whl", hash = "sha256:120681093772bf3600caddb296a65b352a0d3556e962b9b147efcfb8e8c9801b"}, + {file = "Cython-3.0.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:731d719423e041242c9303c80cae4327467299b90ffe62d4cc407e11e9ea3160"}, + {file = "Cython-3.0.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3238a29f37999e27494d120983eca90d14896b2887a0bd858a381204549137a"}, + {file = "Cython-3.0.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b588c0a089a9f4dd316d2f9275230bad4a7271e5af04e1dc41d2707c816be44b"}, + {file = "Cython-3.0.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ab9f5198af74eb16502cc143cdde9ca1cbbf66ea2912e67440dd18a36e3b5fa"}, + {file = "Cython-3.0.12-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8ee841c0e114efa1e849c281ac9b8df8aa189af10b4a103b1c5fd71cbb799679"}, + {file = "Cython-3.0.12-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:43c48b5789398b228ea97499f5b864843ba9b1ab837562a9227c6f58d16ede8b"}, + {file = "Cython-3.0.12-cp38-cp38-win32.whl", hash = "sha256:5e5f17c48a4f41557fbcc7ee660ccfebe4536a34c557f553b6893c1b3c83df2d"}, + {file = "Cython-3.0.12-cp38-cp38-win_amd64.whl", hash = "sha256:309c081057930bb79dc9ea3061a1af5086c679c968206e9c9c2ec90ab7cb471a"}, + {file = "Cython-3.0.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54115fcc126840926ff3b53cfd2152eae17b3522ae7f74888f8a41413bd32f25"}, + {file = "Cython-3.0.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:629db614b9c364596d7c975fa3fb3978e8c5349524353dbe11429896a783fc1e"}, + {file = "Cython-3.0.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af081838b0f9e12a83ec4c3809a00a64c817f489f7c512b0e3ecaf5f90a2a816"}, + {file = "Cython-3.0.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:34ce459808f7d8d5d4007bc5486fe50532529096b43957af6cbffcb4d9cc5c8d"}, + {file = "Cython-3.0.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6c6cd6a75c8393e6805d17f7126b96a894f310a1a9ea91c47d141fb9341bfa8"}, + {file = "Cython-3.0.12-cp39-cp39-win32.whl", hash = "sha256:a4032e48d4734d2df68235d21920c715c451ac9de15fa14c71b378e8986b83be"}, + {file = "Cython-3.0.12-cp39-cp39-win_amd64.whl", hash = "sha256:dcdc3e5d4ce0e7a4af6903ed580833015641e968d18d528d8371e2435a34132c"}, + {file = "Cython-3.0.12-py2.py3-none-any.whl", hash = "sha256:0038c9bae46c459669390e53a1ec115f8096b2e4647ae007ff1bf4e6dee92806"}, + {file = "cython-3.0.12.tar.gz", hash = "sha256:b988bb297ce76c671e28c97d017b95411010f7c77fa6623dd0bb47eed1aee1bc"}, +] + +[[package]] +name = "decorator" +version = "5.2.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, + {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, +] + +[[package]] +name = "diffq" +version = "0.2.4" +description = "Differentiable quantization framework for PyTorch." +optional = false +python-versions = ">=3.7.0" +groups = ["main"] +markers = "sys_platform != \"win32\"" +files = [ + {file = "diffq-0.2.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d8e6d6b882dd93568b41a7da9ff9657845ec08c82e71460544d0d04ed112320"}, + {file = "diffq-0.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:15d5055ebfc629914689d66fcfa36f6d751fd45b4b2331ba0d3390604e2b40fa"}, + {file = "diffq-0.2.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf990911fc2c932e505df9958ce50417f182fe9178b2dbe329173b29e6521727"}, + {file = "diffq-0.2.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d62ffd89498611dbf32cde417f5fc8d222f450085b06afb4e8764307906ab2ca"}, + {file = "diffq-0.2.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:71a374573ec064227665208a5892d88032cb18736f68560d5522e0c48138ced1"}, + {file = "diffq-0.2.4-cp310-cp310-win32.whl", hash = "sha256:1480ea49785dfdcc793a3f20043aba430f510d51487063e3617020f5a2d2a753"}, + {file = "diffq-0.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:3467622841b15ece3d953fa42ad65f41703afe30e777bb910b96c89125174c8e"}, + {file = "diffq-0.2.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3aef094383d39e12508ddf61c45a377986b2d4bac26ee553b6504fee10e2ff9d"}, + {file = "diffq-0.2.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0729231949ec74641709ad9b713ba127898735ba20ec8f44677d984d2ce1c3b9"}, + {file = "diffq-0.2.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d6779a81fcb8045d006a5f309c52a34e48fefb73db99232b4b1452a8829c083c"}, + {file = "diffq-0.2.4-cp37-cp37m-win32.whl", hash = "sha256:36f568bb1bbf75ac5601115e6253828c8c7b21a0501d7fcdc3b9545f80dc74f7"}, + {file = "diffq-0.2.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ee7f31d56f5131c2577dfa7bdb7d7284c5cce031fca0e30ac10d248b3e0e6841"}, + {file = "diffq-0.2.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:de84917882a3def0d71548e5366813f7e25a7b110d2085fe0b0fa4c9877f5098"}, + {file = "diffq-0.2.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8937f15e45464fd899e9b3a6b1b57700c977367caf50a626f872dbb7883e3c1c"}, + {file = "diffq-0.2.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8ff6ff92f3978770b0d2d355a5e553a554ea22732236cda9171c0683e5da5577"}, + {file = "diffq-0.2.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b0cf50749d1a80fb74ee9e5135e08f06b519ab57f5b725bb374b2866412b725"}, + {file = "diffq-0.2.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0381dedef3b88b4910eedfd894610ecac9affd689c2191c96694b70b3366dd27"}, + {file = "diffq-0.2.4-cp38-cp38-win32.whl", hash = "sha256:e793fed11642fdb4909efc0f87f2dbb52808dc5fa9865d7fcadb93ec5fd3aacd"}, + {file = "diffq-0.2.4-cp38-cp38-win_amd64.whl", hash = "sha256:7566f823bda2f3f786dfea1ca2cfaa9663b854ccafcb1b185a4370690b628cf5"}, + {file = "diffq-0.2.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:967a30e3a9da922d8705c3dbf44bb82d5b76a3ad49ecaa4c9450d97479fe8a31"}, + {file = "diffq-0.2.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:78124e86f1e208830bfebe744c2321d92c65ba5d7e125d260ed418b4a2fa93df"}, + {file = "diffq-0.2.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ce966eb21bbb983e5bf5957c5832cad57d0968b7c5602da4065c3d1603ef8a95"}, + {file = "diffq-0.2.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:02268472f1646cafe4fb3feaad9ac519f7e65d617871a58b56e71bc552fc8fb3"}, + {file = "diffq-0.2.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a5fc5cf4967d7cea065e75d2044824137ad08f1ccf7571d871cbf03bcf8809bd"}, + {file = "diffq-0.2.4-cp39-cp39-win32.whl", hash = "sha256:71575ca7202628ee1380a993aebee7e15c23ee12a96bc1a4dd1bff023aafdee2"}, + {file = "diffq-0.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:9729121832c9abbbf4c443effe4e2c2952c48170d8c8255d79012d236c8dcd6d"}, + {file = "diffq-0.2.4.tar.gz", hash = "sha256:049064861e974ebf00d0badab8b324c775037371419eda3150985b9d477b5bd2"}, +] + +[package.dependencies] +Cython = "*" +numpy = "*" +torch = "*" + +[package.extras] +dev = ["coverage", "flake8", "pdoc3", "torchvision"] + +[[package]] +name = "diffq-fixed" +version = "0.2.4" +description = "Differentiable quantization framework for PyTorch -- fixed for compatibility with Python 3.11+" +optional = false +python-versions = ">=3.7.0" +groups = ["main"] +markers = "sys_platform == \"win32\"" +files = [ + {file = "diffq_fixed-0.2.4-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c911cda65ddebb672aaa8d80d902259ffc4ee469ce231021544093d83372ed15"}, + {file = "diffq_fixed-0.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:d6fc81bd6ca17ebc04b8a163f9efae5afedf3274a4eee473f6742471a8d904bc"}, + {file = "diffq_fixed-0.2.4-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:6cc6c47820b7823fda855f8793ff48bc33a3d9f0f0e7dee6e430dade25085c9a"}, + {file = "diffq_fixed-0.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:67798dccc9b4f46196071953d52fafbef0751c5d0acb064e0883c7a8509d84f9"}, + {file = "diffq_fixed-0.2.4-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:5aea342125e12b9388f23a4f5bf40cf9ea3fc3888d755e848864546b104443ab"}, + {file = "diffq_fixed-0.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:81087279979db570723ca0911265635d7c3132cc8b74bc52bdea94881440ce96"}, + {file = "diffq_fixed-0.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:cd5a12f0da04394c8bd9d2d6bc69a120dce0848c2fb59ddae06b959fb5db8ae3"}, + {file = "diffq_fixed-0.2.4.tar.gz", hash = "sha256:cbc906b76fa23d1cf3c0ae517fbab744d9624980a068fe7fbb00dede1d83208d"}, +] + +[package.dependencies] +Cython = "*" +numpy = "*" +torch = "*" + +[package.extras] +dev = ["coverage", "flake8", "pdoc3", "torchvision"] + +[[package]] +name = "einops" +version = "0.8.1" +description = "A new flavour of deep learning operations" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "einops-0.8.1-py3-none-any.whl", hash = "sha256:919387eb55330f5757c6bea9165c5ff5cfe63a642682ea788a6d472576d81737"}, + {file = "einops-0.8.1.tar.gz", hash = "sha256:de5d960a7a761225532e0f1959e5315ebeafc0cd43394732f103ca44b9837e84"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version == \"3.10\"" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "filelock" +version = "3.18.0" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, + {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] +typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] + +[[package]] +name = "flatbuffers" +version = "25.2.10" +description = "The FlatBuffers serialization format for Python" +optional = true +python-versions = "*" +groups = ["main"] +markers = "extra == \"cpu\" or extra == \"gpu\" or extra == \"dml\"" +files = [ + {file = "flatbuffers-25.2.10-py2.py3-none-any.whl", hash = "sha256:ebba5f4d5ea615af3f7fd70fc310636fbb2bbd1f566ac0a23d98dd412de50051"}, + {file = "flatbuffers-25.2.10.tar.gz", hash = "sha256:97e451377a41262f8d9bd4295cc836133415cc03d8cb966410a4af92eb00d26e"}, +] + +[[package]] +name = "fonttools" +version = "4.57.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "fonttools-4.57.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:babe8d1eb059a53e560e7bf29f8e8f4accc8b6cfb9b5fd10e485bde77e71ef41"}, + {file = "fonttools-4.57.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81aa97669cd726349eb7bd43ca540cf418b279ee3caba5e2e295fb4e8f841c02"}, + {file = "fonttools-4.57.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0e9618630edd1910ad4f07f60d77c184b2f572c8ee43305ea3265675cbbfe7e"}, + {file = "fonttools-4.57.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34687a5d21f1d688d7d8d416cb4c5b9c87fca8a1797ec0d74b9fdebfa55c09ab"}, + {file = "fonttools-4.57.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69ab81b66ebaa8d430ba56c7a5f9abe0183afefd3a2d6e483060343398b13fb1"}, + {file = "fonttools-4.57.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d639397de852f2ccfb3134b152c741406752640a266d9c1365b0f23d7b88077f"}, + {file = "fonttools-4.57.0-cp310-cp310-win32.whl", hash = "sha256:cc066cb98b912f525ae901a24cd381a656f024f76203bc85f78fcc9e66ae5aec"}, + {file = "fonttools-4.57.0-cp310-cp310-win_amd64.whl", hash = "sha256:7a64edd3ff6a7f711a15bd70b4458611fb240176ec11ad8845ccbab4fe6745db"}, + {file = "fonttools-4.57.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3871349303bdec958360eedb619169a779956503ffb4543bb3e6211e09b647c4"}, + {file = "fonttools-4.57.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c59375e85126b15a90fcba3443eaac58f3073ba091f02410eaa286da9ad80ed8"}, + {file = "fonttools-4.57.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967b65232e104f4b0f6370a62eb33089e00024f2ce143aecbf9755649421c683"}, + {file = "fonttools-4.57.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39acf68abdfc74e19de7485f8f7396fa4d2418efea239b7061d6ed6a2510c746"}, + {file = "fonttools-4.57.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d077f909f2343daf4495ba22bb0e23b62886e8ec7c109ee8234bdbd678cf344"}, + {file = "fonttools-4.57.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:46370ac47a1e91895d40e9ad48effbe8e9d9db1a4b80888095bc00e7beaa042f"}, + {file = "fonttools-4.57.0-cp311-cp311-win32.whl", hash = "sha256:ca2aed95855506b7ae94e8f1f6217b7673c929e4f4f1217bcaa236253055cb36"}, + {file = "fonttools-4.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:17168a4670bbe3775f3f3f72d23ee786bd965395381dfbb70111e25e81505b9d"}, + {file = "fonttools-4.57.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:889e45e976c74abc7256d3064aa7c1295aa283c6bb19810b9f8b604dfe5c7f31"}, + {file = "fonttools-4.57.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0425c2e052a5f1516c94e5855dbda706ae5a768631e9fcc34e57d074d1b65b92"}, + {file = "fonttools-4.57.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44c26a311be2ac130f40a96769264809d3b0cb297518669db437d1cc82974888"}, + {file = "fonttools-4.57.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c41ba992df5b8d680b89fd84c6a1f2aca2b9f1ae8a67400c8930cd4ea115f6"}, + {file = "fonttools-4.57.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea1e9e43ca56b0c12440a7c689b1350066595bebcaa83baad05b8b2675129d98"}, + {file = "fonttools-4.57.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84fd56c78d431606332a0627c16e2a63d243d0d8b05521257d77c6529abe14d8"}, + {file = "fonttools-4.57.0-cp312-cp312-win32.whl", hash = "sha256:f4376819c1c778d59e0a31db5dc6ede854e9edf28bbfa5b756604727f7f800ac"}, + {file = "fonttools-4.57.0-cp312-cp312-win_amd64.whl", hash = "sha256:57e30241524879ea10cdf79c737037221f77cc126a8cdc8ff2c94d4a522504b9"}, + {file = "fonttools-4.57.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:408ce299696012d503b714778d89aa476f032414ae57e57b42e4b92363e0b8ef"}, + {file = "fonttools-4.57.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bbceffc80aa02d9e8b99f2a7491ed8c4a783b2fc4020119dc405ca14fb5c758c"}, + {file = "fonttools-4.57.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f022601f3ee9e1f6658ed6d184ce27fa5216cee5b82d279e0f0bde5deebece72"}, + {file = "fonttools-4.57.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dea5893b58d4637ffa925536462ba626f8a1b9ffbe2f5c272cdf2c6ebadb817"}, + {file = "fonttools-4.57.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dff02c5c8423a657c550b48231d0a48d7e2b2e131088e55983cfe74ccc2c7cc9"}, + {file = "fonttools-4.57.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:767604f244dc17c68d3e2dbf98e038d11a18abc078f2d0f84b6c24571d9c0b13"}, + {file = "fonttools-4.57.0-cp313-cp313-win32.whl", hash = "sha256:8e2e12d0d862f43d51e5afb8b9751c77e6bec7d2dc00aad80641364e9df5b199"}, + {file = "fonttools-4.57.0-cp313-cp313-win_amd64.whl", hash = "sha256:f1d6bc9c23356908db712d282acb3eebd4ae5ec6d8b696aa40342b1d84f8e9e3"}, + {file = "fonttools-4.57.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9d57b4e23ebbe985125d3f0cabbf286efa191ab60bbadb9326091050d88e8213"}, + {file = "fonttools-4.57.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:579ba873d7f2a96f78b2e11028f7472146ae181cae0e4d814a37a09e93d5c5cc"}, + {file = "fonttools-4.57.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e3e1ec10c29bae0ea826b61f265ec5c858c5ba2ce2e69a71a62f285cf8e4595"}, + {file = "fonttools-4.57.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1968f2a2003c97c4ce6308dc2498d5fd4364ad309900930aa5a503c9851aec8"}, + {file = "fonttools-4.57.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:aff40f8ac6763d05c2c8f6d240c6dac4bb92640a86d9b0c3f3fff4404f34095c"}, + {file = "fonttools-4.57.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:d07f1b64008e39fceae7aa99e38df8385d7d24a474a8c9872645c4397b674481"}, + {file = "fonttools-4.57.0-cp38-cp38-win32.whl", hash = "sha256:51d8482e96b28fb28aa8e50b5706f3cee06de85cbe2dce80dbd1917ae22ec5a6"}, + {file = "fonttools-4.57.0-cp38-cp38-win_amd64.whl", hash = "sha256:03290e818782e7edb159474144fca11e36a8ed6663d1fcbd5268eb550594fd8e"}, + {file = "fonttools-4.57.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7339e6a3283e4b0ade99cade51e97cde3d54cd6d1c3744459e886b66d630c8b3"}, + {file = "fonttools-4.57.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:05efceb2cb5f6ec92a4180fcb7a64aa8d3385fd49cfbbe459350229d1974f0b1"}, + {file = "fonttools-4.57.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a97bb05eb24637714a04dee85bdf0ad1941df64fe3b802ee4ac1c284a5f97b7c"}, + {file = "fonttools-4.57.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:541cb48191a19ceb1a2a4b90c1fcebd22a1ff7491010d3cf840dd3a68aebd654"}, + {file = "fonttools-4.57.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cdef9a056c222d0479a1fdb721430f9efd68268014c54e8166133d2643cb05d9"}, + {file = "fonttools-4.57.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3cf97236b192a50a4bf200dc5ba405aa78d4f537a2c6e4c624bb60466d5b03bd"}, + {file = "fonttools-4.57.0-cp39-cp39-win32.whl", hash = "sha256:e952c684274a7714b3160f57ec1d78309f955c6335c04433f07d36c5eb27b1f9"}, + {file = "fonttools-4.57.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2a722c0e4bfd9966a11ff55c895c817158fcce1b2b6700205a376403b546ad9"}, + {file = "fonttools-4.57.0-py3-none-any.whl", hash = "sha256:3122c604a675513c68bd24c6a8f9091f1c2376d18e8f5fe5a101746c81b3e98f"}, + {file = "fonttools-4.57.0.tar.gz", hash = "sha256:727ece10e065be2f9dd239d15dd5d60a66e17eac11aea47d447f9f03fdbc42de"}, +] + +[package.extras] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr ; sys_platform == \"darwin\""] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] + +[[package]] +name = "fsspec" +version = "2025.3.2" +description = "File-system specification" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "fsspec-2025.3.2-py3-none-any.whl", hash = "sha256:2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711"}, + {file = "fsspec-2025.3.2.tar.gz", hash = "sha256:e52c77ef398680bbd6a98c0e628fbc469491282981209907bbc8aea76a04fdc6"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] +tqdm = ["tqdm"] + +[[package]] +name = "humanfriendly" +version = "10.0" +description = "Human friendly output for text interfaces using Python" +optional = true +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] +markers = "extra == \"cpu\" or extra == \"gpu\" or extra == \"dml\"" +files = [ + {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"}, + {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"}, +] + +[package.dependencies] +pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""} + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "imageio" +version = "2.37.0" +description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "imageio-2.37.0-py3-none-any.whl", hash = "sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed"}, + {file = "imageio-2.37.0.tar.gz", hash = "sha256:71b57b3669666272c818497aebba2b4c5f20d5b37c81720e5e1a56d59c492996"}, +] + +[package.dependencies] +numpy = "*" +pillow = ">=8.3.2" + +[package.extras] +all-plugins = ["astropy", "av", "imageio-ffmpeg", "numpy (>2)", "pillow-heif", "psutil", "rawpy", "tifffile"] +all-plugins-pypy = ["av", "imageio-ffmpeg", "pillow-heif", "psutil", "tifffile"] +build = ["wheel"] +dev = ["black", "flake8", "fsspec[github]", "pytest", "pytest-cov"] +docs = ["numpydoc", "pydata-sphinx-theme", "sphinx (<6)"] +ffmpeg = ["imageio-ffmpeg", "psutil"] +fits = ["astropy"] +full = ["astropy", "av", "black", "flake8", "fsspec[github]", "gdal", "imageio-ffmpeg", "itk", "numpy (>2)", "numpydoc", "pillow-heif", "psutil", "pydata-sphinx-theme", "pytest", "pytest-cov", "rawpy", "sphinx (<6)", "tifffile", "wheel"] +gdal = ["gdal"] +itk = ["itk"] +linting = ["black", "flake8"] +pillow-heif = ["pillow-heif"] +pyav = ["av"] +rawpy = ["numpy (>2)", "rawpy"] +test = ["fsspec[github]", "pytest", "pytest-cov"] +tifffile = ["tifffile"] + +[[package]] +name = "iniconfig" +version = "2.1.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "joblib" +version = "1.4.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + +[[package]] +name = "julius" +version = "0.2.7" +description = "Nice DSP sweets: resampling, FFT Convolutions. All with PyTorch, differentiable and with CUDA support." +optional = false +python-versions = ">=3.6.0" +groups = ["main"] +files = [ + {file = "julius-0.2.7.tar.gz", hash = "sha256:3c0f5f5306d7d6016fcc95196b274cae6f07e2c9596eed314e4e7641554fbb08"}, +] + +[package.dependencies] +torch = ">=1.7.0" + +[package.extras] +dev = ["coverage", "flake8", "mypy", "onnxruntime", "pdoc3", "resampy (==0.2.2)"] + +[[package]] +name = "kiwisolver" +version = "1.4.8" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e"}, + {file = "kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751"}, + {file = "kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67"}, + {file = "kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34"}, + {file = "kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8"}, + {file = "kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50"}, + {file = "kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb"}, + {file = "kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2"}, + {file = "kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b"}, + {file = "kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e"}, +] + +[[package]] +name = "lazy-loader" +version = "0.4" +description = "Makes it easy to load subpackages and functions on demand." +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc"}, + {file = "lazy_loader-0.4.tar.gz", hash = "sha256:47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1"}, +] + +[package.dependencies] +packaging = "*" + +[package.extras] +dev = ["changelist (==0.5)"] +lint = ["pre-commit (==3.7.0)"] +test = ["pytest (>=7.4)", "pytest-cov (>=4.1)"] + +[[package]] +name = "librosa" +version = "0.11.0" +description = "Python module for audio and music processing" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "librosa-0.11.0-py3-none-any.whl", hash = "sha256:0b6415c4fd68bff4c29288abe67c6d80b587e0e1e2cfb0aad23e4559504a7fa1"}, + {file = "librosa-0.11.0.tar.gz", hash = "sha256:f5ed951ca189b375bbe2e33b2abd7e040ceeee302b9bbaeeffdfddb8d0ace908"}, +] + +[package.dependencies] +audioread = ">=2.1.9" +decorator = ">=4.3.0" +joblib = ">=1.0" +lazy_loader = ">=0.1" +msgpack = ">=1.0" +numba = ">=0.51.0" +numpy = ">=1.22.3" +pooch = ">=1.1" +scikit-learn = ">=1.1.0" +scipy = ">=1.6.0" +soundfile = ">=0.12.1" +soxr = ">=0.3.2" +standard-aifc = {version = "*", markers = "python_version >= \"3.13\""} +standard-sunau = {version = "*", markers = "python_version >= \"3.13\""} +typing_extensions = ">=4.1.1" + +[package.extras] +display = ["matplotlib (>=3.5.0)"] +docs = ["ipython (>=7.0)", "matplotlib (>=3.5.0)", "mir_eval (>=0.5)", "numba (>=0.51)", "numpydoc", "presets", "sphinx (!=1.3.1)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.7)", "sphinx-multiversion (>=0.2.3)", "sphinx_rtd_theme (>=1.2.0)", "sphinxcontrib-googleanalytics (>=0.4)", "sphinxcontrib-svg2pdfconverter"] +tests = ["matplotlib (>=3.5.0)", "packaging (>=20.0)", "pytest", "pytest-cov", "pytest-mpl", "resampy (>=0.2.2)", "samplerate", "types-decorator"] + +[[package]] +name = "llvmlite" +version = "0.44.0" +description = "lightweight wrapper around basic LLVM functionality" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "llvmlite-0.44.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:9fbadbfba8422123bab5535b293da1cf72f9f478a65645ecd73e781f962ca614"}, + {file = "llvmlite-0.44.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cccf8eb28f24840f2689fb1a45f9c0f7e582dd24e088dcf96e424834af11f791"}, + {file = "llvmlite-0.44.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7202b678cdf904823c764ee0fe2dfe38a76981f4c1e51715b4cb5abb6cf1d9e8"}, + {file = "llvmlite-0.44.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40526fb5e313d7b96bda4cbb2c85cd5374e04d80732dd36a282d72a560bb6408"}, + {file = "llvmlite-0.44.0-cp310-cp310-win_amd64.whl", hash = "sha256:41e3839150db4330e1b2716c0be3b5c4672525b4c9005e17c7597f835f351ce2"}, + {file = "llvmlite-0.44.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:eed7d5f29136bda63b6d7804c279e2b72e08c952b7c5df61f45db408e0ee52f3"}, + {file = "llvmlite-0.44.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ace564d9fa44bb91eb6e6d8e7754977783c68e90a471ea7ce913bff30bd62427"}, + {file = "llvmlite-0.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5d22c3bfc842668168a786af4205ec8e3ad29fb1bc03fd11fd48460d0df64c1"}, + {file = "llvmlite-0.44.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f01a394e9c9b7b1d4e63c327b096d10f6f0ed149ef53d38a09b3749dcf8c9610"}, + {file = "llvmlite-0.44.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8489634d43c20cd0ad71330dde1d5bc7b9966937a263ff1ec1cebb90dc50955"}, + {file = "llvmlite-0.44.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:1d671a56acf725bf1b531d5ef76b86660a5ab8ef19bb6a46064a705c6ca80aad"}, + {file = "llvmlite-0.44.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f79a728e0435493611c9f405168682bb75ffd1fbe6fc360733b850c80a026db"}, + {file = "llvmlite-0.44.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0143a5ef336da14deaa8ec26c5449ad5b6a2b564df82fcef4be040b9cacfea9"}, + {file = "llvmlite-0.44.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d752f89e31b66db6f8da06df8b39f9b91e78c5feea1bf9e8c1fba1d1c24c065d"}, + {file = "llvmlite-0.44.0-cp312-cp312-win_amd64.whl", hash = "sha256:eae7e2d4ca8f88f89d315b48c6b741dcb925d6a1042da694aa16ab3dd4cbd3a1"}, + {file = "llvmlite-0.44.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:319bddd44e5f71ae2689859b7203080716448a3cd1128fb144fe5c055219d516"}, + {file = "llvmlite-0.44.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c58867118bad04a0bb22a2e0068c693719658105e40009ffe95c7000fcde88e"}, + {file = "llvmlite-0.44.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46224058b13c96af1365290bdfebe9a6264ae62fb79b2b55693deed11657a8bf"}, + {file = "llvmlite-0.44.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0097052c32bf721a4efc03bd109d335dfa57d9bffb3d4c24cc680711b8b4fc"}, + {file = "llvmlite-0.44.0-cp313-cp313-win_amd64.whl", hash = "sha256:2fb7c4f2fb86cbae6dca3db9ab203eeea0e22d73b99bc2341cdf9de93612e930"}, + {file = "llvmlite-0.44.0.tar.gz", hash = "sha256:07667d66a5d150abed9157ab6c0b9393c9356f229784a4385c02f99e94fc94d4"}, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "matplotlib" +version = "3.10.1" +description = "Python plotting package" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "matplotlib-3.10.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ff2ae14910be903f4a24afdbb6d7d3a6c44da210fc7d42790b87aeac92238a16"}, + {file = "matplotlib-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0721a3fd3d5756ed593220a8b86808a36c5031fce489adb5b31ee6dbb47dd5b2"}, + {file = "matplotlib-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0673b4b8f131890eb3a1ad058d6e065fb3c6e71f160089b65f8515373394698"}, + {file = "matplotlib-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e875b95ac59a7908978fe307ecdbdd9a26af7fa0f33f474a27fcf8c99f64a19"}, + {file = "matplotlib-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2589659ea30726284c6c91037216f64a506a9822f8e50592d48ac16a2f29e044"}, + {file = "matplotlib-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a97ff127f295817bc34517255c9db6e71de8eddaab7f837b7d341dee9f2f587f"}, + {file = "matplotlib-3.10.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:057206ff2d6ab82ff3e94ebd94463d084760ca682ed5f150817b859372ec4401"}, + {file = "matplotlib-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a144867dd6bf8ba8cb5fc81a158b645037e11b3e5cf8a50bd5f9917cb863adfe"}, + {file = "matplotlib-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56c5d9fcd9879aa8040f196a235e2dcbdf7dd03ab5b07c0696f80bc6cf04bedd"}, + {file = "matplotlib-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f69dc9713e4ad2fb21a1c30e37bd445d496524257dfda40ff4a8efb3604ab5c"}, + {file = "matplotlib-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c59af3e8aca75d7744b68e8e78a669e91ccbcf1ac35d0102a7b1b46883f1dd7"}, + {file = "matplotlib-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:11b65088c6f3dae784bc72e8d039a2580186285f87448babb9ddb2ad0082993a"}, + {file = "matplotlib-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107"}, + {file = "matplotlib-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be"}, + {file = "matplotlib-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6"}, + {file = "matplotlib-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d"}, + {file = "matplotlib-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea"}, + {file = "matplotlib-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c"}, + {file = "matplotlib-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42eee41e1b60fd83ee3292ed83a97a5f2a8239b10c26715d8a6172226988d7b"}, + {file = "matplotlib-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4f0647b17b667ae745c13721602b540f7aadb2a32c5b96e924cd4fea5dcb90f1"}, + {file = "matplotlib-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa3854b5f9473564ef40a41bc922be978fab217776e9ae1545c9b3a5cf2092a3"}, + {file = "matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6"}, + {file = "matplotlib-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d45d3f5245be5b469843450617dcad9af75ca50568acf59997bed9311131a0b"}, + {file = "matplotlib-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:8e8e25b1209161d20dfe93037c8a7f7ca796ec9aa326e6e4588d8c4a5dd1e473"}, + {file = "matplotlib-3.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:19b06241ad89c3ae9469e07d77efa87041eac65d78df4fcf9cac318028009b01"}, + {file = "matplotlib-3.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01e63101ebb3014e6e9f80d9cf9ee361a8599ddca2c3e166c563628b39305dbb"}, + {file = "matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f06bad951eea6422ac4e8bdebcf3a70c59ea0a03338c5d2b109f57b64eb3972"}, + {file = "matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfb036f34873b46978f55e240cff7a239f6c4409eac62d8145bad3fc6ba5a3"}, + {file = "matplotlib-3.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dc6ab14a7ab3b4d813b88ba957fc05c79493a037f54e246162033591e770de6f"}, + {file = "matplotlib-3.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc411ebd5889a78dabbc457b3fa153203e22248bfa6eedc6797be5df0164dbf9"}, + {file = "matplotlib-3.10.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:648406f1899f9a818cef8c0231b44dcfc4ff36f167101c3fd1c9151f24220fdc"}, + {file = "matplotlib-3.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:02582304e352f40520727984a5a18f37e8187861f954fea9be7ef06569cf85b4"}, + {file = "matplotlib-3.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3809916157ba871bcdd33d3493acd7fe3037db5daa917ca6e77975a94cef779"}, + {file = "matplotlib-3.10.1.tar.gz", hash = "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.23" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[package.extras] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] + +[[package]] +name = "ml-collections" +version = "1.1.0" +description = "ML Collections is a library of Python collections designed for ML usecases." +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "ml_collections-1.1.0-py3-none-any.whl", hash = "sha256:23b6fa4772aac1ae745a96044b925a5746145a70734f087eaca6626e92c05cbc"}, + {file = "ml_collections-1.1.0.tar.gz", hash = "sha256:0ac1ac6511b9f1566863e0bb0afad0c64e906ea278ad3f4d2144a55322671f6f"}, +] + +[package.dependencies] +absl-py = "*" +PyYAML = "*" + +[package.extras] +dev = ["pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4) ; platform_python_implementation != \"PyPy\""] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "msgpack" +version = "1.1.0" +description = "MessagePack serializer" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b"}, + {file = "msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044"}, + {file = "msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5"}, + {file = "msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88"}, + {file = "msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b"}, + {file = "msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b"}, + {file = "msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c"}, + {file = "msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc"}, + {file = "msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f"}, + {file = "msgpack-1.1.0-cp38-cp38-win32.whl", hash = "sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b"}, + {file = "msgpack-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8"}, + {file = "msgpack-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd"}, + {file = "msgpack-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325"}, + {file = "msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, + {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, +] + +[[package]] +name = "networkx" +version = "3.4.2" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.10" +groups = ["main", "dev"] +files = [ + {file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"}, + {file = "networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1"}, +] + +[package.extras] +default = ["matplotlib (>=3.7)", "numpy (>=1.24)", "pandas (>=2.0)", "scipy (>=1.10,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.15)", "sphinx (>=7.3)", "sphinx-gallery (>=0.16)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=1.9)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "numba" +version = "0.61.2" +description = "compiling Python code using LLVM" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "numba-0.61.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:cf9f9fc00d6eca0c23fc840817ce9f439b9f03c8f03d6246c0e7f0cb15b7162a"}, + {file = "numba-0.61.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ea0247617edcb5dd61f6106a56255baab031acc4257bddaeddb3a1003b4ca3fd"}, + {file = "numba-0.61.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae8c7a522c26215d5f62ebec436e3d341f7f590079245a2f1008dfd498cc1642"}, + {file = "numba-0.61.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd1e74609855aa43661edffca37346e4e8462f6903889917e9f41db40907daa2"}, + {file = "numba-0.61.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae45830b129c6137294093b269ef0a22998ccc27bf7cf096ab8dcf7bca8946f9"}, + {file = "numba-0.61.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:efd3db391df53aaa5cfbee189b6c910a5b471488749fd6606c3f33fc984c2ae2"}, + {file = "numba-0.61.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:49c980e4171948ffebf6b9a2520ea81feed113c1f4890747ba7f59e74be84b1b"}, + {file = "numba-0.61.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3945615cd73c2c7eba2a85ccc9c1730c21cd3958bfcf5a44302abae0fb07bb60"}, + {file = "numba-0.61.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbfdf4eca202cebade0b7d43896978e146f39398909a42941c9303f82f403a18"}, + {file = "numba-0.61.2-cp311-cp311-win_amd64.whl", hash = "sha256:76bcec9f46259cedf888041b9886e257ae101c6268261b19fda8cfbc52bec9d1"}, + {file = "numba-0.61.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:34fba9406078bac7ab052efbf0d13939426c753ad72946baaa5bf9ae0ebb8dd2"}, + {file = "numba-0.61.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ddce10009bc097b080fc96876d14c051cc0c7679e99de3e0af59014dab7dfe8"}, + {file = "numba-0.61.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b1bb509d01f23d70325d3a5a0e237cbc9544dd50e50588bc581ba860c213546"}, + {file = "numba-0.61.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48a53a3de8f8793526cbe330f2a39fe9a6638efcbf11bd63f3d2f9757ae345cd"}, + {file = "numba-0.61.2-cp312-cp312-win_amd64.whl", hash = "sha256:97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18"}, + {file = "numba-0.61.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:3a10a8fc9afac40b1eac55717cece1b8b1ac0b946f5065c89e00bde646b5b154"}, + {file = "numba-0.61.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d3bcada3c9afba3bed413fba45845f2fb9cd0d2b27dd58a1be90257e293d140"}, + {file = "numba-0.61.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdbca73ad81fa196bd53dc12e3aaf1564ae036e0c125f237c7644fe64a4928ab"}, + {file = "numba-0.61.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f154aaea625fb32cfbe3b80c5456d514d416fcdf79733dd69c0df3a11348e9e"}, + {file = "numba-0.61.2-cp313-cp313-win_amd64.whl", hash = "sha256:59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7"}, + {file = "numba-0.61.2.tar.gz", hash = "sha256:8750ee147940a6637b80ecf7f95062185ad8726c8c28a2295b8ec1160a196f7d"}, +] + +[package.dependencies] +llvmlite = "==0.44.*" +numpy = ">=1.24,<2.3" + +[[package]] +name = "numpy" +version = "2.2.5" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.10" +groups = ["main", "dev"] +files = [ + {file = "numpy-2.2.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f4a922da1729f4c40932b2af4fe84909c7a6e167e6e99f71838ce3a29f3fe26"}, + {file = "numpy-2.2.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b6f91524d31b34f4a5fee24f5bc16dcd1491b668798b6d85585d836c1e633a6a"}, + {file = "numpy-2.2.5-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:19f4718c9012e3baea91a7dba661dcab2451cda2550678dc30d53acb91a7290f"}, + {file = "numpy-2.2.5-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:eb7fd5b184e5d277afa9ec0ad5e4eb562ecff541e7f60e69ee69c8d59e9aeaba"}, + {file = "numpy-2.2.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6413d48a9be53e183eb06495d8e3b006ef8f87c324af68241bbe7a39e8ff54c3"}, + {file = "numpy-2.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7451f92eddf8503c9b8aa4fe6aa7e87fd51a29c2cfc5f7dbd72efde6c65acf57"}, + {file = "numpy-2.2.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0bcb1d057b7571334139129b7f941588f69ce7c4ed15a9d6162b2ea54ded700c"}, + {file = "numpy-2.2.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36ab5b23915887543441efd0417e6a3baa08634308894316f446027611b53bf1"}, + {file = "numpy-2.2.5-cp310-cp310-win32.whl", hash = "sha256:422cc684f17bc963da5f59a31530b3936f57c95a29743056ef7a7903a5dbdf88"}, + {file = "numpy-2.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:e4f0b035d9d0ed519c813ee23e0a733db81ec37d2e9503afbb6e54ccfdee0fa7"}, + {file = "numpy-2.2.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c42365005c7a6c42436a54d28c43fe0e01ca11eb2ac3cefe796c25a5f98e5e9b"}, + {file = "numpy-2.2.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:498815b96f67dc347e03b719ef49c772589fb74b8ee9ea2c37feae915ad6ebda"}, + {file = "numpy-2.2.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6411f744f7f20081b1b4e7112e0f4c9c5b08f94b9f086e6f0adf3645f85d3a4d"}, + {file = "numpy-2.2.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9de6832228f617c9ef45d948ec1cd8949c482238d68b2477e6f642c33a7b0a54"}, + {file = "numpy-2.2.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:369e0d4647c17c9363244f3468f2227d557a74b6781cb62ce57cf3ef5cc7c610"}, + {file = "numpy-2.2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:262d23f383170f99cd9191a7c85b9a50970fe9069b2f8ab5d786eca8a675d60b"}, + {file = "numpy-2.2.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa70fdbdc3b169d69e8c59e65c07a1c9351ceb438e627f0fdcd471015cd956be"}, + {file = "numpy-2.2.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37e32e985f03c06206582a7323ef926b4e78bdaa6915095ef08070471865b906"}, + {file = "numpy-2.2.5-cp311-cp311-win32.whl", hash = "sha256:f5045039100ed58fa817a6227a356240ea1b9a1bc141018864c306c1a16d4175"}, + {file = "numpy-2.2.5-cp311-cp311-win_amd64.whl", hash = "sha256:b13f04968b46ad705f7c8a80122a42ae8f620536ea38cf4bdd374302926424dd"}, + {file = "numpy-2.2.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ee461a4eaab4f165b68780a6a1af95fb23a29932be7569b9fab666c407969051"}, + {file = "numpy-2.2.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ec31367fd6a255dc8de4772bd1658c3e926d8e860a0b6e922b615e532d320ddc"}, + {file = "numpy-2.2.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:47834cde750d3c9f4e52c6ca28a7361859fcaf52695c7dc3cc1a720b8922683e"}, + {file = "numpy-2.2.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2c1a1c6ccce4022383583a6ded7bbcda22fc635eb4eb1e0a053336425ed36dfa"}, + {file = "numpy-2.2.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d75f338f5f79ee23548b03d801d28a505198297534f62416391857ea0479571"}, + {file = "numpy-2.2.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a801fef99668f309b88640e28d261991bfad9617c27beda4a3aec4f217ea073"}, + {file = "numpy-2.2.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:abe38cd8381245a7f49967a6010e77dbf3680bd3627c0fe4362dd693b404c7f8"}, + {file = "numpy-2.2.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a0ac90e46fdb5649ab6369d1ab6104bfe5854ab19b645bf5cda0127a13034ae"}, + {file = "numpy-2.2.5-cp312-cp312-win32.whl", hash = "sha256:0cd48122a6b7eab8f06404805b1bd5856200e3ed6f8a1b9a194f9d9054631beb"}, + {file = "numpy-2.2.5-cp312-cp312-win_amd64.whl", hash = "sha256:ced69262a8278547e63409b2653b372bf4baff0870c57efa76c5703fd6543282"}, + {file = "numpy-2.2.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:059b51b658f4414fff78c6d7b1b4e18283ab5fa56d270ff212d5ba0c561846f4"}, + {file = "numpy-2.2.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:47f9ed103af0bc63182609044b0490747e03bd20a67e391192dde119bf43d52f"}, + {file = "numpy-2.2.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:261a1ef047751bb02f29dfe337230b5882b54521ca121fc7f62668133cb119c9"}, + {file = "numpy-2.2.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4520caa3807c1ceb005d125a75e715567806fed67e315cea619d5ec6e75a4191"}, + {file = "numpy-2.2.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d14b17b9be5f9c9301f43d2e2a4886a33b53f4e6fdf9ca2f4cc60aeeee76372"}, + {file = "numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d"}, + {file = "numpy-2.2.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4cbdef3ddf777423060c6f81b5694bad2dc9675f110c4b2a60dc0181543fac7"}, + {file = "numpy-2.2.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54088a5a147ab71a8e7fdfd8c3601972751ded0739c6b696ad9cb0343e21ab73"}, + {file = "numpy-2.2.5-cp313-cp313-win32.whl", hash = "sha256:c8b82a55ef86a2d8e81b63da85e55f5537d2157165be1cb2ce7cfa57b6aef38b"}, + {file = "numpy-2.2.5-cp313-cp313-win_amd64.whl", hash = "sha256:d8882a829fd779f0f43998e931c466802a77ca1ee0fe25a3abe50278616b1471"}, + {file = "numpy-2.2.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e8b025c351b9f0e8b5436cf28a07fa4ac0204d67b38f01433ac7f9b870fa38c6"}, + {file = "numpy-2.2.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dfa94b6a4374e7851bbb6f35e6ded2120b752b063e6acdd3157e4d2bb922eba"}, + {file = "numpy-2.2.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:97c8425d4e26437e65e1d189d22dff4a079b747ff9c2788057bfb8114ce1e133"}, + {file = "numpy-2.2.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:352d330048c055ea6db701130abc48a21bec690a8d38f8284e00fab256dc1376"}, + {file = "numpy-2.2.5-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b4c0773b6ada798f51f0f8e30c054d32304ccc6e9c5d93d46cb26f3d385ab19"}, + {file = "numpy-2.2.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55f09e00d4dccd76b179c0f18a44f041e5332fd0e022886ba1c0bbf3ea4a18d0"}, + {file = "numpy-2.2.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:02f226baeefa68f7d579e213d0f3493496397d8f1cff5e2b222af274c86a552a"}, + {file = "numpy-2.2.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c26843fd58f65da9491165072da2cccc372530681de481ef670dcc8e27cfb066"}, + {file = "numpy-2.2.5-cp313-cp313t-win32.whl", hash = "sha256:1a161c2c79ab30fe4501d5a2bbfe8b162490757cf90b7f05be8b80bc02f7bb8e"}, + {file = "numpy-2.2.5-cp313-cp313t-win_amd64.whl", hash = "sha256:d403c84991b5ad291d3809bace5e85f4bbf44a04bdc9a88ed2bb1807b3360bb8"}, + {file = "numpy-2.2.5-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b4ea7e1cff6784e58fe281ce7e7f05036b3e1c89c6f922a6bfbc0a7e8768adbe"}, + {file = "numpy-2.2.5-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d7543263084a85fbc09c704b515395398d31d6395518446237eac219eab9e55e"}, + {file = "numpy-2.2.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0255732338c4fdd00996c0421884ea8a3651eea555c3a56b84892b66f696eb70"}, + {file = "numpy-2.2.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d2e3bdadaba0e040d1e7ab39db73e0afe2c74ae277f5614dad53eadbecbbb169"}, + {file = "numpy-2.2.5.tar.gz", hash = "sha256:a9c0d994680cd991b1cb772e8b297340085466a6fe964bc9d4e80f5e2f43c291"}, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.6.4.1" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08ed2686e9875d01b58e3cb379c6896df8e76c75e0d4a7f7dace3d7b6d9ef8eb"}, + {file = "nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:235f728d6e2a409eddf1df58d5b0921cf80cfa9e72b9f2775ccb7b4a87984668"}, + {file = "nvidia_cublas_cu12-12.6.4.1-py3-none-win_amd64.whl", hash = "sha256:9e4fa264f4d8a4eb0cdbd34beadc029f453b3bafae02401e999cf3d5a5af75f8"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.6.80" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:166ee35a3ff1587f2490364f90eeeb8da06cd867bd5b701bf7f9a02b78bc63fc"}, + {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_aarch64.whl", hash = "sha256:358b4a1d35370353d52e12f0a7d1769fc01ff74a191689d3870b2123156184c4"}, + {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6768bad6cab4f19e8292125e5f1ac8aa7d1718704012a0e3272a6f61c4bce132"}, + {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a3eff6cdfcc6a4c35db968a06fcadb061cbc7d6dde548609a941ff8701b98b73"}, + {file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-win_amd64.whl", hash = "sha256:bbe6ae76e83ce5251b56e8c8e61a964f757175682bbad058b170b136266ab00a"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.6.77" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5847f1d6e5b757f1d2b3991a01082a44aad6f10ab3c5c0213fa3e25bddc25a13"}, + {file = "nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:35b0cc6ee3a9636d5409133e79273ce1f3fd087abb0532d2d2e8fff1fe9efc53"}, + {file = "nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:f7007dbd914c56bd80ea31bc43e8e149da38f68158f423ba845fc3292684e45a"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.6.77" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6116fad3e049e04791c0256a9778c16237837c08b27ed8c8401e2e45de8d60cd"}, + {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d461264ecb429c84c8879a7153499ddc7b19b5f8d84c204307491989a365588e"}, + {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ba3b56a4f896141e25e19ab287cd71e52a6a0f4b29d0d31609f60e3b4d5219b7"}, + {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a84d15d5e1da416dd4774cb42edf5e954a3e60cc945698dc1d5be02321c44dc8"}, + {file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:86c58044c824bf3c173c49a2dbc7a6c8b53cb4e4dca50068be0bf64e9dab3f7f"}, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "9.5.1.17" +description = "cuDNN runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:9fd4584468533c61873e5fda8ca41bac3a38bcb2d12350830c69b0a96a7e4def"}, + {file = "nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:30ac3869f6db17d170e0e556dd6cc5eee02647abc31ca856634d5a40f82c15b2"}, + {file = "nvidia_cudnn_cu12-9.5.1.17-py3-none-win_amd64.whl", hash = "sha256:d7af0f8a4f3b4b9dbb3122f2ef553b45694ed9c384d5a75bab197b8eefb79ab8"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.3.0.4" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d16079550df460376455cba121db6564089176d9bac9e4f360493ca4741b22a6"}, + {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8510990de9f96c803a051822618d42bf6cb8f069ff3f48d93a8486efdacb48fb"}, + {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ccba62eb9cef5559abd5e0d54ceed2d9934030f51163df018532142a8ec533e5"}, + {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.whl", hash = "sha256:768160ac89f6f7b459bee747e8d175dbf53619cfe74b2a5636264163138013ca"}, + {file = "nvidia_cufft_cu12-11.3.0.4-py3-none-win_amd64.whl", hash = "sha256:6048ebddfb90d09d2707efb1fd78d4e3a77cb3ae4dc60e19aab6be0ece2ae464"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cufile-cu12" +version = "1.11.1.6" +description = "cuFile GPUDirect libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cufile_cu12-1.11.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc23469d1c7e52ce6c1d55253273d32c565dd22068647f3aa59b3c6b005bf159"}, + {file = "nvidia_cufile_cu12-1.11.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:8f57a0051dcf2543f6dc2b98a98cb2719c37d3cee1baba8965d57f3bbc90d4db"}, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.7.77" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:6e82df077060ea28e37f48a3ec442a8f47690c7499bff392a5938614b56c98d8"}, + {file = "nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a42cd1344297f70b9e39a1e4f467a4e1c10f1da54ff7a85c12197f6c652c8bdf"}, + {file = "nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:99f1a32f1ac2bd134897fc7a203f779303261268a65762a623bf30cc9fe79117"}, + {file = "nvidia_curand_cu12-10.3.7.77-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:7b2ed8e95595c3591d984ea3603dd66fe6ce6812b886d59049988a712ed06b6e"}, + {file = "nvidia_curand_cu12-10.3.7.77-py3-none-win_amd64.whl", hash = "sha256:6d6d935ffba0f3d439b7cd968192ff068fafd9018dbf1b85b37261b13cfc9905"}, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.7.1.2" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0ce237ef60acde1efc457335a2ddadfd7610b892d94efee7b776c64bb1cac9e0"}, + {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e9e49843a7707e42022babb9bcfa33c29857a93b88020c4e4434656a655b698c"}, + {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6cf28f17f64107a0c4d7802be5ff5537b2130bfc112f25d5a30df227058ca0e6"}, + {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:dbbe4fc38ec1289c7e5230e16248365e375c3673c9c8bac5796e2e20db07f56e"}, + {file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-win_amd64.whl", hash = "sha256:6813f9d8073f555444a8705f3ab0296d3e1cb37a16d694c5fc8b862a0d8706d7"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.5.4.2" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d25b62fb18751758fe3c93a4a08eff08effedfe4edf1c6bb5afd0890fe88f887"}, + {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7aa32fa5470cf754f72d1116c7cbc300b4e638d3ae5304cfa4a638a5b87161b1"}, + {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7556d9eca156e18184b94947ade0fba5bb47d69cec46bf8660fd2c71a4b48b73"}, + {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:23749a6571191a215cb74d1cdbff4a86e7b19f1200c071b3fcf844a5bea23a2f"}, + {file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-win_amd64.whl", hash = "sha256:4acb8c08855a26d737398cba8fb6f8f5045d93f82612b4cfd84645a2332ccf20"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparselt-cu12" +version = "0.6.3" +description = "NVIDIA cuSPARSELt" +optional = false +python-versions = "*" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cusparselt_cu12-0.6.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8371549623ba601a06322af2133c4a44350575f5a3108fb75f3ef20b822ad5f1"}, + {file = "nvidia_cusparselt_cu12-0.6.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e5c8a26c36445dd2e6812f1177978a24e2d37cacce7e090f297a688d1ec44f46"}, + {file = "nvidia_cusparselt_cu12-0.6.3-py3-none-win_amd64.whl", hash = "sha256:3b325bcbd9b754ba43df5a311488fca11a6b5dc3d11df4d190c000cf1a0765c7"}, +] + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.26.2" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_nccl_cu12-2.26.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c196e95e832ad30fbbb50381eb3cbd1fadd5675e587a548563993609af19522"}, + {file = "nvidia_nccl_cu12-2.26.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:694cf3879a206553cc9d7dbda76b13efaf610fdb70a50cba303de1b0d1530ac6"}, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.6.85" +description = "Nvidia JIT LTO Library" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:eedc36df9e88b682efe4309aa16b5b4e78c2407eac59e8c10a6a47535164369a"}, + {file = "nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cf4eaa7d4b6b543ffd69d6abfb11efdeb2db48270d94dfd3a452c24150829e41"}, + {file = "nvidia_nvjitlink_cu12-12.6.85-py3-none-win_amd64.whl", hash = "sha256:e61120e52ed675747825cdd16febc6a0730537451d867ee58bee3853b1b13d1c"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.6.77" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f44f8d86bb7d5629988d61c8d3ae61dddb2015dee142740536bc7481b022fe4b"}, + {file = "nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:adcaabb9d436c9761fca2b13959a2d237c5f9fd406c8e4b723c695409ff88059"}, + {file = "nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b90bed3df379fa79afbd21be8e04a0314336b8ae16768b58f2d34cb1d04cd7d2"}, + {file = "nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6574241a3ec5fdc9334353ab8c479fe75841dbe8f4532a8fc97ce63503330ba1"}, + {file = "nvidia_nvtx_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:2fb11a4af04a5e6c84073e6404d26588a34afd35379f0855a99797897efa75c0"}, +] + +[[package]] +name = "onnx-weekly" +version = "1.19.0.dev20250428" +description = "Open Neural Network Exchange" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "onnx_weekly-1.19.0.dev20250428-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:efdebafaef8f063f65b7c6d86f9786d5f4812a8a24c8106004f2338a96ddc68a"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8aaf085c2a058d73068d45931e5e7e22f279710a6f9b58e87c6e117a4a4f056b"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28b8c6d260f02c5d7d8feb0b9c84195c1cbc18bb966448d738e304938207750e"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp310-cp310-win32.whl", hash = "sha256:c2c25587aa61b87a43cfb10a85d19d4d74517098e97b98f931cf9b031b43b605"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp310-cp310-win_amd64.whl", hash = "sha256:a2594395b4187c377f3e80dbc0a17391be33a6c9187f37e603dd0de1c6f4b8a6"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:01c3421e540a8af5ca857a018bc68aa5b1b56a4f8ad6ecb8237f7bf8f99b19e8"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:791c1bf8a336c6faa2b5ac5a81e29ee374ab7defee6272d1d81d45e3d33f76ba"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62577028d47e3f57554179bf461f2f747d0501684000cd6c06af6bce8ffcfe3e"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp311-cp311-win32.whl", hash = "sha256:803e53a51a7984326e2d667ee9248e1b287f5516a2fbc12e838dba313fb10544"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp311-cp311-win_amd64.whl", hash = "sha256:d0da1dc123ecd02f8b3e025fcf89412d260974d0d9fb150e380cf2f561910b13"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp311-cp311-win_arm64.whl", hash = "sha256:fb91f1e305d49d6521d86f5ec0556bea197ab8073176a4d251d2fc95986923c2"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:30a9ab2e20ce087040ac4ef0fd57f2b1873be59cef40e77620f742901ddf4c8f"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ff865650e14befe759cb3b8e2f887ec5a5fd895ca99a70602df8674d35e0d3c"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecbc0a585ce4bc368b27783f9677c3b25db002c2a0b4913607762b6b34908e1b"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp312-cp312-win32.whl", hash = "sha256:eb4dc98460c7bf4a2f5d77d8d82015b2de6aedf7c2b7a868985d221ce66b039a"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp312-cp312-win_amd64.whl", hash = "sha256:20cc44a0f2674abae78adbe7ecdc06f35c1f653e6dce00667fea0e7e64f20e77"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp312-cp312-win_arm64.whl", hash = "sha256:0d816f803ff69f8ecc0030b0ef3f401b826bfd27eb0192acaec44fcb2f5d0691"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:8c819ee04b679e0f5a2b70082feefb07211d8f1517cdf9bb5d8b92f0efa43da5"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976858d205703f0f4516f8bb9a4bdc3dade8b173fa3fee9372169c2f77fe2b05"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac281deaff31b63d86313a19aea1c85b541cb42af7d81cc911a941e8af38fa1b"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp313-cp313-win32.whl", hash = "sha256:714560f620d70d98ce718c60be6d44bad98611c4c7c21c75c5debe9b982ba479"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp313-cp313-win_amd64.whl", hash = "sha256:35be8f80008880356d914accbe1934dfadad2cc6bc5d75ea81db15bbb646e240"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp313-cp313-win_arm64.whl", hash = "sha256:39122d350aa6a3640b44002537726f6c844ffb3905ffca4df6e206b0dd835b30"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp313-cp313t-macosx_12_0_universal2.whl", hash = "sha256:f3b33b8b098dce4c9abe6dc0e56070a79d4cdaa49115c3e12a4bc3fa2bde7488"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d32a4a5c2b0b13c509d2bd331aef4fcdba25c17590b5dd6e869ab36109c6c36a"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6c1d9df00069e6ca6948e1ab216d4583523608c03770339a48514c79a526bd8"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp313-cp313t-win_amd64.whl", hash = "sha256:2bf68dc5eb9ec2ecfdc2930c2fc36905de8c2cdc488423e478a3f1675a84d19d"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp39-cp39-macosx_12_0_universal2.whl", hash = "sha256:9d75977a39b7d5ad190338460e0279573c488801cb2e4c3c44a73a6aca336b7d"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d25361ea618b17172d0c5d006a30cf8756fd673093947f1bbb7c9600d70ae07"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54beda8d2332532fca742b858f2ad5077462129da97ca00c8ab433180961ad36"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp39-cp39-win32.whl", hash = "sha256:5ab989dd5fd30d8c75f5d35d6af3cca621348a3e991d8a720ab2ec215af2e6cc"}, + {file = "onnx_weekly-1.19.0.dev20250428-cp39-cp39-win_amd64.whl", hash = "sha256:f887ad15eb648e3f2657662304951badce949e2fcda60f690837d6d0afb8278f"}, + {file = "onnx_weekly-1.19.0.dev20250428.tar.gz", hash = "sha256:bc30d4794c9494ceec14060a0891f2f8f867ca35de3303fa82d9ed833351a2a2"}, +] + +[package.dependencies] +numpy = ">=1.22" +protobuf = ">=4.25.1" +typing_extensions = ">=4.7.1" + +[package.extras] +reference = ["Pillow", "google-re2 ; python_version < \"3.13\""] + +[[package]] +name = "onnx2torch-py313" +version = "1.6.0" +description = "ONNX to PyTorch converter" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "onnx2torch_py313-1.6.0-py3-none-any.whl", hash = "sha256:03b1cc771f93941cc221635547e97dd7823dffc05f052057e51c6a45fbacba70"}, + {file = "onnx2torch_py313-1.6.0.tar.gz", hash = "sha256:d27b54c7e170f12ad252fe186e6cab8f3cade8ee4e596682acc5a3afddadb753"}, +] + +[package.dependencies] +numpy = ">=1.16.4" +onnx-weekly = "*" +torch = ">=1.8.0" +torchvision = ">=0.9.0" + +[package.extras] +dev = ["Pillow", "black", "googledrivedownloader", "isort", "onnxruntime", "pre-commit", "pylint", "pytest", "requests"] + +[[package]] +name = "onnxruntime" +version = "1.21.1" +description = "ONNX Runtime is a runtime accelerator for Machine Learning models" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"cpu\"" +files = [ + {file = "onnxruntime-1.21.1-cp310-cp310-macosx_13_0_universal2.whl", hash = "sha256:daedb5d33d8963062a25f4a3c788262074587f685a19478ef759a911b4b12c25"}, + {file = "onnxruntime-1.21.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a402f9bda0b1cc791d9cf31d23c471e8189a55369b49ef2b9d0854eb11d22c4"}, + {file = "onnxruntime-1.21.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15656a2d0126f4f66295381e39c8812a6d845ccb1bb1f7bf6dd0a46d7d602e7f"}, + {file = "onnxruntime-1.21.1-cp310-cp310-win_amd64.whl", hash = "sha256:79bbedfd1263065532967a2132fb365a27ffe5f7ed962e16fec55cca741f72aa"}, + {file = "onnxruntime-1.21.1-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:8bee9b5ba7b88ae7bfccb4f97bbe1b4bae801b0fb05d686b28a722cb27c89931"}, + {file = "onnxruntime-1.21.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b6a29a1767b92d543091349f5397a1c7619eaca746cd1bc47f8b4ec5a9f1a6c"}, + {file = "onnxruntime-1.21.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:982dcc04a6688e1af9e3da1d4ef2bdeb11417cf3f8dde81f8f721043c1919a4f"}, + {file = "onnxruntime-1.21.1-cp311-cp311-win_amd64.whl", hash = "sha256:2b6052c04b9125319293abb9bdcce40e806db3e097f15b82242d4cd72d81fd0c"}, + {file = "onnxruntime-1.21.1-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:f615c05869a523a94d0a4de1f0936d0199a473cf104d630fc26174bebd5759bd"}, + {file = "onnxruntime-1.21.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79dfb1f47386c4edd115b21015354b2f05f5566c40c98606251f15a64add3cbe"}, + {file = "onnxruntime-1.21.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2742935d6610fe0f58e1995018d9db7e8239d0201d9ebbdb7964a61386b5390a"}, + {file = "onnxruntime-1.21.1-cp312-cp312-win_amd64.whl", hash = "sha256:a7afdb3fcb162f5536225e13c2b245018068964b1d0eee05303ea6823ca6785e"}, + {file = "onnxruntime-1.21.1-cp313-cp313-macosx_13_0_universal2.whl", hash = "sha256:ed4f9771233a92edcab9f11f537702371d450fe6cd79a727b672d37b9dab0cde"}, + {file = "onnxruntime-1.21.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bc100fd1f4f95258e7d0f7068ec69dec2a47cc693f745eec9cf4561ee8d952a"}, + {file = "onnxruntime-1.21.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0fea0d2b98eecf4bebe01f7ce9a265a5d72b3050e9098063bfe65fa2b0633a8e"}, + {file = "onnxruntime-1.21.1-cp313-cp313-win_amd64.whl", hash = "sha256:da606061b9ed1b05b63a37be38c2014679a3e725903f58036ffd626df45c0e47"}, + {file = "onnxruntime-1.21.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94674315d40d521952bfc28007ce9b6728e87753e1f18d243c8cd953f25903b8"}, + {file = "onnxruntime-1.21.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c9e4571ff5b2a5d377d414bc85cd9450ba233a9a92f766493874f1093976453"}, +] + +[package.dependencies] +coloredlogs = "*" +flatbuffers = "*" +numpy = ">=1.21.6" +packaging = "*" +protobuf = "*" +sympy = "*" + +[[package]] +name = "onnxruntime-directml" +version = "1.21.1" +description = "ONNX Runtime is a runtime accelerator for Machine Learning models" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"dml\"" +files = [ + {file = "onnxruntime_directml-1.21.1-cp310-cp310-win_amd64.whl", hash = "sha256:c18bc21d8c2d9f4e0780198fe5609948390a585d6fe920149b3f31d2243ee5fb"}, + {file = "onnxruntime_directml-1.21.1-cp311-cp311-win_amd64.whl", hash = "sha256:9479cc556dcd5f5c61e57ee9cbf9dbe33488af6bc7d13a3e6601ff0972fb56fd"}, + {file = "onnxruntime_directml-1.21.1-cp312-cp312-win_amd64.whl", hash = "sha256:ebef3f6ec3bf02bf7758401020f9a20b767acbb47fbb4c9fbf461fe94b13ab70"}, + {file = "onnxruntime_directml-1.21.1-cp313-cp313-win_amd64.whl", hash = "sha256:9e75454533fadf70930dfe07af2132653d9416bf3f3b10b4422fd80089669e69"}, +] + +[package.dependencies] +coloredlogs = "*" +flatbuffers = "*" +numpy = ">=1.21.6" +packaging = "*" +protobuf = "*" +sympy = "*" + +[[package]] +name = "onnxruntime-gpu" +version = "1.21.1" +description = "ONNX Runtime is a runtime accelerator for Machine Learning models" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"gpu\"" +files = [ + {file = "onnxruntime_gpu-1.21.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:838337c704a95250dba92c2d6062e976bb9546d79d7665322964ed8891726bc9"}, + {file = "onnxruntime_gpu-1.21.1-cp310-cp310-win_amd64.whl", hash = "sha256:d01bbadb943860d41cb49b3d85a5fc587a5f25e0aa07f421018927468015facf"}, + {file = "onnxruntime_gpu-1.21.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f210e613293bf939cf62b4ffa149cc4ccc5622430044e72201a058b261799eed"}, + {file = "onnxruntime_gpu-1.21.1-cp311-cp311-win_amd64.whl", hash = "sha256:ef940d9912d37962368406071eec38dc142dc350aacd70e7ddd27bf4629c40c5"}, + {file = "onnxruntime_gpu-1.21.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:968123d2668add079548980999edfd35fb6317cad9c35c0798fc0665591003f0"}, + {file = "onnxruntime_gpu-1.21.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c1885a46061c5f5e0ca26256d8e338db9ea0428867754bd93e517bcb0a3899c"}, + {file = "onnxruntime_gpu-1.21.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1405e953da84e5a9463c467d86c3fd46a50f4dc767c87c3682d9fabf0a0e2251"}, + {file = "onnxruntime_gpu-1.21.1-cp313-cp313-win_amd64.whl", hash = "sha256:69f407ec2e5f8b409d2729191708cbad5b95539b6d5f7a28dac1aa9f9f644bf9"}, + {file = "onnxruntime_gpu-1.21.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd2056e7cadcec184b1014dc4f8484e1458a633d6db8262f88c0148ef1e572a6"}, +] + +[package.dependencies] +coloredlogs = "*" +flatbuffers = "*" +numpy = ">=1.21.6" +packaging = "*" +protobuf = "*" +sympy = "*" + +[package.extras] +cuda = ["nvidia-cuda-nvrtc-cu12 (>=12.0,<13.0)", "nvidia-cuda-runtime-cu12 (>=12.0,<13.0)", "nvidia-cufft-cu12 (>=11.0,<12.0)", "nvidia-curand-cu12 (>=10.0,<11.0)"] +cudnn = ["nvidia-cudnn-cu12 (>=9.0,<10.0)"] + +[[package]] +name = "packaging" +version = "25.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pillow" +version = "11.2.1" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "pillow-11.2.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:d57a75d53922fc20c165016a20d9c44f73305e67c351bbc60d1adaf662e74047"}, + {file = "pillow-11.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:127bf6ac4a5b58b3d32fc8289656f77f80567d65660bc46f72c0d77e6600cc95"}, + {file = "pillow-11.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ba4be812c7a40280629e55ae0b14a0aafa150dd6451297562e1764808bbe61"}, + {file = "pillow-11.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8bd62331e5032bc396a93609982a9ab6b411c05078a52f5fe3cc59234a3abd1"}, + {file = "pillow-11.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:562d11134c97a62fe3af29581f083033179f7ff435f78392565a1ad2d1c2c45c"}, + {file = "pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c97209e85b5be259994eb5b69ff50c5d20cca0f458ef9abd835e262d9d88b39d"}, + {file = "pillow-11.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0c3e6d0f59171dfa2e25d7116217543310908dfa2770aa64b8f87605f8cacc97"}, + {file = "pillow-11.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc1c3bc53befb6096b84165956e886b1729634a799e9d6329a0c512ab651e579"}, + {file = "pillow-11.2.1-cp310-cp310-win32.whl", hash = "sha256:312c77b7f07ab2139924d2639860e084ec2a13e72af54d4f08ac843a5fc9c79d"}, + {file = "pillow-11.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9bc7ae48b8057a611e5fe9f853baa88093b9a76303937449397899385da06fad"}, + {file = "pillow-11.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:2728567e249cdd939f6cc3d1f049595c66e4187f3c34078cbc0a7d21c47482d2"}, + {file = "pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70"}, + {file = "pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf"}, + {file = "pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7"}, + {file = "pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8"}, + {file = "pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600"}, + {file = "pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788"}, + {file = "pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e"}, + {file = "pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e"}, + {file = "pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6"}, + {file = "pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193"}, + {file = "pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7"}, + {file = "pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f"}, + {file = "pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b"}, + {file = "pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d"}, + {file = "pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4"}, + {file = "pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d"}, + {file = "pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4"}, + {file = "pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443"}, + {file = "pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c"}, + {file = "pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3"}, + {file = "pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941"}, + {file = "pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb"}, + {file = "pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28"}, + {file = "pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830"}, + {file = "pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0"}, + {file = "pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1"}, + {file = "pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f"}, + {file = "pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155"}, + {file = "pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14"}, + {file = "pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b"}, + {file = "pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2"}, + {file = "pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691"}, + {file = "pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c"}, + {file = "pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22"}, + {file = "pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7"}, + {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16"}, + {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b"}, + {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406"}, + {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91"}, + {file = "pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751"}, + {file = "pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9"}, + {file = "pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd"}, + {file = "pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e"}, + {file = "pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681"}, + {file = "pillow-11.2.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:7491cf8a79b8eb867d419648fff2f83cb0b3891c8b36da92cc7f1931d46108c8"}, + {file = "pillow-11.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b02d8f9cb83c52578a0b4beadba92e37d83a4ef11570a8688bbf43f4ca50909"}, + {file = "pillow-11.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:014ca0050c85003620526b0ac1ac53f56fc93af128f7546623cc8e31875ab928"}, + {file = "pillow-11.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3692b68c87096ac6308296d96354eddd25f98740c9d2ab54e1549d6c8aea9d79"}, + {file = "pillow-11.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:f781dcb0bc9929adc77bad571b8621ecb1e4cdef86e940fe2e5b5ee24fd33b35"}, + {file = "pillow-11.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:2b490402c96f907a166615e9a5afacf2519e28295f157ec3a2bb9bd57de638cb"}, + {file = "pillow-11.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dd6b20b93b3ccc9c1b597999209e4bc5cf2853f9ee66e3fc9a400a78733ffc9a"}, + {file = "pillow-11.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4b835d89c08a6c2ee7781b8dd0a30209a8012b5f09c0a665b65b0eb3560b6f36"}, + {file = "pillow-11.2.1-cp39-cp39-win32.whl", hash = "sha256:b10428b3416d4f9c61f94b494681280be7686bda15898a3a9e08eb66a6d92d67"}, + {file = "pillow-11.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:6ebce70c3f486acf7591a3d73431fa504a4e18a9b97ff27f5f47b7368e4b9dd1"}, + {file = "pillow-11.2.1-cp39-cp39-win_arm64.whl", hash = "sha256:c27476257b2fdcd7872d54cfd119b3a9ce4610fb85c8e32b70b42e3680a29a1e"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b7b0d4fd2635f54ad82785d56bc0d94f147096493a79985d0ab57aedd563156"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:aa442755e31c64037aa7c1cb186e0b369f8416c567381852c63444dd666fb772"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d3348c95b766f54b76116d53d4cb171b52992a1027e7ca50c81b43b9d9e363"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85d27ea4c889342f7e35f6d56e7e1cb345632ad592e8c51b693d7b7556043ce0"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bf2c33d6791c598142f00c9c4c7d47f6476731c31081331664eb26d6ab583e01"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e616e7154c37669fc1dfc14584f11e284e05d1c650e1c0f972f281c4ccc53193"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39ad2e0f424394e3aebc40168845fee52df1394a4673a6ee512d840d14ab3013"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044"}, + {file = "pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +test-arrow = ["pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] +typing = ["typing-extensions ; python_version < \"3.10\""] +xmp = ["defusedxml"] + +[[package]] +name = "platformdirs" +version = "4.3.7" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94"}, + {file = "platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.14.1)"] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pooch" +version = "1.8.2" +description = "A friend to fetch your data files" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "pooch-1.8.2-py3-none-any.whl", hash = "sha256:3529a57096f7198778a5ceefd5ac3ef0e4d06a6ddaf9fc2d609b806f25302c47"}, + {file = "pooch-1.8.2.tar.gz", hash = "sha256:76561f0de68a01da4df6af38e9955c4c9d1a5c90da73f7e40276a5728ec83d10"}, +] + +[package.dependencies] +packaging = ">=20.0" +platformdirs = ">=2.5.0" +requests = ">=2.19.0" + +[package.extras] +progress = ["tqdm (>=4.41.0,<5.0.0)"] +sftp = ["paramiko (>=2.7.0)"] +xxhash = ["xxhash (>=1.4.3)"] + +[[package]] +name = "protobuf" +version = "6.30.2" +description = "" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "protobuf-6.30.2-cp310-abi3-win32.whl", hash = "sha256:b12ef7df7b9329886e66404bef5e9ce6a26b54069d7f7436a0853ccdeb91c103"}, + {file = "protobuf-6.30.2-cp310-abi3-win_amd64.whl", hash = "sha256:7653c99774f73fe6b9301b87da52af0e69783a2e371e8b599b3e9cb4da4b12b9"}, + {file = "protobuf-6.30.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:0eb523c550a66a09a0c20f86dd554afbf4d32b02af34ae53d93268c1f73bc65b"}, + {file = "protobuf-6.30.2-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:50f32cc9fd9cb09c783ebc275611b4f19dfdfb68d1ee55d2f0c7fa040df96815"}, + {file = "protobuf-6.30.2-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:4f6c687ae8efae6cf6093389a596548214467778146b7245e886f35e1485315d"}, + {file = "protobuf-6.30.2-cp39-cp39-win32.whl", hash = "sha256:524afedc03b31b15586ca7f64d877a98b184f007180ce25183d1a5cb230ee72b"}, + {file = "protobuf-6.30.2-cp39-cp39-win_amd64.whl", hash = "sha256:acec579c39c88bd8fbbacab1b8052c793efe83a0a5bd99db4a31423a25c0a0e2"}, + {file = "protobuf-6.30.2-py3-none-any.whl", hash = "sha256:ae86b030e69a98e08c77beab574cbcb9fff6d031d57209f574a5aea1445f4b51"}, + {file = "protobuf-6.30.2.tar.gz", hash = "sha256:35c859ae076d8c56054c25b59e5e59638d86545ed6e2b6efac6be0b6ea3ba048"}, +] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pydub" +version = "0.25.1" +description = "Manipulate audio with an simple and easy high level interface" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"}, + {file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"}, +] + +[[package]] +name = "pyparsing" +version = "3.2.3" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"}, + {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyreadline3" +version = "3.5.4" +description = "A python implementation of GNU readline." +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"win32\" and (extra == \"cpu\" or extra == \"gpu\" or extra == \"dml\")" +files = [ + {file = "pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6"}, + {file = "pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7"}, +] + +[package.extras] +dev = ["build", "flake8", "mypy", "pytest", "twine"] + +[[package]] +name = "pytest" +version = "8.3.5" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820"}, + {file = "pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "6.1.1" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pytest_cov-6.1.1-py3-none-any.whl", hash = "sha256:bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde"}, + {file = "pytest_cov-6.1.1.tar.gz", hash = "sha256:46935f7aaefba760e716c2ebfbe1c216240b9592966e7da99ea8292d4d3e2a0a"}, +] + +[package.dependencies] +coverage = {version = ">=7.5", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["dev"] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "resampy" +version = "0.4.3" +description = "Efficient signal resampling" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "resampy-0.4.3-py3-none-any.whl", hash = "sha256:ad2ed64516b140a122d96704e32bc0f92b23f45419e8b8f478e5a05f83edcebd"}, + {file = "resampy-0.4.3.tar.gz", hash = "sha256:a0d1c28398f0e55994b739650afef4e3974115edbe96cd4bb81968425e916e47"}, +] + +[package.dependencies] +numba = ">=0.53" +numpy = ">=1.17" + +[package.extras] +design = ["optuna (>=2.10.0)"] +docs = ["numpydoc", "sphinx (!=1.3.1)"] +tests = ["pytest (<8)", "pytest-cov", "scipy (>=1.1)"] + +[[package]] +name = "rotary-embedding-torch" +version = "0.6.5" +description = "Rotary Embedding - Pytorch" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "rotary_embedding_torch-0.6.5-py3-none-any.whl", hash = "sha256:96c0b27b688820cbde652dd7869cf035b4f653eee53ddaf78133cf7cdd4aab19"}, + {file = "rotary_embedding_torch-0.6.5.tar.gz", hash = "sha256:a3623274c559e0215922edc7cd14068d5a64dea1ca469e1ecd642b293ee8af78"}, +] + +[package.dependencies] +einops = ">=0.7" +torch = ">=2.0" + +[[package]] +name = "samplerate" +version = "0.1.0" +description = "Python bindings for libsamplerate based on CFFI and NumPy" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "samplerate-0.1.0-py2.py3-none-any.whl", hash = "sha256:f55e5c9d0a8ba3c82a53b7d9c34a2d145439c61166a7f310efaec88f2781b8f8"}, + {file = "samplerate-0.1.0.tar.gz", hash = "sha256:75ef725e6cd9c4545569caf4c47147beab7b53b2c36e5122e8c285d348f88847"}, +] + +[package.dependencies] +cffi = ">=1.0.0" +numpy = "*" + +[[package]] +name = "scikit-image" +version = "0.25.2" +description = "Image processing in Python" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "scikit_image-0.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d3278f586793176599df6a4cf48cb6beadae35c31e58dc01a98023af3dc31c78"}, + {file = "scikit_image-0.25.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5c311069899ce757d7dbf1d03e32acb38bb06153236ae77fcd820fd62044c063"}, + {file = "scikit_image-0.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be455aa7039a6afa54e84f9e38293733a2622b8c2fb3362b822d459cc5605e99"}, + {file = "scikit_image-0.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4c464b90e978d137330be433df4e76d92ad3c5f46a22f159520ce0fdbea8a09"}, + {file = "scikit_image-0.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:60516257c5a2d2f74387c502aa2f15a0ef3498fbeaa749f730ab18f0a40fd054"}, + {file = "scikit_image-0.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f4bac9196fb80d37567316581c6060763b0f4893d3aca34a9ede3825bc035b17"}, + {file = "scikit_image-0.25.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d989d64ff92e0c6c0f2018c7495a5b20e2451839299a018e0e5108b2680f71e0"}, + {file = "scikit_image-0.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2cfc96b27afe9a05bc92f8c6235321d3a66499995675b27415e0d0c76625173"}, + {file = "scikit_image-0.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24cc986e1f4187a12aa319f777b36008764e856e5013666a4a83f8df083c2641"}, + {file = "scikit_image-0.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:b4f6b61fc2db6340696afe3db6b26e0356911529f5f6aee8c322aa5157490c9b"}, + {file = "scikit_image-0.25.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8db8dd03663112783221bf01ccfc9512d1cc50ac9b5b0fe8f4023967564719fb"}, + {file = "scikit_image-0.25.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:483bd8cc10c3d8a7a37fae36dfa5b21e239bd4ee121d91cad1f81bba10cfb0ed"}, + {file = "scikit_image-0.25.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d1e80107bcf2bf1291acfc0bf0425dceb8890abe9f38d8e94e23497cbf7ee0d"}, + {file = "scikit_image-0.25.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a17e17eb8562660cc0d31bb55643a4da996a81944b82c54805c91b3fe66f4824"}, + {file = "scikit_image-0.25.2-cp312-cp312-win_amd64.whl", hash = "sha256:bdd2b8c1de0849964dbc54037f36b4e9420157e67e45a8709a80d727f52c7da2"}, + {file = "scikit_image-0.25.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7efa888130f6c548ec0439b1a7ed7295bc10105458a421e9bf739b457730b6da"}, + {file = "scikit_image-0.25.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:dd8011efe69c3641920614d550f5505f83658fe33581e49bed86feab43a180fc"}, + {file = "scikit_image-0.25.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28182a9d3e2ce3c2e251383bdda68f8d88d9fff1a3ebe1eb61206595c9773341"}, + {file = "scikit_image-0.25.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8abd3c805ce6944b941cfed0406d88faeb19bab3ed3d4b50187af55cf24d147"}, + {file = "scikit_image-0.25.2-cp313-cp313-win_amd64.whl", hash = "sha256:64785a8acefee460ec49a354706db0b09d1f325674107d7fa3eadb663fb56d6f"}, + {file = "scikit_image-0.25.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:330d061bd107d12f8d68f1d611ae27b3b813b8cdb0300a71d07b1379178dd4cd"}, + {file = "scikit_image-0.25.2.tar.gz", hash = "sha256:e5a37e6cd4d0c018a7a55b9d601357e3382826d3888c10d0213fc63bff977dde"}, +] + +[package.dependencies] +imageio = ">=2.33,<2.35.0 || >2.35.0" +lazy-loader = ">=0.4" +networkx = ">=3.0" +numpy = ">=1.24" +packaging = ">=21" +pillow = ">=10.1" +scipy = ">=1.11.4" +tifffile = ">=2022.8.12" + +[package.extras] +build = ["Cython (>=3.0.8)", "build (>=1.2.1)", "meson-python (>=0.16)", "ninja (>=1.11.1.1)", "numpy (>=2.0)", "pythran (>=0.16)", "spin (==0.13)"] +data = ["pooch (>=1.6.0)"] +developer = ["ipython", "pre-commit", "tomli ; python_version < \"3.11\""] +docs = ["PyWavelets (>=1.6)", "dask[array] (>=2023.2.0)", "intersphinx-registry (>=0.2411.14)", "ipykernel", "ipywidgets", "kaleido (==0.2.1)", "matplotlib (>=3.7)", "myst-parser", "numpydoc (>=1.7)", "pandas (>=2.0)", "plotly (>=5.20)", "pooch (>=1.6)", "pydata-sphinx-theme (>=0.16)", "pytest-doctestplus", "scikit-learn (>=1.2)", "seaborn (>=0.11)", "sphinx (>=8.0)", "sphinx-copybutton", "sphinx-gallery[parallel] (>=0.18)", "sphinx_design (>=0.5)", "tifffile (>=2022.8.12)"] +optional = ["PyWavelets (>=1.6)", "SimpleITK", "astropy (>=5.0)", "cloudpickle (>=1.1.1)", "dask[array] (>=2023.2.0)", "matplotlib (>=3.7)", "pooch (>=1.6.0)", "pyamg (>=5.2)", "scikit-learn (>=1.2)"] +test = ["asv", "numpydoc (>=1.7)", "pooch (>=1.6.0)", "pytest (>=8)", "pytest-cov (>=2.11.0)", "pytest-doctestplus", "pytest-faulthandler", "pytest-localserver"] + +[[package]] +name = "scikit-learn" +version = "1.6.1" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "scikit_learn-1.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d056391530ccd1e501056160e3c9673b4da4805eb67eb2bdf4e983e1f9c9204e"}, + {file = "scikit_learn-1.6.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0c8d036eb937dbb568c6242fa598d551d88fb4399c0344d95c001980ec1c7d36"}, + {file = "scikit_learn-1.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8634c4bd21a2a813e0a7e3900464e6d593162a29dd35d25bdf0103b3fce60ed5"}, + {file = "scikit_learn-1.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:775da975a471c4f6f467725dff0ced5c7ac7bda5e9316b260225b48475279a1b"}, + {file = "scikit_learn-1.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:8a600c31592bd7dab31e1c61b9bbd6dea1b3433e67d264d17ce1017dbdce8002"}, + {file = "scikit_learn-1.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:72abc587c75234935e97d09aa4913a82f7b03ee0b74111dcc2881cba3c5a7b33"}, + {file = "scikit_learn-1.6.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b3b00cdc8f1317b5f33191df1386c0befd16625f49d979fe77a8d44cae82410d"}, + {file = "scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc4765af3386811c3ca21638f63b9cf5ecf66261cc4815c1db3f1e7dc7b79db2"}, + {file = "scikit_learn-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25fc636bdaf1cc2f4a124a116312d837148b5e10872147bdaf4887926b8c03d8"}, + {file = "scikit_learn-1.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:fa909b1a36e000a03c382aade0bd2063fd5680ff8b8e501660c0f59f021a6415"}, + {file = "scikit_learn-1.6.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:926f207c804104677af4857b2c609940b743d04c4c35ce0ddc8ff4f053cddc1b"}, + {file = "scikit_learn-1.6.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c2cae262064e6a9b77eee1c8e768fc46aa0b8338c6a8297b9b6759720ec0ff2"}, + {file = "scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1061b7c028a8663fb9a1a1baf9317b64a257fcb036dae5c8752b2abef31d136f"}, + {file = "scikit_learn-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e69fab4ebfc9c9b580a7a80111b43d214ab06250f8a7ef590a4edf72464dd86"}, + {file = "scikit_learn-1.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52"}, + {file = "scikit_learn-1.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ffa1e9e25b3d93990e74a4be2c2fc61ee5af85811562f1288d5d055880c4322"}, + {file = "scikit_learn-1.6.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:dc5cf3d68c5a20ad6d571584c0750ec641cc46aeef1c1507be51300e6003a7e1"}, + {file = "scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c06beb2e839ecc641366000ca84f3cf6fa9faa1777e29cf0c04be6e4d096a348"}, + {file = "scikit_learn-1.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8ca8cb270fee8f1f76fa9bfd5c3507d60c6438bbee5687f81042e2bb98e5a97"}, + {file = "scikit_learn-1.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb"}, + {file = "scikit_learn-1.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a17c1dea1d56dcda2fac315712f3651a1fea86565b64b48fa1bc090249cbf236"}, + {file = "scikit_learn-1.6.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6a7aa5f9908f0f28f4edaa6963c0a6183f1911e63a69aa03782f0d924c830a35"}, + {file = "scikit_learn-1.6.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0650e730afb87402baa88afbf31c07b84c98272622aaba002559b614600ca691"}, + {file = "scikit_learn-1.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:3f59fe08dc03ea158605170eb52b22a105f238a5d512c4470ddeca71feae8e5f"}, + {file = "scikit_learn-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6849dd3234e87f55dce1db34c89a810b489ead832aaf4d4550b7ea85628be6c1"}, + {file = "scikit_learn-1.6.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:e7be3fa5d2eb9be7d77c3734ff1d599151bb523674be9b834e8da6abe132f44e"}, + {file = "scikit_learn-1.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44a17798172df1d3c1065e8fcf9019183f06c87609b49a124ebdf57ae6cb0107"}, + {file = "scikit_learn-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b7a3b86e411e4bce21186e1c180d792f3d99223dcfa3b4f597ecc92fa1a422"}, + {file = "scikit_learn-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7a73d457070e3318e32bdb3aa79a8d990474f19035464dfd8bede2883ab5dc3b"}, + {file = "scikit_learn-1.6.1.tar.gz", hash = "sha256:b4fc2525eca2c69a59260f583c56a7557c6ccdf8deafdba6e060f94c1c59738e"}, +] + +[package.dependencies] +joblib = ">=1.2.0" +numpy = ">=1.19.5" +scipy = ">=1.6.0" +threadpoolctl = ">=3.1.0" + +[package.extras] +benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] +build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.17.1)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)", "towncrier (>=24.8.0)"] +examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] +install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] +maintenance = ["conda-lock (==2.5.6)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.5.1)", "scikit-image (>=0.17.2)"] + +[[package]] +name = "scipy" +version = "1.15.2" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.10" +groups = ["main", "dev"] +files = [ + {file = "scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9"}, + {file = "scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5"}, + {file = "scipy-1.15.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:ecf797d2d798cf7c838c6d98321061eb3e72a74710e6c40540f0e8087e3b499e"}, + {file = "scipy-1.15.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:9b18aa747da280664642997e65aab1dd19d0c3d17068a04b3fe34e2559196cb9"}, + {file = "scipy-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87994da02e73549dfecaed9e09a4f9d58a045a053865679aeb8d6d43747d4df3"}, + {file = "scipy-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69ea6e56d00977f355c0f84eba69877b6df084516c602d93a33812aa04d90a3d"}, + {file = "scipy-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:888307125ea0c4466287191e5606a2c910963405ce9671448ff9c81c53f85f58"}, + {file = "scipy-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9412f5e408b397ff5641080ed1e798623dbe1ec0d78e72c9eca8992976fa65aa"}, + {file = "scipy-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:b5e025e903b4f166ea03b109bb241355b9c42c279ea694d8864d033727205e65"}, + {file = "scipy-1.15.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:92233b2df6938147be6fa8824b8136f29a18f016ecde986666be5f4d686a91a4"}, + {file = "scipy-1.15.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:62ca1ff3eb513e09ed17a5736929429189adf16d2d740f44e53270cc800ecff1"}, + {file = "scipy-1.15.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4c6676490ad76d1c2894d77f976144b41bd1a4052107902238047fb6a473e971"}, + {file = "scipy-1.15.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8bf5cb4a25046ac61d38f8d3c3426ec11ebc350246a4642f2f315fe95bda655"}, + {file = "scipy-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a8e34cf4c188b6dd004654f88586d78f95639e48a25dfae9c5e34a6dc34547e"}, + {file = "scipy-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28a0d2c2075946346e4408b211240764759e0fabaeb08d871639b5f3b1aca8a0"}, + {file = "scipy-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:42dabaaa798e987c425ed76062794e93a243be8f0f20fff6e7a89f4d61cb3d40"}, + {file = "scipy-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f5e296ec63c5da6ba6fa0343ea73fd51b8b3e1a300b0a8cae3ed4b1122c7462"}, + {file = "scipy-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:597a0c7008b21c035831c39927406c6181bcf8f60a73f36219b69d010aa04737"}, + {file = "scipy-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd"}, + {file = "scipy-1.15.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301"}, + {file = "scipy-1.15.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93"}, + {file = "scipy-1.15.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20"}, + {file = "scipy-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e"}, + {file = "scipy-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8"}, + {file = "scipy-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11"}, + {file = "scipy-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53"}, + {file = "scipy-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded"}, + {file = "scipy-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf"}, + {file = "scipy-1.15.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37"}, + {file = "scipy-1.15.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d"}, + {file = "scipy-1.15.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb"}, + {file = "scipy-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27"}, + {file = "scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0"}, + {file = "scipy-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32"}, + {file = "scipy-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d"}, + {file = "scipy-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f"}, + {file = "scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9"}, + {file = "scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f"}, + {file = "scipy-1.15.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6"}, + {file = "scipy-1.15.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af"}, + {file = "scipy-1.15.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274"}, + {file = "scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776"}, + {file = "scipy-1.15.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828"}, + {file = "scipy-1.15.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28"}, + {file = "scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db"}, + {file = "scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec"}, +] + +[package.dependencies] +numpy = ">=1.23.5,<2.5" + +[package.extras] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "setuptools" +version = "80.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" or python_version >= \"3.12\"" +files = [ + {file = "setuptools-80.0.0-py3-none-any.whl", hash = "sha256:a38f898dcd6e5380f4da4381a87ec90bd0a7eec23d204a5552e80ee3cab6bd27"}, + {file = "setuptools-80.0.0.tar.gz", hash = "sha256:c40a5b3729d58dd749c0f08f1a07d134fb8a0a3d7f87dc33e7c5e1f762138650"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "soundfile" +version = "0.13.1" +description = "An audio library based on libsndfile, CFFI and NumPy" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "soundfile-0.13.1-py2.py3-none-any.whl", hash = "sha256:a23c717560da2cf4c7b5ae1142514e0fd82d6bbd9dfc93a50423447142f2c445"}, + {file = "soundfile-0.13.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:82dc664d19831933fe59adad199bf3945ad06d84bc111a5b4c0d3089a5b9ec33"}, + {file = "soundfile-0.13.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:743f12c12c4054921e15736c6be09ac26b3b3d603aef6fd69f9dde68748f2593"}, + {file = "soundfile-0.13.1-py2.py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:9c9e855f5a4d06ce4213f31918653ab7de0c5a8d8107cd2427e44b42df547deb"}, + {file = "soundfile-0.13.1-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:03267c4e493315294834a0870f31dbb3b28a95561b80b134f0bd3cf2d5f0e618"}, + {file = "soundfile-0.13.1-py2.py3-none-win32.whl", hash = "sha256:c734564fab7c5ddf8e9be5bf70bab68042cd17e9c214c06e365e20d64f9a69d5"}, + {file = "soundfile-0.13.1-py2.py3-none-win_amd64.whl", hash = "sha256:1e70a05a0626524a69e9f0f4dd2ec174b4e9567f4d8b6c11d38b5c289be36ee9"}, + {file = "soundfile-0.13.1.tar.gz", hash = "sha256:b2c68dab1e30297317080a5b43df57e302584c49e2942defdde0acccc53f0e5b"}, +] + +[package.dependencies] +cffi = ">=1.0" +numpy = "*" + +[[package]] +name = "soxr" +version = "0.5.0.post1" +description = "High quality, one-dimensional sample-rate conversion library" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "soxr-0.5.0.post1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:7406d782d85f8cf64e66b65e6b7721973de8a1dc50b9e88bc2288c343a987484"}, + {file = "soxr-0.5.0.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fa0a382fb8d8e2afed2c1642723b2d2d1b9a6728ff89f77f3524034c8885b8c9"}, + {file = "soxr-0.5.0.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b01d3efb95a2851f78414bcd00738b0253eec3f5a1e5482838e965ffef84969"}, + {file = "soxr-0.5.0.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcc049b0a151a65aa75b92f0ac64bb2dba785d16b78c31c2b94e68c141751d6d"}, + {file = "soxr-0.5.0.post1-cp310-cp310-win_amd64.whl", hash = "sha256:97f269bc26937c267a2ace43a77167d0c5c8bba5a2b45863bb6042b5b50c474e"}, + {file = "soxr-0.5.0.post1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:6fb77b626773a966e3d8f6cb24f6f74b5327fa5dc90f1ff492450e9cdc03a378"}, + {file = "soxr-0.5.0.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:39e0f791ba178d69cd676485dbee37e75a34f20daa478d90341ecb7f6d9d690f"}, + {file = "soxr-0.5.0.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f0b558f445ba4b64dbcb37b5f803052eee7d93b1dbbbb97b3ec1787cb5a28eb"}, + {file = "soxr-0.5.0.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca6903671808e0a6078b0d146bb7a2952b118dfba44008b2aa60f221938ba829"}, + {file = "soxr-0.5.0.post1-cp311-cp311-win_amd64.whl", hash = "sha256:c4d8d5283ed6f5efead0df2c05ae82c169cfdfcf5a82999c2d629c78b33775e8"}, + {file = "soxr-0.5.0.post1-cp312-abi3-macosx_10_14_x86_64.whl", hash = "sha256:fef509466c9c25f65eae0ce1e4b9ac9705d22c6038c914160ddaf459589c6e31"}, + {file = "soxr-0.5.0.post1-cp312-abi3-macosx_11_0_arm64.whl", hash = "sha256:4704ba6b13a3f1e41d12acf192878384c1c31f71ce606829c64abdf64a8d7d32"}, + {file = "soxr-0.5.0.post1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd052a66471a7335b22a6208601a9d0df7b46b8d087dce4ff6e13eed6a33a2a1"}, + {file = "soxr-0.5.0.post1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3f16810dd649ab1f433991d2a9661e9e6a116c2b4101039b53b3c3e90a094fc"}, + {file = "soxr-0.5.0.post1-cp312-abi3-win_amd64.whl", hash = "sha256:b1be9fee90afb38546bdbd7bde714d1d9a8c5a45137f97478a83b65e7f3146f6"}, + {file = "soxr-0.5.0.post1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:c5af7b355959061beb90a1d73c4834ece4549f07b708f8c73c088153cec29935"}, + {file = "soxr-0.5.0.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e1dda616fc797b1507b65486f3116ed2c929f13c722922963dd419d64ada6c07"}, + {file = "soxr-0.5.0.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94de2812368e98cb42b4eaeddf8ee1657ecc19bd053f8e67b9b5aa12a3592012"}, + {file = "soxr-0.5.0.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8e9c980637e03d3f345a4fd81d56477a58c294fb26205fa121bc4eb23d9d01"}, + {file = "soxr-0.5.0.post1-cp39-cp39-win_amd64.whl", hash = "sha256:7e71b0b0db450f36de70f1047505231db77a713f8c47df9342582ae8a4b828f2"}, + {file = "soxr-0.5.0.post1.tar.gz", hash = "sha256:7092b9f3e8a416044e1fa138c8172520757179763b85dc53aa9504f4813cff73"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +docs = ["linkify-it-py", "myst-parser", "sphinx", "sphinx-book-theme"] +test = ["pytest"] + +[[package]] +name = "standard-aifc" +version = "3.13.0" +description = "Standard library aifc redistribution. \"dead battery\"." +optional = false +python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.13\"" +files = [ + {file = "standard_aifc-3.13.0-py3-none-any.whl", hash = "sha256:f7ae09cc57de1224a0dd8e3eb8f73830be7c3d0bc485de4c1f82b4a7f645ac66"}, + {file = "standard_aifc-3.13.0.tar.gz", hash = "sha256:64e249c7cb4b3daf2fdba4e95721f811bde8bdfc43ad9f936589b7bb2fae2e43"}, +] + +[package.dependencies] +audioop-lts = {version = "*", markers = "python_version >= \"3.13\""} +standard-chunk = {version = "*", markers = "python_version >= \"3.13\""} + +[[package]] +name = "standard-chunk" +version = "3.13.0" +description = "Standard library chunk redistribution. \"dead battery\"." +optional = false +python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.13\"" +files = [ + {file = "standard_chunk-3.13.0-py3-none-any.whl", hash = "sha256:17880a26c285189c644bd5bd8f8ed2bdb795d216e3293e6dbe55bbd848e2982c"}, + {file = "standard_chunk-3.13.0.tar.gz", hash = "sha256:4ac345d37d7e686d2755e01836b8d98eda0d1a3ee90375e597ae43aaf064d654"}, +] + +[[package]] +name = "standard-sunau" +version = "3.13.0" +description = "Standard library sunau redistribution. \"dead battery\"." +optional = false +python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.13\"" +files = [ + {file = "standard_sunau-3.13.0-py3-none-any.whl", hash = "sha256:53af624a9529c41062f4c2fd33837f297f3baa196b0cfceffea6555654602622"}, + {file = "standard_sunau-3.13.0.tar.gz", hash = "sha256:b319a1ac95a09a2378a8442f403c66f4fd4b36616d6df6ae82b8e536ee790908"}, +] + +[package.dependencies] +audioop-lts = {version = "*", markers = "python_version >= \"3.13\""} + +[[package]] +name = "sympy" +version = "1.14.0" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5"}, + {file = "sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517"}, +] + +[package.dependencies] +mpmath = ">=1.1.0,<1.4" + +[package.extras] +dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +description = "threadpoolctl" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb"}, + {file = "threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e"}, +] + +[[package]] +name = "tifffile" +version = "2025.3.30" +description = "Read and write TIFF files" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "tifffile-2025.3.30-py3-none-any.whl", hash = "sha256:0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c"}, + {file = "tifffile-2025.3.30.tar.gz", hash = "sha256:3cdee47fe06cd75367c16bc3ff34523713156dae6cd498e3a392e5b39a51b789"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +all = ["defusedxml", "fsspec", "imagecodecs (>=2024.12.30)", "lxml", "matplotlib", "zarr (<3)"] +codecs = ["imagecodecs (>=2024.12.30)"] +plot = ["matplotlib"] +test = ["cmapfile", "czifile", "dask", "defusedxml", "fsspec", "imagecodecs", "lfdfiles", "lxml", "ndtiff", "oiffile", "psdtags", "pytest", "roifile", "xarray", "zarr (<3)"] +xml = ["defusedxml", "lxml"] +zarr = ["fsspec", "zarr (<3)"] + +[[package]] +name = "tomli" +version = "2.2.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +markers = "python_full_version <= \"3.11.0a6\"" +files = [ + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, +] + +[[package]] +name = "torch" +version = "2.7.0" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.9.0" +groups = ["main"] +files = [ + {file = "torch-2.7.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c9afea41b11e1a1ab1b258a5c31afbd646d6319042bfe4f231b408034b51128b"}, + {file = "torch-2.7.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0b9960183b6e5b71239a3e6c883d8852c304e691c0b2955f7045e8a6d05b9183"}, + {file = "torch-2.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:2ad79d0d8c2a20a37c5df6052ec67c2078a2c4e9a96dd3a8b55daaff6d28ea29"}, + {file = "torch-2.7.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:34e0168ed6de99121612d72224e59b2a58a83dae64999990eada7260c5dd582d"}, + {file = "torch-2.7.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2b7813e904757b125faf1a9a3154e1d50381d539ced34da1992f52440567c156"}, + {file = "torch-2.7.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:fd5cfbb4c3bbadd57ad1b27d56a28008f8d8753733411a140fcfb84d7f933a25"}, + {file = "torch-2.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:58df8d5c2eeb81305760282b5069ea4442791a6bbf0c74d9069b7b3304ff8a37"}, + {file = "torch-2.7.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:0a8d43caa342b9986101ec5feb5bbf1d86570b5caa01e9cb426378311258fdde"}, + {file = "torch-2.7.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:36a6368c7ace41ad1c0f69f18056020b6a5ca47bedaca9a2f3b578f5a104c26c"}, + {file = "torch-2.7.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:15aab3e31c16feb12ae0a88dba3434a458874636f360c567caa6a91f6bfba481"}, + {file = "torch-2.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:f56d4b2510934e072bab3ab8987e00e60e1262fb238176168f5e0c43a1320c6d"}, + {file = "torch-2.7.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:30b7688a87239a7de83f269333651d8e582afffce6f591fff08c046f7787296e"}, + {file = "torch-2.7.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:868ccdc11798535b5727509480cd1d86d74220cfdc42842c4617338c1109a205"}, + {file = "torch-2.7.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:9b52347118116cf3dff2ab5a3c3dd97c719eb924ac658ca2a7335652076df708"}, + {file = "torch-2.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:434cf3b378340efc87c758f250e884f34460624c0523fe5c9b518d205c91dd1b"}, + {file = "torch-2.7.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:edad98dddd82220465b106506bb91ee5ce32bd075cddbcf2b443dfaa2cbd83bf"}, + {file = "torch-2.7.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:2a885fc25afefb6e6eb18a7d1e8bfa01cc153e92271d980a49243b250d5ab6d9"}, + {file = "torch-2.7.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:176300ff5bc11a5f5b0784e40bde9e10a35c4ae9609beed96b4aeb46a27f5fae"}, + {file = "torch-2.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d0ca446a93f474985d81dc866fcc8dccefb9460a29a456f79d99c29a78a66993"}, + {file = "torch-2.7.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:27f5007bdf45f7bb7af7f11d1828d5c2487e030690afb3d89a651fd7036a390e"}, + {file = "torch-2.7.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:e362efaa5b3078e5f75c33efc05005b9b46de0d2e899519d5b4cad0e050ed0f7"}, + {file = "torch-2.7.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:fc1ed9258cbfce69970ff508ea60881818d414d098a800b7695ba36f570d34b0"}, + {file = "torch-2.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:87b0802cab44659fcb6bcf5678d58fa4a8b48561cde8fb2d317edf0b6990e1bb"}, + {file = "torch-2.7.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:ccd7509141713997861b7a947ef0a717143cd7e9240addd168f38ba8fd23fd56"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +networkx = "*" +nvidia-cublas-cu12 = {version = "12.6.4.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.6.80", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.6.77", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.6.77", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "9.5.1.17", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.3.0.4", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufile-cu12 = {version = "1.11.1.6", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.7.77", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.7.1.2", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.5.4.2", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparselt-cu12 = {version = "0.6.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.26.2", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvjitlink-cu12 = {version = "12.6.85", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.6.77", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +setuptools = {version = "*", markers = "python_version >= \"3.12\""} +sympy = ">=1.13.3" +triton = {version = "3.3.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +typing-extensions = ">=4.10.0" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.13.0)"] + +[[package]] +name = "torch-directml" +version = "0.1.13.dev221216" +description = "A DirectML backend for hardware acceleration in PyTorch." +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"dml\"" +files = [ + {file = "torch_directml-0.1.13.dev221216-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:ba0d4c9ee66bc8aee4d7e0adc8908b273cfc0c28d2302be31f7178c7e29c50b1"}, + {file = "torch_directml-0.1.13.dev221216-cp310-cp310-win_amd64.whl", hash = "sha256:10068d661a0217abf358f7012eb4e7926fc5d858d0c40b42cc0ed91cda0bdd46"}, + {file = "torch_directml-0.1.13.dev221216-cp37-cp37m-win_amd64.whl", hash = "sha256:1bdb1015a1205e8f9e56889c5df7d5dcc7686346588f16b936b6a9418e05f67d"}, + {file = "torch_directml-0.1.13.dev221216-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:fc63b154e5199d13f34bc4e4de80ab5952794d464ae906ecee8f8445a794d006"}, + {file = "torch_directml-0.1.13.dev221216-cp38-cp38-win_amd64.whl", hash = "sha256:bbc21ddc43182ce7839dd77eb15303b69e597656fcd6a5456542ad5751bf08e0"}, + {file = "torch_directml-0.1.13.dev221216-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:ce6fa42ca1ee1e7124ca7d0bc08d3afbd20b91369734c7d38ba4fbe7a8edccf4"}, + {file = "torch_directml-0.1.13.dev221216-cp39-cp39-win_amd64.whl", hash = "sha256:c140f0170a864d53f6a7bbbc7ef6e831ba9c05bef42ec31e5f69f056e96ba0f1"}, +] + +[[package]] +name = "torchvision" +version = "0.22.0" +description = "image and video datasets and models for torch deep learning" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "torchvision-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:72256f1d7ff510b16c9fb4dd488584d0693f40c792f286a9620674438a81ccca"}, + {file = "torchvision-0.22.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:810ea4af3bc63cf39e834f91f4218ff5999271caaffe2456247df905002bd6c0"}, + {file = "torchvision-0.22.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:6fbca169c690fa2b9b8c39c0ad76d5b8992296d0d03df01e11df97ce12b4e0ac"}, + {file = "torchvision-0.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:8c869df2e8e00f7b1d80a34439e6d4609b50fe3141032f50b38341ec2b59404e"}, + {file = "torchvision-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:191ea28321fc262d8aa1a7fe79c41ff2848864bf382f9f6ea45c41dde8313792"}, + {file = "torchvision-0.22.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6c5620e10ffe388eb6f4744962106ed7cf1508d26e6fdfa0c10522d3249aea24"}, + {file = "torchvision-0.22.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ce292701c77c64dd3935e3e31c722c3b8b176a75f76dc09b804342efc1db5494"}, + {file = "torchvision-0.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:e4017b5685dbab4250df58084f07d95e677b2f3ed6c2e507a1afb8eb23b580ca"}, + {file = "torchvision-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:31c3165418fe21c3d81fe3459e51077c2f948801b8933ed18169f54652796a0f"}, + {file = "torchvision-0.22.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8f116bc82e0c076e70ba7776e611ed392b9666aa443662e687808b08993d26af"}, + {file = "torchvision-0.22.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ce4dc334ebd508de2c534817c9388e928bc2500cf981906ae8d6e2ca3bf4727a"}, + {file = "torchvision-0.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:24b8c9255c209ca419cc7174906da2791c8b557b75c23496663ec7d73b55bebf"}, + {file = "torchvision-0.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ece17995857dd328485c9c027c0b20ffc52db232e30c84ff6c95ab77201112c5"}, + {file = "torchvision-0.22.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:471c6dd75bb984c6ebe4f60322894a290bf3d4b195e769d80754f3689cd7f238"}, + {file = "torchvision-0.22.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:2b839ac0610a38f56bef115ee5b9eaca5f9c2da3c3569a68cc62dbcc179c157f"}, + {file = "torchvision-0.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:4ada1c08b2f761443cd65b7c7b4aec9e2fc28f75b0d4e1b1ebc9d3953ebccc4d"}, + {file = "torchvision-0.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cdc96daa4658b47ce9384154c86ed1e70cba9d972a19f5de6e33f8f94a626790"}, + {file = "torchvision-0.22.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:753d3c84eeadd5979a33b3b73a25ecd0aa4af44d6b45ed2c70d44f5e0ac68312"}, + {file = "torchvision-0.22.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:b30e3ed29e4a61f7499bca50f57d8ebd23dfc52b14608efa17a534a55ee59a03"}, + {file = "torchvision-0.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e5d680162694fac4c8a374954e261ddfb4eb0ce103287b0f693e4e9c579ef957"}, + {file = "torchvision-0.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2ef38a397f1b9cf62846fb20659cb99101f9d361de8c45d79284ee45c6f40d50"}, + {file = "torchvision-0.22.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:4095fac2b2e49a9c30f701e09ec1bdf3d11b1e48b006a76a9015a2ed8b39556e"}, + {file = "torchvision-0.22.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:0dc9b97fea14e7a8d047d0d21d8bfde6afd655c41a9a86207c9d3a7605319fcd"}, + {file = "torchvision-0.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:3548d594ed7d0b7bc59486d642e2dd437f37910e52ab67e5f01567f12ed767dc"}, +] + +[package.dependencies] +numpy = "*" +pillow = ">=5.3.0,<8.3.dev0 || >=8.4.dev0" +torch = "2.7.0" + +[package.extras] +gdown = ["gdown (>=4.7.3)"] +scipy = ["scipy"] + +[[package]] +name = "tqdm" +version = "4.67.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "triton" +version = "3.3.0" +description = "A language and compiler for custom Deep Learning operations" +optional = false +python-versions = "*" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "triton-3.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fad99beafc860501d7fcc1fb7045d9496cbe2c882b1674640304949165a916e7"}, + {file = "triton-3.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3161a2bf073d6b22c4e2f33f951f3e5e3001462b2570e6df9cd57565bdec2984"}, + {file = "triton-3.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b68c778f6c4218403a6bd01be7484f6dc9e20fe2083d22dd8aef33e3b87a10a3"}, + {file = "triton-3.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47bc87ad66fa4ef17968299acacecaab71ce40a238890acc6ad197c3abe2b8f1"}, + {file = "triton-3.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce4700fc14032af1e049005ae94ba908e71cd6c2df682239aed08e49bc71b742"}, + {file = "triton-3.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f41403bfa0cbb3e24fd958ca7fee04e9681e55e539296db9aca30c42acae693"}, +] + +[package.dependencies] +setuptools = ">=40.8.0" + +[package.extras] +build = ["cmake (>=3.20)", "lit"] +tests = ["autopep8", "isort", "llnl-hatchet", "numpy", "pytest", "pytest-forked", "pytest-xdist", "scipy (>=1.7.1)"] +tutorials = ["matplotlib", "pandas", "tabulate"] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"}, + {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"}, +] +markers = {dev = "python_version == \"3.10\""} + +[[package]] +name = "urllib3" +version = "2.4.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"}, + {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[extras] +cpu = ["onnxruntime"] +dml = ["onnxruntime-directml", "torch_directml"] +gpu = ["onnxruntime-gpu"] + +[metadata] +lock-version = "2.1" +python-versions = ">=3.10" +content-hash = "a413533db656a5d72053a436837c4f32d461b716b8dc82a29b277d4103e9d020" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..2c0aa995527cdeb3fc3b73afeed4b58af689865f --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,77 @@ +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry] +name = "audio-separator" +version = "0.33.0" +description = "Easy to use audio stem separation, using various models from UVR trained primarily by @Anjok07" +authors = ["Andrew Beveridge "] +license = "MIT" +readme = "README.md" +packages = [{include = "audio_separator"}] +include = ["audio_separator/separator/models.json"] +homepage = "https://github.com/karaokenerds/python-audio-separator" +repository = "https://github.com/karaokenerds/python-audio-separator" +documentation = "https://github.com/karaokenerds/python-audio-separator/blob/main/README.md" +keywords = ["audio", "sound", "karaoke"] +classifiers = [ + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "Topic :: Multimedia :: Sound/Audio", + "Topic :: Multimedia :: Sound/Audio :: Mixers", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] + +[tool.poetry.dependencies] +python = ">=3.10" +requests = ">=2" +numpy = ">=2" +librosa = ">=0.10" +samplerate = "0.1.0" +six = ">=1.16" +torch = ">=2.3" +torch_directml = {version = "*", optional = true} +tqdm = "*" +pydub = ">=0.25" +audioop-lts = { version = ">=0.2.1", python = "^3.13" } +onnx-weekly = { version = "*" } +onnx2torch-py313 = ">=1.6" +onnxruntime = { version = ">=1.17", optional = true } +onnxruntime-gpu = { version = ">=1.17", optional = true } +onnxruntime-directml = { version = ">=1.17", optional = true } # haven't tested different versions, but gonna assume 1.17, the same as others +julius = ">=0.2" +diffq-fixed = { version = ">=0.2", platform = "win32" } +diffq = { version = ">=0.2", platform = "!=win32" } +einops = ">=0.7" +pyyaml = "*" +ml_collections = "*" +resampy = ">=0.4" +beartype = "^0.18.5" +rotary-embedding-torch = "^0.6.1" +scipy = "^1.13.0" + +[tool.poetry.extras] +cpu = ["onnxruntime"] +gpu = ["onnxruntime-gpu"] +dml = ["onnxruntime-directml", "torch_directml"] + +[tool.poetry.scripts] +audio-separator = 'audio_separator.utils.cli:main' + +[tool.poetry.group.dev.dependencies] +black = ">=23" +pytest = "*" +pytest-cov = ">=4.1.0" +matplotlib = ">=3.8.0" +pillow = ">=10.1.0" +scikit-image = ">=0.22.0" + +[tool.black] +line-length = 140 diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000000000000000000000000000000000000..869cfcfbbbbc9d064aecf48bddceed9ee668f9ec --- /dev/null +++ b/pytest.ini @@ -0,0 +1,5 @@ +# Used by PyDub, which uses a pure-python fallback when needed already, not an issue +[pytest] +filterwarnings = + ignore:stft with return_complex=False is deprecated:UserWarning + ignore:'audioop' is deprecated:DeprecationWarning diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000000000000000000000000000000000000..bbb68d36ca9ad26335be82fdcac91d79c5fd6683 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,103 @@ +# Audio Separator Tests + +This directory contains tests for the audio-separator project. + +## Audio Validation + +The integration tests now include validation of output audio files by comparing waveform and spectrogram images with reference images. This helps ensure that the audio separation results remain consistent across different runs and code changes. + +### How It Works + +1. Reference waveform and spectrogram images are generated from expected output files +2. During test execution, the same images are generated for the actual output files +3. The images are compared using Structural Similarity Index (SSIM) to measure perceptual similarity +4. If the images differ significantly, the test fails, indicating a change in the audio output + +### Image Comparison with SSIM + +The tests use Structural Similarity Index Measure (SSIM) to compare images, which is more robust than pixel-by-pixel comparison: + +- SSIM considers structural information in the images +- It's more resilient to small spatial shifts or offsets +- It better matches human perception of image similarity +- It works well across different environments (local machines vs CI servers) + +The comparison uses a minimum similarity threshold (0.0-1.0): +- **Higher values** (closer to 1.0) require images to be **more similar** +- **Lower values** (closer to 0.0) are **more permissive** +- A value of 0.99 requires 99% similarity between images +- A value of 0.0 would consider any images to match + +The default threshold is set to 0.999, which is quite strict. However, model-specific thresholds can be set to accommodate different models' behavior. + +#### Model-Specific Thresholds + +Some models inherently produce slightly different outputs on different runs, even with the same input. To accommodate these models, you can set model-specific thresholds in the `MODEL_SIMILARITY_THRESHOLDS` dictionary: + +```python +MODEL_SIMILARITY_THRESHOLDS = { + "htdemucs_6s.yaml": 0.990, # Demucs models need a lower threshold + # Add other models that need custom thresholds here +} +``` + +This allows you to maintain a high threshold for most models while being more flexible with models that naturally exhibit more variation. + +### Generating Reference Images + +To generate or update the reference images, use the script provided: + +```bash +python tests/integration/generate_reference_images.py +``` + +This script will create waveform and spectrogram images for all expected output files and store them in the `tests/inputs/reference` directory. + +### Skipping Validation + +If you need to skip the audio validation (e.g., when you're intentionally changing the output), you can set the environment variable `SKIP_AUDIO_VALIDATION=1`: + +```bash +SKIP_AUDIO_VALIDATION=1 pytest tests/integration/test_cli_integration.py +``` + +### Adding New Models + +When adding a new model to the tests: + +1. Add the model and its expected output files to the `MODEL_PARAMS` list in `test_cli_integration.py` +2. Run the integration test to generate the output files +3. Run the `generate_reference_images.py` script to create the reference images +4. Run the tests again to validate the output files +5. If necessary, add a custom similarity threshold for the new model in `MODEL_SIMILARITY_THRESHOLDS` + +### Debugging + +To see detailed validation results, run pytest with the `-sv` flag: + +```bash +pytest tests/integration/test_cli_integration.py -sv +``` + +This will show the similarity scores for each comparison and whether they passed or failed. + +## Running Tests + +To run all tests: + +```bash +pytest +``` + +To run specific tests: + +```bash +pytest tests/unit/ +pytest tests/integration/ +``` + +To run with coverage: + +```bash +pytest --cov=audio_separator +``` \ No newline at end of file diff --git a/tests/TODO.txt b/tests/TODO.txt new file mode 100644 index 0000000000000000000000000000000000000000..32949556bccac6dcaff0c1965655dcf02b1b723a --- /dev/null +++ b/tests/TODO.txt @@ -0,0 +1,13 @@ +- Test running CLI with minimal input file for each major supported model (e.g. at least 1 from each architecture) outputs expected files +- Test running CLI with pre-warmed cache directory containing model files does not repeat download +- Test running CLI with corrupt model files in cache directory throws expected error +- Test loading the separation class rather than using the CLI works as expected with all major supported models +- Test processing multiple files in a row outputs separate expected files +- Test processing file with multiple different models outputs separate expected files +- Test each of the architecure specific parameters works as expected in both CLI and class mode +- Generate oscillogram and spectrogram of model output for a short test file for each major supported model and compare to expected output to ensure separation is actually separating stems +- Add a few different test files with different properties, e.g. background noise, stems present, or genre of music and ensure separation works as expected for each +- Test that processing more than one distinct input file in sequence outputs separate files (not overwriting the first output with the second) +- Test that every model returned by list_models actually works +- Test each model architecture at least once using each supported Python version, to ensure we actually do legitimately support all of them! +- Test that loading a model of one architecture does NOT load the code from any other architecture diff --git a/tests/inputs/mardy20s.flac b/tests/inputs/mardy20s.flac new file mode 100644 index 0000000000000000000000000000000000000000..579e8dd1f0a39c7e8befe80341c879c9fe0e2326 --- /dev/null +++ b/tests/inputs/mardy20s.flac @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:425443940925ffe69be19fbd5a5c9dd7da3e6b84bfa2c9675a542c26130df16b +size 2478894 diff --git a/tests/inputs/reference/expected_mardy20s_(Bass)_htdemucs_6s_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Bass)_htdemucs_6s_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..3f29934849eb4065e77065e687a75f321feefe4a --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Bass)_htdemucs_6s_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89d2c9019834dd602cd68983c59d7f450d8b76095fdb366023e5a0e76d3ec437 +size 291204 diff --git a/tests/inputs/reference/expected_mardy20s_(Bass)_htdemucs_6s_waveform.png b/tests/inputs/reference/expected_mardy20s_(Bass)_htdemucs_6s_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..7425ac56be1ca289fa03a2dc38c5923e6232fd73 Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Bass)_htdemucs_6s_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Drum-Bass)_model_bs_roformer_ep_937_sdr_10_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Drum-Bass)_model_bs_roformer_ep_937_sdr_10_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..00bd247e41fedb159a9e3fdf873ec2c3129726d5 --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Drum-Bass)_model_bs_roformer_ep_937_sdr_10_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23fac5e5db0b200529526903e520762a08ee95c80ff04106117ca49224155cb6 +size 688163 diff --git a/tests/inputs/reference/expected_mardy20s_(Drum-Bass)_model_bs_roformer_ep_937_sdr_10_waveform.png b/tests/inputs/reference/expected_mardy20s_(Drum-Bass)_model_bs_roformer_ep_937_sdr_10_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f0374d949636d3b297d9ad3491e32d680a84ca Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Drum-Bass)_model_bs_roformer_ep_937_sdr_10_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Drums)_htdemucs_6s_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Drums)_htdemucs_6s_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..e6511181f597e0853ea8df13009311a3d84fc474 --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Drums)_htdemucs_6s_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:162b1f965d1f17f7c83b94b6d610ed1b3746179e712c5493f9012c00036da94f +size 681815 diff --git a/tests/inputs/reference/expected_mardy20s_(Drums)_htdemucs_6s_waveform.png b/tests/inputs/reference/expected_mardy20s_(Drums)_htdemucs_6s_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..8c23c7208f394aef5ca97b3d2cda207c0fb51f6a Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Drums)_htdemucs_6s_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Guitar)_htdemucs_6s_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Guitar)_htdemucs_6s_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..fac736adc61ca47ad0423814462563d392db6551 --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Guitar)_htdemucs_6s_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34b1fa75e3f75670173ff2716d0666492cfdbd45c313594a7d10eb35225347b2 +size 563936 diff --git a/tests/inputs/reference/expected_mardy20s_(Guitar)_htdemucs_6s_waveform.png b/tests/inputs/reference/expected_mardy20s_(Guitar)_htdemucs_6s_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..658a75a410eda6f4a25d1ca4287a47cb372f1a0d Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Guitar)_htdemucs_6s_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Instrumental)_2_HP-UVR_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Instrumental)_2_HP-UVR_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..cbb2603069492812d10afa0ce8b9c33b4424743a --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Instrumental)_2_HP-UVR_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6c39483fefe61808e4ab5548c0c2e3c31c63466fc8478fb45b7349e4e859da1 +size 734853 diff --git a/tests/inputs/reference/expected_mardy20s_(Instrumental)_2_HP-UVR_waveform.png b/tests/inputs/reference/expected_mardy20s_(Instrumental)_2_HP-UVR_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..85374c44432a52f57c1cee9ec14c89532b88c45c Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Instrumental)_2_HP-UVR_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Instrumental)_MGM_MAIN_v4_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Instrumental)_MGM_MAIN_v4_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..0c76e212be04577acf05a9e3d3ef2a4bd0565b1b --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Instrumental)_MGM_MAIN_v4_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2fc78f6bb2ba904cc87fe3375c51e7f8125b67c6a298f0d27eccdb05bff2e5b +size 759284 diff --git a/tests/inputs/reference/expected_mardy20s_(Instrumental)_MGM_MAIN_v4_waveform.png b/tests/inputs/reference/expected_mardy20s_(Instrumental)_MGM_MAIN_v4_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..f55878caf6e675e71c3679d0a98f4c0f79db5421 Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Instrumental)_MGM_MAIN_v4_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Instrumental)_UVR-MDX-NET-Inst_HQ_4_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Instrumental)_UVR-MDX-NET-Inst_HQ_4_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..dba55174ec61e723064fc9a5272f0bbd297510f9 --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Instrumental)_UVR-MDX-NET-Inst_HQ_4_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea2153d5509f27961189f6cd0fb6f54423c27157a7850e1caf233a303e4f3394 +size 762487 diff --git a/tests/inputs/reference/expected_mardy20s_(Instrumental)_UVR-MDX-NET-Inst_HQ_4_waveform.png b/tests/inputs/reference/expected_mardy20s_(Instrumental)_UVR-MDX-NET-Inst_HQ_4_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..bb94eaed3538f7e3448fe7283de25a4d7d8ae9f1 Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Instrumental)_UVR-MDX-NET-Inst_HQ_4_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Instrumental)_kuielab_b_vocals_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Instrumental)_kuielab_b_vocals_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..0c805fa094f026b35adf32e2f9d0e193496fb75e --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Instrumental)_kuielab_b_vocals_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ac0959c544b5484f93198d3099a9bb52a090690172aafb0397d7bfd0590d237 +size 781704 diff --git a/tests/inputs/reference/expected_mardy20s_(Instrumental)_kuielab_b_vocals_waveform.png b/tests/inputs/reference/expected_mardy20s_(Instrumental)_kuielab_b_vocals_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..85bf93fc2ab13b52a704844f66da00bf27732d89 Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Instrumental)_kuielab_b_vocals_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Instrumental)_model_bs_roformer_ep_317_sdr_12_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Instrumental)_model_bs_roformer_ep_317_sdr_12_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a6a749a0dba7122c3deb4375d8ff103213a176 --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Instrumental)_model_bs_roformer_ep_317_sdr_12_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6c4fc81885ab17f7e74fa83947c4bf61d107afefe77cbe7445dc0fecca5ff68 +size 737577 diff --git a/tests/inputs/reference/expected_mardy20s_(Instrumental)_model_bs_roformer_ep_317_sdr_12_waveform.png b/tests/inputs/reference/expected_mardy20s_(Instrumental)_model_bs_roformer_ep_317_sdr_12_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..68223be5ee5cda8dbd8dd1094f64e1e1eb385cbe Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Instrumental)_model_bs_roformer_ep_317_sdr_12_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(No Drum-Bass)_model_bs_roformer_ep_937_sdr_10_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(No Drum-Bass)_model_bs_roformer_ep_937_sdr_10_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..35af1f3b0c121c8612dcd220e1dc6ed2d76d2f00 --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(No Drum-Bass)_model_bs_roformer_ep_937_sdr_10_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2bf971721b184116dca7836247510809b918baae0e4bdb47a459db6e92ea6d48 +size 690249 diff --git a/tests/inputs/reference/expected_mardy20s_(No Drum-Bass)_model_bs_roformer_ep_937_sdr_10_waveform.png b/tests/inputs/reference/expected_mardy20s_(No Drum-Bass)_model_bs_roformer_ep_937_sdr_10_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..72e0299ac839a4e2cac96ecda35f3ad275eb36a3 Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(No Drum-Bass)_model_bs_roformer_ep_937_sdr_10_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Other)_htdemucs_6s_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Other)_htdemucs_6s_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ae94438300956b04006c935d8af81760b3f368 --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Other)_htdemucs_6s_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da392eec814342af177622cc12212d6ea1748c33b1517f606b578729702e8757 +size 410220 diff --git a/tests/inputs/reference/expected_mardy20s_(Other)_htdemucs_6s_waveform.png b/tests/inputs/reference/expected_mardy20s_(Other)_htdemucs_6s_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..755156a692e29cbecc3ce8942cbb13c94bf94e46 Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Other)_htdemucs_6s_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Piano)_htdemucs_6s_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Piano)_htdemucs_6s_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..f57869c9ec43611e1d55512ad4791bd533a27219 --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Piano)_htdemucs_6s_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8803307b04a5ef20de700495cc5c533d91de33071ed893fcd6473d8faf481ab7 +size 759841 diff --git a/tests/inputs/reference/expected_mardy20s_(Piano)_htdemucs_6s_waveform.png b/tests/inputs/reference/expected_mardy20s_(Piano)_htdemucs_6s_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..3ebcfc952f332531939b6c2471f6f5d3f68f149a Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Piano)_htdemucs_6s_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Vocals)_2_HP-UVR_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Vocals)_2_HP-UVR_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..f1c0c17ab4217389245471d658bed99b95fd3fcc --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Vocals)_2_HP-UVR_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09f917d92835f7ab9c8ab9e49eb8f1c043f525d4c5bd4b9a73e4e484312fce87 +size 722589 diff --git a/tests/inputs/reference/expected_mardy20s_(Vocals)_2_HP-UVR_waveform.png b/tests/inputs/reference/expected_mardy20s_(Vocals)_2_HP-UVR_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..1e2297f0125da6fb29095c22d3dd24ad018cb574 Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Vocals)_2_HP-UVR_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Vocals)_MGM_MAIN_v4_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Vocals)_MGM_MAIN_v4_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a3f7cc55517b351af745f7ee3a97689b264f2c --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Vocals)_MGM_MAIN_v4_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9cc37d51d1f5736567926e3c5a077b063ff30d7300d910dc55b157a21b96fdb +size 717747 diff --git a/tests/inputs/reference/expected_mardy20s_(Vocals)_MGM_MAIN_v4_waveform.png b/tests/inputs/reference/expected_mardy20s_(Vocals)_MGM_MAIN_v4_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..69b5926b561c81c7de4474172134ac232a9feb69 Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Vocals)_MGM_MAIN_v4_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Vocals)_UVR-MDX-NET-Inst_HQ_4_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Vocals)_UVR-MDX-NET-Inst_HQ_4_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..23790c138a331a13338c3d147b6793fcdf70fdee --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Vocals)_UVR-MDX-NET-Inst_HQ_4_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c8fc73a41416f0089e472041dd6997c75ec1c919317587eaa31f611f1ee9cd7 +size 780614 diff --git a/tests/inputs/reference/expected_mardy20s_(Vocals)_UVR-MDX-NET-Inst_HQ_4_waveform.png b/tests/inputs/reference/expected_mardy20s_(Vocals)_UVR-MDX-NET-Inst_HQ_4_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..c884d8a1344df0f083597ab03f8c1920dcedef20 Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Vocals)_UVR-MDX-NET-Inst_HQ_4_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Vocals)_htdemucs_6s_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Vocals)_htdemucs_6s_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb017115d0ed830bb7e7515d0f221c5201fc7da --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Vocals)_htdemucs_6s_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59b1dafc0bc76219c0068d29d6d6e0bf300af6364165a8e5674a661a7787db00 +size 763152 diff --git a/tests/inputs/reference/expected_mardy20s_(Vocals)_htdemucs_6s_waveform.png b/tests/inputs/reference/expected_mardy20s_(Vocals)_htdemucs_6s_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..385b477623bb988f482088206741ddb7ad659af1 Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Vocals)_htdemucs_6s_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Vocals)_kuielab_b_vocals_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Vocals)_kuielab_b_vocals_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..9d9fd5f527239c5922d86a9f389c962a892cb37e --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Vocals)_kuielab_b_vocals_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50af1f3f5f50cf617ad324ef0025f322670ef1faae1661d1b36c5c62aeaff6ab +size 754004 diff --git a/tests/inputs/reference/expected_mardy20s_(Vocals)_kuielab_b_vocals_waveform.png b/tests/inputs/reference/expected_mardy20s_(Vocals)_kuielab_b_vocals_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..6baf9273a2a2b3a531d843d78be65c46cef9b21b Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Vocals)_kuielab_b_vocals_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_(Vocals)_model_bs_roformer_ep_317_sdr_12_spectrogram.png b/tests/inputs/reference/expected_mardy20s_(Vocals)_model_bs_roformer_ep_317_sdr_12_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..7bdff08ac8458ab100923ba30cad352028bde4ac --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_(Vocals)_model_bs_roformer_ep_317_sdr_12_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6dd0b46fae5bd701392017d28b661d5221b65cf8daf8f8c474ad4e6794ae1d57 +size 757256 diff --git a/tests/inputs/reference/expected_mardy20s_(Vocals)_model_bs_roformer_ep_317_sdr_12_waveform.png b/tests/inputs/reference/expected_mardy20s_(Vocals)_model_bs_roformer_ep_317_sdr_12_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..2e21ce005626f64d2699e1e946a0fcea3508b19d Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_(Vocals)_model_bs_roformer_ep_317_sdr_12_waveform.png differ diff --git a/tests/inputs/reference/expected_mardy20s_spectrogram.png b/tests/inputs/reference/expected_mardy20s_spectrogram.png new file mode 100644 index 0000000000000000000000000000000000000000..58c61584a31601bee54e8c5f48b22f6dfc233756 --- /dev/null +++ b/tests/inputs/reference/expected_mardy20s_spectrogram.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c8b2619f702631b0cb0411bebd31624779c44af0a8b161b75cb0c36f23139bf +size 782248 diff --git a/tests/inputs/reference/expected_mardy20s_waveform.png b/tests/inputs/reference/expected_mardy20s_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9a1dcc14ed749ae3b5f56d807d25434156082d Binary files /dev/null and b/tests/inputs/reference/expected_mardy20s_waveform.png differ diff --git a/tests/integration/README.md b/tests/integration/README.md new file mode 100644 index 0000000000000000000000000000000000000000..feade6261d22ad011f5edd494cf48c7e8c60ca57 --- /dev/null +++ b/tests/integration/README.md @@ -0,0 +1,41 @@ +# Integration Tests + +These tests verify the end-to-end functionality of the audio-separator CLI. + +## Running the tests + +To run the integration tests, use: + +```bash +pytest tests/integration +``` + +To run a specific model test, you can use pytest's parameter selection: + +```bash +# Run only the kuielab_b_vocals.onnx test +pytest tests/integration/test_cli_integration.py::test_model_separation[kuielab_b_vocals.onnx-expected_files0] + +# Run only the MGM_MAIN_v4.pth test +pytest tests/integration/test_cli_integration.py::test_model_separation[MGM_MAIN_v4.pth-expected_files1] +``` + +## Adding New Model Tests + +To add a new model test, simply add a new entry to the `MODEL_PARAMS` list in the test file: + +```python +( + "new_model_filename.onnx", + ["mardy20s_(Instrumental)_new_model_filename.flac", "mardy20s_(Vocals)_new_model_filename.flac"] +), +``` + +No additional test functions are needed. + +## Notes + +- These tests use actual audio files and models, and will run the full audio separation process. +- Tests may take longer to run than unit tests, as they perform actual audio processing. +- The model files will be automatically downloaded if they don't exist locally. +- The test requires the test audio file at `tests/inputs/mardy20s.flac` to exist. \ No newline at end of file diff --git a/tests/integration/generate_reference_images.py b/tests/integration/generate_reference_images.py new file mode 100644 index 0000000000000000000000000000000000000000..8b1dc2ef4e6795146db3f193cda5b87ea9ab9dcd --- /dev/null +++ b/tests/integration/generate_reference_images.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +""" +Script to generate reference waveform and spectrogram images for model outputs. +This script should be run whenever the expected output files change. +""" + +import os +import sys +import glob +from pathlib import Path + +# Add the parent directory to sys.path +sys.path.insert(0, str(Path(__file__).resolve().parent.parent.parent)) + +from tests.utils import generate_reference_images +from tests.integration.test_cli_integration import MODEL_PARAMS + +def main(): + """Generate reference images for all expected model outputs.""" + print("Generating reference images for expected model outputs...") + + # Get the input file path + inputs_dir = Path(__file__).resolve().parent.parent / "inputs" + input_file = inputs_dir / "mardy20s.flac" + + # Create reference directory if it doesn't exist + reference_dir = inputs_dir / "reference" + os.makedirs(reference_dir, exist_ok=True) + + # First, generate reference images for the input file + print(f"Generating reference images for input file: {input_file}") + generate_reference_images(str(input_file), str(reference_dir), prefix="expected_") + + # Then, generate reference images for each expected output file + for model, expected_files in MODEL_PARAMS: + for output_file in expected_files: + file_path = os.path.join(str(inputs_dir), output_file) + + # Check if the file exists + if os.path.exists(file_path): + print(f"Generating reference images for output file: {output_file}") + generate_reference_images(file_path, str(reference_dir), prefix="expected_") + else: + print(f"Warning: Output file does not exist: {file_path}") + print(f"You may need to run the CLI command first to generate the output files.") + + print("Done generating reference images.") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/tests/integration/test_cli_integration.py b/tests/integration/test_cli_integration.py new file mode 100644 index 0000000000000000000000000000000000000000..f228a76b8cb14f6f9a23c5cad7801f94de15581e --- /dev/null +++ b/tests/integration/test_cli_integration.py @@ -0,0 +1,176 @@ +import os +import subprocess +import pytest +from pathlib import Path +from tests.utils import generate_reference_images, compare_images + + +@pytest.fixture(name="input_file") +def fixture_input_file(): + """Fixture providing the test input audio file path.""" + return "tests/inputs/mardy20s.flac" + + +@pytest.fixture(name="reference_dir") +def fixture_reference_dir(): + """Fixture providing the reference images directory path.""" + return "tests/inputs/reference" + + +@pytest.fixture(name="cleanup_output_files") +def fixture_cleanup_output_files(): + """Fixture to clean up output files before and after test.""" + # This list will be populated by the test functions + output_files = [] + + # Yield to allow the test to run and add files to the list + yield output_files + + # Clean up output files after test + for file in output_files: + if os.path.exists(file): + print(f"Test output file exists: {file}") + os.remove(file) + + +def run_separation_test(model, audio_path, expected_files): + """Helper function to run a separation test with a specific model.""" + # Clean up any existing output files before the test + for file in expected_files: + if os.path.exists(file): + print(f"Deleting existing test output file {file}") + os.remove(file) + + # Run the CLI command + result = subprocess.run(["audio-separator", "-m", model, audio_path], capture_output=True, text=True, check=False) # Explicitly set check to False as we handle errors manually + + # Check that the command completed successfully + assert result.returncode == 0, f"Command failed with output: {result.stderr}" + + # Check that the output files were created + for file in expected_files: + assert os.path.exists(file), f"Output file {file} was not created" + assert os.path.getsize(file) > 0, f"Output file {file} is empty" + + return result + + +def validate_audio_output(output_file, reference_dir, waveform_threshold=0.999, spectrogram_threshold=None): + """Validate an audio output file by comparing its waveform and spectrogram with reference images. + + Args: + output_file: Path to the audio output file + reference_dir: Directory containing reference images + waveform_threshold: Minimum similarity required for waveform images (0.0-1.0) + spectrogram_threshold: Minimum similarity for spectrogram images (0.0-1.0), defaults to waveform_threshold if None + + Returns: + Tuple of booleans: (waveform_match, spectrogram_match) + """ + # If spectrogram threshold not specified, use the same as waveform threshold + if spectrogram_threshold is None: + spectrogram_threshold = waveform_threshold + + # Create temporary directory for generated images + temp_dir = os.path.join(os.path.dirname(output_file), "temp_images") + os.makedirs(temp_dir, exist_ok=True) + + # Generate waveform and spectrogram images for the output file + output_filename = os.path.basename(output_file) + name_without_ext = os.path.splitext(output_filename)[0] + + # Generate actual images + actual_waveform_path, actual_spectrogram_path = generate_reference_images(output_file, temp_dir, prefix="actual_") + + # Path to expected reference images + expected_waveform_path = os.path.join(reference_dir, f"expected_{name_without_ext}_waveform.png") + expected_spectrogram_path = os.path.join(reference_dir, f"expected_{name_without_ext}_spectrogram.png") + + # Check if reference images exist + if not os.path.exists(expected_waveform_path) or not os.path.exists(expected_spectrogram_path): + print(f"Warning: Reference images not found for {output_file}") + print(f"Expected: {expected_waveform_path} and {expected_spectrogram_path}") + return False, False + + # Compare waveform images + waveform_similarity, waveform_match = compare_images(expected_waveform_path, actual_waveform_path, min_similarity_threshold=waveform_threshold) + + # Compare spectrogram images + spectrogram_similarity, spectrogram_match = compare_images(expected_spectrogram_path, actual_spectrogram_path, min_similarity_threshold=spectrogram_threshold) + + print(f"Validation results for {output_file}:\n") + print(f" Waveform similarity: {waveform_similarity:.4f} (match: {waveform_match}, threshold: {waveform_threshold:.2f})\n") + print(f" Spectrogram similarity: {spectrogram_similarity:.4f} (match: {spectrogram_match}, threshold: {spectrogram_threshold:.2f})\n") + + # Cleanup temp images (optional, uncomment if needed) + # os.remove(actual_waveform_path) + # os.remove(actual_spectrogram_path) + + return waveform_match, spectrogram_match + + +# Default similarity threshold to use for most models +DEFAULT_SIMILARITY_THRESHOLDS = (0.90, 0.80) # (waveform_threshold, spectrogram_threshold) + +# Model-specific similarity thresholds +# Use lower thresholds for models that show more variation between runs +MODEL_SIMILARITY_THRESHOLDS = { + # Format: (waveform_threshold, spectrogram_threshold) + "htdemucs_6s.yaml": (0.90, 0.70) # Demucs multi-stem output (e.g. "Other" and "Piano") is a lot more variable +} + + +# Parameterized test for multiple models +MODEL_PARAMS = [ + # (model_filename, expected_output_filenames) + ("kuielab_b_vocals.onnx", ["mardy20s_(Instrumental)_kuielab_b_vocals.flac", "mardy20s_(Vocals)_kuielab_b_vocals.flac"]), + ("MGM_MAIN_v4.pth", ["mardy20s_(Instrumental)_MGM_MAIN_v4.flac", "mardy20s_(Vocals)_MGM_MAIN_v4.flac"]), + ("UVR-MDX-NET-Inst_HQ_4.onnx", ["mardy20s_(Instrumental)_UVR-MDX-NET-Inst_HQ_4.flac", "mardy20s_(Vocals)_UVR-MDX-NET-Inst_HQ_4.flac"]), + ("2_HP-UVR.pth", ["mardy20s_(Instrumental)_2_HP-UVR.flac", "mardy20s_(Vocals)_2_HP-UVR.flac"]), + ( + "htdemucs_6s.yaml", + [ + "mardy20s_(Vocals)_htdemucs_6s.flac", + "mardy20s_(Drums)_htdemucs_6s.flac", + "mardy20s_(Bass)_htdemucs_6s.flac", + "mardy20s_(Other)_htdemucs_6s.flac", + "mardy20s_(Guitar)_htdemucs_6s.flac", + "mardy20s_(Piano)_htdemucs_6s.flac", + ], + ), + ("model_bs_roformer_ep_937_sdr_10.5309.ckpt", ["mardy20s_(Drum-Bass)_model_bs_roformer_ep_937_sdr_10.flac", "mardy20s_(No Drum-Bass)_model_bs_roformer_ep_937_sdr_10.flac"]), + ("model_bs_roformer_ep_317_sdr_12.9755.ckpt", ["mardy20s_(Instrumental)_model_bs_roformer_ep_317_sdr_12.flac", "mardy20s_(Vocals)_model_bs_roformer_ep_317_sdr_12.flac"]), +] + + +@pytest.mark.parametrize("model,expected_files", MODEL_PARAMS) +def test_model_separation(model, expected_files, input_file, reference_dir, cleanup_output_files): + """Parameterized test for multiple model files.""" + # Add files to the cleanup list + cleanup_output_files.extend(expected_files) + + # Run the test + run_separation_test(model, input_file, expected_files) + + # Validate the output audio files + print(f"\nValidating output files for model {model}...") + + # Get model-specific similarity threshold or use default + threshold = MODEL_SIMILARITY_THRESHOLDS.get(model, DEFAULT_SIMILARITY_THRESHOLDS) + + # Unpack thresholds - DEFAULT_SIMILARITY_THRESHOLDS is now always a tuple + waveform_threshold, spectrogram_threshold = threshold + + print(f"Using thresholds - waveform: {waveform_threshold}, spectrogram: {spectrogram_threshold} for model {model}") + + for output_file in expected_files: + # Skip validation if reference images are not required (set environment variable to skip) + if os.environ.get("SKIP_AUDIO_VALIDATION") == "1": + print(f"Skipping audio validation for {output_file} (SKIP_AUDIO_VALIDATION=1)") + continue + + waveform_match, spectrogram_match = validate_audio_output(output_file, reference_dir, waveform_threshold=waveform_threshold, spectrogram_threshold=spectrogram_threshold) + + # Assert that the output matches the reference + assert waveform_match, f"Waveform for {output_file} does not match the reference" + assert spectrogram_match, f"Spectrogram for {output_file} does not match the reference" diff --git a/tests/integration/test_separator_output_integration.py b/tests/integration/test_separator_output_integration.py new file mode 100644 index 0000000000000000000000000000000000000000..ef26c910f43cc8ea8babefe13324034e39a4a5a0 --- /dev/null +++ b/tests/integration/test_separator_output_integration.py @@ -0,0 +1,175 @@ +import os +import pytest +import tempfile +import shutil +from pathlib import Path + +from audio_separator.separator import Separator + + +@pytest.fixture(name="input_file") +def fixture_input_file(): + """Fixture providing the test input audio file path.""" + return "tests/inputs/mardy20s.flac" + + +@pytest.fixture(name="temp_output_dir") +def fixture_temp_output_dir(): + """Fixture providing a temporary directory for output files.""" + temp_dir = tempfile.mkdtemp() + yield temp_dir + # Clean up after test + shutil.rmtree(temp_dir) + + +def test_separator_output_dir_and_custom_names(input_file, temp_output_dir): + """Test that Separator respects output_dir and custom_output_names parameters.""" + print("\n>>> TEST: Checking output_dir with custom output names") + + # Define custom output filenames + vocal_output_filename = "custom_vocals_output" + instrumental_output_filename = "custom_instrumental_output" + + # Create output name mapping + custom_output_names = {"Vocals": vocal_output_filename, "Instrumental": instrumental_output_filename} + + # Initialize separator with specified output directory + print(f"Creating Separator with output_dir: {temp_output_dir}") + separator = Separator(output_dir=temp_output_dir, log_level=20) # INFO level + + # Load model + print("Loading model: MGM_MAIN_v4.pth") + separator.load_model(model_filename="MGM_MAIN_v4.pth") + + # Run separation with custom output names + print(f"Running separation with custom_output_names: {custom_output_names}") + output_files = separator.separate(input_file, custom_output_names=custom_output_names) + print(f"Separator.separate() returned: {output_files}") + + # The separator adds .wav extension since the default output format is WAV + expected_vocal_filename = vocal_output_filename + ".wav" + expected_instrumental_filename = instrumental_output_filename + ".wav" + + # Check that the returned filenames match the expected names + output_filenames = [os.path.basename(f) for f in output_files] + print(f"Extracted filenames from output_files: {output_filenames}") + + # NOTE: The Separator class returns only the filenames, not the full paths with output_dir + print("EXPECTED BEHAVIOR: The Separator.separate() method returns filenames without the output_dir path") + print(f"Expected filenames (without path): {expected_vocal_filename} and {expected_instrumental_filename}") + + assert expected_vocal_filename in output_filenames, f"Expected {expected_vocal_filename} in output files" + assert expected_instrumental_filename in output_filenames, f"Expected {expected_instrumental_filename} in output files" + + # Check that files physically exist in the specified output directory + expected_vocal_path = os.path.join(temp_output_dir, expected_vocal_filename) + expected_instrumental_path = os.path.join(temp_output_dir, expected_instrumental_filename) + + print(f"Checking that files exist in output_dir: {temp_output_dir}") + print(f"Full expected vocal path: {expected_vocal_path}") + print(f"Full expected instrumental path: {expected_instrumental_path}") + + assert os.path.exists(expected_vocal_path), f"Vocals output file doesn't exist: {expected_vocal_path}" + assert os.path.exists(expected_instrumental_path), f"Instrumental output file doesn't exist: {expected_instrumental_path}" + assert os.path.getsize(expected_vocal_path) > 0, f"Vocals output file is empty: {expected_vocal_path}" + assert os.path.getsize(expected_instrumental_path) > 0, f"Instrumental output file is empty: {expected_instrumental_path}" + + print("✅ Test passed: Separator correctly handles output_dir and custom_output_names") + print(" - Files were saved to the specified output directory") + print(" - Custom filenames were used (with .wav extension added)") + print(" - Returned paths include just the filenames (not the full paths)") + + +def test_separator_single_stem_output(input_file, temp_output_dir): + """Test that Separator correctly respects output_single_stem with custom output name.""" + print("\n>>> TEST: Checking output_single_stem with custom output name") + + # Define custom output filename for single stem + vocal_output_filename = "only_vocals_output" + + # Create output name mapping + custom_output_names = {"Vocals": vocal_output_filename} + + # Initialize separator with specified output directory and single stem output + print(f"Creating Separator with output_dir: {temp_output_dir} and output_single_stem: Vocals") + separator = Separator( + output_dir=temp_output_dir, + output_single_stem="Vocals", # Only extract vocals + log_level=20 # INFO level + ) + + # Load model + print("Loading model: MGM_MAIN_v4.pth") + separator.load_model(model_filename="MGM_MAIN_v4.pth") + + # Run separation with custom output name + print(f"Running separation with custom_output_names: {custom_output_names}") + output_files = separator.separate(input_file, custom_output_names=custom_output_names) + print(f"Separator.separate() returned: {output_files}") + + # The separator adds .wav extension since the default output format is WAV + expected_vocal_filename = vocal_output_filename + ".wav" + + # Check that the output files list contains only the expected file + print(f"Checking that only one file was returned and it has the correct name") + assert len(output_files) == 1, f"Expected 1 output file, got {len(output_files)}" + assert os.path.basename(output_files[0]) == expected_vocal_filename, f"Expected {expected_vocal_filename} in output files" + + # Check that file physically exists in the specified output directory + expected_vocal_path = os.path.join(temp_output_dir, expected_vocal_filename) + print(f"Checking that file exists in output_dir: {expected_vocal_path}") + + assert os.path.exists(expected_vocal_path), f"Vocals output file doesn't exist: {expected_vocal_path}" + assert os.path.getsize(expected_vocal_path) > 0, f"Vocals output file is empty: {expected_vocal_path}" + + # Make sure the instrumental file was NOT created + instrumental_files = [f for f in os.listdir(temp_output_dir) if "instrumental" in f.lower()] + print(f"Checking that no instrumental files were created, found: {instrumental_files}") + assert len(instrumental_files) == 0, f"No instrumental file should be created when using output_single_stem, found: {instrumental_files}" + + print("✅ Test passed: Separator correctly handles output_single_stem with custom output name") + print(" - Only the specified stem (Vocals) was extracted") + print(" - The custom filename was used (with .wav extension added)") + print(" - No other stems (like Instrumental) were created") + + +def test_separator_output_without_custom_names(input_file, temp_output_dir): + """Test that Separator respects output_dir without custom_output_names.""" + print("\n>>> TEST: Checking output_dir without custom output names") + + # Initialize separator with specified output directory + print(f"Creating Separator with output_dir: {temp_output_dir}") + separator = Separator(output_dir=temp_output_dir, log_level=20) # INFO level + + # Load model + print("Loading model: MGM_MAIN_v4.pth") + separator.load_model(model_filename="MGM_MAIN_v4.pth") + + # Run separation without custom output names + print("Running separation without custom_output_names") + output_files = separator.separate(input_file) + print(f"Separator.separate() returned: {output_files}") + + # Check that output files exist and have content + print(f"Checking that two files were returned (one for each stem)") + assert len(output_files) == 2, f"Expected 2 output files, got {len(output_files)}" + + # Check if the files were created in the output directory + # Note: The separator doesn't include the full path in the returned output_files + output_file_basenames = [os.path.basename(f) for f in output_files] + print(f"Extracted filenames from output_files: {output_file_basenames}") + + print("EXPECTED BEHAVIOR: Default filenames are being used (format: inputname_(StemName)_modelname.wav)") + + # Check all output files exist in the specified output directory + print(f"Checking that files exist in output_dir: {temp_output_dir}") + for basename in output_file_basenames: + full_path = os.path.join(temp_output_dir, basename) + print(f"Checking file: {full_path}") + assert os.path.exists(full_path), f"Output file doesn't exist: {full_path}" + assert os.path.getsize(full_path) > 0, f"Output file is empty: {full_path}" + + print("✅ Test passed: Separator correctly handles output_dir without custom output names") + print(" - Files were saved to the specified output directory") + print(" - Default naming scheme was used (input_name_(Stem)_model.wav)") + print(" - Returned paths include just the filenames (not the full paths)") diff --git a/tests/model-metrics/test-all-models.py b/tests/model-metrics/test-all-models.py new file mode 100644 index 0000000000000000000000000000000000000000..373d5a90dee3c4d9879feaa6c734467c23fb186b --- /dev/null +++ b/tests/model-metrics/test-all-models.py @@ -0,0 +1,890 @@ +#!/usr/bin/env python +import os +import time +import museval +import numpy as np +import soundfile as sf +from audio_separator.separator import Separator +import json +from json import JSONEncoder +import logging +import musdb +from decimal import Decimal +import tempfile +import argparse + + +# Setup logging +logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s") +logger = logging.getLogger(__name__) + + +# Custom JSON Encoder to handle Decimal types +class DecimalEncoder(JSONEncoder): + def default(self, obj): + if isinstance(obj, Decimal): + return float(obj) + return super().default(obj) + + +MUSDB_PATH = "/Volumes/Nomad4TBOne/python-audio-separator/tests/model-metrics/datasets/musdb18hq" +RESULTS_PATH = "/Volumes/Nomad4TBOne/python-audio-separator/tests/model-metrics/results" +COMBINED_RESULTS_PATH = "/Users/andrew/Projects/python-audio-separator/audio_separator/models-scores.json" +COMBINED_MUSEVAL_RESULTS_PATH = "/Volumes/Nomad4TBOne/python-audio-separator/tests/model-metrics/results/combined-museval-results.json" +STOP_SIGNAL_PATH = "/Volumes/Nomad4TBOne/python-audio-separator/tests/model-metrics/stop-signal" + + +def load_combined_results(): + """Load the combined museval results file""" + if os.path.exists(COMBINED_MUSEVAL_RESULTS_PATH): + logger.info("Loading combined museval results...") + try: + with open(COMBINED_MUSEVAL_RESULTS_PATH, "r") as f: + # Use a custom parser to handle Decimal values + def decimal_parser(dct): + for k, v in dct.items(): + if isinstance(v, str) and v.replace(".", "").isdigit(): + try: + dct[k] = float(v) + except (ValueError, TypeError): + pass + return dct + + return json.load(f, object_hook=decimal_parser) + except Exception as e: + logger.error(f"Error loading combined results: {str(e)}") + # Try to load a backup file if it exists + backup_path = COMBINED_MUSEVAL_RESULTS_PATH + ".backup" + if os.path.exists(backup_path): + logger.info("Attempting to load backup file...") + try: + with open(backup_path, "r") as f: + return json.load(f, object_hook=decimal_parser) + except Exception as backup_e: + logger.error(f"Error loading backup file: {str(backup_e)}") + return {} + else: + logger.info("No combined results file found, creating new one") + return {} + + +def save_combined_results(combined_results): + """Save the combined museval results file""" + logger.info("Saving combined museval results...") + try: + # Create a backup of the existing file if it exists + if os.path.exists(COMBINED_MUSEVAL_RESULTS_PATH): + backup_path = COMBINED_MUSEVAL_RESULTS_PATH + ".backup" + try: + with open(COMBINED_MUSEVAL_RESULTS_PATH, "r") as src, open(backup_path, "w") as dst: + dst.write(src.read()) + except Exception as e: + logger.error(f"Error creating backup file: {str(e)}") + + # Save the new results using the custom encoder + with open(COMBINED_MUSEVAL_RESULTS_PATH, "w") as f: + json.dump(combined_results, f, cls=DecimalEncoder, indent=2) + logger.info("Combined results saved successfully") + return True + except Exception as e: + logger.error(f"Error saving combined results: {str(e)}") + return False + + +def update_combined_results(model_name, track_name, track_data): + """Update the combined results file with new track data""" + try: + # Load existing combined results + combined_results = load_combined_results() + + # Initialize model entry if it doesn't exist + if model_name not in combined_results: + combined_results[model_name] = {} + + # Add or update track data + combined_results[model_name][track_name] = track_data + + # Write updated results back to file + save_combined_results(combined_results) + return True + except Exception as e: + logger.error(f"Error updating combined results: {str(e)}") + return False + + +def check_track_evaluated(model_name, track_name): + """Check if a track has already been evaluated for a specific model""" + combined_results = load_combined_results() + return model_name in combined_results and track_name in combined_results[model_name] + + +def get_track_results(model_name, track_name): + """Get the evaluation results for a specific track and model""" + combined_results = load_combined_results() + if model_name in combined_results and track_name in combined_results[model_name]: + return combined_results[model_name][track_name] + return None + + +def get_track_duration(track_path): + """Get the duration of a track in minutes""" + try: + mixture_path = os.path.join(track_path, "mixture.wav") + info = sf.info(mixture_path) + return info.duration / 60.0 # Convert seconds to minutes + except Exception as e: + logger.error(f"Error getting track duration: {str(e)}") + return 0.0 + + +def evaluate_track(track_name, track_path, test_model, mus_db): + """Evaluate a single track using a specific model""" + logger.info(f"Evaluating track: {track_name} with model: {test_model}") + + # Get track duration in minutes + track_duration_minutes = get_track_duration(track_path) + logger.info(f"Track duration: {track_duration_minutes:.2f} minutes") + + # Initialize variables to track processing time + processing_time = 0 + seconds_per_minute = 0 + + # Create a basic result structure that will be returned even if evaluation fails + basic_model_results = {"track_name": track_name, "scores": {}} + + # Check if evaluation results already exist in combined file + museval_results = load_combined_results() + if test_model in museval_results and track_name in museval_results[test_model]: + logger.info("Found existing evaluation results in combined file...") + track_data = museval_results[test_model][track_name] + scores = museval.TrackStore(track_name) + scores.scores = track_data + + # Try to extract existing speed metrics if available + try: + if isinstance(track_data, dict) and "targets" in track_data: + for target in track_data["targets"]: + if "metrics" in target and "seconds_per_minute_m3" in target["metrics"]: + basic_model_results["scores"]["seconds_per_minute_m3"] = target["metrics"]["seconds_per_minute_m3"] + break + except Exception: + pass # Ignore errors in extracting existing speed metrics + else: + # Expanded stem mapping to include "no-stem" outputs and custom stem formats + stem_mapping = { + # Standard stems + "Vocals": "vocals", + "Instrumental": "instrumental", + "Drums": "drums", + "Bass": "bass", + "Other": "other", + # No-stem variants + "No Drums": "nodrums", + "No Bass": "nobass", + "No Other": "noother", + # Custom stem formats (with hyphens) + "Drum-Bass": "drumbass", + "No Drum-Bass": "nodrumbass", + "Vocals-Other": "vocalsother", + "No Vocals-Other": "novocalsother", + } + + # Create a temporary directory for separation files + with tempfile.TemporaryDirectory() as temp_dir: + logger.info(f"Using temporary directory: {temp_dir}") + + # Measure separation time + start_time = time.time() + + # Perform separation + logger.info("Performing separation...") + separator = Separator(output_dir=temp_dir) + separator.load_model(model_filename=test_model) + separator.separate(os.path.join(track_path, "mixture.wav"), custom_output_names=stem_mapping) + + # Calculate processing time + processing_time = time.time() - start_time + seconds_per_minute = processing_time / track_duration_minutes if track_duration_minutes > 0 else 0 + logger.info(f"Separation completed in {processing_time:.2f} seconds") + logger.info(f"Processing speed: {seconds_per_minute:.2f} seconds per minute of audio") + + # Always add the speed metric to our basic results + basic_model_results["scores"]["seconds_per_minute_m3"] = round(seconds_per_minute, 1) + + # Check which stems were actually created + wav_files = [f for f in os.listdir(temp_dir) if f.endswith(".wav")] + logger.info(f"Found WAV files: {wav_files}") + + # Determine if this is a standard vocal/instrumental model that can be evaluated with museval + standard_model = False + if len(wav_files) == 2: + # Check if one of the files is named vocals.wav or instrumental.wav + if "vocals.wav" in wav_files and "instrumental.wav" in wav_files: + standard_model = True + logger.info("Detected standard vocals/instrumental model, will run museval evaluation") + + # If not a standard model, skip museval evaluation and just return speed metrics + if not standard_model: + logger.info(f"Non-standard stem configuration detected for model {test_model}, skipping museval evaluation") + + # Store the speed metric in the combined results + if test_model not in museval_results: + museval_results[test_model] = {} + + # Create a minimal structure for the speed metric + minimal_results = {"targets": [{"name": "speed_metrics_only", "metrics": {"seconds_per_minute_m3": round(seconds_per_minute, 1)}}]} + + museval_results[test_model][track_name] = minimal_results + save_combined_results(museval_results) + + return None, basic_model_results + + # For standard models, proceed with museval evaluation + available_stems = {} + available_stems["vocals"] = os.path.join(temp_dir, "vocals.wav") + available_stems["accompaniment"] = os.path.join(temp_dir, "instrumental.wav") + + # Get track from MUSDB + track = next((t for t in mus_db if t.name == track_name), None) + if track is None: + raise ValueError(f"Track {track_name} not found in MUSDB18") + + # Load available stems + estimates = {} + for stem_name, stem_path in available_stems.items(): + audio, _ = sf.read(stem_path) + if len(audio.shape) == 1: + audio = np.expand_dims(audio, axis=1) + estimates[stem_name] = audio + + # Evaluate using museval + logger.info(f"Evaluating stems: {list(estimates.keys())}") + try: + scores = museval.eval_mus_track(track, estimates, output_dir=temp_dir, mode="v4") + + # Add the speed metric to the scores + if not hasattr(scores, "speed_metric_added"): + for target in scores.scores["targets"]: + if "metrics" not in target: + target["metrics"] = {} + target["metrics"]["seconds_per_minute_m3"] = round(seconds_per_minute, 1) + scores.speed_metric_added = True + + # Update the combined results file with the new evaluation + if test_model not in museval_results: + museval_results[test_model] = {} + museval_results[test_model][track_name] = scores.scores + save_combined_results(museval_results) + except Exception as e: + logger.error(f"Error during museval evaluation: {str(e)}") + logger.exception("Evaluation exception details:") + # Return basic results with just the speed metric + return None, basic_model_results + + try: + # Only process museval results if we have them + if "scores" in locals() and scores is not None: + # Calculate aggregate scores for available stems + results_store = museval.EvalStore() + results_store.add_track(scores.df) + methods = museval.MethodStore() + methods.add_evalstore(results_store, name=test_model) + agg_scores = methods.agg_frames_tracks_scores() + + # Return the aggregate scores in a structured format with 6 significant figures + model_results = {"track_name": track_name, "scores": {}} + + for stem in ["vocals", "drums", "bass", "other", "accompaniment"]: + try: + stem_scores = {metric: float(f"{agg_scores.loc[(test_model, stem, metric)]:.6g}") for metric in ["SDR", "SIR", "SAR", "ISR"]} + # Rename 'accompaniment' to 'instrumental' in the output + output_stem = "instrumental" if stem == "accompaniment" else stem + model_results["scores"][output_stem] = stem_scores + except KeyError: + continue + + # Add the seconds_per_minute_m3 metric if it was calculated + if processing_time > 0 and track_duration_minutes > 0: + model_results["scores"]["seconds_per_minute_m3"] = round(seconds_per_minute, 1) + + return scores, model_results if model_results["scores"] else basic_model_results + else: + # If we don't have scores, just return the basic results with speed metrics + return None, basic_model_results + + except Exception as e: + logger.error(f"Error processing evaluation results: {str(e)}") + logger.exception("Results processing exception details:") + # Return basic results with just the speed metric + return None, basic_model_results + + +def convert_decimal_to_float(obj): + """Recursively converts Decimal objects to floats in a nested structure.""" + if isinstance(obj, Decimal): + return float(obj) + elif isinstance(obj, dict): + return {k: convert_decimal_to_float(v) for k, v in obj.items()} + elif isinstance(obj, list): + return [convert_decimal_to_float(x) for x in obj] + return obj + + +def calculate_median_scores(track_scores): + """Calculate median scores across all tracks for each stem and metric""" + # Initialize containers for each stem's metrics + stem_metrics = { + "vocals": {"SDR": [], "SIR": [], "SAR": [], "ISR": []}, + "drums": {"SDR": [], "SIR": [], "SAR": [], "ISR": []}, + "bass": {"SDR": [], "SIR": [], "SAR": [], "ISR": []}, + "instrumental": {"SDR": [], "SIR": [], "SAR": [], "ISR": []}, + "seconds_per_minute_m3": [], + } + + # Collect all scores for each stem and metric + for track_score in track_scores: + if track_score is not None and "scores" in track_score: + # Process audio quality metrics + for stem, metrics in track_score["scores"].items(): + if stem in stem_metrics and stem != "seconds_per_minute_m3": + for metric, value in metrics.items(): + stem_metrics[stem][metric].append(value) + + # Process speed metric separately + if "seconds_per_minute_m3" in track_score["scores"]: + stem_metrics["seconds_per_minute_m3"].append(track_score["scores"]["seconds_per_minute_m3"]) + + # Calculate medians for each stem and metric + median_scores = {} + for stem, metrics in stem_metrics.items(): + if stem != "seconds_per_minute_m3" and any(metrics.values()): # Only include stems that have scores + median_scores[stem] = {metric: float(f"{np.median(values):.6g}") for metric, values in metrics.items() if values} # Only include metrics that have values + + # Add median speed metric if available + if stem_metrics["seconds_per_minute_m3"]: + median_scores["seconds_per_minute_m3"] = round(np.median(stem_metrics["seconds_per_minute_m3"]), 1) + + return median_scores + + +def check_disk_usage(path): + """Check inode usage and disk space on the filesystem containing path""" + import subprocess + import sys + + # Check disk space first + result = subprocess.run(["df", "-h", path], capture_output=True, text=True) + output = result.stdout + logger.info(f"Current disk usage:\n{output}") + + # Parse the output to get disk usage percentage + lines = output.strip().split("\n") + if len(lines) >= 2: + parts = lines[1].split() + if len(parts) >= 5: + try: + # Extract disk usage percentage + disk_usage_str = parts[4].rstrip("%") + disk_usage_pct = int(disk_usage_str) + + logger.info(f"Disk usage: {disk_usage_pct}%") + + if disk_usage_pct >= 99: + logger.critical("CRITICAL: Disk is almost full (>99%)! Cannot continue processing.") + logger.critical("Please free up disk space before continuing.") + sys.exit(1) + elif disk_usage_pct > 95: + logger.warning(f"WARNING: High disk usage ({disk_usage_pct}%)!") + except (ValueError, IndexError) as e: + logger.error(f"Error parsing disk usage: {str(e)}") + + # Now check inode usage + result = subprocess.run(["df", "-i", path], capture_output=True, text=True) + output = result.stdout + logger.info(f"Current inode usage:\n{output}") + + # Parse the output to get inode usage percentage + lines = output.strip().split("\n") + if len(lines) >= 2: + # The second line contains the actual data + parts = lines[1].split() + if len(parts) >= 8: # macOS df -i format has 8 columns + try: + # On macOS, inode usage is in the 8th column as a percentage + inode_usage_str = parts[7].rstrip("%") + inode_usage_pct = int(inode_usage_str) + + # Also extract the actual inode numbers for better reporting + iused = int(parts[5]) + ifree = int(parts[6]) + total_inodes = iused + ifree + + # Skip inode check for exFAT or similar filesystems + if total_inodes <= 1: + logger.info("Filesystem appears to be exFAT or similar (no real inode tracking). Skipping inode check.") + return None + + logger.info(f"Inode usage: {iused:,}/{total_inodes:,} ({inode_usage_pct}%)") + + if inode_usage_pct >= 100: + logger.critical("CRITICAL: Inode usage is at 100%! Cannot continue processing.") + logger.critical("Please free up inodes before continuing.") + sys.exit(1) + elif inode_usage_pct > 90: + logger.warning(f"WARNING: High inode usage ({inode_usage_pct}%)!") + + return inode_usage_pct + except (ValueError, IndexError) as e: + logger.error(f"Error parsing inode usage: {str(e)}") + + return None + + +def get_evaluated_track_count(model_name, museval_results): + """Get the number of tracks evaluated for a specific model""" + if model_name in museval_results: + return len(museval_results[model_name]) + return 0 + + +def get_most_evaluated_tracks(museval_results, min_count=10): + """Get tracks that have been evaluated for the most models""" + track_counts = {} + + # Count how many models have evaluated each track + for model_name, tracks in museval_results.items(): + for track_name in tracks: + if track_name not in track_counts: + track_counts[track_name] = 0 + track_counts[track_name] += 1 + + # Sort tracks by evaluation count (descending) + sorted_tracks = sorted(track_counts.items(), key=lambda x: x[1], reverse=True) + + # Return tracks that have been evaluated at least min_count times + return [track for track, count in sorted_tracks if count >= min_count] + + +def generate_summary_statistics( + start_time, models_processed, tracks_processed, models_with_new_data, tracks_evaluated, total_processing_time, fastest_model=None, slowest_model=None, combined_results_path=None, is_dry_run=False +): + """Generate a summary of the script's execution""" + end_time = time.time() + total_runtime = end_time - start_time + + # Format the runtime + hours, remainder = divmod(total_runtime, 3600) + minutes, seconds = divmod(remainder, 60) + runtime_str = f"{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}" + + # Build the summary + summary = [ + "=" * 80, + "DRY RUN SUMMARY - PREVIEW ONLY" if is_dry_run else "EXECUTION SUMMARY", + "=" * 80, + f"Total runtime: {runtime_str}", + f"Models {'that would be' if is_dry_run else ''} processed: {models_processed}", + f"Models {'that would receive' if is_dry_run else 'with'} new data: {len(models_with_new_data)}", + f"Total tracks {'that would be' if is_dry_run else ''} evaluated: {tracks_evaluated}", + f"Average tracks per model: {tracks_evaluated / len(models_with_new_data) if models_with_new_data else 0:.2f}", + ] + + if fastest_model: + summary.append(f"Fastest model: {fastest_model['name']} ({fastest_model['speed']:.2f} seconds per minute)") + + if slowest_model: + summary.append(f"Slowest model: {slowest_model['name']} ({slowest_model['speed']:.2f} seconds per minute)") + + if total_processing_time > 0: + summary.append(f"Total audio processing time: {total_processing_time:.2f} seconds") + + if combined_results_path and os.path.exists(combined_results_path): + file_size = os.path.getsize(combined_results_path) / (1024 * 1024) # Size in MB + summary.append(f"Results file size: {file_size:.2f} MB") + + # Add models with new data + if models_with_new_data: + summary.append(f"\nModels {'that would receive' if is_dry_run else 'with'} new evaluation data:") + for model_name in models_with_new_data: + summary.append(f"- {model_name}") + + # Add dry run disclaimer if needed + if is_dry_run: + summary.append("\nNOTE: This is a dry run summary. No actual changes were made.") + summary.append("Run without --dry-run to perform actual evaluations.") + + summary.append("=" * 80) + return "\n".join(summary) + + +def check_stop_signal(): + """Check if the stop signal file exists""" + if os.path.exists(STOP_SIGNAL_PATH): + logger.info("Stop signal detected at: " + STOP_SIGNAL_PATH) + return True + return False + + +def main(): + # Add command line argument parsing for dry run mode + parser = argparse.ArgumentParser(description="Run model evaluation on MUSDB18 dataset") + parser.add_argument("--dry-run", action="store_true", help="Run in dry-run mode (no writes)") + parser.add_argument("--max-tracks", type=int, default=10, help="Maximum number of tracks to evaluate per model") + parser.add_argument("--max-models", type=int, default=None, help="Maximum number of models to evaluate") + args = parser.parse_args() + + # Remove any existing stop signal file at start + if os.path.exists(STOP_SIGNAL_PATH): + os.remove(STOP_SIGNAL_PATH) + logger.info("Removed existing stop signal file") + + # Track start time for progress reporting + start_time = time.time() + + # Statistics tracking + models_processed = 0 + tracks_processed = 0 + models_with_new_data = set() + total_processing_time = 0 + fastest_model = {"name": "", "speed": float("inf")} # Initialize with infinity for comparison + slowest_model = {"name": "", "speed": 0} # Initialize with zero for comparison + + # Create a results cache manager + class ResultsCache: + def __init__(self): + self.results = load_combined_results() + self.last_update_time = time.time() + + def get_results(self, force=False): + current_time = time.time() + # Only reload from disk every 5 minutes unless forced + if force or (current_time - self.last_update_time) > 300: + self.results = load_combined_results() + self.last_update_time = current_time + return self.results + + results_cache = ResultsCache() + + # Helper function for logging with elapsed time + def log_with_time(message, level=logging.INFO): + elapsed = time.time() - start_time + hours, remainder = divmod(elapsed, 3600) + minutes, seconds = divmod(remainder, 60) + time_str = f"{int(hours):02d}:{int(minutes):02d}:{int(seconds):02d}" + logger.log(level, f"[{time_str}] {message}") + + if args.dry_run: + log_with_time("*** RUNNING IN DRY-RUN MODE - NO DATA WILL BE MODIFIED ***") + + log_with_time("Starting model evaluation script...") + os.makedirs(RESULTS_PATH, exist_ok=True) + + # Check disk space and inode usage at start + check_disk_usage(RESULTS_PATH) + + # Load existing results if available + combined_results = {} + if os.path.exists(COMBINED_RESULTS_PATH): + log_with_time("Loading existing combined results...") + with open(COMBINED_RESULTS_PATH) as f: + combined_results = json.load(f) + + # Get initial museval results + museval_results = results_cache.get_results() + log_with_time(f"Loaded combined museval results with {len(museval_results)} models") + + # Get the most commonly evaluated tracks + common_tracks = get_most_evaluated_tracks(museval_results) + log_with_time(f"Found {len(common_tracks)} commonly evaluated tracks") + + # Initialize MUSDB + log_with_time("Initializing MUSDB database...") + mus = musdb.DB(root=MUSDB_PATH, is_wav=True) + + # Create a prioritized list of tracks + all_tracks = [] + for track in mus.tracks: + # Check if this is a commonly evaluated track + is_common = track.name in common_tracks + all_tracks.append({"name": track.name, "path": os.path.dirname(track.path), "is_common": is_common}) + + # Sort tracks by whether they're commonly evaluated + all_tracks.sort(key=lambda t: 0 if t["is_common"] else 1) + + # Get list of all available models + log_with_time("Getting list of available models...") + separator = Separator() + models_by_type = separator.list_supported_model_files() + + # Flatten the models list and prioritize them + all_models = [] + for model_type, models in models_by_type.items(): + for model_name, model_info in models.items(): + filename = model_info.get("filename") + if filename: + # Count how many tracks have been evaluated for this model + evaluated_count = get_evaluated_track_count(filename, museval_results) + + # Determine if this is a roformer model + is_roformer = "roformer" in model_name.lower() + + # Add to the list with priority information + all_models.append({"name": model_name, "filename": filename, "type": model_type, "info": model_info, "evaluated_count": evaluated_count, "is_roformer": is_roformer}) + + # Sort models by priority: + # 1. Roformer models with fewer than max_tracks evaluations + # 2. Other models with fewer than max_tracks evaluations + # 3. Roformer models with more evaluations + # 4. Other models with more evaluations + all_models.sort( + key=lambda m: ( + 0 if m["is_roformer"] and m["evaluated_count"] < args.max_tracks else 1 if not m["is_roformer"] and m["evaluated_count"] < args.max_tracks else 2 if m["is_roformer"] else 3, + m["evaluated_count"], # Secondary sort by number of evaluations (ascending) + ) + ) + + # Log the prioritized models + log_with_time(f"Prioritized {len(all_models)} models for evaluation:") + for i, model in enumerate(all_models[:10]): # Show top 10 + log_with_time(f"{i+1}. {model['name']} ({model['filename']}) - {model['evaluated_count']} tracks evaluated, roformer: {model['is_roformer']}") + + if len(all_models) > 10: + log_with_time(f"... and {len(all_models) - 10} more models") + + # Limit the number of models if specified + if args.max_models: + all_models = all_models[: args.max_models] + log_with_time(f"Limited to {args.max_models} models for this run") + + # Process models according to priority + model_idx = 0 + stop_requested = False + while model_idx < len(all_models): + # Check for stop signal before processing each model + if check_stop_signal(): + log_with_time("Stop signal detected. Will finish current model's tracks and then exit.") + stop_requested = True + + model = all_models[model_idx] + model_name = model["name"] + model_filename = model["filename"] + model_type = model["type"] + + progress_pct = (model_idx + 1) / len(all_models) * 100 + log_with_time(f"\n=== Processing model {model_idx+1}/{len(all_models)} ({progress_pct:.1f}%): {model_name} ({model_filename}) ===") + + # Initialize model entry if it doesn't exist + if model_filename not in combined_results: + log_with_time(f"Initializing new entry for {model_filename}") + combined_results[model_filename] = {"model_name": model_name, "track_scores": [], "median_scores": {}, "stems": [], "target_stem": None} + + # Try to load the model to get stem information + try: + separator.load_model(model_filename=model_filename) + model_data = separator.model_instance.model_data + + # Extract stem information (similar to your existing code) + # ... (keep your existing stem extraction logic here) + + except Exception as e: + log_with_time(f"Error loading model {model_filename}: {str(e)}", logging.ERROR) + logger.exception("Full exception details:") + model_idx += 1 + continue + + # Count how many tracks have been evaluated for this model + # Use the cached results + evaluated_count = get_evaluated_track_count(model_filename, results_cache.get_results()) + + # Determine how many more tracks to evaluate + tracks_to_evaluate = max(0, args.max_tracks - evaluated_count) + + if tracks_to_evaluate == 0: + log_with_time(f"Model {model_name} already has {evaluated_count} tracks evaluated (>= {args.max_tracks}). Skipping.") + model_idx += 1 + continue + + log_with_time(f"Will evaluate up to {tracks_to_evaluate} tracks for model {model_name}") + + # Process tracks for this model + tracks_processed = 0 + for track in all_tracks: + # Check for stop signal before each track if we haven't already detected it + if not stop_requested and check_stop_signal(): + log_with_time("Stop signal detected. Will finish current track and then exit.") + stop_requested = True + + # Skip if we've processed enough tracks for this model + if tracks_processed >= tracks_to_evaluate: + break + + track_name = track["name"] + track_path = track["path"] + + # Skip if track already evaluated for this model + # Use the cached results + if model_filename in results_cache.get_results() and track_name in results_cache.get_results()[model_filename]: + log_with_time(f"Skipping already evaluated track {track_name} for model: {model_filename}") + continue + + log_with_time(f"Processing track: {track_name} for model: {model_filename}") + + if args.dry_run: + log_with_time(f"[DRY RUN] Would evaluate track {track_name} with model {model_filename}") + tracks_processed += 1 + models_with_new_data.add(model_filename) + + # Estimate processing time based on model type for dry run + # This is a rough estimate - roformer models are typically slower + estimated_speed = 30.0 # Default estimate: 30 seconds per minute + if "roformer" in model_name.lower(): + estimated_speed = 45.0 # Roformer models are typically slower + elif "umx" in model_name.lower(): + estimated_speed = 20.0 # UMX models are typically faster + + # Update statistics with estimated values + total_processing_time += estimated_speed + + # Track fastest and slowest models based on estimates + if estimated_speed < fastest_model["speed"]: + fastest_model = {"name": model_name, "speed": estimated_speed} + if estimated_speed > slowest_model["speed"]: + slowest_model = {"name": model_name, "speed": estimated_speed} + + continue + + try: + result = evaluate_track(track_name, track_path, model_filename, mus) + + # Unpack the result safely + if result and isinstance(result, tuple) and len(result) == 2: + _, model_results = result + else: + model_results = None + + # Process the results if they exist and are valid + if model_results is not None and isinstance(model_results, dict): + combined_results[model_filename]["track_scores"].append(model_results) + tracks_processed += 1 + models_with_new_data.add(model_filename) + + # Track processing time statistics - safely access nested dictionaries + scores = model_results.get("scores", {}) + if isinstance(scores, dict): + speed = scores.get("seconds_per_minute_m3") + if speed is not None: + total_processing_time += speed # Accumulate total processing time + + # Track fastest and slowest models + if speed < fastest_model["speed"]: + fastest_model = {"name": model_name, "speed": speed} + if speed > slowest_model["speed"]: + slowest_model = {"name": model_name, "speed": speed} + else: + log_with_time(f"Skipping model {model_filename} for track {track_name} due to no evaluatable stems or invalid results") + except Exception as e: + log_with_time(f"Error evaluating model {model_filename} with track {track_name}: {str(e)}", logging.ERROR) + logger.exception(f"Exception details: ", exc_info=e) + continue + + # Update and save results + if combined_results[model_filename]["track_scores"]: + median_scores = calculate_median_scores(combined_results[model_filename]["track_scores"]) + combined_results[model_filename]["median_scores"] = median_scores + + # Save results after each track + if not args.dry_run: + os.makedirs(os.path.dirname(COMBINED_RESULTS_PATH), exist_ok=True) + with open(COMBINED_RESULTS_PATH, "w", encoding="utf-8") as f: + json.dump(combined_results, f, indent=2) + log_with_time(f"Updated combined results file with {model_filename} - {track_name}") + + # Force update the cache after saving + results_cache.get_results(force=True) + else: + log_with_time(f"[DRY RUN] Would have updated combined results for {model_filename} - {track_name}") + + # Check disk space periodically + check_disk_usage(RESULTS_PATH) + + log_with_time(f"Completed processing {tracks_processed} tracks for model {model_name}") + + # If stop was requested, exit after completing the current model + if stop_requested: + log_with_time("Stop signal processed. Generating final summary before exit.") + break + + # If we're processing a non-roformer model, check if there are roformer models that need evaluation + if not model["is_roformer"]: + # Find roformer models that still need more evaluations + # Use the cached results + roformer_models_needing_eval = [] + for i, m in enumerate(all_models[model_idx + 1 :], start=model_idx + 1): + if m["is_roformer"]: + eval_count = get_evaluated_track_count(m["filename"], results_cache.get_results()) + if eval_count < args.max_tracks: + roformer_models_needing_eval.append((i, m)) + + if roformer_models_needing_eval: + log_with_time(f"Found {len(roformer_models_needing_eval)} roformer models that still need evaluation. Reprioritizing...") + + # Move these models to the front of the remaining queue + for offset, (i, m) in enumerate(roformer_models_needing_eval): + # Adjust index for models we've already moved + adjusted_idx = i - offset + # Move this model right after the current one + all_models.insert(model_idx + 1, all_models.pop(adjusted_idx)) + + log_with_time("Reprioritization complete. Continuing with highest priority model.") + + # Move to the next model + model_idx += 1 + models_processed += 1 + + log_with_time("Evaluation complete") + # Final disk space check + check_disk_usage(RESULTS_PATH) + + # Generate and display summary statistics + # Reset fastest/slowest models if they weren't updated + if fastest_model["speed"] == float("inf"): + fastest_model = None + if slowest_model["speed"] == 0: + slowest_model = None + + summary = generate_summary_statistics( + start_time=start_time, + models_processed=models_processed, + tracks_processed=tracks_processed, + models_with_new_data=models_with_new_data, + tracks_evaluated=tracks_processed, + total_processing_time=total_processing_time, + fastest_model=fastest_model, + slowest_model=slowest_model, + combined_results_path=COMBINED_RESULTS_PATH, + is_dry_run=args.dry_run, + ) + + log_with_time("\n" + summary) + + # Also write summary to a log file + summary_filename = "dry_run_summary.log" if args.dry_run else "evaluation_summary.log" + if stop_requested: + summary_filename = "stopped_" + summary_filename + summary_log_path = os.path.join(os.path.dirname(COMBINED_RESULTS_PATH), summary_filename) + with open(summary_log_path, "w") as f: + f.write(f"{'Dry run' if args.dry_run else 'Evaluation'} {'(stopped early)' if stop_requested else ''} completed at: {time.strftime('%Y-%m-%d %H:%M:%S')}\n") + f.write(summary) + + log_with_time(f"Summary written to {summary_log_path}") + + # Clean up stop signal file if it exists + if os.path.exists(STOP_SIGNAL_PATH): + os.remove(STOP_SIGNAL_PATH) + log_with_time("Removed stop signal file") + + return 0 if not stop_requested else 2 # Return different exit code if stopped early + + +if __name__ == "__main__": + exit(main()) diff --git a/tests/unit/test_cli.py b/tests/unit/test_cli.py new file mode 100644 index 0000000000000000000000000000000000000000..6589545a4bca094b31d72913fa238de80f5f61ac --- /dev/null +++ b/tests/unit/test_cli.py @@ -0,0 +1,283 @@ +import json +import pytest +import logging +from audio_separator.utils.cli import main +import subprocess +from unittest import mock +from unittest.mock import patch, MagicMock, mock_open + + +# Common fixture for expected arguments +@pytest.fixture +def common_expected_args(): + return { + "log_formatter": mock.ANY, + "log_level": logging.INFO, + "model_file_dir": "/tmp/audio-separator-models/", + "output_dir": None, + "output_format": "FLAC", + "output_bitrate": None, + "normalization_threshold": 0.9, + "amplification_threshold": 0.0, + "output_single_stem": None, + "invert_using_spec": False, + "sample_rate": 44100, + "use_autocast": False, + "use_soundfile": False, + "mdx_params": {"hop_length": 1024, "segment_size": 256, "overlap": 0.25, "batch_size": 1, "enable_denoise": False}, + "vr_params": {"batch_size": 1, "window_size": 512, "aggression": 5, "enable_tta": False, "enable_post_process": False, "post_process_threshold": 0.2, "high_end_process": False}, + "demucs_params": {"segment_size": "Default", "shifts": 2, "overlap": 0.25, "segments_enabled": True}, + "mdxc_params": {"segment_size": 256, "batch_size": 1, "overlap": 8, "override_model_segment_size": False, "pitch_shift": 0}, + } + + +# Test the CLI with version argument using subprocess +def test_cli_version_subprocess(): + # Run the CLI script with the '--version' argument + result = subprocess.run(["poetry", "run", "audio-separator", "--version"], capture_output=True, text=True) + assert result.returncode == 0 + assert "audio-separator" in result.stdout + + # Test with the short version flag '-v' + result = subprocess.run(["poetry", "run", "audio-separator", "-v"], capture_output=True, text=True) + assert result.returncode == 0 + assert "audio-separator" in result.stdout + + +# Test the CLI with no arguments +def test_cli_no_args(capsys): + result = subprocess.run(["poetry", "run", "audio-separator"], capture_output=True, text=True) + assert result.returncode == 1 + assert "usage:" in result.stdout + + +# Test with multiple filename arguments +def test_cli_multiple_filenames(): + test_args = ["cli.py", "test1.mp3", "test2.mp3"] + + # Mock the open function to prevent actual file operations + mock_file = mock_open() + + # Create a mock logger + mock_logger = MagicMock() + + # Patch multiple functions to prevent actual file operations and separations + with patch("sys.argv", test_args), patch("builtins.open", mock_file), patch("audio_separator.separator.Separator.separate") as mock_separate, patch( + "audio_separator.separator.Separator.load_model" + ), patch("logging.getLogger", return_value=mock_logger): + + # Mock the separate method to return some dummy output + mock_separate.return_value = ["output_file1.mp3", "output_file2.mp3"] + + # Call the main function + main() + + # Check if separate was called twice (once for each input file) + assert mock_separate.call_count == 2 + + # Check if the logger captured information about both files + log_messages = [call[0][0] for call in mock_logger.info.call_args_list] + assert any("test1.mp3" in msg and "test2.mp3" in msg for msg in log_messages) + assert any("Separation complete" in msg for msg in log_messages) + + +# Test the CLI with a specific audio file +def test_cli_with_audio_file(capsys, common_expected_args): + test_args = ["cli.py", "test_audio.mp3", "--model_filename=UVR-MDX-NET-Inst_HQ_4.onnx"] + with patch("audio_separator.separator.Separator.separate") as mock_separate: + mock_separate.return_value = ["output_file.mp3"] + with patch("sys.argv", test_args): + # Call the main function in cli.py + main() + + # Update expected args for this specific test + common_expected_args["model_file_dir"] = "/tmp/audio-separator-models/" + + # Check if the separate method was called with the correct arguments + mock_separate.assert_called_once() + + # Assertions + assert mock_separate.called + + +# Test the CLI with invalid log level +def test_cli_invalid_log_level(): + test_args = ["cli.py", "test_audio.mp3", "--log_level=invalid"] + with patch("sys.argv", test_args): + # Assert an attribute error is raised due to the invalid LogLevel + with pytest.raises(AttributeError): + # Call the main function in cli.py + main() + + +# Test using model name argument +def test_cli_model_filename_argument(common_expected_args): + test_args = ["cli.py", "test_audio.mp3", "--model_filename=Custom_Model.onnx"] + with patch("sys.argv", test_args): + with patch("audio_separator.separator.Separator") as mock_separator: + mock_separator_instance = mock_separator.return_value + mock_separator_instance.separate.return_value = ["output_file.mp3"] + main() + + # Assertions + mock_separator.assert_called_once_with(**common_expected_args) + mock_separator_instance.load_model.assert_called_once_with(model_filename="Custom_Model.onnx") + + +# Test using output directory argument +def test_cli_output_dir_argument(common_expected_args): + test_args = ["cli.py", "test_audio.mp3", "--output_dir=/custom/output/dir"] + with patch("sys.argv", test_args): + with patch("audio_separator.separator.Separator") as mock_separator: + mock_separator_instance = mock_separator.return_value + mock_separator_instance.separate.return_value = ["output_file.mp3"] + main() + + # Update expected args for this specific test + expected_args = common_expected_args.copy() + expected_args["output_dir"] = "/custom/output/dir" + + # Assertions + mock_separator.assert_called_once_with(**expected_args) + + +# Test using output format argument +def test_cli_output_format_argument(common_expected_args): + test_args = ["cli.py", "test_audio.mp3", "--output_format=MP3"] + with patch("sys.argv", test_args): + with patch("audio_separator.separator.Separator") as mock_separator: + mock_separator_instance = mock_separator.return_value + mock_separator_instance.separate.return_value = ["output_file.mp3"] + main() + + # Update expected args for this specific test + expected_args = common_expected_args.copy() + expected_args["output_format"] = "MP3" + + # Assertions + mock_separator.assert_called_once_with(**expected_args) + + +# Test using normalization_threshold argument +def test_cli_normalization_threshold_argument(common_expected_args): + test_args = ["cli.py", "test_audio.mp3", "--normalization=0.75"] + with patch("sys.argv", test_args): + with patch("audio_separator.separator.Separator") as mock_separator: + mock_separator_instance = mock_separator.return_value + mock_separator_instance.separate.return_value = ["output_file.mp3"] + main() + + # Update expected args for this specific test + expected_args = common_expected_args.copy() + expected_args["normalization_threshold"] = 0.75 + + # Assertions + mock_separator.assert_called_once_with(**expected_args) + + +# Test using amplification_threshold argument +def test_cli_amplification_threshold_argument(common_expected_args): + test_args = ["cli.py", "test_audio.mp3", "--amplification=0.75"] + with patch("sys.argv", test_args): + with patch("audio_separator.separator.Separator") as mock_separator: + mock_separator_instance = mock_separator.return_value + mock_separator_instance.separate.return_value = ["output_file.mp3"] + main() + + # Update expected args for this specific test + expected_args = common_expected_args.copy() + expected_args["amplification_threshold"] = 0.75 + + # Assertions + mock_separator.assert_called_once_with(**expected_args) + + +# Test using single stem argument +def test_cli_single_stem_argument(common_expected_args): + test_args = ["cli.py", "test_audio.mp3", "--single_stem=instrumental"] + with patch("sys.argv", test_args): + with patch("audio_separator.separator.Separator") as mock_separator: + mock_separator_instance = mock_separator.return_value + mock_separator_instance.separate.return_value = ["output_file.mp3"] + main() + + # Update expected args for this specific test + expected_args = common_expected_args.copy() + expected_args["output_single_stem"] = "instrumental" + + # Assertions + mock_separator.assert_called_once_with(**expected_args) + + +# Test using invert spectrogram argument +def test_cli_invert_spectrogram_argument(common_expected_args): + test_args = ["cli.py", "test_audio.mp3", "--invert_spect"] + with patch("sys.argv", test_args): + with patch("audio_separator.separator.Separator") as mock_separator: + mock_separator_instance = mock_separator.return_value + mock_separator_instance.separate.return_value = ["output_file.mp3"] + main() + + # Update expected args for this specific test + expected_args = common_expected_args.copy() + expected_args["invert_using_spec"] = True + + # Assertions + mock_separator.assert_called_once_with(**expected_args) + + +# Test using use_autocast argument +def test_cli_use_autocast_argument(common_expected_args): + test_args = ["cli.py", "test_audio.mp3", "--use_autocast"] + with patch("sys.argv", test_args): + with patch("audio_separator.separator.Separator") as mock_separator: + mock_separator_instance = mock_separator.return_value + mock_separator_instance.separate.return_value = ["output_file.mp3"] + main() + + # Update expected args for this specific test + expected_args = common_expected_args.copy() + expected_args["use_autocast"] = True + + # Assertions + mock_separator.assert_called_once_with(**expected_args) + + +# Test using custom_output_names arguments +def test_cli_custom_output_names_argument(common_expected_args): + custom_names = { + "Vocals": "vocals_output", + "Instrumental": "instrumental_output", + } + test_args = ["cli.py", "test_audio.mp3", f"--custom_output_names={json.dumps(custom_names)}"] + with patch("sys.argv", test_args): + with patch("audio_separator.separator.Separator") as mock_separator: + mock_separator_instance = mock_separator.return_value + mock_separator_instance.separate.return_value = ["output_file.mp3"] + main() + + # Assertions + mock_separator.assert_called_once_with(**common_expected_args) + mock_separator_instance.separate.assert_called_once_with("test_audio.mp3", custom_output_names=custom_names) + + +# Test using custom_output_names arguments +def test_cli_demucs_output_names_argument(common_expected_args): + demucs_output_names = { + "Vocals": "vocals_output", + "Drums": "drums_output", + "Bass": "bass_output", + "Other": "other_output", + "Guitar": "guitar_output", + "Piano": "piano_output" + } + test_args = ["cli.py", "test_audio.mp3", f"--custom_output_names={json.dumps(demucs_output_names)}", "--model_filename=htdemucs_6s.yaml"] + with patch("sys.argv", test_args): + with patch("audio_separator.separator.Separator") as mock_separator: + mock_separator_instance = mock_separator.return_value + mock_separator_instance.separate.return_value = ["output_file.mp3"] + main() + + # Assertions + mock_separator.assert_called_once_with(**common_expected_args) + mock_separator_instance.separate.assert_called_once_with("test_audio.mp3", custom_output_names=demucs_output_names) diff --git a/tests/unit/test_stft.py b/tests/unit/test_stft.py new file mode 100644 index 0000000000000000000000000000000000000000..bc1fc978f61ab1bd7d5f04d56e5cb55f1351886f --- /dev/null +++ b/tests/unit/test_stft.py @@ -0,0 +1,166 @@ +import unittest +import numpy as np +import torch +from unittest.mock import Mock +from audio_separator.separator.uvr_lib_v5.stft import STFT + +# Short-Time Fourier Transform (STFT) Process Overview: +# +# STFT transforms a time-domain signal into a frequency-domain representation. +# This transformation is achieved by dividing the signal into short frames (or segments) and applying the Fourier Transform to each frame. +# +# n_fft: The number of points used in the Fourier Transform, which determines the resolution of the frequency domain representation. +# Essentially, it dictates how many frequency bins we get in our STFT. +# +# hop_length: The number of samples by which we shift each frame of the signal. +# It affects the overlap between consecutive frames. If the hop_length is less than n_fft, we get overlapping frames. +# +# Windowing: Each frame of the signal is multiplied by a window function (e.g. Hann window) before applying the Fourier Transform. +# This is done to minimize discontinuities at the borders of each frame. + + +class TestSTFT(unittest.TestCase): + def setUp(self): + self.n_fft = 2048 + self.hop_length = 512 + self.dim_f = 1025 + self.device = torch.device("cpu") + self.stft = STFT(logger=Mock(), n_fft=self.n_fft, hop_length=self.hop_length, dim_f=self.dim_f, device=self.device) + + def create_mock_tensor(self, shape, device=None): + tensor = torch.rand(shape) + if device: + tensor = tensor.to(device) + return tensor + + def test_stft_initialization(self): + self.assertEqual(self.stft.n_fft, self.n_fft) + self.assertEqual(self.stft.hop_length, self.hop_length) + self.assertEqual(self.stft.dim_f, self.dim_f) + self.assertEqual(self.stft.device.type, "cpu") + self.assertIsInstance(self.stft.hann_window, torch.Tensor) + + def test_stft_call(self): + input_tensor = self.create_mock_tensor((1, 16000)) + + # Apply STFT + stft_result = self.stft(input_tensor) + + # Test conditions + self.assertIsNotNone(stft_result) + self.assertIsInstance(stft_result, torch.Tensor) + + # Calculate the expected shape based on input parameters: + + # Frequency Dimension (dim_f): This corresponds to the number of frequency bins in the STFT output. + # In the case of a real-valued input signal (like audio), the Fourier Transform produces a symmetric output. + # Hence, for an n_fft of 2048, we would typically get 2049 frequency bins (from 0 Hz to the Nyquist frequency). + # However, we often don't need the full symmetric spectrum. + # So, dim_f is used to specify how many frequency bins we are interested in. + # In this test, it's set to 1025, which is about half of n_fft + 1 (as the Fourier Transform of a real-valued signal is symmetric). + + # Time Dimension: This corresponds to how many frames (or segments) the input signal has been divided into. + # It depends on the length of the input signal and the hop_length. + # The formula for calculating the number of frames is derived from how we stride the window across the signal: + # Length of Input Signal: Let's denote it as L. In this test, the input tensor has a shape of [1, 16000], so L is 16000 (ignoring the batch dimension for simplicity). + # Number of Frames: The number of frames depends on how we stride the window across the signal. For each frame, we move the window by hop_length samples. + # Therefore, the number of frames N_frames can be roughly estimated by dividing the length of the signal by the hop_length. + # However, since the window overlaps the signal, we add an extra frame to account for the last segment of the signal. This gives us N_frames = (L // hop_length) + 1. + + # Putting It All Together + # expected_shape thus becomes (dim_f, N_frames), which is (1025, (16000 // 512) + 1) in this test case. + + expected_shape = (self.dim_f, (input_tensor.shape[1] // self.hop_length) + 1) + + self.assertEqual(stft_result.shape[-2:], expected_shape) + + def test_calculate_inverse_dimensions(self): + # Create a sample input tensor + sample_input = torch.randn(1, 2, 500, 32) # Batch, Channel, Frequency, Time dimensions + batch_dims, channel_dim, freq_dim, time_dim, num_freq_bins = self.stft.calculate_inverse_dimensions(sample_input) + + # Expected values + expected_num_freq_bins = self.n_fft // 2 + 1 + + # Assertions + self.assertEqual(batch_dims, sample_input.shape[:-3]) + self.assertEqual(channel_dim, 2) + self.assertEqual(freq_dim, 500) + self.assertEqual(time_dim, 32) + self.assertEqual(num_freq_bins, expected_num_freq_bins) + + def test_pad_frequency_dimension(self): + # Create a sample input tensor + sample_input = torch.randn(1, 2, 500, 32) # Batch, Channel, Frequency, Time dimensions + batch_dims, channel_dim, freq_dim, time_dim, num_freq_bins = self.stft.calculate_inverse_dimensions(sample_input) + + # Apply padding + padded_output = self.stft.pad_frequency_dimension(sample_input, batch_dims, channel_dim, freq_dim, time_dim, num_freq_bins) + + # Expected frequency dimension after padding + expected_freq_dim = num_freq_bins + + # Assertions + self.assertEqual(padded_output.shape[-2], expected_freq_dim) + + def test_prepare_for_istft(self): + # Create a sample input tensor + sample_input = torch.randn(1, 2, 500, 32) # Batch, Channel, Frequency, Time dimensions + batch_dims, channel_dim, freq_dim, time_dim, num_freq_bins = self.stft.calculate_inverse_dimensions(sample_input) + padded_output = self.stft.pad_frequency_dimension(sample_input, batch_dims, channel_dim, freq_dim, time_dim, num_freq_bins) + + # Apply prepare_for_istft + complex_tensor = self.stft.prepare_for_istft(padded_output, batch_dims, channel_dim, num_freq_bins, time_dim) + + # Calculate the expected flattened batch size (flattening batch and channel dimensions) + expected_flattened_batch_size = batch_dims[0] * (channel_dim // 2) + + # Expected shape of the complex tensor + expected_shape = (expected_flattened_batch_size, num_freq_bins, time_dim) + + # Assertions + self.assertEqual(complex_tensor.shape, expected_shape) + + def test_inverse_stft(self): + # Create a mock tensor with the correct input shape + input_tensor = torch.rand(1, 2, 1025, 32) # shape matching output of STFT + + # Apply inverse STFT + output_tensor = self.stft.inverse(input_tensor) + + # Check if the output tensor is on the CPU + self.assertEqual(output_tensor.device.type, "cpu") + + # Expected output shape: (Batch size, Channel dimension, Time dimension) + expected_shape = (1, 2, 7936) # Calculated based on STFT parameters + + # Check if the output tensor has the expected shape + self.assertEqual(output_tensor.shape, expected_shape) + + @unittest.skipIf(not torch.backends.mps.is_available(), "MPS not available") + def test_stft_with_mps_device(self): + mps_device = torch.device("mps") + self.stft.device = mps_device + input_tensor = self.create_mock_tensor((1, 16000), device=mps_device) + stft_result = self.stft(input_tensor) + self.assertIsNotNone(stft_result) + self.assertIsInstance(stft_result, torch.Tensor) + + @unittest.skipIf(not torch.backends.mps.is_available(), "MPS not available") + def test_inverse_with_mps_device(self): + mps_device = torch.device("mps") + self.stft.device = mps_device + input_tensor = self.create_mock_tensor((1, 2, 1025, 32), device=mps_device) + istft_result = self.stft.inverse(input_tensor) + self.assertIsNotNone(istft_result) + self.assertIsInstance(istft_result, torch.Tensor) + + +# Mock logger to use in tests +class MockLogger: + def debug(self, message): + pass + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/utils.py b/tests/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..17c4f26965db60ad72b524d14f637e19c89eacdd --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,189 @@ +import os +import numpy as np +import librosa +import librosa.display +import matplotlib.pyplot as plt +from PIL import Image +from io import BytesIO +import soundfile as sf +from pathlib import Path +from skimage.metrics import structural_similarity as ssim + + +def generate_waveform_image(audio_path, output_path=None, fig_size=(10, 4)): + """Generate a waveform image from an audio file. + + Args: + audio_path: Path to the audio file + output_path: Path to save the generated image (optional) + fig_size: Size of the figure (width, height) + + Returns: + BytesIO object containing the image if output_path is None, otherwise saves to output_path + """ + # Load audio file + y, sr = librosa.load(audio_path, sr=None, mono=False) + + # If mono, convert to stereo-like format for consistent plotting + if y.ndim == 1: + y = np.array([y, y]) + + plt.figure(figsize=fig_size) + + # Plot waveform for each channel with fixed Y-axis scale + plt.subplot(2, 1, 1) + plt.plot(y[0]) + plt.title('Channel 1') + plt.ylim([-1.0, 1.0]) # Fixed Y-axis scale for all waveforms + + plt.subplot(2, 1, 2) + plt.plot(y[1]) + plt.title('Channel 2') + plt.ylim([-1.0, 1.0]) # Fixed Y-axis scale for all waveforms + + plt.tight_layout() + + if output_path: + plt.savefig(output_path) + plt.close() + return output_path + else: + buf = BytesIO() + plt.savefig(buf, format='png') + plt.close() + buf.seek(0) + return buf + + +def generate_spectrogram_image(audio_path, output_path=None, fig_size=(10, 8)): + """Generate a spectrogram image from an audio file. + + Args: + audio_path: Path to the audio file + output_path: Path to save the generated image (optional) + fig_size: Size of the figure (width, height) + + Returns: + BytesIO object containing the image if output_path is None, otherwise saves to output_path + """ + # Load audio file + y, sr = librosa.load(audio_path, sr=None, mono=False) + + # If mono, convert to stereo-like format for consistent plotting + if y.ndim == 1: + y = np.array([y, y]) + + plt.figure(figsize=fig_size) + + # Set fixed min and max values for spectrogram color scale + vmin = -80 # dB + vmax = 0 # dB + + # Generate spectrograms for each channel + for i in range(2): + # Compute spectrogram + S = librosa.amplitude_to_db(np.abs(librosa.stft(y[i])), ref=np.max) + + plt.subplot(2, 1, i+1) + # Use fixed frequency range and consistent color scaling + librosa.display.specshow( + S, + sr=sr, + x_axis='time', + y_axis='log', + vmin=vmin, + vmax=vmax + ) + plt.colorbar(format='%+2.0f dB') + plt.title(f'Channel {i+1} Spectrogram') + + # Set frequency range (y-axis) - typically up to Nyquist frequency (sr/2) + plt.ylim([20, sr/2]) # From 20Hz to Nyquist frequency + + plt.tight_layout() + + if output_path: + plt.savefig(output_path) + plt.close() + return output_path + else: + buf = BytesIO() + plt.savefig(buf, format='png') + plt.close() + buf.seek(0) + return buf + + +def compare_images(image1_path, image2_path, min_similarity_threshold=0.999): + """Compare two images using Structural Similarity Index (SSIM) which is robust to small shifts. + + Args: + image1_path: Path to the first image + image2_path: Path to the second image + min_similarity_threshold: Minimum similarity required for images to be considered matching (0.0-1.0) + - Higher values (closer to 1.0) require images to be more similar + - Lower values (closer to 0.0) are more permissive + - A value of 0.99 requires 99% similarity between images + - A value of 0.0 would consider any images to match + + Returns: + Tuple of (similarity_score, is_match) + - similarity_score: Value between 0.0 and 1.0, where 1.0 means identical images + - is_match: Boolean indicating if similarity_score >= min_similarity_threshold + """ + # Open images + img1 = Image.open(image1_path).convert('RGB') + img2 = Image.open(image2_path).convert('RGB') + + # Ensure same size for comparison + if img1.size != img2.size: + img2 = img2.resize(img1.size) + + # Convert to numpy arrays + arr1 = np.array(img1) + arr2 = np.array(img2) + + # Calculate SSIM for each color channel + similarity_scores = [] + for channel in range(3): # RGB channels + score = ssim(arr1[:,:,channel], arr2[:,:,channel], data_range=255) + similarity_scores.append(score) + + # Calculate average SSIM across channels + similarity_score = np.mean(similarity_scores) + + # Determine if images match by comparing similarity to threshold + is_match = similarity_score >= min_similarity_threshold + + return (similarity_score, is_match) + + +def generate_reference_images(input_path, output_dir=None, prefix=""): + """Generate reference waveform and spectrogram images for an audio file. + + Args: + input_path: Path to the audio file + output_dir: Directory to save the generated images (optional) + prefix: Prefix to add to the output image filenames + + Returns: + Tuple of (waveform_path, spectrogram_path) + """ + if output_dir is None: + output_dir = os.path.dirname(input_path) + + # Create output directory if it doesn't exist + os.makedirs(output_dir, exist_ok=True) + + input_filename = os.path.basename(input_path) + name_without_ext = os.path.splitext(input_filename)[0] + + # Generate waveform image + waveform_path = os.path.join(output_dir, f"{prefix}{name_without_ext}_waveform.png") + generate_waveform_image(input_path, waveform_path) + + # Generate spectrogram image + spectrogram_path = os.path.join(output_dir, f"{prefix}{name_without_ext}_spectrogram.png") + generate_spectrogram_image(input_path, spectrogram_path) + + return (waveform_path, spectrogram_path) \ No newline at end of file diff --git a/tools/calculate-model-hashes.py b/tools/calculate-model-hashes.py new file mode 100644 index 0000000000000000000000000000000000000000..0887c3616b4c8919cd04f0c68e36e2f0c8d19d6a --- /dev/null +++ b/tools/calculate-model-hashes.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 + +import os +import sys +import json +import hashlib +import requests + +MODEL_CACHE_PATH = "/tmp/audio-separator-models" +VR_MODEL_DATA_LOCAL_PATH = f"{MODEL_CACHE_PATH}/vr_model_data.json" +MDX_MODEL_DATA_LOCAL_PATH = f"{MODEL_CACHE_PATH}/mdx_model_data.json" + +MODEL_DATA_URL_PREFIX = "https://raw.githubusercontent.com/TRvlvr/application_data/main" +VR_MODEL_DATA_URL = f"{MODEL_DATA_URL_PREFIX}/vr_model_data/model_data_new.json" +MDX_MODEL_DATA_URL = f"{MODEL_DATA_URL_PREFIX}/mdx_model_data/model_data_new.json" + +OUTPUT_PATH = f"{MODEL_CACHE_PATH}/model_hashes.json" + + +def get_model_hash(model_path): + """ + Get the hash of a model file + """ + # print(f"Getting hash for model at {model_path}") + try: + with open(model_path, "rb") as f: + f.seek(-10000 * 1024, 2) # Move the file pointer 10MB before the end of the file + hash_result = hashlib.md5(f.read()).hexdigest() + # print(f"Hash for {model_path}: {hash_result}") + return hash_result + except IOError: + with open(model_path, "rb") as f: + hash_result = hashlib.md5(f.read()).hexdigest() + # print(f"IOError encountered, hash for {model_path}: {hash_result}") + return hash_result + + +def download_file_if_missing(url, local_path): + """ + Download a file from a URL if it doesn't exist locally + """ + print(f"Checking if {local_path} needs to be downloaded from {url}") + if not os.path.exists(local_path): + print(f"Downloading {url} to {local_path}") + with requests.get(url, stream=True, timeout=10) as r: + r.raise_for_status() + with open(local_path, "wb") as f: + for chunk in r.iter_content(chunk_size=8192): + f.write(chunk) + print(f"Downloaded {url} to {local_path}") + else: + print(f"{local_path} already exists. Skipping download.") + + +def load_json_data(file_path): + """ + Load JSON data from a file + """ + print(f"Loading JSON data from {file_path}") + try: + with open(file_path, "r", encoding="utf-8") as file: + data = json.load(file) + print(f"Loaded JSON data successfully from {file_path}") + return data + except FileNotFoundError: + print(f"{file_path} not found.") + sys.exit(1) + + +def iterate_and_hash(directory): + """ + Iterate through a directory and hash all model files + """ + print(f"Iterating through directory {directory} to hash model files") + model_files = [(file, os.path.join(root, file)) for root, _, files in os.walk(directory) for file in files if file.endswith((".pth", ".onnx"))] + + download_file_if_missing(VR_MODEL_DATA_URL, VR_MODEL_DATA_LOCAL_PATH) + download_file_if_missing(MDX_MODEL_DATA_URL, MDX_MODEL_DATA_LOCAL_PATH) + + vr_model_data = load_json_data(VR_MODEL_DATA_LOCAL_PATH) + mdx_model_data = load_json_data(MDX_MODEL_DATA_LOCAL_PATH) + + combined_model_params = { + **vr_model_data, + **mdx_model_data, + } + + model_info_list = [] + for file, file_path in sorted(model_files): + file_hash = get_model_hash(file_path) + model_info = { + "file": file, + "hash": file_hash, + "params": combined_model_params.get(file_hash, "Parameters not found"), + } + model_info_list.append(model_info) + + print(f"Writing model info list to {OUTPUT_PATH}") + with open(OUTPUT_PATH, "w", encoding="utf-8") as json_file: + json.dump(model_info_list, json_file, indent=4) + print(f"Successfully wrote model info list to {OUTPUT_PATH}") + + +if __name__ == "__main__": + iterate_and_hash(MODEL_CACHE_PATH) diff --git a/tools/sync-to-github.py b/tools/sync-to-github.py new file mode 100644 index 0000000000000000000000000000000000000000..081596d483fff850d4fb15b4a662a3d705666a41 --- /dev/null +++ b/tools/sync-to-github.py @@ -0,0 +1,177 @@ +#! /usr/bin/env python3 +import os +import requests +import hashlib +from typing import List, Dict +import sys + +# Configuration +GITHUB_TOKEN = os.getenv("GITHUB_TOKEN", "").strip() # Add .strip() to remove whitespace +REPO_OWNER = "nomadkaraoke" +REPO_NAME = "python-audio-separator" +RELEASE_TAG = "model-configs" + +HEADERS = {"Authorization": f"Bearer {GITHUB_TOKEN}", "Accept": "application/vnd.github.v3+json"} + + +def debug_request(url: str, headers: dict, response: requests.Response): + """Debug helper to print request and response details.""" + print("\n=== Debug Information ===") + print(f"Request URL: {url}") + print(f"Request Headers: {headers}") + print(f"Response Status: {response.status_code}") + print(f"Response Headers: {dict(response.headers)}") + print(f"Response Body: {response.text[:500]}...") # First 500 chars of response + print("=======================\n") + + +def get_release_assets() -> List[Dict]: + """Get all assets from the specified release.""" + url = f"https://api.github.com/repos/{REPO_OWNER}/{REPO_NAME}/releases/tags/{RELEASE_TAG}" + print(f"\nDebug: Using token: {GITHUB_TOKEN[:4]}...{GITHUB_TOKEN[-4:]}") # Show first/last 4 chars + print(f"Debug: Requesting URL: {url}") + print(f"Debug: Headers: {HEADERS}") + + response = requests.get(url, headers=HEADERS) + debug_request(url, HEADERS, response) + + if response.status_code != 200: + print(f"Error getting release: {response.status_code}") + return [] + + release_data = response.json() + return release_data.get("assets", []) + + +def list_local_files() -> List[str]: + """List all files in the current directory (excluding directories).""" + return [f for f in os.listdir(".") if os.path.isfile(f)] + + +def calculate_file_hash(filepath: str) -> str: + """Calculate SHA256 hash of a file.""" + sha256_hash = hashlib.sha256() + with open(filepath, "rb") as f: + for byte_block in iter(lambda: f.read(4096), b""): + sha256_hash.update(byte_block) + return sha256_hash.hexdigest() + + +def upload_asset(release_id: int, filepath: str): + """Upload a file as a release asset.""" + upload_url = f"https://uploads.github.com/repos/{REPO_OWNER}/{REPO_NAME}/releases/{release_id}/assets" + + filename = os.path.basename(filepath) + headers = {"Authorization": f"Bearer {GITHUB_TOKEN}", "Content-Type": "application/octet-stream"} + + params = {"name": filename} + + with open(filepath, "rb") as f: + response = requests.post(upload_url, headers=headers, params=params, data=f) + + if response.status_code == 201: + print(f"Successfully uploaded {filename}") + else: + print(f"Failed to upload {filename}: {response.status_code}") + print(response.text) + + +def download_asset(asset: Dict): + """Download a release asset to the local directory.""" + filename = asset["name"] + download_url = asset["browser_download_url"] + + print(f"Downloading {filename}...") + response = requests.get(download_url, headers=HEADERS, stream=True) + + if response.status_code == 200: + with open(filename, "wb") as f: + for chunk in response.iter_content(chunk_size=8192): + f.write(chunk) + print(f"Successfully downloaded {filename}") + else: + print(f"Failed to download {filename}: {response.status_code}") + + +def main(): + if not GITHUB_TOKEN: + print("Please set GITHUB_TOKEN environment variable") + sys.exit(1) + + print(f"Debug: Script starting with token length: {len(GITHUB_TOKEN)}") + print(f"Debug: Token characters: {[ord(c) for c in GITHUB_TOKEN]}") + print(f"Debug: Token first/last chars: {GITHUB_TOKEN[:4]}...{GITHUB_TOKEN[-4:]}") + + # Get release ID first + url = f"https://api.github.com/repos/{REPO_OWNER}/{REPO_NAME}/releases/tags/{RELEASE_TAG}" + response = requests.get(url, headers=HEADERS) + if response.status_code != 200: + print(f"Error getting release: {response.status_code}") + return + + release_id = response.json()["id"] + + # Get existing assets + existing_assets = get_release_assets() + existing_filenames = {asset["name"] for asset in existing_assets} + + # Get local files + local_files = list_local_files() + + print("\nExisting release assets:") + for asset in existing_assets: + print(f"- {asset['name']} ({asset['size']} bytes)") + + # Add download option + print("\nOptions:") + print("1. Upload new files") + print("2. Download all missing files") + print("3. Exit") + + choice = input("\nEnter your choice (1-3): ") + + if choice == "1": + # Original upload logic + files_to_upload = [] + for local_file in local_files: + if local_file not in existing_filenames: + print(f"- {local_file}") + files_to_upload.append(local_file) + + if files_to_upload: + files_with_size = [(f, os.path.getsize(f)) for f in files_to_upload] + files_with_size.sort(key=lambda x: x[1]) + + print("\nFiles to upload (in order):") + for file, size in files_with_size: + print(f"- {file} ({size / 1024 / 1024:.2f} MB)") + + response = input("\nDo you want to upload these files? (y/n): ") + if response.lower() == "y": + for file, _ in files_with_size: + upload_asset(release_id, file) + else: + print("\nNo new files to upload.") + + elif choice == "2": + # Download missing files + files_to_download = [] + for asset in existing_assets: + if asset["name"] not in local_files: + files_to_download.append(asset) + + if files_to_download: + print("\nFiles to download:") + for asset in files_to_download: + print(f"- {asset['name']} ({asset['size'] / 1024 / 1024:.2f} MB)") + + response = input("\nDo you want to download these files? (y/n): ") + if response.lower() == "y": + for asset in files_to_download: + download_asset(asset) + else: + print("\nNo files to download. Local directory is in sync.") + + +if __name__ == "__main__": + main()