Audio similarity engine: do not treat silent songs as errors
This commit is contained in:
+4
-2
@@ -48,10 +48,10 @@ namespace lms::recommendation
|
|||||||
session.checkReadTransaction();
|
session.checkReadTransaction();
|
||||||
|
|
||||||
const db::TrackMusicNNEmbeddings::pointer embeddings{ db::TrackMusicNNEmbeddings::find(session, trackId) };
|
const db::TrackMusicNNEmbeddings::pointer embeddings{ db::TrackMusicNNEmbeddings::find(session, trackId) };
|
||||||
if (embeddings)
|
if (embeddings && !embeddings->getData().empty())
|
||||||
readEmbeddings(embeddings, vec);
|
readEmbeddings(embeddings, vec);
|
||||||
|
|
||||||
return embeddings;
|
return embeddings && !embeddings->getData().empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MusicNNEmbeddingProvider::visitVectors(db::Session& session, const std::function<void(db::TrackId, Vector&)>& visitor)
|
void MusicNNEmbeddingProvider::visitVectors(db::Session& session, const std::function<void(db::TrackId, Vector&)>& visitor)
|
||||||
@@ -60,6 +60,8 @@ namespace lms::recommendation
|
|||||||
|
|
||||||
Vector vec;
|
Vector vec;
|
||||||
db::TrackMusicNNEmbeddings::find(session, [&](const db::TrackMusicNNEmbeddings::pointer& embeddings) {
|
db::TrackMusicNNEmbeddings::find(session, [&](const db::TrackMusicNNEmbeddings::pointer& embeddings) {
|
||||||
|
if (embeddings->getData().empty())
|
||||||
|
return;
|
||||||
readEmbeddings(embeddings, vec);
|
readEmbeddings(embeddings, vec);
|
||||||
visitor(embeddings->getTrackId(), vec);
|
visitor(embeddings->getTrackId(), vec);
|
||||||
});
|
});
|
||||||
|
|||||||
-1
@@ -40,7 +40,6 @@ namespace lms::recommendation
|
|||||||
static constexpr std::size_t DimCount{ 200 };
|
static constexpr std::size_t DimCount{ 200 };
|
||||||
using Vector = math::Vector<DimCount, FloatType>;
|
using Vector = math::Vector<DimCount, FloatType>;
|
||||||
|
|
||||||
static std::size_t getCount(db::Session& session);
|
|
||||||
static bool getVector(db::Session& session, db::TrackId trackId, Vector& vec);
|
static bool getVector(db::Session& session, db::TrackId trackId, Vector& vec);
|
||||||
static void visitVectors(db::Session& session, const std::function<void(db::TrackId, Vector&)>& visitor);
|
static void visitVectors(db::Session& session, const std::function<void(db::TrackId, Vector&)>& visitor);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ namespace lms::scanner
|
|||||||
ExtractMusicNNEmbeddingsJob& operator=(const ExtractMusicNNEmbeddingsJob&) = delete;
|
ExtractMusicNNEmbeddingsJob& operator=(const ExtractMusicNNEmbeddingsJob&) = delete;
|
||||||
|
|
||||||
const TrackLocation& getTrackLocation() const { return _trackLocation; }
|
const TrackLocation& getTrackLocation() const { return _trackLocation; }
|
||||||
|
bool isSuccess() const { return _success; }
|
||||||
const audio::TrackMusicNNEmbeddings* getEmbeddings() const { return _embeddings ? &_embeddings.value() : nullptr; }
|
const audio::TrackMusicNNEmbeddings* getEmbeddings() const { return _embeddings ? &_embeddings.value() : nullptr; }
|
||||||
std::string_view getErrorMessage() const { return _errorMessage; }
|
std::string_view getErrorMessage() const { return _errorMessage; }
|
||||||
|
|
||||||
@@ -107,6 +108,8 @@ namespace lms::scanner
|
|||||||
if (result.patchCount > 0)
|
if (result.patchCount > 0)
|
||||||
_embeddings.emplace(result.embeddings);
|
_embeddings.emplace(result.embeddings);
|
||||||
LMS_LOG(DBUPDATER, DEBUG, "MusicNN extraction complete for " << _trackLocation.trackPath << " (" << result.patchCount << " patches)");
|
LMS_LOG(DBUPDATER, DEBUG, "MusicNN extraction complete for " << _trackLocation.trackPath << " (" << result.patchCount << " patches)");
|
||||||
|
|
||||||
|
_success = true;
|
||||||
}
|
}
|
||||||
catch (const audio::Exception& e)
|
catch (const audio::Exception& e)
|
||||||
{
|
{
|
||||||
@@ -116,6 +119,7 @@ namespace lms::scanner
|
|||||||
|
|
||||||
const audio::IMusicNNEmbeddingExtractor& _extractor;
|
const audio::IMusicNNEmbeddingExtractor& _extractor;
|
||||||
const TrackLocation _trackLocation;
|
const TrackLocation _trackLocation;
|
||||||
|
bool _success{};
|
||||||
std::optional<audio::TrackMusicNNEmbeddings> _embeddings;
|
std::optional<audio::TrackMusicNNEmbeddings> _embeddings;
|
||||||
std::string _errorMessage;
|
std::string _errorMessage;
|
||||||
};
|
};
|
||||||
@@ -125,10 +129,13 @@ namespace lms::scanner
|
|||||||
db::Track::pointer track{ db::Track::find(session, assoc.trackId) };
|
db::Track::pointer track{ db::Track::find(session, assoc.trackId) };
|
||||||
assert(track);
|
assert(track);
|
||||||
|
|
||||||
std::vector<std::byte> blob(sizeof(audio::TrackMusicNNEmbeddings));
|
|
||||||
audio::trackMusicNNEmbeddingsToBlob(*assoc.embeddings, blob);
|
|
||||||
db::TrackMusicNNEmbeddings::pointer entry{ session.create<db::TrackMusicNNEmbeddings>(track) };
|
db::TrackMusicNNEmbeddings::pointer entry{ session.create<db::TrackMusicNNEmbeddings>(track) };
|
||||||
entry.modify()->setData(blob);
|
if (assoc.embeddings)
|
||||||
|
{
|
||||||
|
std::vector<std::byte> blob(sizeof(audio::TrackMusicNNEmbeddings));
|
||||||
|
audio::trackMusicNNEmbeddingsToBlob(*assoc.embeddings, blob);
|
||||||
|
entry.modify()->setData(blob);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeEmbeddings(ScanContext& context, db::Session& session, TrackEmbeddingAssociationContainer& pendingAssocs, bool forceFullBatch)
|
void writeEmbeddings(ScanContext& context, db::Session& session, TrackEmbeddingAssociationContainer& pendingAssocs, bool forceFullBatch)
|
||||||
@@ -202,10 +209,22 @@ namespace lms::scanner
|
|||||||
{
|
{
|
||||||
const auto& extractJob{ static_cast<const ExtractMusicNNEmbeddingsJob&>(*job) };
|
const auto& extractJob{ static_cast<const ExtractMusicNNEmbeddingsJob&>(*job) };
|
||||||
|
|
||||||
if (const audio::TrackMusicNNEmbeddings * embeddings{ extractJob.getEmbeddings() })
|
if (extractJob.isSuccess())
|
||||||
pendingAssocs.push_back(TrackEmbeddingAssociation{ .trackId = extractJob.getTrackLocation().track, .embeddings = *embeddings });
|
{
|
||||||
|
if (const audio::TrackMusicNNEmbeddings * embeddings{ extractJob.getEmbeddings() })
|
||||||
|
{
|
||||||
|
pendingAssocs.push_back(TrackEmbeddingAssociation{ .trackId = extractJob.getTrackLocation().track, .embeddings = *embeddings });
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LMS_LOG(DBUPDATER, INFO, "No patch extracted from " << extractJob.getTrackLocation().trackPath);
|
||||||
|
pendingAssocs.push_back(TrackEmbeddingAssociation{ .trackId = extractJob.getTrackLocation().track, .embeddings = std::nullopt });
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
addError<MusicNNEmbeddingsExtractError>(context, extractJob.getTrackLocation().trackPath, extractJob.getErrorMessage());
|
addError<MusicNNEmbeddingsExtractError>(context, extractJob.getTrackLocation().trackPath, extractJob.getErrorMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
context.currentStepStats.processedElems += jobs.size();
|
context.currentStepStats.processedElems += jobs.size();
|
||||||
|
|||||||
Reference in New Issue
Block a user