






















@@ -11,11 +11,12 @@ import type {
1111SpeechProviderOverrides,
1212SpeechProviderPlugin,
1313} from "openclaw/plugin-sdk/speech-core";
14-import { asObject, trimToUndefined } from "openclaw/plugin-sdk/speech-core";
1514import {
16-asFiniteNumberInRange,
17-parseStrictFiniteNumber,
18-} from "openclaw/plugin-sdk/string-coerce-runtime";
15+asObject,
16+parseSpeechDirectiveNumberOverride,
17+trimToUndefined,
18+} from "openclaw/plugin-sdk/speech-core";
19+import { asFiniteNumberInRange } from "openclaw/plugin-sdk/string-coerce-runtime";
1920import {
2021DEFAULT_MINIMAX_TTS_BASE_URL,
2122MINIMAX_TTS_MODELS,
@@ -131,10 +132,6 @@ function normalizeMinimaxPitch(value: unknown): number | undefined {
131132return pitch !== undefined ? Math.trunc(pitch) : undefined;
132133}
133134134-function parseDirectiveFiniteNumber(value: string): number | undefined {
135-return parseStrictFiniteNumber(value);
136-}
137-138135function readMinimaxProviderConfig(
139136config: SpeechProviderConfig,
140137cfg?: OpenClawConfig,
@@ -189,38 +186,29 @@ function parseDirectiveToken(ctx: SpeechDirectiveTokenParseContext): {
189186}
190187return { handled: true, overrides: { model: ctx.value } };
191188case "speed": {
192-if (!ctx.policy.allowVoiceSettings) {
193-return { handled: true };
194-}
195-const speed = parseDirectiveFiniteNumber(ctx.value);
196-if (speed === undefined || speed < 0.5 || speed > 2.0) {
197-return { handled: true, warnings: [`invalid MiniMax speed "${ctx.value}" (0.5-2.0)`] };
198-}
199-return { handled: true, overrides: { speed } };
189+return parseSpeechDirectiveNumberOverride({
190+ ctx,
191+overrideKey: "speed",
192+range: { min: 0.5, max: 2 },
193+warning: (value) => `invalid MiniMax speed "${value}" (0.5-2.0)`,
194+});
200195}
201196case "vol":
202197case "volume": {
203-if (!ctx.policy.allowVoiceSettings) {
204-return { handled: true };
205-}
206-const vol = parseDirectiveFiniteNumber(ctx.value);
207-if (vol === undefined || vol <= 0 || vol > 10) {
208-return {
209-handled: true,
210-warnings: [`invalid MiniMax volume "${ctx.value}" (0-10, exclusive)`],
211-};
212-}
213-return { handled: true, overrides: { vol } };
198+return parseSpeechDirectiveNumberOverride({
199+ ctx,
200+overrideKey: "vol",
201+range: { min: 0, minExclusive: true, max: 10 },
202+warning: (value) => `invalid MiniMax volume "${value}" (0-10, exclusive)`,
203+});
214204}
215205case "pitch": {
216-if (!ctx.policy.allowVoiceSettings) {
217-return { handled: true };
218-}
219-const pitch = parseDirectiveFiniteNumber(ctx.value);
220-if (pitch === undefined || pitch < -12 || pitch > 12) {
221-return { handled: true, warnings: [`invalid MiniMax pitch "${ctx.value}" (-12 to 12)`] };
222-}
223-return { handled: true, overrides: { pitch } };
206+return parseSpeechDirectiveNumberOverride({
207+ ctx,
208+overrideKey: "pitch",
209+range: { min: -12, max: 12 },
210+warning: (value) => `invalid MiniMax pitch "${value}" (-12 to 12)`,
211+});
224212}
225213default:
226214return { handled: false };
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。