use crate::error::Result;
use crate::vad::SpeechSegment;
use boostr::model::speech_lm::layout::SpeechLayout;
use boostr::model::speech_lm::pack::{SpeechRecord, pack_records, pack_records_padded};
use boostr::model::speech_lm::vocab::SpeechVocab;
use crate::corpus::options::CorpusOptions;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Utterance {
pub segment: SpeechSegment,
pub text: String,
pub text_tokens: Vec<u32>,
pub frames: Vec<Vec<usize>>,
}
fn build_records(utterances: &[Utterance]) -> Vec<SpeechRecord<'_>> {
utterances
.iter()
.map(|utterance| SpeechRecord {
speaker: None,
style: None,
text: &utterance.text_tokens,
frames: &utterance.frames,
})
.collect()
}
pub fn pack_utterances(
vocab: &SpeechVocab,
utterances: &[Utterance],
opts: &CorpusOptions<'_>,
) -> Result<Vec<u32>> {
let records = build_records(utterances);
match opts.pad_to_multiple {
Some(pad_to_multiple) => Ok(pack_records_padded(vocab, &records, pad_to_multiple)?),
None => Ok(pack_records(vocab, &records)?),
}
}
pub fn pack_utterances_with_layout(
layout: &SpeechLayout,
utterances: &[Utterance],
opts: &CorpusOptions<'_>,
) -> Result<Vec<u32>> {
let records = build_records(utterances);
match opts.pad_to_multiple {
Some(pad_to_multiple) => Ok(layout.pack_records_padded(&records, pad_to_multiple)?),
None => Ok(layout.pack_records(&records)?),
}
}