| 202 | } |
| 203 | |
| 204 | void emit_task_result( |
| 205 | const engine::runtime::TaskResult & result, |
| 206 | const std::optional<std::filesystem::path> & audio_out, |
| 207 | const std::optional<std::filesystem::path> & audio_out_dir, |
| 208 | const std::optional<std::filesystem::path> & artifact_out_dir, |
| 209 | const std::optional<std::filesystem::path> & segments_out, |
| 210 | const std::optional<std::filesystem::path> & turns_out, |
| 211 | const std::optional<std::filesystem::path> & words_out) { |
| 212 | if (result.audio_output.has_value() && audio_out.has_value()) { |
| 213 | write_wav_output(*audio_out, engine::audio::AudioBuffer{ |
| 214 | result.audio_output->sample_rate, |
| 215 | result.audio_output->channels, |
| 216 | result.audio_output->samples, |
| 217 | }); |
| 218 | std::cout << "audio_out=" << audio_out->string() << "\n"; |
| 219 | } else if (!result.named_audio_outputs.empty() && audio_out.has_value()) { |
| 220 | if (result.named_audio_outputs.size() != 1) { |
| 221 | throw std::runtime_error("--out requires exactly one audio output"); |
| 222 | } |
| 223 | const auto & audio = result.named_audio_outputs.front().audio; |
| 224 | write_wav_output(*audio_out, engine::audio::AudioBuffer{ |
| 225 | audio.sample_rate, |
| 226 | audio.channels, |
| 227 | audio.samples, |
| 228 | }); |
| 229 | std::cout << "audio_out=" << audio_out->string() << "\n"; |
| 230 | } |
| 231 | |
| 232 | if (!result.named_audio_outputs.empty()) { |
| 233 | if (audio_out_dir.has_value()) { |
| 234 | std::filesystem::create_directories(*audio_out_dir); |
| 235 | for (const auto & output : result.named_audio_outputs) { |
| 236 | const auto path = *audio_out_dir / (output.id + ".wav"); |
| 237 | write_wav_output(path, engine::audio::AudioBuffer{ |
| 238 | output.audio.sample_rate, |
| 239 | output.audio.channels, |
| 240 | output.audio.samples, |
| 241 | }); |
| 242 | std::cout << "audio_out[" << output.id << "]=" << path.string() << "\n"; |
| 243 | } |
| 244 | } else { |
| 245 | std::cout << "audio_outputs=" << result.named_audio_outputs.size() << "\n"; |
| 246 | for (const auto & output : result.named_audio_outputs) { |
| 247 | std::cout << "audio_output_id=" << output.id |
| 248 | << " sample_rate=" << output.audio.sample_rate |
| 249 | << " channels=" << output.audio.channels |
| 250 | << " samples=" << output.audio.samples.size() |
| 251 | << "\n"; |
| 252 | } |
| 253 | } |
| 254 | } |
| 255 | |
| 256 | if (!result.speech_segments.empty()) { |
| 257 | const auto json = speech_segments_to_json(result.speech_segments); |
| 258 | if (segments_out.has_value()) { |
| 259 | if (!segments_out->parent_path().empty()) { |
| 260 | std::filesystem::create_directories(segments_out->parent_path()); |
| 261 | } |
no test coverage detected