koboldcpp/otherarch/tts_adapter.cpp
2026-02-21 23:45:15 +08:00

1335 lines
No EOL
177 KiB
C++

#include "model_adapter.h"
#include "otherarch/utils.h"
#include "common.h"
#include "sampling.h"
#include "llama.h"
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <fstream>
#include <map>
#include <regex>
#include <string>
#include <thread>
#include <vector>
#include "src/llama-context.h"
#if defined(_MSC_VER)
#pragma warning(disable: 4244 4267) // possible loss of data
#endif
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
//imports required for tts.cpp to work
#include "ttscommon.h"
#include "ttscpp.cpp"
#include "ttstokenizer.cpp"
#include "ttssampler.cpp"
#include "parler_model.cpp"
#include "dac_model.cpp"
#include "ttsutil.cpp"
#include "ttst5_encoder_model.cpp"
#include "phonemizer.cpp"
#include "tts_model.cpp"
#include "kokoro_model.cpp"
#include "dia_model.cpp"
#include "orpheus_model.cpp"
#include "snac_model.cpp"
#include "general_neural_audio_codec.cpp"
//imports required for qwen3tts to work
#include "qwen3_tts.cpp"
#include "text_tokenizer.cpp"
#include "gguf_loader.cpp"
#include "tts_transformer.cpp"
#include "audio_tokenizer_decoder.cpp"
#include "audio_tokenizer_encoder.cpp"
#include "coreml_code_predictor_stub.cpp"
const std::string kobo_b64 = "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";
const std::string cheery_b64 = "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Nn9m8wd3yYJiiSJo//OExFw3JDJpCuNTWbNgUAJKIyXGcmCBjJmqLCegrQmRmYm47AEuE5KJMPCXgC+J0yi6SYW8FuIaB4ziDkQe1GgTzShdJH//9ev/Y/77lGNeCq0vc1zle/pHj3tQitG6rZwlLdSyruugNsswD58IgkjIjwoEgGcRTckQwRRrwfGPeonBb3bZlWEILkyY2gA5yBAMruTttZBjBByUBQLsU8NqIGlaGfAR3l6+jsYkIt6dysxsCBQwK9UyjAlorCba//OExDIxRDp8dVpIABZZajMkRq4tc0ltnOsW3zr1u1df//N+1OH//ySFKOVK0kTW+rImpXVQFUtycQFHdQrJ1jcJ/GktjsE4v/+sF27pfYQusUYRrR21jxIuovCdR3clGcL821E5Jvisy55JdI0BdE1NZ0mJptr1fzwbty+od0ohNRPNQniODLL9QMzliNVtNaJRlvGKiT5qWQSjVarSDQAX6m0olbJJI2xQF5AGSQFGxSlCHLA1JnHJgm0RaKT2//OExCAuXBphvZhoAYLILkAVjKidUZjccRu2zss8XjdAxbdCpeTi8U60U0Dc6aooHkUFrWpBE+qtCo4ki6da0nOJrmpMJai6W5go66Flvemi1TpUVJEktF7L1JVIKZSDIHloLPl9aKRstTuq6i8mXTyC7XdTps96FqFBrJub2dA66neTjJIxUkmTSVJxksySLw7qdD1Lrey/exot00mQZ1Jpl/UDAfWSCWzCwSWzabTaWKQthQ4L3gAbJv/9nQDf//OExBktvDquX49YAsavxxAYP57BsMAGP+/sagIAGBq/id99AQAmEQB4WOa1Frl213QIAgHjoaT6d8PcyKrhggCsnmIey8e7bLYljom5q7P20Pdm54dheaHHRMS2apGnR/9d/vrabn0x3nzpLsnul23liLDznTFvv7r62V/uY+96Z+kz4Jmw+ydsbp2sbTt0umm1/8VVbIZX8//mhzN3UmSy9pLL37z8cks+mt/111ut220lcawAKsfAxbqSdQqB//OExBUrW47mXY9JAmo6/BShJHcZjOIBDxOokWREB8UhciFJFae0+mXg8SaHW2JNMfowk4UaDXRLo24rOaecRzhJ7CdiuKv85z/jO9EZTfOPbyNCvd29qFnv/69Rl9nD+HVdBH//6v+e3H3/Xl/Lfk62Fvu+ZW1t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";
const std::string sleepy_b64 = "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";
const std::string shouty_b64 = "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";
const std::string chatty_b64 = "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";
enum TTS_VER
{
TTS_VER_2,
TTS_VER_3
};
struct wav_header {
char riff[4] = {'R', 'I', 'F', 'F'};
uint32_t chunk_size;
char wave[4] = {'W', 'A', 'V', 'E'};
char fmt[4] = {'f', 'm', 't', ' '};
uint32_t fmt_chunk_size = 16;
uint16_t audio_format = 1; // PCM
uint16_t num_channels = 1; // Mono
uint32_t sample_rate;
uint32_t byte_rate;
uint16_t block_align;
uint16_t bits_per_sample = 16;
char data[4] = {'d', 'a', 't', 'a'};
uint32_t data_size;
};
static std::string save_wav16_base64(const std::vector<float> &data, int sample_rate) {
std::ostringstream oss;
wav_header header;
// Fill header fields
header.sample_rate = sample_rate;
header.byte_rate = header.sample_rate * header.num_channels * (header.bits_per_sample / 8);
header.block_align = header.num_channels * (header.bits_per_sample / 8);
header.data_size = data.size() * (header.bits_per_sample / 8);
header.chunk_size = 36 + header.data_size;
// Write header
oss.write(reinterpret_cast<const char*>(&header), sizeof(header));
// Write samples
for (const auto &sample : data) {
int16_t pcm_sample = static_cast<int16_t>(std::clamp(sample * 32767.0, -32768.0, 32767.0));
oss.write(reinterpret_cast<const char*>(&pcm_sample), sizeof(pcm_sample));
}
// Get binary WAV data
std::string wav_data = oss.str();
return kcpp_base64_encode(wav_data); //return as base64 string
}
static void fill_hann_window(int length, bool periodic, float * output) {
int offset = -1;
if (periodic) {
offset = 0;
}
for (int i = 0; i < length; i++) {
output[i] = 0.5 * (1.0 - cosf((2.0 * M_PI * i) / (length + offset)));
}
}
// very poor-man fft
static void twiddle(float * real, float * imag, int k, int N) {
float angle = 2 * M_PI * k / N;
*real = cos(angle);
*imag = sin(angle);
}
static void irfft(int n, const float * inp_cplx, float * out_real) {
int N = n / 2 + 1;
std::vector<float> real_input(N);
std::vector<float> imag_input(N);
for (int i = 0; i < N; ++i) {
real_input[i] = inp_cplx[2 * i];
imag_input[i] = inp_cplx[2 * i + 1];
}
std::vector<float> real_output(n);
std::vector<float> imag_output(n);
for (int k = 0; k < n; ++k) {
real_output[k] = 0.0f;
imag_output[k] = 0.0f;
for (int m = 0; m < N; ++m) {
float twiddle_real;
float twiddle_imag;
twiddle(&twiddle_real, &twiddle_imag, k * m, n);
real_output[k] += real_input[m] * twiddle_real - imag_input[m] * twiddle_imag;
imag_output[k] += real_input[m] * twiddle_imag + imag_input[m] * twiddle_real;
}
}
for (int i = 0; i < n; ++i) {
out_real[i] = real_output[i] / N;
}
}
static void fold(const std::vector<float> & data, int64_t n_out, int64_t n_win, int64_t n_hop, int64_t n_pad, std::vector<float> & output) {
int64_t output_height = n_out;
int64_t kernel_w = n_win;
int64_t stride_w = n_hop;
int64_t width = n_out;
output.resize(width, 0.0f);
int64_t col_idx = 0;
for (int64_t w_col = 0; w_col < width; ++w_col) {
int64_t start = w_col * stride_w - n_pad;
int64_t end = start + kernel_w;
for (int64_t w_im = start; w_im < end; ++w_im) {
if (w_im >= 0 && w_im < output_height && col_idx < (int64_t) data.size()) {
output[w_im] += data[col_idx];
}
col_idx++;
}
}
output.resize(n_out - 2 * n_pad);
}
// TODO: not optimized at all
static std::vector<float> embd_to_audio(
const float * embd,
const int n_codes,
const int n_embd,
const int n_thread) {
const int n_fft = 1280; //its 1280 at 320, or 2400 at 600
const int n_hop = 320;
const int n_win = 1280;
const int n_pad = (n_win - n_hop)/2;
const int n_out = (n_codes - 1)*n_hop + n_win;
std::vector<float> hann(n_fft);
fill_hann_window(hann.size(), true, hann.data());
int n_spec = n_embd*n_codes;
std::vector<float> E (n_spec);
std::vector<float> S (n_spec);
std::vector<float> ST(n_spec);
for (int l = 0; l < n_codes; ++l) {
for (int k = 0; k < n_embd; ++k) {
E[k*n_codes + l] = embd[l*n_embd + k];
}
}
for (int k = 0; k < n_embd/2; ++k) {
for (int l = 0; l < n_codes; ++l) {
float mag = E[(k )*n_codes + l];
float phi = E[(k + n_embd/2)*n_codes + l];
mag = exp(mag);
if (mag > 1e2) {
mag = 1e2;
}
S[2*(k*n_codes + l) + 0] = mag*cosf(phi);
S[2*(k*n_codes + l) + 1] = mag*sinf(phi);
}
}
for (int l = 0; l < n_codes; ++l) {
for (int k = 0; k < n_embd/2; ++k) {
ST[l*n_embd + 2*k + 0] = S[2*(k*n_codes + l) + 0];
ST[l*n_embd + 2*k + 1] = S[2*(k*n_codes + l) + 1];
}
}
std::vector<float> res (n_codes*n_fft);
std::vector<float> hann2(n_codes*n_fft);
std::vector<std::thread> workers(n_thread);
for (int i = 0; i < n_thread; ++i) {
workers[i] = std::thread([&, i]() {
for (int l = i; l < n_codes; l += n_thread) {
irfft(n_fft, ST.data() + l*n_embd, res.data() + l*n_fft);
for (int j = 0; j < n_fft; ++j) {
res [l*n_fft + j] *= hann[j];
hann2[l*n_fft + j] = hann[j] * hann[j];
}
}
});
}
for (int i = 0; i < n_thread; ++i) {
workers[i].join();
}
std::vector<float> audio;
std::vector<float> env;
fold(res, n_out, n_win, n_hop, n_pad, audio);
fold(hann2, n_out, n_win, n_hop, n_pad, env); // TODO: can be done once
for (size_t i = 0; i < audio.size(); ++i) {
audio[i] /= env[i];
}
return audio;
}
static const std::map<int, std::string> ones = {
{0, "zero"}, {1, "one"}, {2, "two"}, {3, "three"}, {4, "four"},
{5, "five"}, {6, "six"}, {7, "seven"}, {8, "eight"}, {9, "nine"},
{10, "ten"}, {11, "eleven"}, {12, "twelve"}, {13, "thirteen"}, {14, "fourteen"},
{15, "fifteen"}, {16, "sixteen"}, {17, "seventeen"}, {18, "eighteen"}, {19, "nineteen"}
};
static const std::map<int, std::string> tens = {
{2, "twenty"}, {3, "thirty"}, {4, "forty"}, {5, "fifty"},
{6, "sixty"}, {7, "seventy"}, {8, "eighty"}, {9, "ninety"}
};
// Convert a number less than 1000 to words
static std::string convert_less_than_thousand(int num) {
std::string result;
if (num >= 100) {
result += ones.at(num / 100) + " hundred ";
num %= 100;
}
if (num >= 20) {
result += tens.at(num / 10);
if (num % 10 > 0) {
result += "-" + ones.at(num % 10);
}
} else if (num > 0) {
result += ones.at(num);
}
return result;
}
static std::string number_to_words(const std::string & number_str) {
try {
size_t decimal_pos = number_str.find('.');
std::string integer_part = number_str.substr(0, decimal_pos);
int int_number = std::stoi(integer_part);
std::string result;
if (int_number == 0) {
result = "zero";
} else {
if (int_number >= 1000000000) {
int billions = int_number / 1000000000;
result += convert_less_than_thousand(billions) + " billion ";
int_number %= 1000000000;
}
if (int_number >= 1000000) {
int millions = int_number / 1000000;
result += convert_less_than_thousand(millions) + " million ";
int_number %= 1000000;
}
if (int_number >= 1000) {
int thousands = int_number / 1000;
result += convert_less_than_thousand(thousands) + " thousand ";
int_number %= 1000;
}
if (int_number > 0) {
result += convert_less_than_thousand(int_number);
}
}
// Handle decimal part
if (decimal_pos != std::string::npos) {
result += " point";
std::string decimal_part = number_str.substr(decimal_pos + 1);
for (char digit : decimal_part) {
result += " " + ones.at(digit - '0');
}
}
return result;
} catch (const std::exception& e) {
// Skip if fails
return " ";
}
}
static std::string replace_numbers_with_words(const std::string & input_text) {
std::regex number_pattern(R"(\d+(\.\d+)?)");
std::string result;
auto it = std::sregex_iterator(input_text.begin(), input_text.end(), number_pattern);
auto end = std::sregex_iterator();
size_t last_pos = 0;
for (std::sregex_iterator i = it; i != end; ++i) {
const std::smatch& match = *i;
result.append(input_text, last_pos, match.position() - last_pos);
result.append(number_to_words(match.str()));
last_pos = match.position() + match.length();
}
result.append(input_text, last_pos);
return result;
}
static std::string process_text(const std::string & text, TTS_VER ver) {
std::string processed_text = replace_numbers_with_words(text);
std::transform(processed_text.begin(), processed_text.end(),
processed_text.begin(), ::tolower);
if(ver==TTS_VER_2)
{
// replace multiple punctuation with single
processed_text = std::regex_replace(processed_text, std::regex(R"(([,.!?])\1+)"), "$1");
//handle words connected by periods, add a space
processed_text = std::regex_replace(processed_text, std::regex(R"(([.,?!])([^\s]))"), "$1 $2"); //add space after punctuation
std::regex special_chars(R"([\(\)\[\]\{\}\:-_/,\.\\])");
processed_text = std::regex_replace(processed_text, special_chars, " ");
std::regex non_alpha(R"([^a-z\s])");
processed_text = std::regex_replace(processed_text, non_alpha, "");
std::regex multiple_spaces(R"(\s+)");
processed_text = std::regex_replace(processed_text, multiple_spaces, " ");
processed_text = std::regex_replace(processed_text, std::regex(R"(^\s+|\s+$)"), "");
processed_text = std::regex_replace(processed_text, std::regex(R"(\s)"), "<|text_sep|>");
} else {
std::regex special_chars(R"([\(\)\[\]\{\}\:-_/\\])");
processed_text = std::regex_replace(processed_text, special_chars, " ");
std::regex non_alpha(R"([^a-z\s.,?!])");
processed_text = std::regex_replace(processed_text, non_alpha, "");
processed_text = std::regex_replace(processed_text, std::regex(R"(\s+)"), " "); // compress multiple spaces
processed_text = std::regex_replace(processed_text, std::regex(R"(([,.!?])\1+)"), "$1"); // replace multiple punctuation with single
processed_text = std::regex_replace(processed_text, std::regex(R"(\s+([.,!?]))"), "$1"); // Remove whitespace before punctuation
processed_text = std::regex_replace(processed_text, std::regex(R"(([.,?!])([^\s]))"), "$1 $2"); //add space after punctuation
processed_text = std::regex_replace(processed_text, std::regex(R"(\,)"), "<|comma|>");
processed_text = std::regex_replace(processed_text, std::regex(R"(\.)"), "<|period|>");
processed_text = std::regex_replace(processed_text, std::regex(R"(\?)"), "<|question_mark|>");
processed_text = std::regex_replace(processed_text, std::regex(R"(\!)"), "<|exclamation_mark|>");
processed_text = std::regex_replace(processed_text, std::regex(R"(\s+)"), " "); // compress multiple spaces
processed_text = std::regex_replace(processed_text, std::regex(R"(^\s+|\s+$)"), "");
processed_text = std::regex_replace(processed_text, std::regex(R"(\s)"), "<|space|>");
}
return processed_text;
}
static void prompt_add(llama_tokens & prompt, const llama_tokens & tokens) {
prompt.insert(prompt.end(), tokens.begin(), tokens.end());
}
static void prompt_add(llama_tokens & prompt, const llama_vocab * vocab, const std::string & txt, bool add_special, bool parse_special) {
auto tmp = common_tokenize(vocab, txt, add_special, parse_special);
prompt_add(prompt, tmp);
}
static void prompt_init(llama_tokens & prompt, const llama_vocab * vocab) {
prompt.clear();
prompt_add(prompt, vocab, "<|im_start|>\n<|text_start|>", true, true);
}
static std::vector<llama_token> prepare_guide_tokens(const llama_vocab * vocab, const std::string& str, TTS_VER ver)
{
std::string delimiter = "<|text_sep|>";
if(ver==TTS_VER_3)
{
delimiter = "<|space|>";
}
std::vector<llama_token> result;
size_t start = 0;
size_t end = str.find(delimiter);
while (end != std::string::npos) {
std::string current_word = str.substr(start, end - start);
auto tmp = common_tokenize(vocab, current_word, false, true);
result.push_back(tmp[0]);
start = end + delimiter.length();
end = str.find(delimiter, start);
}
// Add the last part
std::string current_word = str.substr(start);
if(current_word!="")
{
auto tmp = common_tokenize(vocab, current_word, false, true);
if(tmp.size()>0){
result.push_back(tmp[0]);
}
}
return result;
}
std::string format_audiotokens(const std::string& input, TTS_VER ver)
{
if (ver == TTS_VER_2) {
//already correct
return input;
} else {
std::string clean = std::regex_replace(input, std::regex(R"(<\|code_start\|>)"), "");
clean = std::regex_replace(clean, std::regex(R"(<\|code_end\|>)"), "<|space|>");
return clean;
}
}
std::string trim_words(const std::string& input, const std::string& separator, size_t maxWords) {
// Split the input string by the separator
std::vector<std::string> words;
size_t start = 0, end;
while ((end = input.find(separator, start)) != std::string::npos) {
std::string last = input.substr(start, end - start);
if (last != "") {
words.push_back(last);
}
start = end + separator.length();
}
std::string last = input.substr(start);
if(last!="")
{
words.push_back(last); // Add the last word
}
// Ensure no more than maxWords are kept
if (words.size() > maxWords) {
words.resize(maxWords);
}
// Reconstruct the string with the separator
std::ostringstream result;
for (size_t i = 0; i < words.size(); ++i) {
if (i > 0) result << separator;
result << words[i];
}
return result.str();
}
static std::string TruncateToFirstNumberWords(const std::string& input, int limit) {
static const std::regex wordRegex(R"(\b[\w'-]+\b)");
std::sregex_iterator words_begin(input.begin(), input.end(), wordRegex);
std::sregex_iterator words_end;
int count = 0;
std::size_t cutoffPos = std::string::npos;
if(limit<=0)
{
return "";
}
for (auto it = words_begin; it != words_end; ++it) {
++count;
if (count >= limit) {
// position AFTER the last matched word
cutoffPos = it->position() + it->length();
break;
}
}
if (cutoffPos == std::string::npos) {
// fewer than N words, return original
return input;
}
// Preserve everything up to and including the Nth word
return input.substr(0, cutoffPos);
}
static llama_context * ttc_ctx = nullptr; //text to codes ctx
static llama_context * cts_ctx = nullptr; //codes to speech
static TTS_VER ttsver = TTS_VER_2;
static int ttsdebugmode = 0;
static bool tts_is_quiet = false;
static std::string ttsvulkandeviceenv;
static std::string last_generated_audio = "";
static std::string last_generation_settings_prompt = ""; //for caching purposes to fix ST bug
static int last_generation_settings_speaker_seed;
static int last_generation_settings_audio_seed;
static std::vector<llama_token> last_speaker_codes; //will store cached speaker
static int last_speaker_seed = -999;
static std::string last_speaker_data = "";
static int cts_offset = 151672;
static int space_id = 151670;
static int code_terminate_id = 151670;
static int nthreads = 4;
static int tts_max_len = 4096;
//ttscpp specific
static bool is_ttscpp_file = false;
static generation_configuration * ttscpp_config = nullptr;
static struct tts_runner * ttscpp_runner = nullptr;
static std::string detectedarch = "";
//qwen3tts specific
static bool is_qwen3tts_file = false;
static qwen3_tts::Qwen3TTS qwen3tts_runner;
static std::string last_qwen3tts_reference_audio_str = "";
int total_tts_gens = 0;
static std::string tts_executable_path = "";
bool ttstype_load_model(const tts_load_model_inputs inputs)
{
tts_is_quiet = inputs.quiet;
tts_executable_path = inputs.executable_path;
//duplicated from expose.cpp
std::string vulkan_info_raw = inputs.vulkan_info;
std::string vulkan_info_str = "";
for (size_t i = 0; i < vulkan_info_raw.length(); ++i) {
vulkan_info_str += vulkan_info_raw[i];
if (i < vulkan_info_raw.length() - 1) {
vulkan_info_str += ",";
}
}
const char* existingenv = getenv("GGML_VK_VISIBLE_DEVICES");
std::vector<ggml_backend_dev_t> devices_override;
std::string dev_override_str = inputs.devices_override;
if(dev_override_str!="")
{
devices_override = kcpp_parse_device_list(dev_override_str);
}
if(!existingenv && vulkan_info_str!="")
{
ttsvulkandeviceenv = "GGML_VK_VISIBLE_DEVICES="+vulkan_info_str;
putenv((char*)ttsvulkandeviceenv.c_str());
}
llama_backend_init();
std::string modelfile_ttc = inputs.ttc_model_filename;
std::string modelfile_cts = inputs.cts_model_filename;
detectedarch = gguf_get_model_arch(modelfile_ttc);
is_ttscpp_file = false;
is_qwen3tts_file = false;
if (detectedarch=="qwen3-tts")
{
is_qwen3tts_file = true;
printf("\nLoading Qwen3-TTS Model: %s, Arch: %s \n",modelfile_ttc.c_str(), detectedarch.c_str());
}
else if (detectedarch!="" && TTSCPP_SUPPORTED_ARCHITECTURES.find(detectedarch) != TTSCPP_SUPPORTED_ARCHITECTURES.end()) {
is_ttscpp_file = true;
printf("\nLoading TTS.CPP Model: %s, Arch: %s \n",modelfile_ttc.c_str(), detectedarch.c_str());
if(detectedarch=="kokoro")
{
//setup kokoro IPA
populate_kokoro_ipa_map(tts_executable_path);
}
}else{
printf("\nLoading OuteTTS Model, OuteTTS: %s \nWavTokenizer: %s \n",modelfile_ttc.c_str(),modelfile_cts.c_str());
if(modelfile_ttc=="" || modelfile_cts=="")
{
printf("\nWarning: KCPP OuteTTS missing a file! Make sure both TTS and WavTokenizer models are loaded.\n");
return false;
}
}
ttsdebugmode = inputs.debugmode;
tts_max_len = inputs.ttsmaxlen;
// tts init
if (is_ttscpp_file) {
ttscpp_config = new generation_configuration("am_echo", 25, 1.0, 1.0, true, "", 1600, 1.0);
ttscpp_runner = runner_from_file(modelfile_ttc, inputs.threads, ttscpp_config, true);
if (ttscpp_runner == nullptr) {
printf("\nTTS Load Error: Failed to initialize TTSCPP!\n");
return false;
}
}
else if(is_qwen3tts_file)
{
if (!qwen3tts_runner.load_models(modelfile_ttc,modelfile_cts)) {
printf("\nQwen3TTS Load Error: %s\n", qwen3tts_runner.get_error().c_str());
return false;
}
}
else //outetts only
{
llama_model_params tts_model_params = llama_model_default_params();
llama_context_params tts_ctx_params = llama_context_default_params();
nthreads = inputs.threads;
tts_model_params.use_mmap = false;
tts_model_params.use_mlock = false;
tts_model_params.n_gpu_layers = inputs.gpulayers; //offload if possible
tts_model_params.split_mode = llama_split_mode::LLAMA_SPLIT_MODE_LAYER;
int kcpp_parseinfo_maindevice = inputs.kcpp_main_gpu<=0?0:inputs.kcpp_main_gpu;
tts_model_params.main_gpu = kcpp_parseinfo_maindevice;
tts_ctx_params.n_ctx = 8192;
tts_ctx_params.offload_kqv = true;
tts_ctx_params.n_batch = 8192;
tts_ctx_params.n_ubatch = 512;
tts_ctx_params.n_threads = nthreads;
tts_ctx_params.n_threads_batch = nthreads;
tts_ctx_params.flash_attn_type = (inputs.flash_attention?LLAMA_FLASH_ATTN_TYPE_ENABLED:LLAMA_FLASH_ATTN_TYPE_DISABLED);
tts_ctx_params.kv_unified = true;
if(devices_override.size()>0)
{
printf("\nOverriding with %d devices...\n",devices_override.size()-1);
tts_model_params.devices = devices_override.data();
}
llama_model * ttcmodel = llama_model_load_from_file(modelfile_ttc.c_str(), tts_model_params);
ttc_ctx = llama_init_from_model(ttcmodel, tts_ctx_params);
if (ttc_ctx == nullptr) {
printf("\nTTS Load Error: Failed to initialize ttc context!\n");
return false;
}
llama_model * ctsmodel = llama_model_load_from_file(modelfile_cts.c_str(), tts_model_params);
tts_ctx_params.embeddings = true; //this requires embeddings instead
tts_ctx_params.n_ubatch = tts_ctx_params.n_batch;
cts_ctx = llama_init_from_model(ctsmodel, tts_ctx_params);
if (cts_ctx == nullptr) {
printf("\nTTS Load Error: Failed to initialize cts context!\n");
return false;
}
std::vector<int> tmp = {1, 2, 3, 4};
llama_memory_clear(llama_get_memory(ttc_ctx),true);
auto er = llama_decode(ttc_ctx, llama_batch_get_one(tmp.data(), tmp.size()));
if(er!=0)
{
printf("\nTTS Eval returned nonzero: %d\n",er);
return false;
}
const llama_vocab * ttcvocab = llama_model_get_vocab(ttcmodel);
llama_tokens testoks = common_tokenize(ttcvocab,"<|space|>",false,true);
if (testoks.size() == 1) {
ttsver = TTS_VER_3;
printf("\nUsing v0.3 mode");
//note that the final word does NOT have a space at the end.
space_id = testoks[0];
testoks = common_tokenize(ttcvocab,"<|audio_end|>",false,true);
if (testoks.size() == 1) {
code_terminate_id = testoks[0];
}
} else {
ttsver = TTS_VER_2;
printf("\nUsing v0.2 mode");
}
//determine offset of <|0|>
testoks = common_tokenize(ttcvocab,"<|0|>",false,true);
if (testoks.size() == 1) {
cts_offset = testoks[0];
}
}
printf("\nTTS Load Complete.\n");
return true;
}
static tts_generation_outputs ttstype_generate_ttscpp(const tts_generation_inputs inputs)
{
tts_generation_outputs output;
if(ttscpp_runner==nullptr || ttscpp_config==nullptr)
{
printf("\nWarning: KCPP TTSCPP not initialized! Make sure TTS model is loaded successfully.\n");
output.data = "";
output.status = 0;
return output;
}
int speaker_seed = inputs.speaker_seed;
std::string voiceused = "am_echo";
std::string prompt = inputs.prompt;
double ttstime = 0;
timer_start();
std::vector<std::string> vmapper = {};
std::vector<std::string> vpermitted = {};
if(detectedarch=="kokoro")
{
vmapper = {"am_echo","af_heart","af_nicole","bm_fable","bf_isabella"};
vpermitted = {"af_alloy", "af_aoede", "af_bella", "af_heart", "af_jessica", "af_kore", "af_nicole", "af_nova", "af_river", "af_sarah", "af_sky", "am_adam", "am_echo", "am_eric", "am_fenrir", "am_liam", "am_michael", "am_onyx", "am_puck", "am_santa", "bf_alice", "bf_emma", "bf_isabella", "bf_lily", "bm_daniel", "bm_fable", "bm_george", "bm_lewis"};
}
else if(detectedarch=="dia")
{
vmapper = {"zac", "zoe", "jess", "leo", "mia"};
vpermitted = {"zoe", "zac","jess", "leo", "mia", "julia", "leah"};
}
if(speaker_seed>=1 && speaker_seed<=5 && vmapper.size()>=5)
{
voiceused = vmapper[speaker_seed-1];
}
else if(vpermitted.size()>0)
{
//if we can match the voice, use it
const std::string cspeaker = inputs.custom_speaker_voice;
if (std::find(vpermitted.begin(), vpermitted.end(), cspeaker) != vpermitted.end()) {
voiceused = cspeaker;
}
}
if(tts_max_len>0)
{
prompt = TruncateToFirstNumberWords(prompt,tts_max_len);
}
if(ttsdebugmode==1 && !tts_is_quiet)
{
printf("\nUsing Speaker ID: %d, Voice: %s", speaker_seed, voiceused.c_str());
printf("\nInput: %s\n", prompt.c_str());
}
ttscpp_config->voice = voiceused;
if(!tts_is_quiet)
{
printf("\nTTS Generating...");
}
tts_response response_data;
int errorres = generate(ttscpp_runner, prompt, &response_data, ttscpp_config);
if(errorres==0)
{
ttstime = timer_check();
printf("\nTTS Generated audio in %.2fs.\n",ttstime);
std::vector<float> wavdat = std::vector(response_data.data, response_data.data + response_data.n_outputs);
//audio_post_clean(wavdat);
last_generated_audio = save_wav16_base64(wavdat, ttscpp_runner->sampling_rate);
output.data = last_generated_audio.c_str();
output.status = 1;
last_generation_settings_audio_seed = 0;
last_generation_settings_speaker_seed = speaker_seed;
last_generation_settings_prompt = std::string(prompt);
total_tts_gens += 1;
return output;
}
else
{
printf("\nError: TTSCPP generation failed\n");
output.data = "";
output.status = 0;
return output;
}
}
static tts_generation_outputs ttstype_generate_outetts(const tts_generation_inputs inputs)
{
tts_generation_outputs output;
if(ttc_ctx==nullptr || cts_ctx==nullptr)
{
printf("\nWarning: KCPP TTS not initialized! Make sure both TTS and WavTokenizer models are loaded.\n");
output.data = "";
output.status = 0;
return output;
}
std::vector<llama_token> codes;
std::vector<llama_token> guide_tokens;
const llama_model * model_ttc = llama_get_model(ttc_ctx);
const llama_vocab * ttcvocab = llama_model_get_vocab(model_ttc);
const llama_model * model_cts = llama_get_model(cts_ctx);
const llama_vocab * ctsvocab = llama_model_get_vocab(model_cts);
const int ttc_n_vocab = llama_vocab_n_tokens(ttcvocab);
std::string prompt = inputs.prompt;
std::string custom_speaker_text = inputs.custom_speaker_text;
std::string custom_speaker_data = inputs.custom_speaker_data;
const std::string sampletext = (custom_speaker_text=="")?process_text("but that is what it is",ttsver):process_text(custom_speaker_text,ttsver);
// process prompt and generate voice codes
llama_memory_clear(llama_get_memory(ttc_ctx),true);
llama_memory_clear(llama_get_memory(cts_ctx),true);
std::vector<llama_token> prompt_inp;
prompt_init(prompt_inp, ttcvocab);
int speaker_seed = inputs.speaker_seed;
int audio_seed = inputs.audio_seed;
if (speaker_seed <= 0 || speaker_seed==0xFFFFFFFF)
{
speaker_seed = (((uint32_t)time(NULL)) % 1000000u);
}
if (audio_seed <= 0 || audio_seed==0xFFFFFFFF)
{
audio_seed = (((uint32_t)time(NULL)) % 1000000u);
}
if(ttsdebugmode==1 && !tts_is_quiet)
{
printf("\nUsing Speaker Seed: %d", speaker_seed);
printf("\nUsing Audio Seed: %d", audio_seed);
}
std::mt19937 tts_rng(audio_seed);
std::mt19937 speaker_rng(speaker_seed);
int n_decode = 0;
int n_predict = 2048; //will be updated later
bool next_token_uses_guide_token = true;
// convert the input text into the necessary format expected by OuteTTS
std::string prompt_clean = process_text(prompt,ttsver);
bool empty_check = (process_text(prompt,TTS_VER_2).size()==0); //if there is no audio, will crash, so prevent that
//further clean it by keeping only the last 300 words
prompt_clean = trim_words(prompt_clean,(ttsver==TTS_VER_3?"<|space|>":"<|text_sep|>"),300);
if(empty_check)
{
//no input
if(!tts_is_quiet)
{
printf("\nTTS sent empty input.\n");
last_generated_audio = "";
output.data = last_generated_audio.c_str();
output.status = 1;
return output;
}
}
double ttstime = 0;
timer_start();
if(!tts_is_quiet && ttsdebugmode==1)
{
printf("\nInput: %s\n", prompt_clean.c_str());
}
llama_token newlineid = common_tokenize(ttcvocab,"\n",false,true)[0];
//2 passes. first pass, we generate the speaker voice if required, then cache it for reuse
//second pass, we use the speaker snipper to align output voice to match the desired speaker
if(speaker_seed>0) //first pass
{
//if we have a cached speaker, reuse it
if(last_speaker_seed==speaker_seed && !last_speaker_codes.empty() && custom_speaker_data==last_speaker_data)
{
//able to proceed, do nothing
if(!tts_is_quiet && ttsdebugmode==1)
{
printf("\nReuse speaker ID=%d (%d tokens)...", last_speaker_seed, last_speaker_codes.size());
}
} else if (custom_speaker_data!="" && custom_speaker_text!="") { //custom speaker json
std::string speaker = format_audiotokens(custom_speaker_data,ttsver);
last_speaker_codes = common_tokenize(ttcvocab, speaker, false, true);
last_speaker_seed = speaker_seed;
if(!tts_is_quiet && ttsdebugmode==1)
{
printf("\nCustom Speaker JSON (%d tokens)...", last_speaker_seed, last_speaker_codes.size());
}
} else if (speaker_seed>=1 && speaker_seed<=5){ //special seeds
std::string speaker = "";
switch(speaker_seed)
{
case 1:
speaker = format_audiotokens("but<|t_0.31|><|code_start|><|1023|><|1474|><|17|><|121|><|1362|><|744|><|438|><|1319|><|744|><|1419|><|1246|><|923|><|1338|><|406|><|939|><|975|><|1491|><|965|><|1212|><|248|><|794|><|464|><|830|><|code_end|>\nthat<|t_0.13|><|code_start|><|1578|><|1773|><|660|><|1074|><|221|><|1803|><|142|><|914|><|798|><|485|><|code_end|>\nis<|t_0.11|><|code_start|><|737|><|794|><|1288|><|182|><|895|><|1653|><|448|><|471|><|code_end|>\nwhat<|t_0.12|><|code_start|><|1734|><|1306|><|779|><|490|><|525|><|1028|><|37|><|1633|><|1353|><|code_end|>\nit<|t_0.09|><|code_start|><|1343|><|898|><|270|><|1035|><|94|><|1409|><|388|><|code_end|>\nis<|t_0.23|><|code_start|><|694|><|695|><|577|><|692|><|1047|><|388|><|28|><|905|><|1155|><|50|><|1629|><|1775|><|1711|><|1729|><|404|><|1027|><|344|><|code_end|>",ttsver);
break;
case 2:
speaker = format_audiotokens("but<|t_0.45|><|code_start|><|920|><|1824|><|1138|><|1387|><|1096|><|1712|><|1642|><|810|><|1685|><|620|><|954|><|584|><|23|><|1467|><|509|><|659|><|1598|><|465|><|567|><|1440|><|3|><|476|><|740|><|288|><|419|><|1440|><|1477|><|254|><|25|><|811|><|882|><|476|><|246|><|246|><|code_end|>\nthat<|t_0.17|><|code_start|><|419|><|1690|><|208|><|1044|><|300|><|1100|><|375|><|1222|><|371|><|1045|><|637|><|1719|><|314|><|code_end|>\nis<|t_0.12|><|code_start|><|319|><|1131|><|794|><|1103|><|1296|><|1615|><|1587|><|233|><|863|><|code_end|>\nwhat<|t_0.16|><|code_start|><|793|><|902|><|391|><|946|><|437|><|95|><|1133|><|110|><|58|><|853|><|1283|><|449|><|code_end|>\nit<|t_0.12|><|code_start|><|774|><|239|><|974|><|213|><|1095|><|1612|><|101|><|1569|><|882|><|code_end|>\nis<|t_0.32|><|code_start|><|1131|><|529|><|1144|><|774|><|1114|><|483|><|693|><|648|><|1112|><|1470|><|1112|><|319|><|1294|><|1417|><|1660|><|729|><|1789|><|1413|><|1728|><|554|><|273|><|736|><|640|><|1549|><|code_end|>",ttsver);
break;
case 3:
speaker = format_audiotokens("but<|t_0.21|><|code_start|><|348|><|1776|><|1620|><|1262|><|118|><|288|><|258|><|1407|><|1331|><|1102|><|664|><|1300|><|1647|><|1536|><|71|><|23|><|code_end|>\nthat<|t_0.19|><|code_start|><|3|><|1740|><|1253|><|1122|><|549|><|715|><|718|><|657|><|1136|><|1247|><|517|><|1333|><|815|><|634|><|code_end|>\nis<|t_0.12|><|code_start|><|1330|><|839|><|753|><|1826|><|1602|><|50|><|1441|><|889|><|948|><|code_end|>\nwhat<|t_0.16|><|code_start|><|899|><|869|><|250|><|894|><|876|><|1471|><|1308|><|1436|><|1328|><|1700|><|1425|><|1330|><|code_end|>\nit<|t_0.12|><|code_start|><|1027|><|1162|><|1344|><|1170|><|86|><|1562|><|1575|><|176|><|1186|><|code_end|>\nis<|t_0.25|><|code_start|><|361|><|1533|><|1697|><|903|><|333|><|1232|><|1337|><|1611|><|1196|><|0|><|1328|><|1245|><|1718|><|1635|><|1616|><|1599|><|1363|><|962|><|328|><|code_end|>",ttsver);
break;
case 4:
speaker = format_audiotokens("but<|t_0.20|><|code_start|><|686|><|1288|><|1251|><|1428|><|481|><|702|><|1812|><|829|><|81|><|756|><|76|><|104|><|952|><|1723|><|1632|><|code_end|>\nthat<|t_0.20|><|code_start|><|1006|><|1067|><|1614|><|1810|><|887|><|43|><|1192|><|106|><|400|><|43|><|730|><|660|><|186|><|87|><|467|><|code_end|>\nis<|t_0.27|><|code_start|><|648|><|1625|><|9|><|685|><|243|><|106|><|996|><|990|><|228|><|809|><|1009|><|2|><|806|><|1325|><|1332|><|1766|><|202|><|725|><|416|><|822|><|code_end|>\nwhat<|t_0.36|><|code_start|><|1287|><|328|><|1241|><|1661|><|1651|><|1708|><|1740|><|1685|><|1715|><|1787|><|1381|><|197|><|1769|><|525|><|1000|><|234|><|364|><|115|><|212|><|632|><|1153|><|228|><|73|><|1002|><|1800|><|1277|><|1117|><|code_end|>\nit<|t_0.40|><|code_start|><|1830|><|1199|><|1282|><|1163|><|1195|><|1752|><|1092|><|1481|><|1003|><|513|><|1639|><|1805|><|1485|><|1645|><|195|><|1464|><|181|><|195|><|123|><|87|><|433|><|878|><|170|><|1265|><|375|><|1708|><|1739|><|1519|><|1185|><|1099|><|code_end|>\nis<|t_0.76|><|code_start|><|1748|><|1422|><|276|><|1337|><|1322|><|1519|><|1779|><|1067|><|1724|><|891|><|1205|><|1419|><|1144|><|1667|><|591|><|1003|><|1543|><|566|><|1390|><|426|><|1824|><|182|><|1138|><|52|><|129|><|1056|><|155|><|1056|><|1298|><|919|><|155|><|125|><|500|><|1022|><|571|><|315|><|400|><|100|><|617|><|295|><|757|><|324|><|592|><|1298|><|1310|><|57|><|876|><|1175|><|1353|><|1770|><|1649|><|1828|><|1637|><|362|><|1744|><|884|><|1027|><|code_end|>",ttsver);
break;
case 5:
speaker = format_audiotokens("but<|t_0.68|><|code_start|><|1761|><|1164|><|1543|><|1677|><|1120|><|1634|><|1496|><|1639|><|1717|><|1306|><|1016|><|1713|><|976|><|1474|><|1817|><|976|><|1595|><|1255|><|584|><|1440|><|1121|><|287|><|91|><|44|><|246|><|160|><|1233|><|247|><|776|><|44|><|246|><|12|><|1352|><|866|><|168|><|71|><|246|><|246|><|804|><|933|><|168|><|193|><|44|><|1663|><|1097|><|411|><|1393|><|1326|><|21|><|342|><|118|><|code_end|>\nthat<|t_0.17|><|code_start|><|220|><|1750|><|1160|><|260|><|1738|><|300|><|291|><|989|><|147|><|1150|><|947|><|803|><|930|><|code_end|>\nis<|t_0.15|><|code_start|><|798|><|1632|><|412|><|1084|><|1166|><|1014|><|416|><|1637|><|415|><|1|><|1660|><|code_end|>\nwhat<|t_0.21|><|code_start|><|1412|><|707|><|572|><|1092|><|898|><|673|><|770|><|1787|><|994|><|983|><|1096|><|221|><|924|><|1323|><|1726|><|387|><|code_end|>\nit<|t_0.12|><|code_start|><|798|><|665|><|513|><|695|><|1410|><|337|><|237|><|1717|><|1353|><|code_end|>\nis<|t_0.24|><|code_start|><|1355|><|1084|><|65|><|1422|><|674|><|1280|><|940|><|1752|><|396|><|1431|><|1761|><|957|><|1440|><|634|><|333|><|1627|><|821|><|788|><|code_end|>",ttsver);
break;
}
last_speaker_codes = common_tokenize(ttcvocab, speaker, false, true);
last_speaker_seed = speaker_seed;
if(!tts_is_quiet && ttsdebugmode==1)
{
printf("\nSpecial ID=%d (%d tokens)...", last_speaker_seed, last_speaker_codes.size());
}
} else {
//generate the voice texture of our new speaker
last_speaker_codes.clear();
guide_tokens = prepare_guide_tokens(ttcvocab,sampletext,ttsver);
if(!tts_is_quiet && ttsdebugmode==1)
{
printf("\nGuide Tokens (%d tokens):\n", guide_tokens.size());
const std::string inp_txt = common_detokenize(ttc_ctx, guide_tokens, true);
printf("%s,", inp_txt.c_str());
printf("\n");
}
prompt_add(prompt_inp, ttcvocab, sampletext, false, true);
prompt_add(prompt_inp, ttcvocab, "<|text_end|>\n<|audio_start|>\n", false, true);
if(!tts_is_quiet && ttsdebugmode==1)
{
printf("\nPrepare new speaker (%d input tokens)...\n", prompt_inp.size());
print_tok_vec(prompt_inp);
}
kcpp_embd_batch tts_batch = kcpp_embd_batch(prompt_inp, 0, false, false);
auto evalok = (llama_decode(ttc_ctx, tts_batch.batch)==0);
if (!evalok) {
printf("\nError: TTS prompt batch processing failed\n");
output.data = "";
output.status = 0;
return output;
}
while (n_decode <= n_predict)
{
float * logits = llama_get_logits(ttc_ctx);
//use creative settings to generate speakers
const int topk = 20;
const float top_p = 1.0f;
const float temp = 1.2f;
llama_token new_token_id = kcpp_quick_sample(logits,ttc_n_vocab,std::vector<int32_t>(),1.0,top_p,topk,temp,speaker_rng);
//guide tokens help prevent hallucinations by forcing the TTS to use the correct word
if(next_token_uses_guide_token && !llama_vocab_is_control(ttcvocab, new_token_id) && !llama_vocab_is_eog(ttcvocab, new_token_id))
{
if(!guide_tokens.empty())
{
llama_token guide_token = guide_tokens[0];
guide_tokens.erase(guide_tokens.begin());
new_token_id = guide_token; //ensure correct word fragment is used
} else {
n_decode = n_predict; //stop generation
}
}
//this is the token id that always precedes a new word
next_token_uses_guide_token = (new_token_id == newlineid);
last_speaker_codes.push_back(new_token_id);
// is it an end of generation? -> mark the stream as finished
if (llama_vocab_is_eog(ttcvocab, new_token_id) || n_decode >= n_predict) {
break;
}
n_decode += 1;
std::vector<llama_token> next = {new_token_id};
llama_batch batch = llama_batch_get_one(next.data(), next.size());
// evaluate the current batch with the transformer model
if (llama_decode(ttc_ctx, batch)) {
printf("\nError: TTS code generation failed!\n");
output.data = "";
output.status = 0;
return output;
}
}
//trim everything after final <|code_end|> for v2, or <|audio_end|> offset-1 replaced with <|space|> for v3
auto it = std::find(last_speaker_codes.rbegin(), last_speaker_codes.rend(), code_terminate_id);
if (it != last_speaker_codes.rend()) {
// Erase elements after the found token (inclusive)
last_speaker_codes.erase(it.base(), last_speaker_codes.end());
if(ttsver==TTS_VER_3 && last_speaker_codes.size()>2)
{
last_speaker_codes.pop_back();
last_speaker_codes.pop_back();
last_speaker_codes.push_back(space_id);
}
}
last_speaker_seed = speaker_seed;
if(!tts_is_quiet && ttsdebugmode==1)
{
printf("\nNew speaker ID=%d created (%d tokens)...", last_speaker_seed, last_speaker_codes.size());
const std::string inp_txt = common_detokenize(ttc_ctx, last_speaker_codes, true);
printf("\n%s\n", inp_txt.c_str());
}
}
guide_tokens.clear();
llama_memory_clear(llama_get_memory(ttc_ctx),true);
prompt_init(prompt_inp, ttcvocab);
next_token_uses_guide_token = true;
}
last_speaker_data = custom_speaker_data;
//second pass: add the speaker before the actual prompt
guide_tokens = prepare_guide_tokens(ttcvocab,prompt_clean,ttsver);
if(!tts_is_quiet && ttsdebugmode==1)
{
printf("\nGuide Tokens (%d tokens):\n", guide_tokens.size());
const std::string inp_txt = common_detokenize(ttc_ctx, guide_tokens, true);
printf("%s", inp_txt.c_str());
printf("\n");
}
if(speaker_seed > 0)
{
prompt_clean = sampletext + (ttsver==TTS_VER_3?"<|space|>":"<|text_sep|>") + prompt_clean;
}
prompt_add(prompt_inp, ttcvocab, prompt_clean, false, true);
if(!tts_is_quiet)
{
printf("\nTTS Processing (%d input tokens)...\n", prompt_inp.size());
}
prompt_add(prompt_inp, ttcvocab, "<|text_end|>\n<|audio_start|>\n", false, true);
if(!last_speaker_codes.empty() && speaker_seed > 0) //apply speaker voice output
{
prompt_add(prompt_inp, last_speaker_codes);
prompt_add(prompt_inp, ttcvocab, "\n", false, true);
}
if(!tts_is_quiet && ttsdebugmode==1)
{
printf("\nDUMP TTS PROMPT (%d tokens):\n", prompt_inp.size());
print_tok_vec(prompt_inp);
const std::string inp_txt = common_detokenize(ttc_ctx, prompt_inp, true);
printf("\n%s\n", inp_txt.c_str());
}
//create batch with tokens for decoding prompt processing
kcpp_embd_batch tts_batch = kcpp_embd_batch(prompt_inp, 0, false, false);
auto evalok = (llama_decode(ttc_ctx, tts_batch.batch)==0);
if (!evalok) {
printf("\nError: TTS prompt batch processing failed\n");
output.data = "";
output.status = 0;
return output;
}
// main loop
n_decode = 0;
n_predict = tts_max_len; //max 4096 tokens
while (n_decode <= n_predict)
{
float * logits = llama_get_logits(ttc_ctx);
//use predictable settings to generate voice
const int topk = 4;
const float temp = 0.75f;
const float top_p = 1.0f;
llama_token new_token_id = kcpp_quick_sample(logits,ttc_n_vocab,std::vector<int32_t>(),1.0,top_p,topk,temp,speaker_rng);
//guide tokens help prevent hallucinations by forcing the TTS to use the correct word
if(next_token_uses_guide_token && !llama_vocab_is_control(ttcvocab, new_token_id) && !llama_vocab_is_eog(ttcvocab, new_token_id))
{
if(!guide_tokens.empty())
{
llama_token guide_token = guide_tokens[0];
guide_tokens.erase(guide_tokens.begin());
new_token_id = guide_token; //ensure correct word fragment is used
} else {
n_decode = n_predict; //end generation
}
}
//this is the token id that always precedes a new word
next_token_uses_guide_token = (new_token_id == newlineid);
codes.push_back(new_token_id);
// is it an end of generation? -> mark the stream as finished
if (llama_vocab_is_eog(ttcvocab, new_token_id) || n_decode >= n_predict) {
break;
}
n_decode += 1;
std::vector<llama_token> next = {new_token_id};
llama_batch batch = llama_batch_get_one(next.data(), next.size());
// evaluate the current batch with the transformer model
if (llama_decode(ttc_ctx, batch)) {
printf("\nError: TTS code generation failed!\n");
output.data = "";
output.status = 0;
return output;
}
if(!tts_is_quiet)
{
printf("\rTTS Generating (%d outputs)", n_decode);
}
}
if(!tts_is_quiet && ttsdebugmode==1)
{
const std::string inp_txt = common_detokenize(ttc_ctx, codes, true);
printf("\nGenerated %d Codes: '%s'\n",codes.size(), inp_txt.c_str());
}
// remove all non-audio tokens (i.e. < 151672 || > 155772)
codes.erase(std::remove_if(codes.begin(), codes.end(), [](llama_token t) { return t < cts_offset || t > (cts_offset+4100); }), codes.end());
for (auto & token : codes) {
token -= cts_offset;
}
const int n_codes = codes.size();
if(n_codes<=1)
{
printf("\nWarning: No Audio Tokens Produced!\n");
last_generated_audio = "";
output.data = last_generated_audio.c_str();
output.status = 1;
return output;
}
kcpp_embd_batch codebatch = kcpp_embd_batch(codes,0,false,true);
printf("\nRunning Vocoder (%d AudioTokens)", codes.size());
if (llama_encode(cts_ctx, codebatch.batch) != 0) {
printf("\nError: TTS vocoder generation failed!\n");
output.data = "";
output.status = 0;
return output;
}
else
{
// spectral operations
const int n_embd = llama_model_n_embd_out(model_cts);
const float * embd = llama_get_embeddings(cts_ctx);
std::vector<float> audio = embd_to_audio(embd, n_codes, n_embd, nthreads);
const int n_sr = 24000; // original sampling rate
const int t_sr = 24000; //final target sampling rate
// zero out first x seconds depending on whether its seeded
const int cutout = t_sr/4;
//audio = resample_wav(audio,n_sr,t_sr); //resample to 16k
if(audio.size()>cutout+16)
{
for (int i = 0; i < cutout; ++i) {
audio[i] = 0.0f;
}
//add some silence at the end
for (int i = 0; i < cutout*2; ++i) {
audio.push_back(0.0f);
}
}
else
{
printf("\nWarning: TTS vocoder generated nothing!\n");
last_generated_audio = "";
output.data = last_generated_audio.c_str();
output.status = 1;
return output;
}
last_generated_audio = save_wav16_base64(audio, t_sr);
ttstime = timer_check();
printf("\nTTS Generated %d audio tokens in %.2fs.\n",(int) codes.size(),ttstime);
output.data = last_generated_audio.c_str();
output.status = 1;
last_generation_settings_audio_seed = inputs.audio_seed;
last_generation_settings_speaker_seed = inputs.speaker_seed;
last_generation_settings_prompt = std::string(prompt);
total_tts_gens += 1;
return output;
}
}
static tts_generation_outputs ttstype_generate_qwen3tts(const tts_generation_inputs inputs)
{
tts_generation_outputs output;
if(!qwen3tts_runner.is_loaded())
{
printf("\nWarning: KCPP TTS not initialized! Make sure both TTS and WavTokenizer models are loaded.\n");
output.data = "";
output.status = 0;
return output;
}
else
{
double ttstime = 0;
timer_start();
qwen3_tts::tts_result result;
std::string prompt = inputs.prompt;
qwen3_tts::tts_params qwen3tts_params;
std::string custom_reference_audio_str = inputs.reference_audio;
std::vector<float> custom_reference_audio_pcmf32;
std::string speakerstr = inputs.custom_speaker_voice;
if(ttsdebugmode==1 && !tts_is_quiet)
{
printf("\nUsing Audio Seed: %d, Speaker: %s", inputs.audio_seed,speakerstr.c_str());
}
qwen3tts_runner.set_seed(inputs.audio_seed);
if(speakerstr=="kobo")
{
custom_reference_audio_str = kobo_b64;
}
else if(speakerstr=="cheery")
{
custom_reference_audio_str = cheery_b64;
}
else if(speakerstr=="sleepy")
{
custom_reference_audio_str = sleepy_b64;
}
else if(speakerstr=="shouty")
{
custom_reference_audio_str = shouty_b64;
}
else if(speakerstr=="chatty")
{
custom_reference_audio_str = chatty_b64;
}
if(custom_reference_audio_str!="")
{
std::vector<uint8_t> media_data_buffer = kcpp_base64_decode(custom_reference_audio_str);
//qwen3tts uses 24khz
bool ok = kcpp_decode_audio_from_buf(media_data_buffer.data(), media_data_buffer.size(), 24000, custom_reference_audio_pcmf32);
if (!ok) {
printf("\nError: Cannot read input audio file.\n");
output.data = "";
output.status = 0;
return output;
}
}
if(!tts_is_quiet)
{
printf("\nTTS Generating...");
}
if (custom_reference_audio_pcmf32.empty()) {
result = qwen3tts_runner.synthesize(prompt, qwen3tts_params);
} else {
bool regenerate = (last_qwen3tts_reference_audio_str=="" || last_qwen3tts_reference_audio_str!=custom_reference_audio_str);
std::string msg = "\nUsing reference voice...";
if(regenerate)
{
msg += "Regenerating... (Warning, lengthy sample audio will be very slow. Use short clips!)";
}
msg += "\n";
printf("%s",msg.c_str());
result = qwen3tts_runner.synthesize_with_voice(prompt, custom_reference_audio_pcmf32.data(),custom_reference_audio_pcmf32.size(), qwen3tts_params, regenerate);
if(regenerate)
{
last_qwen3tts_reference_audio_str = custom_reference_audio_str;
}
}
if (!result.success) {
printf("\nError: TTS vocoder generation failed : %s\n", result.error_msg.c_str());
output.data = "";
output.status = 0;
return output;
}
ttstime = timer_check();
printf("\nTTS Generated audio in %.2fs.\n",ttstime);
last_generated_audio = save_wav16_base64(result.audio, result.sample_rate);
output.data = last_generated_audio.c_str();
output.status = 1;
last_generation_settings_audio_seed = inputs.audio_seed;
last_generation_settings_speaker_seed = 0;
last_generation_settings_prompt = std::string(prompt);
total_tts_gens += 1;
return output;
}
}
tts_generation_outputs ttstype_generate(const tts_generation_inputs inputs)
{
if (is_ttscpp_file)
{
return ttstype_generate_ttscpp(inputs);
}
else if(is_qwen3tts_file)
{
return ttstype_generate_qwen3tts(inputs);
}
else
{
return ttstype_generate_outetts(inputs);
}
}