18 std::vector<File> paths;
20 AudioFormatManager formatManager;
21 formatManager.registerBasicFormats();
24 for (
const auto& path : File(root).findChildFiles(2,
true,
"*.wav", juce::File::FollowSymlinks::no))
27 const auto filename = path.getFileName().toStdString();
31 const auto success = std::binary_search(
CatIDSet.begin(),
CatIDSet.end(), key);
34 paths.push_back(path);
43 if ((
int)sampleRate == (
int)targetRate)
46 const double ratio = sampleRate / targetRate;
47 AudioBuffer<float> resampledBuffer;
48 resampledBuffer.setSize(1, (
int)(buffer.getNumSamples() / ratio));
49 auto inputData = buffer.getReadPointer(0);
50 auto outputData = resampledBuffer.getWritePointer(0);
51 LagrangeInterpolator resampler;
52 resampler.process(ratio, inputData, outputData, resampledBuffer.getNumSamples());
53 return resampledBuffer;
60 const auto tick = std::chrono::steady_clock::now();
62 AudioFormatManager formatManager;
63 formatManager.registerBasicFormats();
67 const auto file_count = paths.size();
69 for (
const auto& path : paths)
72 const auto filename = path.getFileName().toStdString();
75 std::unique_ptr<juce::AudioFormatReader> reader(formatManager.createReaderFor(path));
76 if (reader.get() !=
nullptr)
79 const auto numSamples =
80 std::min(
static_cast<int>(reader->lengthInSamples),
static_cast<int>(3 * reader->sampleRate));
81 const auto duration =
static_cast<float>(reader->lengthInSamples) / reader->sampleRate;
82 int64 readerStartSample = 0;
89 readerStartSample =
static_cast<int64
>(reader->lengthInSamples / 2) - (numSamples / 2);
93 if (threadShouldExit())
97 juce::AudioBuffer<float> buffer(1, numSamples);
98 reader->read(&buffer, 0, numSamples, readerStartSample,
true,
false);
104 const auto embedding = model.
forward(buffer);
107 const auto data = std::make_pair(path.getFullPathName().toStdString(), embedding);
112 if (threadShouldExit())
116 const auto tock = std::chrono::steady_clock::now();
117 const auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(tock - tick).count();
118 DBG(
"analysis time: " << elapsed <<
" ms");
119 DBG(
"file count: " << file_count);
124 const auto outfile =
getDatasetFile().getFullPathName().toStdString();
125 DBG(
"analysis cached to: " << outfile);
129 DBG(
"caching analysis failed");
232 DynamicObject* dataset =
new DynamicObject();
237 const auto key = category.first;
238 const auto results = category.second;
240 for (
const auto& element : results)
242 DynamicObject* metadata =
new DynamicObject();
243 metadata->setProperty(
"CatID", var(key));
245 const auto path = element.first;
246 const auto embedding = element.second;
247 metadata->setProperty(
"Path", var(path));
250 for (
auto value : embedding)
252 metadata->setProperty(
"Embedding", features);
258 dataset->setProperty(
"Version", var(
m_version));
259 dataset->setProperty(
"Dataset", rows);
261 FileOutputStream stream(file);
262 if (stream.openedOk())
265 stream.setPosition(0);
267 JSON::writeToStream(stream, dataset);
277 assert(file.existsAsFile());
281 auto json = JSON::parse(file);
282 auto version = json.getProperty(Identifier(
"Version"), 0).toString().toStdString();
289 var result = json.getProperty(Identifier(
"Dataset"), 0);
290 for (
int i = 0; i < result.size(); ++i)
293 auto CatID = result[i].getProperty(Identifier(
"CatID"), 0).toString().toStdString();
294 auto Path = result[i].getProperty(Identifier(
"Path"), 0).toString().toStdString();
295 var array = result[i].getProperty(Identifier(
"Embedding"), 0);
296 std::vector<float> embedding;
297 for (
int j = 0; j < array.size(); ++j)
298 embedding.push_back(array[j]);
300 auto metadata = std::make_pair(Path, embedding);
319std::vector<std::pair<std::string, float>>
AudioDataset::sample(std::string path, std::size_t k,
bool descending)
const
323 std::vector<std::pair<std::string, float>> query_results;
325 auto filename = juce::File(path).getFileName().toStdString();
327 const auto success = std::binary_search(
CatIDSet.begin(),
CatIDSet.end(), key);
336 if (results.size() == 1)
339 query_results.push_back(std::make_pair(results.at(0).first, 1.f));
340 return query_results;
346 const auto it = std::find_if(results.begin(), results.end(),
347 [path](
const std::pair<std::string, std::vector<float>>& element) {
348 return element.first == path;
350 if (it == results.end())
354 query_results.push_back(std::make_pair(path, 1.f));
355 return query_results;
357 const auto query_index = std::distance(results.begin(), it);
358 const auto query_features = results.at(query_index).second;
363 const int scale = descending ? 1 : -1;
364 std::vector<float> scores(results.size(), 0.f);
365 for (std::size_t i = 0; i < results.size(); ++i)
367 const auto features = results.at(i).second;
368 const auto score = std::inner_product(features.begin(), features.end(), query_features.begin(), 0.f);
369 scores.at(i) = scale * score;
376 std::priority_queue<std::pair<float, std::size_t>, std::vector<std::pair<float, std::size_t>>,
377 std::greater<std::pair<float, std::size_t>>>
380 for (std::size_t i = 0; i < scores.size(); ++i)
384 q.push(std::make_pair(scores.at(i), i));
386 else if (q.top().first < scores.at(i))
389 q.push(std::make_pair(scores.at(i), i));
392 assert(q.size() >= 1);
400 const auto result = q.top();
401 const auto score = scale * result.first;
402 query_results.push_back(std::make_pair(results.at(result.second).first, score));
406 return query_results;
411 query_results.push_back(std::make_pair(path, 1.f));
412 return query_results;
std::vector< std::pair< std::string, float > > sample(std::string query, std::size_t k=3, bool descending=true) const
Definition AudioDataset.cpp:319