pub mod audio;
mod bias;
mod ctc;
mod decode;
#[cfg(feature = "diarization")]
mod diarization;
mod engine;
mod features;
mod pool;
mod state;
mod types;
#[cfg(not(feature = "__internals"))]
mod tokenizer;
#[cfg(feature = "__internals")]
pub mod tokenizer;
#[cfg(all(feature = "coreml", feature = "cuda"))]
compile_error!("Features `coreml` and `cuda` are mutually exclusive. Choose one.");
pub use engine::Engine;
pub use pool::{OwnedReservation, Pool, PoolError, PoolGuard, SessionPool, SessionTriplet};
#[cfg(feature = "diarization")]
pub use diarization::{SharedExtractor, SpeakerEncoder, StreamingDiarizationState};
pub use state::{
DecoderState, EndpointMode, EndpointReason, FeatureExtractor, StreamingState,
TranscriptAssembler, TranscriptSegment, WordInfo,
};
pub use types::{
DEFAULT_HOTWORDS_BOOST, DiarizationOutcome, HotwordError, HotwordOverride,
MAX_HOTWORD_PHRASE_CHARS, MAX_HOTWORDS_PER_REQUEST, OverrideError, TranscribeOverrides,
TranscribeRequest, TranscribeResult, TranscribeSource, merge_channel_results,
};
pub const N_MELS: usize = 64;
pub const N_FFT: usize = 320;
pub const HOP_LENGTH: usize = 160;
pub const PRED_HIDDEN: usize = 320;
const ENCODER_SUBSAMPLING: usize = 4;
const SECONDS_PER_FRAME: f64 = (HOP_LENGTH as f64 * ENCODER_SUBSAMPLING as f64) / 16000.0;
pub fn now_timestamp() -> f64 {
use std::sync::OnceLock;
use std::time::{Instant, SystemTime, UNIX_EPOCH};
static ANCHOR: OnceLock<(SystemTime, Instant)> = OnceLock::new();
let (epoch, start) = ANCHOR.get_or_init(|| (SystemTime::now(), Instant::now()));
let base = match epoch.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs_f64(),
Err(e) => {
tracing::warn!("System clock is before Unix epoch: {e}");
0.0
}
};
base + start.elapsed().as_secs_f64()
}