feat: find best embedding matches (#1102)

This commit is contained in:
thewh1teagle
2024-07-11 04:38:06 +03:00
committed by GitHub
parent 1c104ea847
commit c0eaf86dbd
4 changed files with 134 additions and 0 deletions

View File

@@ -1256,6 +1256,44 @@ void SherpaOnnxSpeakerEmbeddingManagerFreeSearch(const char *name) {
delete[] name;
}
const SherpaOnnxSpeakerEmbeddingManagerBestMatchesResult *
SherpaOnnxSpeakerEmbeddingManagerGetBestMatches(
const SherpaOnnxSpeakerEmbeddingManager *p, const float *v, float threshold,
int32_t n) {
auto matches = p->impl->GetBestMatches(v, threshold, n);
if (matches.empty()) {
return nullptr;
}
auto resultMatches =
new SherpaOnnxSpeakerEmbeddingManagerSpeakerMatch[matches.size()];
for (int i = 0; i < matches.size(); ++i) {
resultMatches[i].score = matches[i].score;
char *name = new char[matches[i].name.size() + 1];
std::copy(matches[i].name.begin(), matches[i].name.end(), name);
name[matches[i].name.size()] = '\0';
resultMatches[i].name = name;
}
auto *result = new SherpaOnnxSpeakerEmbeddingManagerBestMatchesResult();
result->count = matches.size();
result->matches = resultMatches;
return result;
}
void SherpaOnnxSpeakerEmbeddingManagerFreeBestMatches(
const SherpaOnnxSpeakerEmbeddingManagerBestMatchesResult *r) {
for (int32_t i = 0; i < r->count; ++i) {
delete[] r->matches[i].name;
}
delete[] r->matches;
delete r;
};
int32_t SherpaOnnxSpeakerEmbeddingManagerVerify(
const SherpaOnnxSpeakerEmbeddingManager *p, const char *name,
const float *v, float threshold) {

View File

@@ -1109,6 +1109,39 @@ SHERPA_ONNX_API const char *SherpaOnnxSpeakerEmbeddingManagerSearch(
SHERPA_ONNX_API void SherpaOnnxSpeakerEmbeddingManagerFreeSearch(
const char *name);
SHERPA_ONNX_API typedef struct SherpaOnnxSpeakerEmbeddingManagerSpeakerMatch {
float score;
const char *name;
} SherpaOnnxSpeakerEmbeddingManagerSpeakerMatch;
SHERPA_ONNX_API typedef struct
SherpaOnnxSpeakerEmbeddingManagerBestMatchesResult {
const SherpaOnnxSpeakerEmbeddingManagerSpeakerMatch *matches;
int32_t count;
} SherpaOnnxSpeakerEmbeddingManagerBestMatchesResult;
// Get the best matching speakers whose embeddings match the given
// embedding.
//
// @param p Pointer to the SherpaOnnxSpeakerEmbeddingManager instance.
// @param v Pointer to an array containing the embedding vector.
// @param threshold Minimum similarity score required for a match (between 0 and
// 1).
// @param n Number of best matches to retrieve.
// @return Returns a pointer to
// SherpaOnnxSpeakerEmbeddingManagerBestMatchesResult
// containing the best matches found. Returns NULL if no matches are
// found. The caller is responsible for freeing the returned pointer
// using SherpaOnnxSpeakerEmbeddingManagerFreeBestMatches() to
// avoid memory leaks.
SHERPA_ONNX_API const SherpaOnnxSpeakerEmbeddingManagerBestMatchesResult *
SherpaOnnxSpeakerEmbeddingManagerGetBestMatches(
const SherpaOnnxSpeakerEmbeddingManager *p, const float *v, float threshold,
int32_t n);
SHERPA_ONNX_API void SherpaOnnxSpeakerEmbeddingManagerFreeBestMatches(
const SherpaOnnxSpeakerEmbeddingManagerBestMatchesResult *r);
// Check whether the input embedding matches the embedding of the input
// speaker.
//