#pragma once #include #include "engine/framework/assets/tensor_source.h" #include "engine/framework/core/execution_context.h" #include #include #include #include namespace engine::models::fish_drama3 { using Drama3Frame = std::array; struct Drama3TowerConfig { int64_t hidden_size = 2048; int64_t intermediate_size = 6144; int64_t heads = 16; int64_t kv_heads = 2; int64_t head_dim = 256; int64_t codebook_size = 4096; int64_t shared_layers = 4; int64_t residual_layers = 9; int64_t backbone_codebooks = 1; int32_t semantic_begin = 248099; float norm_eps = 1e-6F; float rope_theta = 1e7F; float rotary_fraction = 0.25F; }; struct Drama3TowerOutput { std::vector hidden; std::vector logits; }; // Each tower layer attends over the speech timeline, including prompt rows. // Its cache is independent of the backbone and persists across codebooks. class Drama3Tower { public: Drama3Tower(std::shared_ptr weights, Drama3TowerConfig config, core::ExecutionContext & execution, int64_t cache_steps, size_t prefill_cache_bytes = 256u * 1024u * 1024u); ~Drama3Tower(); Drama3Tower(const Drama3Tower &) = delete; Drama3Tower & operator=(const Drama3Tower &) = delete; void reset(); void release_prefill_graphs(); void mix_backbone_embeddings(std::vector & embeddings, const std::vector & frames) const; std::vector shared_input(const std::vector & frames) const; void prefill(const std::vector & hidden, const std::vector & frames); Drama3TowerOutput run_layer(int64_t layer, const std::vector & hidden, const std::vector & codes, const std::vector & semantic_mask, const std::vector & extra_input, int64_t position, int64_t steps = 1); Drama3Frame run_frame(const std::vector & hidden, const Drama3Frame & current, int32_t semantic_code, int64_t position, float temperature, int top_k, float top_p, const std::array & uniforms); const Drama3TowerConfig & config() const noexcept; private: class Impl; std::unique_ptr impl_; }; } // namespace engine::models::fish_drama3