| 272 | session_defaults_.text = request.text; |
| 273 | } |
| 274 | if (request.voice.has_value() && request.voice->speaker.has_value() && request.voice->speaker->audio.has_value()) { |
| 275 | session_defaults_.reference_audio = *request.voice->speaker->audio; |
| 276 | } |
| 277 | session_defaults_.options = request.options; |
| 278 | if (const auto reference_text = request_option(request.options, "reference_text"); reference_text.has_value()) { |
| 279 | session_defaults_.reference_text = std::move(reference_text); |
| 280 | } |
| 281 | if (const auto instruct = request_option(request.options, "instruct"); instruct.has_value()) { |
| 282 | session_defaults_.instruct = std::move(instruct); |
| 283 | } else if (request.voice.has_value() && request.voice->style.has_value()) { |
| 284 | const auto it = request.voice->style->tags.find("instruct"); |
| 285 | if (it != request.voice->style->tags.end()) { |
| 286 | session_defaults_.instruct = it->second; |
| 287 | } |
| 288 | } |
| 289 | if (session_defaults_.reference_audio.has_value()) { |
| 290 | const auto merged_options = session_defaults_.options; |
| 291 | const auto generation = generation_options_from_options(merged_options); |
| 292 | const bool reference_text_provided = |
| 293 | session_defaults_.reference_text.has_value() && !session_defaults_.reference_text->empty(); |
| 294 | (void) resolve_reference_audio_tokens( |
| 295 | *session_defaults_.reference_audio, |
| 296 | generation.preprocess_prompt, |
| 297 | reference_text_provided); |
| 298 | if (mem_saver_) { |
| 299 | audio_tokenizer_.release_runtime_graphs(); |
| 300 | } |
| 301 | } |
| 302 | mark_prepared(); |
| 303 | } |
| 304 | |
| 305 | runtime::TaskResult OmniVoiceSession::run(const runtime::TaskRequest & request) { |
| 306 | require_prepared("OmniVoice run()"); |
| 307 | if (task_.mode != runtime::RunMode::Offline) { |
| 308 | throw std::runtime_error("OmniVoice run() requires an offline session"); |
| 309 | } |
| 310 | const auto wall_start = Clock::now(); |
| 311 | auto omni_request = make_request(request); |
| 312 | if (omni_request.generation.seed.has_value()) { |
| 313 | generator_.seed_rng(*omni_request.generation.seed); |
| 314 | } |
| 315 | runtime::TaskResult task_result; |
| 316 | std::optional<double> reference_encode_ms = std::nullopt; |
| 317 | bool encoder_graph_rebuilt = false; |
| 318 | if (omni_request.reference_audio.has_value()) { |
| 319 | const auto encode_start = Clock::now(); |
| 320 | const auto reference_tokens = resolve_reference_audio_tokens( |
| 321 | *omni_request.reference_audio, |
| 322 | omni_request.generation.preprocess_prompt, |
| 323 | !omni_request.reference_text.empty()); |
| 324 | const auto encode_end = Clock::now(); |
| 325 | omni_request.reference_rms = reference_tokens.reference_rms; |
| 326 | omni_request.reference_audio_tokens = std::move(reference_tokens); |
| 327 | omni_request.reference_audio.reset(); |
| 328 | reference_encode_ms = engine::debug::elapsed_ms(encode_start, encode_end); |
| 329 | const auto & tokenizer_stats = audio_tokenizer_.last_stats(); |
| 330 | encoder_graph_rebuilt = tokenizer_stats.encoder_graph_rebuilt; |
| 331 | if (mem_saver_) { |
nothing calls this directly
no test coverage detected