| 1223 | } |
| 1224 | |
| 1225 | RnnoiseSequenceRunOutput run( |
| 1226 | const float * features, |
| 1227 | int64_t frames, |
| 1228 | RnnoiseSequenceState & state) const { |
| 1229 | if (features == nullptr || frames <= 0 || frames > capacity_frames_) { |
| 1230 | throw std::runtime_error("RNNoise sequence graph input shape mismatch"); |
| 1231 | } |
| 1232 | std::vector<float> padded_features(static_cast<size_t>(capacity_frames_ * kRnnoiseFeatures), 0.0f); |
| 1233 | std::copy(features, features + frames * kRnnoiseFeatures, padded_features.begin()); |
| 1234 | ggml_backend_tensor_set(features_, padded_features.data(), 0, padded_features.size() * sizeof(float)); |
| 1235 | ggml_backend_tensor_set(conv1_memory_in_, state.conv1_memory.data(), 0, state.conv1_memory.size() * sizeof(float)); |
| 1236 | ggml_backend_tensor_set(conv2_memory_in_, state.conv2_memory.data(), 0, state.conv2_memory.size() * sizeof(float)); |
| 1237 | ggml_backend_tensor_set(gru1_hidden_in_, state.gru1_hidden.data(), 0, state.gru1_hidden.size() * sizeof(float)); |
| 1238 | ggml_backend_tensor_set(gru2_hidden_in_, state.gru2_hidden.data(), 0, state.gru2_hidden.size() * sizeof(float)); |
| 1239 | ggml_backend_tensor_set(gru3_hidden_in_, state.gru3_hidden.data(), 0, state.gru3_hidden.size() * sizeof(float)); |
| 1240 | const auto status = core::compute_backend_graph(weights_.backend.get(), graph_, plan_, "RNNoise sequence"); |
| 1241 | ggml_backend_synchronize(weights_.backend.get()); |
| 1242 | if (status != GGML_STATUS_SUCCESS) { |
| 1243 | throw std::runtime_error("RNNoise sequence GGML graph compute failed"); |
| 1244 | } |
| 1245 | RnnoiseSequenceRunOutput output; |
| 1246 | output.gains.resize(static_cast<size_t>(capacity_frames_ * weights_.config.gain_bands)); |
| 1247 | output.vad.resize(static_cast<size_t>(capacity_frames_)); |
| 1248 | ggml_backend_tensor_get(gains_, output.gains.data(), 0, output.gains.size() * sizeof(float)); |
| 1249 | ggml_backend_tensor_get(vad_, output.vad.data(), 0, output.vad.size() * sizeof(float)); |
| 1250 | output.gains.resize(static_cast<size_t>(frames * weights_.config.gain_bands)); |
| 1251 | output.vad.resize(static_cast<size_t>(frames)); |
| 1252 | read_output(conv1_memory_out_, state.conv1_memory); |
| 1253 | read_output(conv2_memory_out_, state.conv2_memory); |
| 1254 | read_output(gru1_hidden_out_, state.gru1_hidden); |
| 1255 | read_output(gru2_hidden_out_, state.gru2_hidden); |
| 1256 | read_output(gru3_hidden_out_, state.gru3_hidden); |
| 1257 | return output; |
| 1258 | } |
| 1259 | |
| 1260 | private: |
| 1261 | static void read_output(ggml_tensor * tensor, std::vector<float> & values) { |
nothing calls this directly
no test coverage detected