| 149 | } |
| 150 | |
| 151 | std::filesystem::path write_clipped_wav( |
| 152 | const std::filesystem::path & source_path, |
| 153 | const std::filesystem::path & temp_dir, |
| 154 | double seconds) { |
| 155 | const auto audio = minitts::cli::read_audio_buffer(source_path); |
| 156 | const int64_t frame_limit = static_cast<int64_t>(seconds * static_cast<double>(audio.sample_rate)); |
| 157 | const int64_t sample_limit = std::max<int64_t>( |
| 158 | 1, |
| 159 | std::min<int64_t>( |
| 160 | static_cast<int64_t>(audio.samples.size()), |
| 161 | frame_limit * static_cast<int64_t>(audio.channels))); |
| 162 | std::vector<float> clipped( |
| 163 | audio.samples.begin(), |
| 164 | audio.samples.begin() + static_cast<std::ptrdiff_t>(sample_limit)); |
| 165 | const auto target = temp_dir / source_path.filename(); |
| 166 | engine::audio::WavPcm16Sink().write( |
| 167 | target, |
| 168 | engine::audio::AudioBuffer{ |
| 169 | audio.sample_rate, |
| 170 | audio.channels, |
| 171 | std::move(clipped), |
| 172 | }); |
| 173 | return target; |
| 174 | } |
| 175 | |
| 176 | JsonValue clip_audio_path_field( |
| 177 | const JsonValue & value, |
no test coverage detected