| 724 | const auto text_chunk_size_override = engine::text::parse_text_chunk_size_override(request.options); |
| 725 | auto vevo2_request = make_request(request); |
| 726 | std::vector<Vevo2Request> chunk_requests; |
| 727 | if (vevo2_request.path == Vevo2InferencePath::TextProsodyToTargetVoice) { |
| 728 | const int64_t text_chunk_size = text_chunk_size_override.value_or(kDefaultTextChunkSize); |
| 729 | const auto text_chunks = engine::text::split_text_chunks( |
| 730 | vevo2_request.refs.target_text, |
| 731 | text_chunk_size); |
| 732 | engine::debug::trace_log_scalar("vevo2.text_chunk_size", text_chunk_size); |
| 733 | engine::debug::trace_log_scalar("vevo2.text_chunk_count", static_cast<int64_t>(text_chunks.empty() ? 1 : text_chunks.size())); |
| 734 | chunk_requests.reserve(text_chunks.empty() ? 1 : text_chunks.size()); |
| 735 | if (text_chunks.empty()) { |
| 736 | chunk_requests.push_back(std::move(vevo2_request)); |
| 737 | } else { |
| 738 | const bool split_across_chunks = text_chunks.size() > 1; |
| 739 | for (const auto & text_chunk : text_chunks) { |
| 740 | Vevo2Request chunk_request = vevo2_request; |
| 741 | chunk_request.refs.target_text = text_chunk; |
| 742 | if (split_across_chunks && chunk_request.route == Vevo2RouteKind::ZeroShotTts) { |
| 743 | chunk_request.refs.style_ref_text.clear(); |
| 744 | } |
| 745 | chunk_requests.push_back(std::move(chunk_request)); |
| 746 | } |
| 747 | } |
| 748 | } else { |
| 749 | chunk_requests.push_back(std::move(vevo2_request)); |
| 750 | } |
| 751 | |
| 752 | runtime::TaskResult result; |
| 753 | runtime::AudioBuffer merged_audio; |
| 754 | bool have_audio_output = false; |
| 755 | Vevo2TokenSequence cached_prosody_tokens; |
| 756 | bool have_cached_prosody_tokens = false; |
| 757 | |
| 758 | for (const auto & chunk_request : chunk_requests) { |
| 759 | Vevo2TokenSequence prosody_tokens; |
| 760 | Vevo2TokenSequence style_content_tokens; |
| 761 | Vevo2TokenSequence generated_tokens; |
| 762 | Vevo2PromptParts prompt; |
| 763 | |
| 764 | if (chunk_request.path == Vevo2InferencePath::TextProsodyToTargetVoice) { |
| 765 | if (chunk_request.generation.use_prosody_code) { |
| 766 | if (!have_cached_prosody_tokens) { |
| 767 | const auto start = Clock::now(); |
| 768 | cached_prosody_tokens = prosody_tokenizer_.encode( |
| 769 | *chunk_request.refs.prosody_audio, |
| 770 | chunk_request.refs.style_ref_audio, |
| 771 | chunk_request.generation); |
| 772 | prosody_tokenizer_ms += engine::debug::elapsed_ms(start); |
| 773 | have_cached_prosody_tokens = true; |
| 774 | } |
| 775 | prosody_tokens = cached_prosody_tokens; |
| 776 | } |
| 777 | std::optional<std::vector<float>> style_whisper_features; |
| 778 | int64_t style_frames = 0; |
| 779 | if (chunk_request.refs.style_ref_audio.has_value()) { |
| 780 | style_frames = frame_count_24k(*chunk_request.refs.style_ref_audio); |
| 781 | const auto start = Clock::now(); |
| 782 | style_whisper_features = cached_whisper_features(*chunk_request.refs.style_ref_audio, style_frames, 0); |
| 783 | style_whisper_ms += engine::debug::elapsed_ms(start); |
nothing calls this directly
no test coverage detected