| #include "diarizen_segmenter.h" |
|
|
| #include <cmath> |
| #include <cstring> |
| #include <algorithm> |
| #include <numeric> |
|
|
| |
| |
| |
|
|
| namespace diarizen { |
|
|
| struct DiarizenSegmenter::Impl { |
| std::string cnn_path; |
| std::string backend_path; |
| |
| }; |
|
|
| DiarizenSegmenter::DiarizenSegmenter( |
| const std::string& cnn_model_path, |
| const std::string& backend_onnx_path) |
| : impl_(std::make_unique<Impl>()) |
| { |
| impl_->cnn_path = cnn_model_path; |
| impl_->backend_path = backend_onnx_path; |
| |
| |
| } |
|
|
| DiarizenSegmenter::~DiarizenSegmenter() = default; |
|
|
| SegmentResult DiarizenSegmenter::run(const float* audio, int num_samples) { |
| SegmentResult result; |
| result.log_probs.resize(result.num_frames * result.num_classes, 0.0f); |
|
|
| |
| if (num_samples != 64000) { |
| |
| return result; |
| } |
|
|
| float mean = 0.0f; |
| for (int i = 0; i < num_samples; ++i) mean += audio[i]; |
| mean /= num_samples; |
|
|
| float var = 0.0f; |
| for (int i = 0; i < num_samples; ++i) { |
| float d = audio[i] - mean; |
| var += d * d; |
| } |
| var = var / num_samples + 1e-5f; |
| float inv_std = 1.0f / std::sqrt(var); |
|
|
| std::vector<float> normalized(num_samples); |
| for (int i = 0; i < num_samples; ++i) { |
| normalized[i] = (audio[i] - mean) * inv_std; |
| } |
|
|
| |
| |
| |
| float uniform_log_prob = std::log(1.0f / result.num_classes); |
| std::fill(result.log_probs.begin(), result.log_probs.end(), uniform_log_prob); |
|
|
| return result; |
| } |
|
|
| } |
|
|