#pragma once
#include "ggml-backend.h"
#include "ggml.h"
#include "transcribe-backend.h"
#include "transcribe-load-common.h"
#include "transcribe-model.h"
#include "transcribe-session.h"
#include "transcribe-tokenizer.h"
#include "weights.h"
#include <cstdint>
#include <deque>
#include <string>
#include <vector>
struct ggml_context;
struct ggml_tensor;
struct ggml_backend;
struct ggml_backend_buffer;
struct ggml_backend_sched;
typedef struct ggml_backend * ggml_backend_t;
typedef struct ggml_backend_buffer * ggml_backend_buffer_t;
typedef struct ggml_backend_sched * ggml_backend_sched_t;
namespace transcribe::moonshine_streaming {
void apply_family_invariants(transcribe_model & model);
struct MoonshineStreamingKvCache {
ggml_tensor * self_k = nullptr;
ggml_tensor * self_v = nullptr;
ggml_tensor * cross_k = nullptr;
ggml_tensor * cross_v = nullptr;
ggml_context * ctx = nullptr;
ggml_backend_buffer_t buffer = nullptr;
int n_ctx = 0;
int n = 0;
int head = 0;
int T_enc = 0;
int n_batch = 1;
bool cross_populated = false;
void free() {
if (buffer != nullptr) {
safe_buffer_free(buffer);
buffer = nullptr;
}
if (ctx != nullptr) {
ggml_free(ctx);
ctx = nullptr;
}
self_k = nullptr;
self_v = nullptr;
cross_k = nullptr;
cross_v = nullptr;
n = 0;
head = 0;
T_enc = 0;
n_batch = 1;
cross_populated = false;
}
};
bool kv_cache_init(MoonshineStreamingKvCache & cache,
ggml_backend_t backend,
int n_ctx,
int T_enc,
int d_model,
int n_layer,
ggml_type kv_type);
bool kv_cache_init_batched(MoonshineStreamingKvCache & cache,
ggml_backend_t backend,
int n_ctx,
int T_enc,
int d_model,
int n_layer,
int n_batch,
ggml_type kv_type);
struct MoonshineStreamingModel final : public transcribe_model {
Tokenizer tok;
MoonshineStreamingHParams hparams;
MoonshineStreamingWeights weights;
ggml_context * ctx_meta = nullptr;
transcribe::BackendPlan plan;
transcribe::load_common::WeightStorage weight_storage;
MoonshineStreamingModel() = default;
~MoonshineStreamingModel() override;
const transcribe::Tokenizer * tokenizer() const override { return &tok; }
};
struct MoonshineStreamingSession final : public transcribe_session {
std::vector<float> adapter_host;
int enc_T = 0;
MoonshineStreamingKvCache kv_cache;
bool encoder_use_flash = true;
bool decoder_use_flash = true;
std::vector<float> stream_pcm_buffer;
int64_t stream_pcm_start_sample = 0;
std::vector<float> stream_adapter_committed;
std::vector<std::vector<float>> stream_cross_k_committed;
std::vector<std::vector<float>> stream_cross_v_committed;
int32_t stream_T_emitted = 0;
int32_t stream_last_decoded_T = 0;
bool stream_input_capped = false;
std::deque<std::vector<int32_t>> stream_token_id_history;
int32_t stream_L_total_frames = 0;
int32_t stream_R_total_frames = 0;
int32_t stream_frontend_pad_frames = 0;
int32_t stream_samples_per_enc_frame = 0;
int32_t stream_min_decode_frames = 0;
transcribe_run_params stream_run_params{};
MoonshineStreamingSession() = default;
~MoonshineStreamingSession() override;
};
}