| 78 | } // namespace |
| 79 | |
| 80 | void denoise_file( |
| 81 | const std::filesystem::path & input_wav, |
| 82 | const std::filesystem::path & output_wav, |
| 83 | std::string_view model, |
| 84 | const AudioUtilityPaths & paths) { |
| 85 | if (model == "deepfilternet2") { |
| 86 | const auto denoiser = DeepFilterNet2Model::load_from_directory(require_model_dir(paths, "deepfilternet2"), paths.backend); |
| 87 | const auto input = read_mono_resampled(input_wav, 48000); |
| 88 | const auto output = denoiser.run_mono_48k(input); |
| 89 | create_output_parent(output_wav); |
| 90 | write_pcm16_wav(output_wav, output.sample_rate, 1, output.samples); |
| 91 | return; |
| 92 | } |
| 93 | if (model == "rnnoise") { |
| 94 | const auto denoiser = RnnoiseModel::load_from_safetensors( |
| 95 | require_model_dir(paths, "rnnoise") / "rnnoise10Gb_15.safetensors", |
| 96 | paths.backend); |
| 97 | const auto input = read_mono_resampled(input_wav, 48000); |
| 98 | const auto output = denoiser.process_mono_48k(input); |
| 99 | create_output_parent(output_wav); |
| 100 | write_pcm16_wav(output_wav, output.sample_rate, 1, output.samples); |
| 101 | return; |
| 102 | } |
| 103 | if (model == "zipenhancer") { |
| 104 | const auto denoiser = ZipEnhancerModel::load_from_directory(require_model_dir(paths, "zipenhancer"), paths.backend); |
| 105 | const auto input = read_mono_resampled(input_wav, 16000); |
| 106 | const auto output = denoiser.denoise_mono_16k(input); |
| 107 | create_output_parent(output_wav); |
| 108 | write_pcm16_wav(output_wav, output.sample_rate, 1, output.samples); |
| 109 | return; |
| 110 | } |
| 111 | throw_unsupported_model("denoise", model, "deepfilternet2, rnnoise, zipenhancer"); |
| 112 | } |
| 113 | |
| 114 | AudioUtilityBatchResult denoise_directory( |
| 115 | const std::filesystem::path & input_dir, |