import {z} from 'zod' export type GetApiV1VoicesVoiceIdArgs = {voice_id: string, with_settings?: boolean | undefined, 'xi-api-key'?: (string | null) | undefined}; export type GetApiV1VoicesVoiceIdOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const utteranceResponseModel = z.object({start: z.number(), end: z.number()}); export const speakerResponseModel = z.object({speaker_id: z.string(), duration_secs: z.number(), utterances: z.array(utteranceResponseModel).nullable().optional()}); export const speakerSeparationResponseModel = z.object({voice_id: z.string(), sample_id: z.string(), status: z.enum(["not_started", "pending", "completed", "failed"]), speakers: z.record(z.string(), speakerResponseModel).nullable().optional(), selected_speaker_ids: z.array(z.string()).nullable().optional()}); export const sampleResponseModel = z.object({sample_id: z.string(), file_name: z.string(), mime_type: z.string(), size_bytes: z.number().int(), hash: z.string(), duration_secs: z.number().nullable().optional(), remove_background_noise: z.boolean().nullable().optional(), has_isolated_audio: z.boolean().nullable().optional(), has_isolated_audio_preview: z.boolean().nullable().optional(), speaker_separation: speakerSeparationResponseModel.nullable().optional(), trim_start: z.number().int().nullable().optional(), trim_end: z.number().int().nullable().optional()}); export const recordingResponseModel = z.object({recording_id: z.string(), mime_type: z.string(), size_bytes: z.number().int(), upload_date_unix: z.number().int(), transcription: z.string()}); export const verificationAttemptResponseModel = z.object({text: z.string(), date_unix: z.number().int(), accepted: z.boolean(), similarity: z.number(), levenshtein_distance: z.number(), recording: recordingResponseModel.nullable().optional()}); export const manualVerificationFileResponseModel = z.object({file_id: z.string(), file_name: z.string(), mime_type: z.string(), size_bytes: z.number().int(), upload_date_unix: z.number().int()}); export const manualVerificationResponseModel = z.object({extra_text: z.string(), request_time_unix: z.number().int(), files: z.array(manualVerificationFileResponseModel)}); export const fineTuningResponseModel = z.object({is_allowed_to_fine_tune: z.boolean(), state: z.record(z.string(), z.enum(["not_started", "queued", "fine_tuning", "fine_tuned", "failed", "delayed"])), verification_failures: z.array(z.string()), verification_attempts_count: z.number().int(), manual_verification_requested: z.boolean(), language: z.string().nullable().optional(), progress: z.record(z.string(), z.number()).nullable().optional(), message: z.record(z.string(), z.string()).nullable().optional(), dataset_duration_seconds: z.number().nullable().optional(), verification_attempts: z.array(verificationAttemptResponseModel).nullable().optional(), slice_ids: z.array(z.string()).nullable().optional(), manual_verification: manualVerificationResponseModel.nullable().optional(), max_verification_attempts: z.number().int().nullable().optional(), next_max_verification_attempts_reset_unix_ms: z.number().int().nullable().optional()}); export const voiceSettingsResponseModel = z.object({stability: z.number().gte(0).lte(1).nullable().optional(), use_speaker_boost: z.boolean().nullable().optional(), similarity_boost: z.number().gte(0).lte(1).nullable().optional(), style: z.number().nullable().optional(), speed: z.number().nullable().optional(), clone_strength: z.number().gte(0).lte(1).nullable().optional()}); export const voiceSharingModerationCheckResponseModel = z.object({date_checked_unix: z.number().int().nullable().optional(), name_value: z.string().nullable().optional(), name_check: z.boolean().nullable().optional(), description_value: z.string().nullable().optional(), description_check: z.boolean().nullable().optional(), sample_ids: z.array(z.string()).nullable().optional(), sample_checks: z.array(z.number()).nullable().optional(), captcha_ids: z.array(z.string()).nullable().optional(), captcha_checks: z.array(z.number()).nullable().optional()}); export const readerResourceResponseModel = z.object({resource_type: z.enum(["read", "collection"]), resource_id: z.string()}); export const voiceSharingResponseModel = z.object({status: z.enum(["enabled", "disabled", "copied", "copied_disabled"]), history_item_sample_id: z.string().nullable().optional(), date_unix: z.number().int(), whitelisted_emails: z.array(z.string()), public_owner_id: z.string(), original_voice_id: z.string(), financial_rewards_enabled: z.boolean(), free_users_allowed: z.boolean(), live_moderation_enabled: z.boolean(), rate: z.number().nullable().optional(), fiat_rate: z.number().nullable().optional(), notice_period: z.number().int(), disable_at_unix: z.number().int().nullable().optional(), voice_mixing_allowed: z.boolean(), featured: z.boolean(), category: z.enum(["generated", "cloned", "premade", "professional", "famous", "high_quality"]), reader_app_enabled: z.boolean().nullable().optional(), image_url: z.string().nullable().optional(), ban_reason: z.string().nullable().optional(), liked_by_count: z.number().int(), cloned_by_count: z.number().int(), name: z.string(), description: z.string().nullable().optional(), labels: z.record(z.string(), z.string()), review_status: z.enum(["not_requested", "pending", "declined", "declined_resubmittable", "allowed", "allowed_with_changes"]), review_message: z.string().nullable().optional(), enabled_in_library: z.boolean(), instagram_username: z.string().nullable().optional(), twitter_username: z.string().nullable().optional(), youtube_username: z.string().nullable().optional(), tiktok_username: z.string().nullable().optional(), moderation_check: voiceSharingModerationCheckResponseModel.nullable().optional(), reader_restricted_on: z.array(readerResourceResponseModel).nullable().optional()}); export const verifiedVoiceLanguageResponseModel = z.object({language: z.string(), model_id: z.string(), accent: z.string().nullable().optional(), locale: z.string().nullable().optional(), preview_url: z.string().nullable().optional()}); export const voiceVerificationResponseModel = z.object({requires_verification: z.boolean(), is_verified: z.boolean(), verification_failures: z.array(z.string()), verification_attempts_count: z.number().int(), language: z.string().nullable().optional(), verification_attempts: z.array(verificationAttemptResponseModel).nullable().optional()}); export const voiceResponseModel = z.object({voice_id: z.string(), name: z.string(), samples: z.array(sampleResponseModel).nullable().optional(), category: z.enum(["generated", "cloned", "premade", "professional", "famous", "high_quality"]), fine_tuning: fineTuningResponseModel.nullable().optional(), labels: z.record(z.string(), z.string()), description: z.string().nullable().optional(), preview_url: z.string().nullable().optional(), available_for_tiers: z.array(z.string()), settings: voiceSettingsResponseModel.nullable().optional(), sharing: voiceSharingResponseModel.nullable().optional(), high_quality_base_model_ids: z.array(z.string()), verified_languages: z.array(verifiedVoiceLanguageResponseModel).nullable().optional(), collection_ids: z.array(z.string()).nullable().optional(), safety_control: z.enum(["NONE", "BAN", "CAPTCHA", "ENTERPRISE_BAN", "ENTERPRISE_CAPTCHA"]).nullable().optional(), voice_verification: voiceVerificationResponseModel.nullable().optional(), permission_on_resource: z.string().nullable().optional(), is_owner: z.boolean().nullable().optional(), is_legacy: z.boolean().optional(), is_mixed: z.boolean().optional(), favorited_at_unix: z.number().int().nullable().optional(), created_at_unix: z.number().int().nullable().optional(), is_bookmarked: z.boolean().nullable().optional(), recording_quality: z.enum(["studio", "good", "ok", "poor", "bad"]).nullable().optional(), labelling_status: z.enum(["in_review", "review_complete"]).nullable().optional(), recording_quality_reason: z.string().nullable().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get Voice * * GET /v1/voices/{voice_id} */ export const getApiV1VoicesVoiceId = async (args: GetApiV1VoicesVoiceIdArgs, options: GetApiV1VoicesVoiceIdOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.with_settings != null) query.append("with_settings", String(args.with_settings)) if (args['xi-api-key'] != null) headers.set("xi-api-key", String(args['xi-api-key'])) const url = `${baseUrl.replace(/\/+$/, '')}/v1/voices/${encodeURIComponent(String(args.voice_id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(voiceResponseModel, await res.json()) };