use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProsodicFluencyResult {
pub overall_score: f64,
pub rhythmic_flow: f64,
pub stress_pattern_naturalness: f64,
pub intonation_appropriateness: f64,
pub pause_placement: f64,
pub reading_ease: f64,
pub syllable_complexity: f64,
pub phonological_patterns: HashMap<String, f64>,
pub prosodic_breaks: Vec<ProsodicBreak>,
pub rhythm_breakdown: Option<RhythmMetrics>,
pub stress_breakdown: Option<StressMetrics>,
pub intonation_breakdown: Option<IntonationMetrics>,
pub timing_breakdown: Option<TimingMetrics>,
pub phonological_breakdown: Option<PhonologicalMetrics>,
pub advanced_breakdown: Option<AdvancedProsodicMetrics>,
pub insights: Vec<String>,
pub recommendations: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RhythmMetrics {
pub overall_rhythm_score: f64,
pub rhythm_regularity: f64,
pub beat_consistency: f64,
pub alternation_quality: f64,
pub template_matches: Vec<RhythmTemplateMatch>,
pub beat_patterns: Vec<BeatPattern>,
pub rhythm_classification: Option<RhythmClassification>,
pub timing_variance: f64,
pub rhythmic_complexity: f64,
pub pattern_entropy: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RhythmTemplateMatch {
pub template_name: String,
pub confidence: f64,
pub coverage: f64,
pub pattern: Vec<usize>,
pub positions: Vec<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BeatPattern {
pub beat_type: BeatType,
pub position: usize,
pub strength: f64,
pub context: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum BeatType {
Strong,
Weak,
Intermediate,
Silent,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RhythmClassification {
pub primary_class: RhythmClass,
pub secondary_classes: HashMap<RhythmClass, f64>,
pub confidence: f64,
pub features: HashMap<String, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Hash, Eq, PartialEq)]
pub enum RhythmClass {
StressTimed,
SyllableTimed,
MoraTimed,
Mixed,
Irregular,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StressMetrics {
pub overall_stress_score: f64,
pub pattern_naturalness: f64,
pub metrical_quality: f64,
pub placement_accuracy: f64,
pub prominence_analysis: ProminenceAnalysis,
pub metrical_structure: MetricalStructure,
pub stress_clashes: Vec<StressClash>,
pub foot_analysis: FootAnalysis,
pub accent_patterns: Vec<AccentPattern>,
pub prediction_accuracy: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProminenceAnalysis {
pub primary_stress_positions: Vec<usize>,
pub secondary_stress_positions: Vec<usize>,
pub prominence_hierarchy: Vec<ProminenceLevel>,
pub focus_prominence: Vec<FocusMarker>,
pub contrastive_stress: Vec<ContrastiveStress>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProminenceLevel {
pub position: usize,
pub strength: f64,
pub prominence_type: ProminenceType,
pub factors: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ProminenceType {
Primary,
Secondary,
Phrasal,
Contrastive,
Focus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FocusMarker {
pub position: usize,
pub focus_type: FocusType,
pub strength: f64,
pub scope: Vec<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum FocusType {
Contrastive,
Information,
Corrective,
Emphatic,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContrastiveStress {
pub position: usize,
pub strength: f64,
pub contrasted_elements: Vec<String>,
pub context: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricalStructure {
pub metrical_feet: Vec<MetricalFoot>,
pub consistency_score: f64,
pub dominant_foot_type: FootType,
pub pattern_regularity: f64,
pub violations: Vec<MetricalViolation>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricalFoot {
pub foot_type: FootType,
pub syllables: Vec<String>,
pub stress_pattern: Vec<bool>,
pub boundaries: (usize, usize),
pub strength: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum FootType {
Trochee,
Iamb,
Dactyl,
Anapest,
Spondee,
Pyrrhic,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricalViolation {
pub violation_type: String,
pub position: usize,
pub severity: f64,
pub description: String,
pub correction: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StressClash {
pub positions: Vec<usize>,
pub severity: f64,
pub context: String,
pub resolutions: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FootAnalysis {
pub boundary_accuracy: f64,
pub type_distribution: HashMap<FootType, f64>,
pub average_length: f64,
pub regularity_score: f64,
pub complex_patterns: Vec<ComplexFootPattern>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComplexFootPattern {
pub pattern: String,
pub count: usize,
pub complexity: f64,
pub positions: Vec<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccentPattern {
pub accent_type: AccentType,
pub position: usize,
pub strength: f64,
pub tonal_properties: Option<TonalProperties>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AccentType {
HighTone,
LowTone,
Rising,
Falling,
Complex,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TonalProperties {
pub f0_values: Vec<f64>,
pub pitch_range: (f64, f64),
pub movement: TonalMovement,
pub alignment: Vec<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TonalMovement {
Level,
Rising,
Falling,
RiseFall,
FallRise,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntonationMetrics {
pub overall_intonation_score: f64,
pub appropriateness: f64,
pub contour_analysis: Option<PitchContourAnalysis>,
pub boundary_tones: Option<Vec<BoundaryTone>>,
pub focus_patterns: Option<Vec<FocusPattern>>,
pub sentence_classifications: Vec<SentenceTypeClassification>,
pub phrase_structure: Option<IntonationalPhraseStructure>,
pub pitch_range_analysis: Option<PitchRangeAnalysis>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PitchContourAnalysis {
pub smoothness: f64,
pub complexity: f64,
pub peaks_valleys: PeakValleyAnalysis,
pub segments: Vec<ContourSegment>,
pub contour_shape: ContourShape,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PeakValleyAnalysis {
pub peaks: Vec<PitchPoint>,
pub valleys: Vec<PitchPoint>,
pub peak_valley_ratio: f64,
pub regularity: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PitchPoint {
pub position: usize,
pub pitch: f64,
pub prominence: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContourSegment {
pub boundaries: (usize, usize),
pub trend: TrendDirection,
pub slope: f64,
pub length: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TrendDirection {
Rising,
Falling,
Level,
Complex,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ContourShape {
Declarative,
Interrogative,
Exclamatory,
Complex,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BoundaryTone {
pub position: usize,
pub boundary_type: BoundaryType,
pub tone_type: ToneType,
pub strength: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum BoundaryType {
Phrase,
Utterance,
Intermediate,
Major,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ToneType {
High,
Low,
Mid,
Rising,
Falling,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FocusPattern {
pub position: usize,
pub focus_type: FocusType,
pub scope: Vec<usize>,
pub acoustic_correlates: AcousticCorrelates,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AcousticCorrelates {
pub f0_changes: Vec<f64>,
pub duration_changes: Vec<f64>,
pub intensity_changes: Vec<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SentenceTypeClassification {
pub position: usize,
pub sentence_type: SentenceType,
pub confidence: f64,
pub features: HashMap<String, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SentenceType {
Declarative,
Interrogative,
Exclamatory,
Imperative,
Conditional,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntonationalPhraseStructure {
pub phrase_boundaries: Vec<usize>,
pub phrase_types: Vec<PhraseType>,
pub coherence: f64,
pub hierarchy: PhraseHierarchy,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum PhraseType {
Major,
Minor,
Intermediate,
Accentual,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PhraseHierarchy {
pub levels: Vec<HierarchyLevel>,
pub relationships: HashMap<usize, Vec<usize>>,
pub depth: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HierarchyLevel {
pub level: usize,
pub units: Vec<PhraseUnit>,
pub prominence: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PhraseUnit {
pub boundaries: (usize, usize),
pub unit_type: PhraseType,
pub content: String,
pub properties: HashMap<String, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PitchRangeAnalysis {
pub overall_range: (f64, f64),
pub pitch_span: f64,
pub range_utilization: f64,
pub local_variations: Vec<LocalPitchRange>,
pub compression_analysis: Option<RangeCompressionAnalysis>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LocalPitchRange {
pub position: usize,
pub range: (f64, f64),
pub width: f64,
pub variation: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RangeCompressionAnalysis {
pub compression_ratio: f64,
pub compression_points: Vec<usize>,
pub expansion_points: Vec<usize>,
pub trend: CompressionTrend,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CompressionTrend {
Increasing,
Decreasing,
Stable,
Variable,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimingMetrics {
pub overall_timing_score: f64,
pub pause_accuracy: f64,
pub tempo_analysis: Option<TempoAnalysis>,
pub duration_analysis: Option<DurationAnalysis>,
pub speech_rate_analysis: Option<SpeechRateAnalysis>,
pub variability_analysis: Option<TimingVariabilityAnalysis>,
pub break_analysis: Vec<ProsodicBreak>,
pub syllable_timing: Option<SyllableTimingAnalysis>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProsodicBreak {
pub position: usize,
pub break_type: BreakType,
pub strength: f64,
pub duration: Option<f64>,
pub context: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum BreakType {
Minor,
Major,
Pause,
Boundary,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TempoAnalysis {
pub average_tempo: f64,
pub tempo_variability: f64,
pub tempo_changes: Vec<TempoChange>,
pub regularity: f64,
pub tempo_class: TempoClass,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TempoChange {
pub position: usize,
pub magnitude: f64,
pub direction: ChangeDirection,
pub context: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ChangeDirection {
Increase,
Decrease,
Stable,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TempoClass {
VerySlow,
Slow,
Moderate,
Fast,
VeryFast,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DurationAnalysis {
pub average_syllable_duration: f64,
pub duration_variability: f64,
pub duration_patterns: Vec<DurationPattern>,
pub lengthening_effects: Vec<LengtheningEffect>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DurationPattern {
pub pattern_type: String,
pub strength: f64,
pub positions: Vec<usize>,
pub regularity: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LengtheningEffect {
pub position: usize,
pub factor: f64,
pub lengthening_type: LengtheningType,
pub cause: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LengtheningType {
PreBoundary,
Focus,
Stress,
PhraseFinal,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpeechRateAnalysis {
pub words_per_minute: f64,
pub syllables_per_second: f64,
pub rate_variability: f64,
pub rate_changes: Vec<SpeechRateChange>,
pub rate_class: SpeechRateClass,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpeechRateChange {
pub position: usize,
pub new_rate: f64,
pub magnitude: f64,
pub context: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SpeechRateClass {
VerySlow,
Slow,
Normal,
Fast,
VeryFast,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimingVariabilityAnalysis {
pub overall_variability: f64,
pub component_variability: HashMap<String, f64>,
pub variability_patterns: Vec<VariabilityPattern>,
pub consistency_metrics: ConsistencyMetrics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VariabilityPattern {
pub pattern: String,
pub strength: f64,
pub positions: Vec<usize>,
pub regularity: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConsistencyMetrics {
pub beat_consistency: f64,
pub rhythm_consistency: f64,
pub pause_consistency: f64,
pub overall_consistency: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SyllableTimingAnalysis {
pub average_duration: f64,
pub timing_patterns: Vec<SyllableTimingPattern>,
pub timing_regularity: f64,
pub isochrony_measures: IsochronyMeasures,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SyllableTimingPattern {
pub pattern_type: String,
pub positions: Vec<usize>,
pub strength: f64,
pub durations: Vec<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IsochronyMeasures {
pub stress_timed: f64,
pub syllable_timed: f64,
pub mora_timed: Option<f64>,
pub classification: IsochronyClass,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum IsochronyClass {
StrongStressTimed,
WeakStressTimed,
StrongSyllableTimed,
WeakSyllableTimed,
Mixed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PhonologicalMetrics {
pub overall_phonological_score: f64,
pub sound_patterns: SoundPatternAnalysis,
pub euphony_analysis: Option<EuphonyAnalysis>,
pub phonotactic_analysis: Option<PhonotacticAnalysis>,
pub syllable_structure: Option<SyllableStructureAnalysis>,
pub alliteration: HashMap<String, f64>,
pub assonance: HashMap<String, f64>,
pub consonance: HashMap<String, f64>,
pub rhyme: HashMap<String, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SoundPatternAnalysis {
pub pattern_types: Vec<String>,
pub frequencies: HashMap<String, usize>,
pub strengths: HashMap<String, f64>,
pub positions: HashMap<String, Vec<usize>>,
pub pattern_density: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EuphonyAnalysis {
pub euphony_score: f64,
pub pleasant_combinations: Vec<SoundCombination>,
pub harsh_combinations: Vec<SoundCombination>,
pub flow_quality: f64,
pub articulatory_ease: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SoundCombination {
pub sounds: Vec<String>,
pub position: usize,
pub quality: f64,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PhonotacticAnalysis {
pub legal_sequences: Vec<PhoneticSequence>,
pub illegal_sequences: Vec<PhoneticSequence>,
pub probability: f64,
pub constraint_violations: Vec<PhonotacticViolation>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PhoneticSequence {
pub sounds: Vec<String>,
pub position: usize,
pub probability: f64,
pub frequency: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PhonotacticViolation {
pub violation_type: String,
pub position: usize,
pub severity: f64,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SyllableStructureAnalysis {
pub syllable_patterns: Vec<SyllablePattern>,
pub complexity: f64,
pub onset_analysis: OnsetAnalysis,
pub nucleus_analysis: NucleusAnalysis,
pub coda_analysis: CodaAnalysis,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SyllablePattern {
pub pattern: String,
pub frequency: usize,
pub positions: Vec<usize>,
pub complexity: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OnsetAnalysis {
pub simple_onsets: Vec<String>,
pub complex_onsets: Vec<String>,
pub complexity_distribution: HashMap<usize, usize>,
pub average_complexity: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NucleusAnalysis {
pub vowel_nuclei: Vec<String>,
pub diphthong_nuclei: Vec<String>,
pub length_distribution: HashMap<usize, usize>,
pub average_length: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CodaAnalysis {
pub simple_codas: Vec<String>,
pub complex_codas: Vec<String>,
pub presence_ratio: f64,
pub average_complexity: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AdvancedProsodicMetrics {
pub overall_advanced_score: f64,
pub hierarchy_analysis: Option<ProsodicHierarchyAnalysis>,
pub complexity_analysis: Option<ProsodicComplexityAnalysis>,
pub entropy_measures: Option<ProsodicEntropyMeasures>,
pub ml_features: Option<MLProsodicFeatures>,
pub neural_modeling: Option<NeuralProsodicModeling>,
pub profiling_data: Option<ProfilingData>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProsodicHierarchyAnalysis {
pub hierarchy_levels: Vec<HierarchyLevel>,
pub level_relationships: HashMap<usize, Vec<usize>>,
pub coherence: f64,
pub depth: usize,
pub complexity: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProsodicComplexityAnalysis {
pub overall_complexity: f64,
pub rhythmic_complexity: f64,
pub stress_complexity: f64,
pub intonational_complexity: f64,
pub temporal_complexity: f64,
pub hierarchical_complexity: f64,
pub complexity_distribution: HashMap<String, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProsodicEntropyMeasures {
pub rhythmic_entropy: f64,
pub stress_entropy: f64,
pub intonational_entropy: f64,
pub temporal_entropy: f64,
pub overall_entropy: f64,
pub entropy_trends: Vec<EntropyTrend>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EntropyTrend {
pub position: usize,
pub entropy: f64,
pub trend: TrendDirection,
pub change_rate: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MLProsodicFeatures {
pub features: Vec<f64>,
pub feature_names: Vec<String>,
pub importance_scores: Vec<f64>,
pub dimensionality: usize,
pub correlations: Option<Vec<Vec<f64>>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NeuralProsodicModeling {
pub predictions: Vec<f64>,
pub confidence_scores: Vec<f64>,
pub attention_weights: Option<Vec<Vec<f64>>>,
pub hidden_states: Option<Vec<Vec<f64>>>,
pub architecture_info: ModelArchitectureInfo,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelArchitectureInfo {
pub model_type: String,
pub num_layers: usize,
pub hidden_size: usize,
pub input_size: usize,
pub output_size: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProfilingData {
pub component_timings: HashMap<String, f64>,
pub memory_usage: HashMap<String, usize>,
pub cache_statistics: CacheStatistics,
pub bottlenecks: Vec<PerformanceBottleneck>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CacheStatistics {
pub hit_rate: f64,
pub cache_size: usize,
pub cache_usage: f64,
pub evictions: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PerformanceBottleneck {
pub component: String,
pub bottleneck_type: String,
pub severity: f64,
pub description: String,
pub suggestions: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProsodicComparisonResult {
pub text1_result: ProsodicFluencyResult,
pub text2_result: ProsodicFluencyResult,
pub overall_difference: f64,
pub rhythm_difference: f64,
pub stress_difference: f64,
pub intonation_difference: f64,
pub timing_difference: f64,
pub phonological_difference: f64,
pub advanced_difference: f64,
pub similarity_score: f64,
pub comparative_insights: Vec<String>,
pub recommendations: Vec<String>,
}
impl Default for ProsodicFluencyResult {
fn default() -> Self {
Self {
overall_score: 0.0,
rhythmic_flow: 0.0,
stress_pattern_naturalness: 0.0,
intonation_appropriateness: 0.0,
pause_placement: 0.0,
reading_ease: 0.0,
syllable_complexity: 0.0,
phonological_patterns: HashMap::new(),
prosodic_breaks: Vec::new(),
rhythm_breakdown: None,
stress_breakdown: None,
intonation_breakdown: None,
timing_breakdown: None,
phonological_breakdown: None,
advanced_breakdown: None,
insights: Vec::new(),
recommendations: Vec::new(),
}
}
}
impl Default for RhythmMetrics {
fn default() -> Self {
Self {
overall_rhythm_score: 0.0,
rhythm_regularity: 0.0,
beat_consistency: 0.0,
alternation_quality: 0.0,
template_matches: Vec::new(),
beat_patterns: Vec::new(),
rhythm_classification: None,
timing_variance: 0.0,
rhythmic_complexity: 0.0,
pattern_entropy: 0.0,
}
}
}
impl Default for StressMetrics {
fn default() -> Self {
Self {
overall_stress_score: 0.0,
pattern_naturalness: 0.0,
metrical_quality: 0.0,
placement_accuracy: 0.0,
prominence_analysis: ProminenceAnalysis::default(),
metrical_structure: MetricalStructure::default(),
stress_clashes: Vec::new(),
foot_analysis: FootAnalysis::default(),
accent_patterns: Vec::new(),
prediction_accuracy: None,
}
}
}
impl Default for ProminenceAnalysis {
fn default() -> Self {
Self {
primary_stress_positions: Vec::new(),
secondary_stress_positions: Vec::new(),
prominence_hierarchy: Vec::new(),
focus_prominence: Vec::new(),
contrastive_stress: Vec::new(),
}
}
}
impl Default for MetricalStructure {
fn default() -> Self {
Self {
metrical_feet: Vec::new(),
consistency_score: 0.0,
dominant_foot_type: FootType::Trochee,
pattern_regularity: 0.0,
violations: Vec::new(),
}
}
}
impl Default for FootAnalysis {
fn default() -> Self {
Self {
boundary_accuracy: 0.0,
type_distribution: HashMap::new(),
average_length: 0.0,
regularity_score: 0.0,
complex_patterns: Vec::new(),
}
}
}
impl Default for IntonationMetrics {
fn default() -> Self {
Self {
overall_intonation_score: 0.0,
appropriateness: 0.0,
contour_analysis: None,
boundary_tones: None,
focus_patterns: None,
sentence_classifications: Vec::new(),
phrase_structure: None,
pitch_range_analysis: None,
}
}
}
impl Default for TimingMetrics {
fn default() -> Self {
Self {
overall_timing_score: 0.0,
pause_accuracy: 0.0,
tempo_analysis: None,
duration_analysis: None,
speech_rate_analysis: None,
variability_analysis: None,
break_analysis: Vec::new(),
syllable_timing: None,
}
}
}
impl Default for PhonologicalMetrics {
fn default() -> Self {
Self {
overall_phonological_score: 0.0,
sound_patterns: SoundPatternAnalysis::default(),
euphony_analysis: None,
phonotactic_analysis: None,
syllable_structure: None,
alliteration: HashMap::new(),
assonance: HashMap::new(),
consonance: HashMap::new(),
rhyme: HashMap::new(),
}
}
}
impl Default for SoundPatternAnalysis {
fn default() -> Self {
Self {
pattern_types: Vec::new(),
frequencies: HashMap::new(),
strengths: HashMap::new(),
positions: HashMap::new(),
pattern_density: 0.0,
}
}
}
impl Default for AdvancedProsodicMetrics {
fn default() -> Self {
Self {
overall_advanced_score: 0.0,
hierarchy_analysis: None,
complexity_analysis: None,
entropy_measures: None,
ml_features: None,
neural_modeling: None,
profiling_data: None,
}
}
}
impl ProsodicFluencyResult {
pub fn calculate_overall_score(&mut self) -> f64 {
let weights = [0.25, 0.20, 0.20, 0.15, 0.20]; let scores = [
self.rhythmic_flow,
self.stress_pattern_naturalness,
self.intonation_appropriateness,
self.pause_placement,
self.reading_ease,
];
let weighted_score: f64 = scores
.iter()
.zip(weights.iter())
.map(|(score, weight)| score * weight)
.sum();
self.overall_score = weighted_score;
weighted_score
}
pub fn get_summary(&self) -> HashMap<String, f64> {
let mut summary = HashMap::new();
summary.insert("overall_score".to_string(), self.overall_score);
summary.insert("rhythmic_flow".to_string(), self.rhythmic_flow);
summary.insert(
"stress_naturalness".to_string(),
self.stress_pattern_naturalness,
);
summary.insert(
"intonation_appropriateness".to_string(),
self.intonation_appropriateness,
);
summary.insert("pause_placement".to_string(), self.pause_placement);
summary.insert("reading_ease".to_string(), self.reading_ease);
summary.insert("syllable_complexity".to_string(), self.syllable_complexity);
summary
}
pub fn is_complete(&self) -> bool {
self.rhythm_breakdown.is_some()
&& self.stress_breakdown.is_some()
&& self.intonation_breakdown.is_some()
&& self.timing_breakdown.is_some()
&& self.phonological_breakdown.is_some()
&& self.advanced_breakdown.is_some()
}
pub fn get_breakdown_summary(&self) -> HashMap<String, bool> {
let mut breakdown = HashMap::new();
breakdown.insert("rhythm".to_string(), self.rhythm_breakdown.is_some());
breakdown.insert("stress".to_string(), self.stress_breakdown.is_some());
breakdown.insert(
"intonation".to_string(),
self.intonation_breakdown.is_some(),
);
breakdown.insert("timing".to_string(), self.timing_breakdown.is_some());
breakdown.insert(
"phonological".to_string(),
self.phonological_breakdown.is_some(),
);
breakdown.insert("advanced".to_string(), self.advanced_breakdown.is_some());
breakdown
}
}