Fake DB generator: added a way to generate fake musicnn embeddings

This commit is contained in:
emeric
2026-06-07 10:08:39 +02:00
parent 26dc9fa06b
commit 322362b3b9
2 changed files with 25 additions and 1 deletions
+1
View File
@@ -4,6 +4,7 @@ add_executable(lms-db-generator
) )
target_link_libraries(lms-db-generator PRIVATE target_link_libraries(lms-db-generator PRIVATE
lmsaudio
lmsdatabase lmsdatabase
lmscore lmscore
Boost::program_options Boost::program_options
+24 -1
View File
@@ -32,6 +32,8 @@
#include "core/Random.hpp" #include "core/Random.hpp"
#include "core/Service.hpp" #include "core/Service.hpp"
#include "core/SystemPaths.hpp" #include "core/SystemPaths.hpp"
#include "audio/MusicNNEmbeddings.hpp"
#include "database/IDb.hpp" #include "database/IDb.hpp"
#include "database/Session.hpp" #include "database/Session.hpp"
#include "database/objects/Artist.hpp" #include "database/objects/Artist.hpp"
@@ -44,6 +46,7 @@
#include "database/objects/TrackArtistLink.hpp" #include "database/objects/TrackArtistLink.hpp"
#include "database/objects/TrackEmbeddedImage.hpp" #include "database/objects/TrackEmbeddedImage.hpp"
#include "database/objects/TrackEmbeddedImageLink.hpp" #include "database/objects/TrackEmbeddedImageLink.hpp"
#include "database/objects/TrackMusicNNEmbeddings.hpp"
namespace lms namespace lms
{ {
@@ -59,6 +62,7 @@ namespace lms
std::size_t trackEmbeddedImagePerRelease{ 1 }; // usual case: one same image saved on each track std::size_t trackEmbeddedImagePerRelease{ 1 }; // usual case: one same image saved on each track
std::size_t genreCount{ 50 }; std::size_t genreCount{ 50 };
std::size_t moodCount{ 25 }; std::size_t moodCount{ 25 };
bool generateMusicNNEmbeddings{ false };
std::filesystem::path trackPath; std::filesystem::path trackPath;
}; };
@@ -131,6 +135,18 @@ namespace lms
if (!context.moods.empty()) if (!context.moods.empty())
clusters.push_back(*core::random::pickRandom(context.moods)); clusters.push_back(*core::random::pickRandom(context.moods));
track.modify()->setClusters(clusters); track.modify()->setClusters(clusters);
if (params.generateMusicNNEmbeddings)
{
audio::TrackMusicNNEmbeddings embeddings;
std::normal_distribution<float> embeddingDist{ 0.0F, 1.0F };
for (auto& v : embeddings.mean.values)
v = embeddingDist(core::random::getRandGenerator());
std::vector<std::byte> blob(sizeof(audio::TrackMusicNNEmbeddings));
audio::trackMusicNNEmbeddingsToBlob(embeddings, blob);
TrackMusicNNEmbeddings::pointer entry{ context.session.create<TrackMusicNNEmbeddings>(track) };
entry.modify()->setData(blob);
}
} }
} }
@@ -204,7 +220,9 @@ int main(int argc, char* argv[])
("genre-count", program_options::value<unsigned>()->default_value(defaultParams.genreCount), "Number of genres to generate") ("genre-count", program_options::value<unsigned>()->default_value(defaultParams.genreCount), "Number of genres to generate")
("genre-count-per-track", program_options::value<unsigned>()->default_value(defaultParams.genreCountPerTrack), "Number of genres to assign to each track") ("genre-count-per-track", program_options::value<unsigned>()->default_value(defaultParams.genreCountPerTrack), "Number of genres to assign to each track")
("mood-count", program_options::value<unsigned>()->default_value(defaultParams.moodCount), "Number of moods to generate") ("mood-count", program_options::value<unsigned>()->default_value(defaultParams.moodCount), "Number of moods to generate")
("mood-count-per-track", program_options::value<unsigned>()->default_value(defaultParams.moodCountPerTrack), "Number of moods to assign to each track")("help,h", "produce help message"); ("mood-count-per-track", program_options::value<unsigned>()->default_value(defaultParams.moodCountPerTrack), "Number of moods to assign to each track")
("musicnn-embeddings", program_options::bool_switch()->default_value(false), "Generate fake MusicNN embeddings for each track")
("help,h", "produce help message");
// clang-format on // clang-format on
program_options::variables_map vm; program_options::variables_map vm;
@@ -226,6 +244,7 @@ int main(int argc, char* argv[])
genParams.trackCountPerRelease = vm["track-count-per-release"].as<unsigned>(); genParams.trackCountPerRelease = vm["track-count-per-release"].as<unsigned>();
genParams.compilationRatio = vm["compilation-ratio"].as<float>(); genParams.compilationRatio = vm["compilation-ratio"].as<float>();
genParams.trackEmbeddedImagePerRelease = vm["track-embedded-image-count"].as<unsigned>(); genParams.trackEmbeddedImagePerRelease = vm["track-embedded-image-count"].as<unsigned>();
genParams.generateMusicNNEmbeddings = vm["musicnn-embeddings"].as<bool>();
genParams.trackPath = std::filesystem::path{ vm["track-path"].as<std::string>() }; genParams.trackPath = std::filesystem::path{ vm["track-path"].as<std::string>() };
if (!std::filesystem::exists(genParams.trackPath)) if (!std::filesystem::exists(genParams.trackPath))
@@ -234,6 +253,10 @@ int main(int argc, char* argv[])
core::Service<core::IConfig> config{ core::createConfig(vm["conf"].as<std::string>()) }; core::Service<core::IConfig> config{ core::createConfig(vm["conf"].as<std::string>()) };
auto db{ db::createDb(config->getPath("working-dir", "/var/lms") / "lms.db") }; auto db{ db::createDb(config->getPath("working-dir", "/var/lms") / "lms.db") };
db::Session session{ *db }; db::Session session{ *db };
session.prepareTablesIfNeeded();
session.migrateSchemaIfNeeded();
session.createIndexesIfNeeded();
std::cout << "Starting generation..." << std::endl; std::cout << "Starting generation..." << std::endl;
GenerationContext genContext{ session }; GenerationContext genContext{ session };