





























@@ -5,15 +5,17 @@ import {
55import { resolveApiKeyForProvider } from "openclaw/plugin-sdk/provider-auth-runtime";
66import { normalizeResolvedSecretInputString } from "openclaw/plugin-sdk/secret-input";
77import {
8-asFiniteNumber,
98trimToUndefined,
109type SpeechDirectiveTokenParseContext,
1110type SpeechProviderConfig,
1211type SpeechProviderOverrides,
1312type SpeechProviderPlugin,
1413type SpeechSynthesisTarget,
1514} from "openclaw/plugin-sdk/speech";
16-import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
15+import {
16+asFiniteNumberInRange,
17+normalizeLowercaseStringOrEmpty,
18+} from "openclaw/plugin-sdk/string-coerce-runtime";
1719import {
1820isValidXaiTtsVoice,
1921normalizeXaiLanguageCode,
@@ -42,6 +44,10 @@ type XaiTtsProviderOverrides = {
4244speed?: number;
4345};
444647+function normalizeXaiSpeechSpeed(value: unknown): number | undefined {
48+return asFiniteNumberInRange(value, { min: 0.7, max: 1.5 });
49+}
50+4551function normalizeXaiSpeechResponseFormat(value: unknown): XaiSpeechResponseFormat | undefined {
4652const next = normalizeLowercaseStringOrEmpty(value);
4753if (!next) {
@@ -93,7 +99,7 @@ function normalizeXaiProviderConfig(rawConfig: Record<string, unknown>): XaiTtsP
9399),
94100voiceId: trimToUndefined(xai?.voiceId ?? xai?.voice) ?? "eve",
95101language: normalizeXaiLanguageCode(trimToUndefined(xai?.language ?? xai?.languageCode)),
96-speed: asFiniteNumber(xai?.speed),
102+speed: normalizeXaiSpeechSpeed(xai?.speed),
97103responseFormat: normalizeXaiSpeechResponseFormat(xai?.responseFormat),
98104};
99105}
@@ -107,7 +113,7 @@ function readXaiProviderConfig(config: SpeechProviderConfig): XaiTtsProviderConf
107113language:
108114normalizeXaiLanguageCode(trimToUndefined(config.language ?? config.languageCode)) ??
109115normalized.language,
110-speed: asFiniteNumber(config.speed) ?? normalized.speed,
116+speed: normalizeXaiSpeechSpeed(config.speed) ?? normalized.speed,
111117responseFormat:
112118normalizeXaiSpeechResponseFormat(config.responseFormat) ?? normalized.responseFormat,
113119};
@@ -120,7 +126,7 @@ function readXaiOverrides(overrides: SpeechProviderOverrides | undefined): XaiTt
120126return {
121127voiceId: trimToUndefined(overrides.voiceId ?? overrides.voice),
122128language: normalizeXaiLanguageCode(trimToUndefined(overrides.language)),
123-speed: asFiniteNumber(overrides.speed),
129+speed: normalizeXaiSpeechSpeed(overrides.speed),
124130};
125131}
126132@@ -186,9 +192,9 @@ export function buildXaiSpeechProvider(): SpeechProviderPlugin {
186192trimToUndefined(talkProviderConfig.language ?? talkProviderConfig.languageCode),
187193),
188194}),
189- ...(asFiniteNumber(talkProviderConfig.speed) == null
195+ ...(normalizeXaiSpeechSpeed(talkProviderConfig.speed) == null
190196 ? {}
191- : { speed: asFiniteNumber(talkProviderConfig.speed) }),
197+ : { speed: normalizeXaiSpeechSpeed(talkProviderConfig.speed) }),
192198 ...(responseFormat == null ? {} : { responseFormat }),
193199};
194200},
@@ -203,7 +209,9 @@ export function buildXaiSpeechProvider(): SpeechProviderPlugin {
203209trimToUndefined(params.language ?? params.languageCode),
204210),
205211}),
206- ...(asFiniteNumber(params.speed) == null ? {} : { speed: asFiniteNumber(params.speed) }),
212+ ...(normalizeXaiSpeechSpeed(params.speed) == null
213+ ? {}
214+ : { speed: normalizeXaiSpeechSpeed(params.speed) }),
207215}),
208216listVoices: async () => XAI_TTS_VOICES.map((voice) => ({ id: voice, name: voice })),
209217isConfigured: ({ providerConfig, cfg }) =>
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。