
























@@ -11,7 +11,8 @@ import type {
1111SpeechProviderOverrides,
1212SpeechProviderPlugin,
1313} from "openclaw/plugin-sdk/speech-core";
14-import { asFiniteNumber, asObject, trimToUndefined } from "openclaw/plugin-sdk/speech-core";
14+import { asObject, trimToUndefined } from "openclaw/plugin-sdk/speech-core";
15+import { asFiniteNumberInRange } from "openclaw/plugin-sdk/string-coerce-runtime";
1516import {
1617DEFAULT_MINIMAX_TTS_BASE_URL,
1718MINIMAX_TTS_MODELS,
@@ -108,12 +109,25 @@ function normalizeMinimaxProviderConfig(
108109trimToUndefined(raw?.voiceId) ??
109110trimToUndefined(process.env.MINIMAX_TTS_VOICE_ID) ??
110111"English_expressive_narrator",
111-speed: asFiniteNumber(raw?.speed),
112-vol: asFiniteNumber(raw?.vol),
113-pitch: asFiniteNumber(raw?.pitch),
112+speed: normalizeMinimaxSpeed(raw?.speed),
113+vol: normalizeMinimaxVolume(raw?.vol),
114+pitch: normalizeMinimaxPitch(raw?.pitch),
114115};
115116}
116117118+function normalizeMinimaxSpeed(value: unknown): number | undefined {
119+return asFiniteNumberInRange(value, { min: 0.5, max: 2 });
120+}
121+122+function normalizeMinimaxVolume(value: unknown): number | undefined {
123+return asFiniteNumberInRange(value, { min: 0, max: 10, minExclusive: true });
124+}
125+126+function normalizeMinimaxPitch(value: unknown): number | undefined {
127+const pitch = asFiniteNumberInRange(value, { min: -12, max: 12 });
128+return pitch !== undefined ? Math.trunc(pitch) : undefined;
129+}
130+117131function readMinimaxProviderConfig(
118132config: SpeechProviderConfig,
119133cfg?: OpenClawConfig,
@@ -124,9 +138,9 @@ function readMinimaxProviderConfig(
124138baseUrl: normalizeMinimaxTtsBaseUrl(trimToUndefined(config.baseUrl) ?? normalized.baseUrl),
125139model: trimToUndefined(config.model) ?? normalized.model,
126140voiceId: trimToUndefined(config.voiceId) ?? normalized.voiceId,
127-speed: asFiniteNumber(config.speed) ?? normalized.speed,
128-vol: asFiniteNumber(config.vol) ?? normalized.vol,
129-pitch: asFiniteNumber(config.pitch) ?? normalized.pitch,
141+speed: normalizeMinimaxSpeed(config.speed) ?? normalized.speed,
142+vol: normalizeMinimaxVolume(config.vol) ?? normalized.vol,
143+pitch: normalizeMinimaxPitch(config.pitch) ?? normalized.pitch,
130144};
131145}
132146@@ -139,9 +153,9 @@ function readMinimaxOverrides(
139153return {
140154model: trimToUndefined(overrides.model),
141155voiceId: trimToUndefined(overrides.voiceId),
142-speed: asFiniteNumber(overrides.speed),
143-vol: asFiniteNumber(overrides.vol),
144-pitch: asFiniteNumber(overrides.pitch),
156+speed: normalizeMinimaxSpeed(overrides.speed),
157+vol: normalizeMinimaxVolume(overrides.vol),
158+pitch: normalizeMinimaxPitch(overrides.pitch),
145159};
146160}
147161@@ -236,15 +250,15 @@ export function buildMinimaxSpeechProvider(): SpeechProviderPlugin {
236250 ...(trimToUndefined(talkProviderConfig.voiceId) == null
237251 ? {}
238252 : { voiceId: trimToUndefined(talkProviderConfig.voiceId) }),
239- ...(asFiniteNumber(talkProviderConfig.speed) == null
253+ ...(normalizeMinimaxSpeed(talkProviderConfig.speed) == null
240254 ? {}
241- : { speed: asFiniteNumber(talkProviderConfig.speed) }),
242- ...(asFiniteNumber(talkProviderConfig.vol) == null
255+ : { speed: normalizeMinimaxSpeed(talkProviderConfig.speed) }),
256+ ...(normalizeMinimaxVolume(talkProviderConfig.vol) == null
243257 ? {}
244- : { vol: asFiniteNumber(talkProviderConfig.vol) }),
245- ...(asFiniteNumber(talkProviderConfig.pitch) == null
258+ : { vol: normalizeMinimaxVolume(talkProviderConfig.vol) }),
259+ ...(normalizeMinimaxPitch(talkProviderConfig.pitch) == null
246260 ? {}
247- : { pitch: asFiniteNumber(talkProviderConfig.pitch) }),
261+ : { pitch: normalizeMinimaxPitch(talkProviderConfig.pitch) }),
248262};
249263},
250264resolveTalkOverrides: ({ params }) => ({
@@ -254,9 +268,15 @@ export function buildMinimaxSpeechProvider(): SpeechProviderPlugin {
254268 ...(trimToUndefined(params.modelId) == null
255269 ? {}
256270 : { model: trimToUndefined(params.modelId) }),
257- ...(asFiniteNumber(params.speed) == null ? {} : { speed: asFiniteNumber(params.speed) }),
258- ...(asFiniteNumber(params.vol) == null ? {} : { vol: asFiniteNumber(params.vol) }),
259- ...(asFiniteNumber(params.pitch) == null ? {} : { pitch: asFiniteNumber(params.pitch) }),
271+ ...(normalizeMinimaxSpeed(params.speed) == null
272+ ? {}
273+ : { speed: normalizeMinimaxSpeed(params.speed) }),
274+ ...(normalizeMinimaxVolume(params.vol) == null
275+ ? {}
276+ : { vol: normalizeMinimaxVolume(params.vol) }),
277+ ...(normalizeMinimaxPitch(params.pitch) == null
278+ ? {}
279+ : { pitch: normalizeMinimaxPitch(params.pitch) }),
260280}),
261281listVoices: async () => MINIMAX_TTS_VOICES.map((voice) => ({ id: voice, name: voice })),
262282isConfigured: ({ cfg, providerConfig }) =>
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。