use serde::Deserialize;
use std::path::Path;
#[derive(Debug, Clone, Deserialize)]
pub struct WhisperConfig {
pub num_mel_bins: usize,
pub max_source_positions: usize,
pub d_model: usize,
pub encoder_attention_heads: usize,
pub encoder_layers: usize,
pub vocab_size: usize,
pub max_target_positions: usize,
pub decoder_attention_heads: usize,
pub decoder_layers: usize,
#[serde(default)]
pub suppress_tokens: Vec<u32>,
#[serde(default)]
pub begin_suppress_tokens: Vec<u32>,
}
impl WhisperConfig {
pub fn from_file(path: &Path) -> anyhow::Result<Self> {
let data = std::fs::read_to_string(path)?;
Ok(serde_json::from_str(&data)?)
}
pub fn head_dim(&self) -> usize {
self.d_model / self.encoder_attention_heads
}
pub fn decoder_head_dim(&self) -> usize {
self.d_model / self.decoder_attention_heads
}
pub fn encoder_seq_len(&self, mel_frames: usize) -> usize {
let after_conv1 = mel_frames;
let pad = 1usize;
let k = 3usize;
let stride2 = 2usize;
(after_conv1 + 2 * pad - k) / stride2 + 1
}
pub fn tiny_synthetic() -> Self {
Self {
num_mel_bins: 4,
max_source_positions: 16,
d_model: 8,
encoder_attention_heads: 2,
encoder_layers: 1,
vocab_size: 32,
max_target_positions: 16,
decoder_attention_heads: 2,
decoder_layers: 1,
suppress_tokens: vec![],
begin_suppress_tokens: vec![],
}
}
pub fn tiny() -> Self {
Self {
num_mel_bins: 80,
max_source_positions: 1500,
d_model: 384,
encoder_attention_heads: 6,
encoder_layers: 4,
vocab_size: 51865,
max_target_positions: 448,
decoder_attention_heads: 6,
decoder_layers: 4,
suppress_tokens: vec![],
begin_suppress_tokens: vec![220, 50257],
}
}
}