Files
Skald-Circle/crates/core-api/src/transcribe.rs
T
2026-07-10 15:02:09 +01:00

60 lines
2.2 KiB
Rust

use std::sync::Arc;
use async_trait::async_trait;
// ── Record types (DB ↔ manager) ───────────────────────────────────────────────
/// Full model record, mirroring one row in `transcribe_models`.
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct TranscribeModelRecord {
pub id: i64,
pub provider_id: i64,
pub model_id: String,
/// Display alias (also used as the transcriber `id()`).
pub name: String,
/// BCP-47 language hint, e.g. `"it"`. `None` → auto-detect.
pub language: Option<String>,
/// Lower number = tried first by `get()`.
pub priority: i32,
}
/// Remote model info returned by a provider's `list_transcribe_models()`.
#[derive(Debug, Clone, serde::Serialize)]
pub struct RemoteTranscribeModelInfo {
pub id: String,
pub name: String,
pub description: Option<String>,
/// BCP-47 language codes supported by this model (empty = unknown).
pub languages: Vec<String>,
}
/// Implemented by any provider that can convert audio bytes to text.
/// The `format` hint (e.g. `"ogg"`, `"mp3"`) is advisory.
#[async_trait]
pub trait Transcribe: Send + Sync {
/// A stable, unique identifier for this provider (e.g. `"whisper_local"`).
fn id(&self) -> &str;
async fn transcribe(&self, audio: Vec<u8>, format: &str) -> anyhow::Result<String>;
}
/// Resolves the currently active [`Transcribe`] provider.
///
/// Implemented by `TranscribeManager` in the main crate. Plugins store
/// `Arc<dyn TranscribeProvider>` so they can resolve the active transcriber
/// per-call without holding a reference to `AppState`.
#[async_trait]
pub trait TranscribeProvider: Send + Sync {
async fn get(&self) -> Option<Arc<dyn Transcribe>>;
}
/// Write-side of the transcribe manager: register and remove ephemeral providers.
///
/// Implemented by `TranscribeManager`. Plugins that provide their own STT
/// (e.g. `WhisperLocalPlugin`) use this to register themselves at start and
/// unregister at stop.
#[async_trait]
pub trait TranscribeRegistry: Send + Sync {
async fn register(&self, provider: Arc<dyn Transcribe>);
async fn unregister(&self, id: &str);
}