UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

108 lines (107 loc) 4.28 kB
import { u as normalizeResolvedSecretInputString } from "./types.secrets-_0JOMGE5.js"; import { n as asObject, r as assertOkOrThrowHttpError } from "./provider-http-errors-DqaqQLLZ.js"; import { c as postJsonRequest, p as resolveProviderHttpRequestConfig } from "./shared-IuCmx8oC.js"; import "./speech-core-s8tZcO7c.js"; import "./secret-input-DVCzFGxN.js"; import "./provider-http-BXCBCi4E.js"; import { a as DEFAULT_VYDRA_VOICE_ID, c as normalizeVydraBaseUrl, m as trimToUndefined, o as downloadVydraAsset, r as DEFAULT_VYDRA_SPEECH_MODEL, s as extractVydraResultUrls, t as DEFAULT_VYDRA_BASE_URL, u as resolveVydraGeneratedMediaMaxBytes } from "./shared-CT-x41iI.js"; //#region extensions/vydra/speech-provider.ts const VYDRA_SPEECH_VOICES = [{ id: DEFAULT_VYDRA_VOICE_ID, name: "Rachel" }]; function normalizeVydraSpeechConfig(rawConfig) { const raw = asObject(asObject(rawConfig.providers)?.vydra) ?? asObject(rawConfig.vydra); return { apiKey: normalizeResolvedSecretInputString({ value: raw?.apiKey, path: "messages.tts.providers.vydra.apiKey" }), baseUrl: normalizeVydraBaseUrl(trimToUndefined(raw?.baseUrl) ?? trimToUndefined(process.env.VYDRA_BASE_URL)), model: trimToUndefined(raw?.model) ?? trimToUndefined(process.env.VYDRA_TTS_MODEL) ?? "elevenlabs/tts", voiceId: trimToUndefined(raw?.voiceId) ?? trimToUndefined(process.env.VYDRA_TTS_VOICE_ID) ?? "21m00Tcm4TlvDq8ikWAM" }; } function readVydraSpeechConfig(config) { const normalized = normalizeVydraSpeechConfig({}); return { apiKey: trimToUndefined(config.apiKey) ?? normalized.apiKey, baseUrl: normalizeVydraBaseUrl(trimToUndefined(config.baseUrl) ?? normalized.baseUrl), model: trimToUndefined(config.model) ?? normalized.model, voiceId: trimToUndefined(config.voiceId) ?? normalized.voiceId }; } function readVydraOverrides(overrides) { if (!overrides) return {}; return { model: trimToUndefined(overrides.model), voiceId: trimToUndefined(overrides.voiceId) }; } function buildVydraSpeechProvider() { return { id: "vydra", label: "Vydra", models: [DEFAULT_VYDRA_SPEECH_MODEL], voices: VYDRA_SPEECH_VOICES.map((voice) => voice.id), resolveConfig: ({ rawConfig }) => normalizeVydraSpeechConfig(rawConfig), listVoices: async () => VYDRA_SPEECH_VOICES.map((voice) => Object.assign({}, voice)), isConfigured: ({ providerConfig }) => Boolean(readVydraSpeechConfig(providerConfig).apiKey || process.env.VYDRA_API_KEY), synthesize: async (req) => { const config = readVydraSpeechConfig(req.providerConfig); const overrides = readVydraOverrides(req.providerOverrides); const apiKey = config.apiKey || process.env.VYDRA_API_KEY; if (!apiKey) throw new Error("Vydra API key missing"); const fetchFn = fetch; const { baseUrl, allowPrivateNetwork, headers, dispatcherPolicy } = resolveProviderHttpRequestConfig({ baseUrl: config.baseUrl, defaultBaseUrl: DEFAULT_VYDRA_BASE_URL, allowPrivateNetwork: false, defaultHeaders: { Authorization: `Bearer ${apiKey}`, "Content-Type": "application/json" }, provider: "vydra", capability: "audio", transport: "http" }); const { response, release } = await postJsonRequest({ url: `${baseUrl}/models/${overrides.model ?? config.model}`, headers, body: { text: req.text, voice_id: overrides.voiceId ?? config.voiceId }, timeoutMs: req.timeoutMs, fetchFn, allowPrivateNetwork, dispatcherPolicy }); try { await assertOkOrThrowHttpError(response, "Vydra speech synthesis failed"); const audioUrl = extractVydraResultUrls(await response.json(), "audio")[0]; if (!audioUrl) throw new Error("Vydra speech synthesis response missing audio URL"); const audio = await downloadVydraAsset({ url: audioUrl, kind: "audio", timeoutMs: req.timeoutMs, fetchFn, maxBytes: resolveVydraGeneratedMediaMaxBytes({ cfg: req.cfg, kind: "audio" }) }); return { audioBuffer: audio.buffer, outputFormat: audio.mimeType.includes("wav") ? "wav" : "mp3", fileExtension: audio.fileName.endsWith(".wav") ? ".wav" : ".mp3", voiceCompatible: false }; } finally { await release(); } } }; } //#endregion export { buildVydraSpeechProvider as t };