mirror of
https://github.com/ggml-org/llama.cpp.git
synced 2026-09-13 18:29:12 +02:00
78 lines
3.2 KiB
C++
78 lines
3.2 KiB
C++
#include "models.h"
|
|
|
|
// voice-prompt encoder: raw 24kHz waveform -> one conditioning row per 12.5Hz frame
|
|
// mimi encoder (SEANet + transformer + downsample), then flow_lm.speaker_proj_weight
|
|
|
|
// pre-norm block with layer scale on both residual paths, see mimi_transformer.py
|
|
ggml_tensor * clip_graph_pockettts_spkenc::tfm_layer_forward(ggml_tensor * cur, const clip_layer & layer, ggml_tensor * inp_pos, ggml_tensor * kq_mask, int il) const {
|
|
ggml_tensor * inp = cur;
|
|
|
|
cur = build_norm(cur, layer.ln_1_w, layer.ln_1_b, NORM_TYPE_NORMAL, eps, il);
|
|
|
|
ggml_tensor * Qcur = build_mm(layer.q_w, cur);
|
|
ggml_tensor * Kcur = build_mm(layer.k_w, cur);
|
|
ggml_tensor * Vcur = build_mm(layer.v_w, cur);
|
|
|
|
const int64_t n_pos = cur->ne[1];
|
|
Qcur = ggml_reshape_3d(ctx0, Qcur, d_head, n_head, n_pos);
|
|
Kcur = ggml_reshape_3d(ctx0, Kcur, d_head, n_head, n_pos);
|
|
Vcur = ggml_reshape_3d(ctx0, Vcur, d_head, n_head, n_pos);
|
|
|
|
Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, d_head, GGML_ROPE_TYPE_NORMAL, 0,
|
|
hparams.rope_theta, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, d_head, GGML_ROPE_TYPE_NORMAL, 0,
|
|
hparams.rope_theta, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
|
|
cur = build_attn(layer.o_w, nullptr, Qcur, Kcur, Vcur, kq_mask, kq_scale, il);
|
|
cur = ggml_mul(ctx0, cur, layer.ls_1_w);
|
|
cur = ggml_add(ctx0, cur, inp);
|
|
|
|
inp = cur;
|
|
cur = build_norm(cur, layer.ln_2_w, layer.ln_2_b, NORM_TYPE_NORMAL, eps, il);
|
|
cur = build_ffn(cur, layer.ff_up_w, nullptr, nullptr, nullptr, layer.ff_down_w, nullptr, FFN_GELU, il);
|
|
cur = ggml_mul(ctx0, cur, layer.ls_2_w);
|
|
cur = ggml_add(ctx0, cur, inp);
|
|
|
|
return cur;
|
|
}
|
|
|
|
ggml_cgraph * clip_graph_pockettts_spkenc::build() {
|
|
// the preprocessor hands over the waveform as a single-row "mel", already [n_samples, 1]
|
|
ggml_tensor * inp_raw = build_inp_raw(1);
|
|
ggml_tensor * cur = ggml_reshape_2d(ctx0, inp_raw, inp_raw->ne[0], inp_raw->ne[1]);
|
|
|
|
clip_graph_pockettts_seanet seanet(*this);
|
|
cur = seanet.encode(cur);
|
|
cb(cur, "mimi_enc", -1);
|
|
|
|
// [T, 512] -> transformer works on [512, T]
|
|
cur = ggml_cont(ctx0, ggml_transpose(ctx0, cur));
|
|
|
|
ggml_tensor * inp_pos = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, cur->ne[1]);
|
|
ggml_set_name(inp_pos, "inp_pos");
|
|
ggml_set_input(inp_pos);
|
|
|
|
// the mimi transformer is causal with a sliding window, see _build_attention_mask()
|
|
ggml_tensor * kq_mask = ggml_new_tensor_2d(ctx0, GGML_TYPE_F32, cur->ne[1], cur->ne[1]);
|
|
ggml_set_name(kq_mask, "kq_mask");
|
|
ggml_set_input(kq_mask);
|
|
|
|
for (int il = 0; il < n_layer; il++) {
|
|
cur = tfm_layer_forward(cur, model.layers[il], inp_pos, kq_mask, il);
|
|
}
|
|
cb(cur, "mimi_enc_tfm", -1);
|
|
|
|
// downsample to the model frame rate, [512, T] -> [T, 512] -> [T / 16, 32]
|
|
cur = ggml_cont(ctx0, ggml_transpose(ctx0, cur));
|
|
cur = seanet.conv1d(cur, model.downsample_w, nullptr, hparams.mimi_downsample, 1, true);
|
|
cb(cur, "mimi_downsample", -1);
|
|
|
|
// voice latent -> backbone embd
|
|
cur = ggml_cont(ctx0, ggml_transpose(ctx0, cur));
|
|
cur = build_mm(model.spk_proj_w, cur);
|
|
cb(cur, "spk_proj", -1);
|
|
|
|
ggml_build_forward_expand(gf, cur);
|
|
return gf;
|
|
}
|