| 142 | } |
| 143 | |
| 144 | ChatterboxVoiceCloneOutputs ChatterboxTtsComponent::synthesize_voice_clone_impl( |
| 145 | const std::string & text, |
| 146 | const ChatterboxConditionalsOutputs & conds, |
| 147 | const ChatterboxVoiceCloneConfig & config) const { |
| 148 | ChatterboxVoiceCloneOutputs outputs; |
| 149 | outputs.normalized_text = normalize_chatterbox_tts_text(text); |
| 150 | const std::string language = normalize_chatterbox_language_code(config.language); |
| 151 | outputs.text_tokens = chatterbox_language_uses_multilingual_t3(language) |
| 152 | ? encode_chatterbox_multilingual_text(*tokenizer_, outputs.normalized_text, language) |
| 153 | : encode_chatterbox_english_text(*tokenizer_, outputs.normalized_text); |
| 154 | outputs.text_tokens.insert(outputs.text_tokens.begin(), chatterbox_english_start_token_id(*tokenizer_)); |
| 155 | outputs.text_tokens.push_back(chatterbox_english_stop_token_id(*tokenizer_)); |
| 156 | |
| 157 | outputs.prompt_prep_gen_ms = conds.gen_ms; |
| 158 | outputs.prompt_prep_gen_prompt_mel_ms = conds.gen.prompt_mel_ms; |
| 159 | outputs.prompt_prep_gen_speaker_ms = conds.gen.speaker_ms; |
| 160 | outputs.prompt_prep_gen_tokenizer_ms = conds.gen.tokenizer_ms; |
| 161 | outputs.prompt_prep_voice_encoder_ms = conds.voice_encoder_ms; |
| 162 | outputs.prompt_prep_tokenizer_ms = conds.tokenizer_ms; |
| 163 | |
| 164 | T3GenerateRequest request; |
| 165 | request.speaker_embedding = conds.t3.speaker_embedding; |
| 166 | request.cond_prompt_speech_tokens = conds.t3.cond_prompt_speech_tokens; |
| 167 | request.emotion_adv = conds.t3.emotion_adv; |
| 168 | request.text_tokens = outputs.text_tokens; |
| 169 | request.max_new_tokens = config.max_new_tokens; |
| 170 | request.stop_on_eos = config.stop_on_eos; |
| 171 | request.do_sample = config.do_sample; |
| 172 | request.temperature = config.temperature; |
| 173 | request.top_p = config.top_p; |
| 174 | request.min_p = config.min_p; |
| 175 | request.repetition_penalty = config.repetition_penalty; |
| 176 | request.guidance_scale = config.guidance_scale; |
| 177 | request.seed = config.seed; |
| 178 | |
| 179 | const auto t3_memory_before = capture_backend_memory_snapshot(execution_context_); |
| 180 | const auto t3_started = std::chrono::steady_clock::now(); |
| 181 | const auto t3_outputs = t3_.generate_speech_tokens(request); |
| 182 | outputs.t3_ms = |
| 183 | engine::debug::elapsed_ms(t3_started); |
| 184 | const auto t3_memory_after = capture_backend_memory_snapshot(execution_context_); |
| 185 | if (t3_memory_after.available) { |
| 186 | outputs.cuda_memory_total_bytes = t3_memory_after.total_bytes; |
| 187 | } else if (t3_memory_before.available) { |
| 188 | outputs.cuda_memory_total_bytes = t3_memory_before.total_bytes; |
| 189 | } |
| 190 | outputs.t3_prefix_cache_build_ms = t3_outputs.prefix_cache_build_ms; |
| 191 | outputs.t3_decoder_cache_clone_ms = t3_outputs.decoder_cache_clone_ms; |
| 192 | outputs.t3_prefill_runner_ms = t3_outputs.prefill_runner_ms; |
| 193 | outputs.t3_decode_runner_ms = t3_outputs.decode_runner_ms; |
| 194 | outputs.t3_logits_ms = t3_outputs.logits_ms; |
| 195 | outputs.t3_sampling_ms = t3_outputs.sampling_ms; |
| 196 | outputs.t3_next_embed_ms = t3_outputs.next_embed_ms; |
| 197 | outputs.t3_cuda_memory_used_before_bytes = t3_memory_before.used_bytes; |
| 198 | outputs.t3_cuda_memory_used_after_bytes = t3_memory_after.used_bytes; |
| 199 | engine::debug::timing_log_scalar("chatterbox.voice_clone.t3.total_ms", outputs.t3_ms); |
| 200 | engine::debug::timing_log_scalar("chatterbox.voice_clone.t3.prefix_cache.build_ms", outputs.t3_prefix_cache_build_ms); |
| 201 | engine::debug::timing_log_scalar("chatterbox.voice_clone.t3.decoder_cache.clone_ms", outputs.t3_decoder_cache_clone_ms); |
nothing calls this directly
no test coverage detected