@@ -78,6 +78,23 @@ function normalizeCommitStrategy(value: unknown): "manual" | "vad" | undefined {
|
78 | 78 | throw new Error(`Invalid ElevenLabs realtime transcription commit strategy: ${normalized}`); |
79 | 79 | } |
80 | 80 | |
| 81 | +function normalizePositiveSafeInteger(value: unknown): number | undefined { |
| 82 | +const parsed = readFiniteNumber(value); |
| 83 | +return parsed !== undefined && Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined; |
| 84 | +} |
| 85 | + |
| 86 | +function normalizeFiniteRange(value: unknown, min: number, max: number): number | undefined { |
| 87 | +const parsed = readFiniteNumber(value); |
| 88 | +return parsed !== undefined && parsed >= min && parsed <= max ? parsed : undefined; |
| 89 | +} |
| 90 | + |
| 91 | +function normalizeIntegerRange(value: unknown, min: number, max: number): number | undefined { |
| 92 | +const parsed = readFiniteNumber(value); |
| 93 | +return parsed !== undefined && Number.isSafeInteger(parsed) && parsed >= min && parsed <= max |
| 94 | + ? parsed |
| 95 | + : undefined; |
| 96 | +} |
| 97 | + |
81 | 98 | function normalizeProviderConfig( |
82 | 99 | config: RealtimeTranscriptionProviderConfig, |
83 | 100 | ): ElevenLabsRealtimeTranscriptionProviderConfig { |
@@ -90,15 +107,25 @@ function normalizeProviderConfig(
|
90 | 107 | baseUrl: normalizeOptionalString(raw.baseUrl), |
91 | 108 | modelId: normalizeOptionalString(raw.modelId ?? raw.model ?? raw.sttModel), |
92 | 109 | audioFormat: normalizeOptionalString(raw.audioFormat ?? raw.audio_format ?? raw.encoding), |
93 | | -sampleRate: readFiniteNumber(raw.sampleRate ?? raw.sample_rate), |
| 110 | +sampleRate: normalizePositiveSafeInteger(raw.sampleRate ?? raw.sample_rate), |
94 | 111 | languageCode: normalizeOptionalString(raw.languageCode ?? raw.language), |
95 | 112 | commitStrategy: normalizeCommitStrategy(raw.commitStrategy ?? raw.commit_strategy), |
96 | | -vadSilenceThresholdSecs: readFiniteNumber( |
| 113 | +vadSilenceThresholdSecs: normalizeFiniteRange( |
97 | 114 | raw.vadSilenceThresholdSecs ?? raw.vad_silence_threshold_secs, |
| 115 | +0.3, |
| 116 | +3, |
| 117 | +), |
| 118 | +vadThreshold: normalizeFiniteRange(raw.vadThreshold ?? raw.vad_threshold, 0.1, 0.9), |
| 119 | +minSpeechDurationMs: normalizeIntegerRange( |
| 120 | +raw.minSpeechDurationMs ?? raw.min_speech_duration_ms, |
| 121 | +50, |
| 122 | +2_000, |
| 123 | +), |
| 124 | +minSilenceDurationMs: normalizeIntegerRange( |
| 125 | +raw.minSilenceDurationMs ?? raw.min_silence_duration_ms, |
| 126 | +50, |
| 127 | +2_000, |
98 | 128 | ), |
99 | | -vadThreshold: readFiniteNumber(raw.vadThreshold ?? raw.vad_threshold), |
100 | | -minSpeechDurationMs: readFiniteNumber(raw.minSpeechDurationMs ?? raw.min_speech_duration_ms), |
101 | | -minSilenceDurationMs: readFiniteNumber(raw.minSilenceDurationMs ?? raw.min_silence_duration_ms), |
102 | 129 | }; |
103 | 130 | } |
104 | 131 | |
|