#pragma once #include "engine/framework/audio/chunking.h" #include "engine/framework/runtime/model.h" #include "engine/framework/runtime/session_base.h" #include "engine/community_models/granite5asr/assets.h" #include "engine/community_models/granite5asr/encoder.h" #include "engine/community_models/granite5asr/frontend.h" #include #include #include namespace engine::community_models::granite5asr { struct TimedTranscript { runtime::Transcript transcript; std::vector words; }; class Granite5ASRSessionBase : public runtime::RuntimeSessionBase { public: Granite5ASRSessionBase( runtime::TaskSpec task, runtime::SessionOptions options, std::shared_ptr assets); ~Granite5ASRSessionBase() override; protected: std::string family_impl() const; runtime::VoiceTaskKind task_kind_impl() const; runtime::RunMode run_mode_impl() const; TimedTranscript transcribe_audio( const runtime::AudioBuffer & audio, const std::unordered_map & options); runtime::IOfflineVoiceTaskSession & vad_session(); runtime::TaskSpec task_; std::shared_ptr assets_; Granite5Frontend frontend_; std::unique_ptr encoder_; std::string vad_model_path_; std::unique_ptr vad_model_; std::unique_ptr vad_session_; }; class Granite5ASROfflineSession final : public Granite5ASRSessionBase , public runtime::IOfflineVoiceTaskSession { public: Granite5ASROfflineSession( runtime::TaskSpec task, runtime::SessionOptions options, std::shared_ptr assets); std::string family() const override; runtime::VoiceTaskKind task_kind() const override; runtime::RunMode run_mode() const override; void prepare(const runtime::SessionPreparationRequest & request) override; runtime::TaskResult run(const runtime::TaskRequest & request) override; }; class Granite5ASRStreamingSession final : public Granite5ASRSessionBase , public runtime::IStreamingVoiceTaskSession { public: Granite5ASRStreamingSession( runtime::TaskSpec task, runtime::SessionOptions options, std::shared_ptr assets); std::string family() const override; runtime::VoiceTaskKind task_kind() const override; runtime::RunMode run_mode() const override; void prepare(const runtime::SessionPreparationRequest & request) override; runtime::StreamingPolicy streaming_policy() const override; void start_stream(const runtime::TaskRequest & request) override; void set_stream_event_sink(runtime::StreamEventCallback sink) override; void reset() override; runtime::StreamEvent process_audio_chunk(const runtime::AudioChunk & chunk) override; runtime::TaskResult finish_stream() override; runtime::TaskResult finalize() override; private: void remap_stream_words(std::vector & words) const; runtime::StreamEventCallback stream_event_sink_; runtime::AudioBuffer streaming_audio_; runtime::TaskRequest streaming_request_; int32_t stream_input_rate_ = 0; int64_t stream_input_samples_ = 0; }; class Granite5ASRLoadedModel final : public runtime::ILoadedVoiceModel { public: Granite5ASRLoadedModel( runtime::ModelMetadata metadata, runtime::CapabilitySet capabilities, std::shared_ptr assets); const runtime::ModelMetadata & metadata() const noexcept override; const runtime::CapabilitySet & capabilities() const noexcept override; std::unique_ptr create_task_session( const runtime::TaskSpec & task, const runtime::SessionOptions & options) const override; private: runtime::ModelMetadata metadata_; runtime::CapabilitySet capabilities_; std::shared_ptr assets_; }; std::unique_ptr load_granite5asr_model( const runtime::ModelLoadRequest & request); std::shared_ptr make_granite5asr_loader(); } // namespace engine::community_models::granite5asr