@nodaro/sdk 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -3387,10 +3387,16 @@ declare class VoicesResource {
3387
3387
  voiceId: string;
3388
3388
  audioUrl?: string;
3389
3389
  videoUrl?: string;
3390
+ /** Speech-to-speech model id. Defaults to the server-configured default when omitted. */
3391
+ model?: string;
3390
3392
  stability?: number;
3391
3393
  similarityBoost?: number;
3392
3394
  /** Style exaggeration (0–1). Default 0; >0 amplifies delivery at the cost of latency/stability. */
3393
3395
  style?: number;
3396
+ /** ElevenLabs speaker boost — sharpens fidelity to the target speaker (small latency cost). */
3397
+ useSpeakerBoost?: boolean;
3398
+ /** Deterministic speech-to-speech seed (integer 0–4294967295) for reproducible output. Omit for random. */
3399
+ seed?: number;
3394
3400
  removeBackgroundNoise?: boolean;
3395
3401
  }): Promise<{
3396
3402
  jobId: string;
@@ -3432,6 +3438,82 @@ declare class VoicesResource {
3432
3438
  recast(input: VoiceChangerProInput): Promise<{
3433
3439
  jobId: string;
3434
3440
  }>;
3441
+ /**
3442
+ * Detect the speakers in a clip WITHOUT recasting yet
3443
+ * (`POST /v1/voice-changer-pro/analyze`) — the first step of the interactive
3444
+ * flow. Separates voice from music once and diarizes the vocals, returning the
3445
+ * speaker list so a user (or agent) can choose a voice per speaker before
3446
+ * committing to a paid recast. Poll `jobs.get(jobId)`: the completed job's
3447
+ * `output_data` carries the separated stem urls + the detected `speakers`
3448
+ * (each with `id`, time `segments`, `firstStartSec`, `wordCount`, `snippet`)
3449
+ * and the detected language — reshape it into a {@link VcpAnalysis} and pass it
3450
+ * as `recast({ ..., analysis })` to skip re-detection. With `suggestTitle`,
3451
+ * `output_data.suggestedTitle` also carries an LLM-proposed title.
3452
+ *
3453
+ * Cloud-only; costs credits and runs async.
3454
+ */
3455
+ analyze(input: VcpAnalyzeInput): Promise<{
3456
+ jobId: string;
3457
+ }>;
3458
+ /**
3459
+ * Render a final video from a mixed set of stems
3460
+ * (`POST /v1/voice-changer-pro/export`) — the last step of the interactive
3461
+ * flow. After `recast({ output: "stems" })` hands back the dry per-track stems
3462
+ * and the user has set levels / mutes / an effect in your editor, pass those
3463
+ * `tracks` (plus the source `videoUrl`) here to mix and remux into the finished
3464
+ * video. The video is stream-copied (never re-encoded), so the export is
3465
+ * bit-identical to your preview. At least one track must be un-muted (all-muted
3466
+ * is a 400); `voiceFx` is applied to the voice tracks at render time.
3467
+ *
3468
+ * Cloud-only; costs credits and runs async — poll `jobs.get(jobId)` for the
3469
+ * result (`output_data.videoUrl`).
3470
+ */
3471
+ exportMix(input: VcpExportInput): Promise<{
3472
+ jobId: string;
3473
+ }>;
3474
+ /**
3475
+ * Design a brand-new synthetic voice from a text description
3476
+ * (`POST /v1/voice-design`) — ElevenLabs text-to-voice. `text` (100–1000 chars)
3477
+ * is a preview line spoken in the designed voice; `voiceDescription` describes
3478
+ * the voice to create. Costs credits and runs async — poll `jobs.get(jobId)`
3479
+ * for the preview + the reusable voice id.
3480
+ */
3481
+ design(input: VoiceDesignInput): Promise<{
3482
+ jobId: string;
3483
+ }>;
3484
+ /**
3485
+ * Generate speech in a voice described in natural language, without cloning
3486
+ * (`POST /v1/voice-remix`). `text` (1–5000 chars) is spoken in a voice matching
3487
+ * `voiceDescription`. Costs credits and runs async — poll `jobs.get(jobId)`.
3488
+ */
3489
+ remix(input: VoiceRemixInput): Promise<{
3490
+ jobId: string;
3491
+ }>;
3492
+ /**
3493
+ * Dub an audio clip into another language while preserving each speaker's voice
3494
+ * (`POST /v1/dubbing`). `targetLanguage` is an ISO code (e.g. `"es"`, `"fr"`);
3495
+ * `sourceLanguage` is auto-detected when omitted. Costs credits and runs async
3496
+ * — poll `jobs.get(jobId)`.
3497
+ */
3498
+ dub(input: DubbingInput): Promise<{
3499
+ jobId: string;
3500
+ }>;
3501
+ /**
3502
+ * Clone a voice from an audio FILE you hold in memory
3503
+ * (`POST /v1/voice-clones`, multipart) — the counterpart to
3504
+ * {@link VoicesResource.createClone}, which clones from an already-uploaded
3505
+ * URL. Pass the raw audio `file` (a `Blob`/`File` in the browser, or a
3506
+ * `Uint8Array`/`Buffer` in Node) plus a `name`. Costs credits. Returns the new
3507
+ * {@link VoiceClone} (`elevenlabsVoiceId` is the id to recast/synthesize with).
3508
+ */
3509
+ createCloneFromFile(input: {
3510
+ name: string;
3511
+ file: Blob | Uint8Array | ArrayBuffer;
3512
+ /** File name for the upload part (default `sample`). */
3513
+ filename?: string;
3514
+ /** MIME type when `file` is a raw buffer (default `audio/mpeg`). */
3515
+ contentType?: string;
3516
+ }): Promise<VoiceClone>;
3435
3517
  }
3436
3518
  /**
3437
3519
  * One entry in {@link VoiceChangerProInput.orderedVoices}. Either a bare voice id
@@ -3522,6 +3604,316 @@ interface VoiceChangerProInput {
3522
3604
  /** Echo decay / feedback (0–1). Higher = more repeats. Used by the `echo` / `custom` presets. */
3523
3605
  decay?: number;
3524
3606
  };
3607
+ /**
3608
+ * Output mode. `"video"` (default) mixes the recast voices with the preserved
3609
+ * background and returns a finished merged video. `"stems"` returns the dry,
3610
+ * unleveled per-track stems instead (rendering nothing) so you can drive an
3611
+ * INTERACTIVE mix — adjust levels/mutes/effect in your own UI, then render the
3612
+ * final video with {@link VoicesResource.exportMix}. This is how an app builds
3613
+ * a full editor around VCP rather than a one-shot recast.
3614
+ */
3615
+ output?: "video" | "stems";
3616
+ /**
3617
+ * A prior {@link VoicesResource.analyze} result. Pass it to SKIP re-detection:
3618
+ * the recast reuses the already-separated stems and speaker segments instead of
3619
+ * running separation + diarization again. This is the fast-path for the
3620
+ * detect → pick voices → recast interactive flow (analyze once, recast N times
3621
+ * as the user tweaks voice assignments). Omit to auto-detect from the source.
3622
+ */
3623
+ analysis?: VcpAnalysis;
3624
+ }
3625
+ /** One detected speaker in a {@link VcpAnalysis} (from `analyze`). */
3626
+ interface VcpAnalysisSpeaker {
3627
+ /** Stable speaker id (first-appearance order). */
3628
+ id: string;
3629
+ /** The speaker's spoken time ranges (seconds). */
3630
+ segments: Array<{
3631
+ start: number;
3632
+ end: number;
3633
+ }>;
3634
+ /** When the speaker first speaks (seconds). */
3635
+ firstStartSec?: number;
3636
+ /** Rough word count across the clip — a proxy for how much this speaker says. */
3637
+ wordCount?: number;
3638
+ /** The first few transcribed words, to help a user tell speakers apart. */
3639
+ snippet?: string;
3640
+ }
3641
+ /**
3642
+ * The result of {@link VoicesResource.analyze}, reshaped to pass back into
3643
+ * {@link VoiceChangerProInput.analysis}. Read a completed analyze job's
3644
+ * `output_data` into this shape (it carries the separated stem urls + the
3645
+ * detected speakers) and thread it into `recast` to skip re-detection.
3646
+ */
3647
+ interface VcpAnalysis {
3648
+ /** URL of the isolated vocal stem. */
3649
+ vocalsUrl: string;
3650
+ /** URL of the separated music/SFX stem (absent when the source had none). */
3651
+ backgroundUrl?: string;
3652
+ /** The detected speakers, in first-appearance order. */
3653
+ speakers: VcpAnalysisSpeaker[];
3654
+ /** Scribe's detected language code, round-tripped so the recast auto-selects the STS model. */
3655
+ languageCode?: string;
3656
+ /** Confidence (0–1) of {@link VcpAnalysis.languageCode}. */
3657
+ languageProbability?: number;
3658
+ }
3659
+ /** Input for {@link VoicesResource.analyze}. */
3660
+ interface VcpAnalyzeInput {
3661
+ /** URL of an audio file to analyze. Exactly one of `audioUrl` / `videoUrl` is required. */
3662
+ audioUrl?: string;
3663
+ /** URL of a video file to analyze (its audio track is used). Exactly one of `audioUrl` / `videoUrl` is required. */
3664
+ videoUrl?: string;
3665
+ /** Quality of the voice/music separation run before diarization: `"fast"` (default) or `"best"`. */
3666
+ separationQuality?: "fast" | "best";
3667
+ /** Also suggest a conversion title from the transcript (returned on the job's `output_data.suggestedTitle`). */
3668
+ suggestTitle?: boolean;
3669
+ }
3670
+ /** One track in a {@link VcpExportInput} mix. */
3671
+ interface VcpExportTrack {
3672
+ /** URL of the stem for this lane (a recast voice stem or the background stem). */
3673
+ url: string;
3674
+ /** Fader position as a percentage: 0 = silent, 100 = unity, 200 = +6dB. */
3675
+ gain: number;
3676
+ /** Whether this lane is muted in the mix. */
3677
+ muted: boolean;
3678
+ /**
3679
+ * Which bucket the track is in, and so whether `voiceFx` lands on it. Defaults
3680
+ * to `"voice"`. Set `"background"` for the music/SFX lane (the effect never
3681
+ * touches it).
3682
+ */
3683
+ kind?: "voice" | "background";
3684
+ }
3685
+ /** Input for {@link VoicesResource.exportMix}. */
3686
+ interface VcpExportInput {
3687
+ /** The source video to remux the mixed audio onto (stream-copied — never re-encoded). */
3688
+ videoUrl: string;
3689
+ /** The mix: one entry per lane. At least one must be un-muted (all-muted is a 400). Max 16 tracks. */
3690
+ tracks: VcpExportTrack[];
3691
+ /**
3692
+ * A reverb/echo applied to the VOICE tracks only (not `"background"` lanes)
3693
+ * at render time — so iterating the effect in your editor is free until you
3694
+ * export. Same shape as {@link VoiceChangerProInput.voiceFx}.
3695
+ */
3696
+ voiceFx?: VoiceChangerProInput["voiceFx"];
3697
+ }
3698
+ /** Input for {@link VoicesResource.design}. */
3699
+ interface VoiceDesignInput {
3700
+ /** A preview line (100–1000 chars) spoken in the designed voice. */
3701
+ text: string;
3702
+ /** Natural-language description of the voice to create. */
3703
+ voiceDescription: string;
3704
+ /** Voice-design model id. Defaults to the server-configured default. */
3705
+ model?: string;
3706
+ /** Output loudness (-1..1). */
3707
+ loudness?: number;
3708
+ /** How strongly the description steers the design (0–100). */
3709
+ guidanceScale?: number;
3710
+ /** Deterministic seed for a reproducible design. */
3711
+ seed?: number;
3712
+ /** Design quality knob (provider-specific). */
3713
+ quality?: number;
3714
+ /** Enhance the generated voice. */
3715
+ shouldEnhance?: boolean;
3716
+ /** Optional extra prompt context (≤8000 chars). */
3717
+ userPrompt?: string;
3718
+ }
3719
+ /** Input for {@link VoicesResource.remix}. */
3720
+ interface VoiceRemixInput {
3721
+ /** The text (1–5000 chars) to speak in the described voice. */
3722
+ text: string;
3723
+ /** Natural-language description of the voice to speak in. */
3724
+ voiceDescription: string;
3725
+ /** Optional extra prompt context (≤8000 chars). */
3726
+ userPrompt?: string;
3727
+ }
3728
+ /** Input for {@link VoicesResource.dub}. */
3729
+ interface DubbingInput {
3730
+ /** URL of the audio to dub. */
3731
+ audioUrl: string;
3732
+ /** Target language ISO code (2–10 chars), e.g. `"es"`, `"pt-BR"`. */
3733
+ targetLanguage: string;
3734
+ /** Source language ISO code; auto-detected when omitted. */
3735
+ sourceLanguage?: string;
3736
+ /** Expected number of speakers (1–20) — improves separation when known. */
3737
+ numSpeakers?: number;
3738
+ /** Keep the original voices instead of cloning them into the target language. */
3739
+ disableVoiceCloning?: boolean;
3740
+ /** Drop the background/music bed from the dubbed output. */
3741
+ dropBackgroundAudio?: boolean;
3742
+ }
3743
+
3744
+ /**
3745
+ * Media ingestion + trimming — the source-preparation steps a Voice Changer Pro
3746
+ * flow (or any pipeline) needs before it has a clip to work on: pull a social
3747
+ * video into storage, copy a remote URL into storage, trim a video/audio to a
3748
+ * range, and probe a video's metadata. Each generation-style op returns a job id
3749
+ * to poll (`jobs.get(jobId)`); `videoMetadata` is a direct read.
3750
+ */
3751
+ declare class MediaResource {
3752
+ private client;
3753
+ constructor(client: NodaroClient);
3754
+ /**
3755
+ * Download a social video (YouTube / TikTok / Instagram / X / Facebook) into
3756
+ * your storage (`POST /v1/download-video`). `maxHeight` caps the resolution
3757
+ * (default "best"); `sectionStartSec` + `sectionEndSec` (both-or-neither) fetch
3758
+ * ONLY that time range instead of the whole video. Returns a `downloadId`;
3759
+ * progress streams from `GET /v1/download-video/progress/:downloadId`
3760
+ * (server-sent events) and the finished file lands in your library.
3761
+ */
3762
+ downloadVideo(input: {
3763
+ url: string;
3764
+ maxHeight?: number;
3765
+ sectionStartSec?: number;
3766
+ sectionEndSec?: number;
3767
+ }): Promise<{
3768
+ downloadId: string;
3769
+ }>;
3770
+ /**
3771
+ * Copy an external media URL into your Nodaro storage (`POST /v1/save-to-storage`)
3772
+ * — a server-side fetch, so nothing round-trips through the client. Poll
3773
+ * `jobs.get(jobId)`.
3774
+ */
3775
+ saveToStorage(input: {
3776
+ mediaUrl: string;
3777
+ filename?: string;
3778
+ mediaType?: "image" | "video" | "audio";
3779
+ }): Promise<{
3780
+ jobId: string;
3781
+ }>;
3782
+ /**
3783
+ * Trim a video to a range (`POST /v1/trim-video`). Give the range in whichever
3784
+ * unit fits: `startTime`/`endTime` seconds, `trim*Frames`, `trim*Seconds`, or
3785
+ * `keepFirst`/`keepLastSeconds`. Poll `jobs.get(jobId)`.
3786
+ */
3787
+ trimVideo(input: {
3788
+ videoUrl: string;
3789
+ startTime?: number;
3790
+ endTime?: number;
3791
+ trimStartFrames?: number;
3792
+ trimEndFrames?: number;
3793
+ trimStartSeconds?: number;
3794
+ trimEndSeconds?: number;
3795
+ keepFirstSeconds?: number;
3796
+ keepLastSeconds?: number;
3797
+ }): Promise<{
3798
+ jobId: string;
3799
+ }>;
3800
+ /**
3801
+ * Trim (and extract) audio from a video or audio source
3802
+ * (`POST /v1/trim-audio`) to `[startTime, endTime]` seconds, in `audioFormat`
3803
+ * (`mp3` default / `wav` / `aac`). Poll `jobs.get(jobId)`.
3804
+ */
3805
+ trimAudio(input: {
3806
+ videoUrl?: string;
3807
+ audioUrl?: string;
3808
+ audioFormat?: "mp3" | "wav" | "aac";
3809
+ startTime?: number;
3810
+ endTime?: number;
3811
+ }): Promise<{
3812
+ jobId: string;
3813
+ }>;
3814
+ /**
3815
+ * Probe a social video's metadata (`POST /v1/video-metadata`) — duration,
3816
+ * dimensions, title, live status — WITHOUT downloading it. A direct read, not a
3817
+ * job. Use it to decide whether to trim before importing.
3818
+ */
3819
+ videoMetadata(input: {
3820
+ url: string;
3821
+ }): Promise<VideoMetadata>;
3822
+ }
3823
+ /** Result of {@link MediaResource.videoMetadata}. Fields are best-effort — a probe may omit some. */
3824
+ interface VideoMetadata {
3825
+ durationSec?: number | null;
3826
+ width?: number | null;
3827
+ height?: number | null;
3828
+ title?: string | null;
3829
+ isLive?: boolean;
3830
+ [key: string]: unknown;
3831
+ }
3832
+
3833
+ /**
3834
+ * Audio primitives — the building blocks Voice Changer Pro composes internally
3835
+ * (separation, isolation, effect, mix, level), exposed standalone so a consumer
3836
+ * can run any single step or assemble its own pipeline. Each returns a job id to
3837
+ * poll (`jobs.get(jobId)`).
3838
+ */
3839
+ declare class AudioResource {
3840
+ private client;
3841
+ constructor(client: NodaroClient);
3842
+ /**
3843
+ * Separate an audio track into stems (`POST /v1/audio-separation`, Demucs).
3844
+ * `mode` `"vocal_instrumental"` (default) splits voice from music/SFX;
3845
+ * `"stems"` returns the full drums/bass/other/… breakdown. `quality`
3846
+ * `auto` (default) / `fast` / `best`.
3847
+ */
3848
+ separate(input: {
3849
+ audioUrl: string;
3850
+ mode?: "vocal_instrumental" | "stems";
3851
+ quality?: "auto" | "fast" | "best";
3852
+ }): Promise<{
3853
+ jobId: string;
3854
+ }>;
3855
+ /** Isolate the primary voice and strip background noise (`POST /v1/audio-isolation`, ElevenLabs). */
3856
+ isolate(input: {
3857
+ audioUrl: string;
3858
+ }): Promise<{
3859
+ jobId: string;
3860
+ }>;
3861
+ /**
3862
+ * Apply a reverb / echo / telephone / megaphone effect to an audio track
3863
+ * (`POST /v1/audio-fx`) — the same presets VCP's `voiceFx` uses, standalone.
3864
+ * `mix` (0–100) is the reverb wet/dry; `delayMs` + `decay` drive `echo`/`custom`;
3865
+ * `eqLow`/`eqHigh` (dB) shape telephone/megaphone.
3866
+ */
3867
+ applyFx(input: {
3868
+ audioUrl: string;
3869
+ preset?: AudioFxPreset;
3870
+ mix?: number;
3871
+ delayMs?: number;
3872
+ decay?: number;
3873
+ eqLow?: number;
3874
+ eqHigh?: number;
3875
+ }): Promise<{
3876
+ jobId: string;
3877
+ }>;
3878
+ /**
3879
+ * Layer multiple audio tracks into one (`POST /v1/mix-audio`). `audioUrls`
3880
+ * (2–20) are summed; optional `trackVolumes` (0–200% each, positionally) set
3881
+ * per-track level.
3882
+ */
3883
+ mix(input: {
3884
+ audioUrls: string[];
3885
+ trackVolumes?: number[];
3886
+ }): Promise<{
3887
+ jobId: string;
3888
+ }>;
3889
+ /**
3890
+ * Adjust an audio (or a video's audio) level (`POST /v1/adjust-volume`):
3891
+ * `volume` % (default 100), `normalize` to loudnorm, and `fadeIn`/`fadeOut`
3892
+ * seconds. Provide `audioUrl` or `videoUrl`.
3893
+ */
3894
+ adjustVolume(input: {
3895
+ audioUrl?: string;
3896
+ videoUrl?: string;
3897
+ volume?: number;
3898
+ normalize?: boolean;
3899
+ fadeIn?: number;
3900
+ fadeOut?: number;
3901
+ }): Promise<{
3902
+ jobId: string;
3903
+ }>;
3904
+ /**
3905
+ * Concatenate audio segments end-to-end (`POST /v1/combine-audio`). Each
3906
+ * segment is a `url` with an optional `[startTime, endTime]` sub-range.
3907
+ */
3908
+ combine(input: {
3909
+ segments: Array<{
3910
+ url: string;
3911
+ startTime?: number;
3912
+ endTime?: number;
3913
+ }>;
3914
+ }): Promise<{
3915
+ jobId: string;
3916
+ }>;
3525
3917
  }
3526
3918
 
3527
3919
  /**
@@ -3959,6 +4351,8 @@ declare class NodaroClient {
3959
4351
  readonly reduce: ReduceResource;
3960
4352
  readonly promptHelper: PromptHelperResource;
3961
4353
  readonly voices: VoicesResource;
4354
+ readonly media: MediaResource;
4355
+ readonly audio: AudioResource;
3962
4356
  readonly credits: CreditsResource;
3963
4357
  readonly uploads: UploadsResource;
3964
4358
  readonly library: LibraryResource;
@@ -4053,4 +4447,4 @@ interface ApiErrorBody {
4053
4447
  }
4054
4448
  declare function throwFromResponse(status: number, body: ApiErrorBody): never;
4055
4449
 
4056
- export { type AccessTokenResponse, type AnalyzeInput, type AnalyzeResult, type AppRun, type AppRunResult, type ApplyChatProposalResult, type ApproveCreatureMainImageResult, type ApproveMainImageResult, type ApproveObjectMainImageResult, type ApprovePortraitResult, AppsResource, type Auth, type BranchPipelineInput, type BranchPipelineResult, CREATURE_ASSET_TYPES, CallbackAuth, type CancelExecutionParams, type CancelJobResult, type Character, type CharacterDetail, type CharacterUsage, CharactersResource, type ChatStageResult, type ChatTurn, type ClientOptions, CommunityResource, type CreateCreatureInput, type CreateDeveloperAppInput, type CreateDeveloperAppResult, type CreateLocationInput, type CreateObjectInput, type CreateProjectInput, type CreateWorkflowInput, type Creature, type CreatureAssetType, type CreatureDetail, type CreatureReferencePhoto, type CreatureReferencePhotoKind, CreaturesResource, CreditsResource, type DeleteAppRunResult, type DeveloperApp, type DeveloperAppScope, type DeveloperAppStatus, DeveloperAppsResource, type DuplicateCharacterInput, type EnhanceInput, type ExchangeCodeInput, type ExecutionStatus, type ExecutionTriggerType, ExecutionsResource, type FactoryPresetsResult, ForbiddenError, type GenerateAssetInput, type GenerateCharacterInput, type GenerateCharacterResult, type GenerateCreatureAssetInput, type GenerateCreatureAssetResult, type GenerateCreatureInput, type GenerateCreatureMotionInput, type GenerateCreatureMotionResult, type GenerateCreatureResult, type GenerateImageParams, type GenerateInput, type GenerateLocationAssetInput, type GenerateLocationInput, type GenerateLocationResult, type GenerateMotionInput, type GenerateObjectAssetInput, type GenerateObjectAssetResult, type GenerateObjectInput, type GenerateObjectMotionInput, type GenerateObjectMotionResult, type GenerateObjectResult, type GenerateSurroundContinuationInput, type GenerateVideoParams, type GetPickerCatalogOptions, InsufficientCreditsError, type Job, JobAbortedError, JobFailedError, type JobStatus, type JobStatusResult, JobTimeoutError, JobsResource, type LibraryAsset, LibraryResource, type ListAppRunsParams, type ListAppsParams, type ListAppsResult, type ListCharactersParams, type ListCreaturesParams, type ListExecutionsForWorkflowParams, type ListExecutionsPage, type ListLibraryParams, type ListLibraryResult, type ListLocationsParams, type ListObjectsParams, type ListWorkflowsParams, type Location, type LocationDetail, type LocationReferencePhoto, type LocationReferencePhotoKind, LocationsResource, type ModelCostsResult, NodaroClient, NodaroError, type NodeCategory, type NodeDescriptor, type NodeExecutionState, type NodeInputField, type NodeInputSchema, type NodeJobOutput, type NodePreset, type NodePresetGroup, NodesResource, NotFoundError, type OAuthAppInfo, OAuthResource, type Object$1 as Object, type ObjectCategory, type ObjectDetail, type ObjectReferencePhoto, type ObjectReferencePhotoKind, ObjectsResource, type OutputType, type PickerCatalog, type PickerCatalogSummary, PickerCatalogsResource, type PickerDimension, type PickerOption, PipelinesResource, PresetsResource, type Project, ProjectsResource, PromptHelperResource, type PromptResult, type PublishedApp, type PublishedAppDetail, RateLimitedError, type RecaptionCreatureResult, type RecaptionLocationResult, type RecaptionObjectResult, type RecaptionResult, type ReduceInput, ReduceResource, type ReduceResult, type ReferencePhoto, type ReferencePhotoKind, type RotateSecretResult, type RunAndWaitOptions, type RunManyResult, type RunNodeResult, type RunWorkflowParams, type RunWorkflowResult, StaticTokenAuth, StorageExceededError, type StructuredReferenceParams, UnauthorizedError, type UpdateCreatureInput, type UpdateCreatureResult, type UpdateDeveloperAppInput, type UpdateLocationInput, type UpdateLocationResult, type UpdateObjectInput, type UpdateObjectResult, type UpdateProjectInput, type UpdateWorkflowInput, type UploadResult, UploadsResource, type UpsertCharacterInput, type UpsertCharacterResult, type UpsertCreatureInput, type UpsertCreatureResult, type UpsertObjectInput, type UpsertObjectResult, type UserBalance, type UserIdentity, type VoiceChangerProInput, type VoiceChangerProVoice, VoicesResource, type Workflow, type WorkflowExecution, type WorkflowExecutionSummary, WorkflowsResource, buildPersonSeedPrompt, createClient, supabaseAuth, throwFromResponse };
4450
+ export { type AccessTokenResponse, type AnalyzeInput, type AnalyzeResult, type AppRun, type AppRunResult, type ApplyChatProposalResult, type ApproveCreatureMainImageResult, type ApproveMainImageResult, type ApproveObjectMainImageResult, type ApprovePortraitResult, AppsResource, AudioResource, type Auth, type BranchPipelineInput, type BranchPipelineResult, CREATURE_ASSET_TYPES, CallbackAuth, type CancelExecutionParams, type CancelJobResult, type Character, type CharacterDetail, type CharacterUsage, CharactersResource, type ChatStageResult, type ChatTurn, type ClientOptions, CommunityResource, type CreateCreatureInput, type CreateDeveloperAppInput, type CreateDeveloperAppResult, type CreateLocationInput, type CreateObjectInput, type CreateProjectInput, type CreateWorkflowInput, type Creature, type CreatureAssetType, type CreatureDetail, type CreatureReferencePhoto, type CreatureReferencePhotoKind, CreaturesResource, CreditsResource, type DeleteAppRunResult, type DeveloperApp, type DeveloperAppScope, type DeveloperAppStatus, DeveloperAppsResource, type DubbingInput, type DuplicateCharacterInput, type EnhanceInput, type ExchangeCodeInput, type ExecutionStatus, type ExecutionTriggerType, ExecutionsResource, type FactoryPresetsResult, ForbiddenError, type GenerateAssetInput, type GenerateCharacterInput, type GenerateCharacterResult, type GenerateCreatureAssetInput, type GenerateCreatureAssetResult, type GenerateCreatureInput, type GenerateCreatureMotionInput, type GenerateCreatureMotionResult, type GenerateCreatureResult, type GenerateImageParams, type GenerateInput, type GenerateLocationAssetInput, type GenerateLocationInput, type GenerateLocationResult, type GenerateMotionInput, type GenerateObjectAssetInput, type GenerateObjectAssetResult, type GenerateObjectInput, type GenerateObjectMotionInput, type GenerateObjectMotionResult, type GenerateObjectResult, type GenerateSurroundContinuationInput, type GenerateVideoParams, type GetPickerCatalogOptions, InsufficientCreditsError, type Job, JobAbortedError, JobFailedError, type JobStatus, type JobStatusResult, JobTimeoutError, JobsResource, type LibraryAsset, LibraryResource, type ListAppRunsParams, type ListAppsParams, type ListAppsResult, type ListCharactersParams, type ListCreaturesParams, type ListExecutionsForWorkflowParams, type ListExecutionsPage, type ListLibraryParams, type ListLibraryResult, type ListLocationsParams, type ListObjectsParams, type ListWorkflowsParams, type Location, type LocationDetail, type LocationReferencePhoto, type LocationReferencePhotoKind, LocationsResource, MediaResource, type ModelCostsResult, NodaroClient, NodaroError, type NodeCategory, type NodeDescriptor, type NodeExecutionState, type NodeInputField, type NodeInputSchema, type NodeJobOutput, type NodePreset, type NodePresetGroup, NodesResource, NotFoundError, type OAuthAppInfo, OAuthResource, type Object$1 as Object, type ObjectCategory, type ObjectDetail, type ObjectReferencePhoto, type ObjectReferencePhotoKind, ObjectsResource, type OutputType, type PickerCatalog, type PickerCatalogSummary, PickerCatalogsResource, type PickerDimension, type PickerOption, PipelinesResource, PresetsResource, type Project, ProjectsResource, PromptHelperResource, type PromptResult, type PublishedApp, type PublishedAppDetail, RateLimitedError, type RecaptionCreatureResult, type RecaptionLocationResult, type RecaptionObjectResult, type RecaptionResult, type ReduceInput, ReduceResource, type ReduceResult, type ReferencePhoto, type ReferencePhotoKind, type RotateSecretResult, type RunAndWaitOptions, type RunManyResult, type RunNodeResult, type RunWorkflowParams, type RunWorkflowResult, StaticTokenAuth, StorageExceededError, type StructuredReferenceParams, UnauthorizedError, type UpdateCreatureInput, type UpdateCreatureResult, type UpdateDeveloperAppInput, type UpdateLocationInput, type UpdateLocationResult, type UpdateObjectInput, type UpdateObjectResult, type UpdateProjectInput, type UpdateWorkflowInput, type UploadResult, UploadsResource, type UpsertCharacterInput, type UpsertCharacterResult, type UpsertCreatureInput, type UpsertCreatureResult, type UpsertObjectInput, type UpsertObjectResult, type UserBalance, type UserIdentity, type VcpAnalysis, type VcpAnalysisSpeaker, type VcpAnalyzeInput, type VcpExportInput, type VcpExportTrack, type VideoMetadata, type VoiceChangerProInput, type VoiceChangerProVoice, type VoiceDesignInput, type VoiceRemixInput, VoicesResource, type Workflow, type WorkflowExecution, type WorkflowExecutionSummary, WorkflowsResource, buildPersonSeedPrompt, createClient, supabaseAuth, throwFromResponse };
package/dist/index.js CHANGED
@@ -1550,6 +1550,185 @@ var VoicesResource = class {
1550
1550
  recast(input) {
1551
1551
  return this.client.request("POST", "/v1/voice-changer-pro", { body: input });
1552
1552
  }
1553
+ /**
1554
+ * Detect the speakers in a clip WITHOUT recasting yet
1555
+ * (`POST /v1/voice-changer-pro/analyze`) — the first step of the interactive
1556
+ * flow. Separates voice from music once and diarizes the vocals, returning the
1557
+ * speaker list so a user (or agent) can choose a voice per speaker before
1558
+ * committing to a paid recast. Poll `jobs.get(jobId)`: the completed job's
1559
+ * `output_data` carries the separated stem urls + the detected `speakers`
1560
+ * (each with `id`, time `segments`, `firstStartSec`, `wordCount`, `snippet`)
1561
+ * and the detected language — reshape it into a {@link VcpAnalysis} and pass it
1562
+ * as `recast({ ..., analysis })` to skip re-detection. With `suggestTitle`,
1563
+ * `output_data.suggestedTitle` also carries an LLM-proposed title.
1564
+ *
1565
+ * Cloud-only; costs credits and runs async.
1566
+ */
1567
+ analyze(input) {
1568
+ return this.client.request("POST", "/v1/voice-changer-pro/analyze", { body: input });
1569
+ }
1570
+ /**
1571
+ * Render a final video from a mixed set of stems
1572
+ * (`POST /v1/voice-changer-pro/export`) — the last step of the interactive
1573
+ * flow. After `recast({ output: "stems" })` hands back the dry per-track stems
1574
+ * and the user has set levels / mutes / an effect in your editor, pass those
1575
+ * `tracks` (plus the source `videoUrl`) here to mix and remux into the finished
1576
+ * video. The video is stream-copied (never re-encoded), so the export is
1577
+ * bit-identical to your preview. At least one track must be un-muted (all-muted
1578
+ * is a 400); `voiceFx` is applied to the voice tracks at render time.
1579
+ *
1580
+ * Cloud-only; costs credits and runs async — poll `jobs.get(jobId)` for the
1581
+ * result (`output_data.videoUrl`).
1582
+ */
1583
+ exportMix(input) {
1584
+ return this.client.request("POST", "/v1/voice-changer-pro/export", { body: input });
1585
+ }
1586
+ /**
1587
+ * Design a brand-new synthetic voice from a text description
1588
+ * (`POST /v1/voice-design`) — ElevenLabs text-to-voice. `text` (100–1000 chars)
1589
+ * is a preview line spoken in the designed voice; `voiceDescription` describes
1590
+ * the voice to create. Costs credits and runs async — poll `jobs.get(jobId)`
1591
+ * for the preview + the reusable voice id.
1592
+ */
1593
+ design(input) {
1594
+ return this.client.request("POST", "/v1/voice-design", { body: input });
1595
+ }
1596
+ /**
1597
+ * Generate speech in a voice described in natural language, without cloning
1598
+ * (`POST /v1/voice-remix`). `text` (1–5000 chars) is spoken in a voice matching
1599
+ * `voiceDescription`. Costs credits and runs async — poll `jobs.get(jobId)`.
1600
+ */
1601
+ remix(input) {
1602
+ return this.client.request("POST", "/v1/voice-remix", { body: input });
1603
+ }
1604
+ /**
1605
+ * Dub an audio clip into another language while preserving each speaker's voice
1606
+ * (`POST /v1/dubbing`). `targetLanguage` is an ISO code (e.g. `"es"`, `"fr"`);
1607
+ * `sourceLanguage` is auto-detected when omitted. Costs credits and runs async
1608
+ * — poll `jobs.get(jobId)`.
1609
+ */
1610
+ dub(input) {
1611
+ return this.client.request("POST", "/v1/dubbing", { body: input });
1612
+ }
1613
+ /**
1614
+ * Clone a voice from an audio FILE you hold in memory
1615
+ * (`POST /v1/voice-clones`, multipart) — the counterpart to
1616
+ * {@link VoicesResource.createClone}, which clones from an already-uploaded
1617
+ * URL. Pass the raw audio `file` (a `Blob`/`File` in the browser, or a
1618
+ * `Uint8Array`/`Buffer` in Node) plus a `name`. Costs credits. Returns the new
1619
+ * {@link VoiceClone} (`elevenlabsVoiceId` is the id to recast/synthesize with).
1620
+ */
1621
+ createCloneFromFile(input) {
1622
+ const form = new FormData();
1623
+ form.append("name", input.name);
1624
+ const blob = input.file instanceof Blob ? input.file : new Blob([input.file], { type: input.contentType ?? "audio/mpeg" });
1625
+ form.append("file", blob, input.filename ?? "sample");
1626
+ return this.client.request("POST", "/v1/voice-clones", { body: form });
1627
+ }
1628
+ };
1629
+
1630
+ // src/resources/media.ts
1631
+ var MediaResource = class {
1632
+ constructor(client) {
1633
+ this.client = client;
1634
+ }
1635
+ client;
1636
+ /**
1637
+ * Download a social video (YouTube / TikTok / Instagram / X / Facebook) into
1638
+ * your storage (`POST /v1/download-video`). `maxHeight` caps the resolution
1639
+ * (default "best"); `sectionStartSec` + `sectionEndSec` (both-or-neither) fetch
1640
+ * ONLY that time range instead of the whole video. Returns a `downloadId`;
1641
+ * progress streams from `GET /v1/download-video/progress/:downloadId`
1642
+ * (server-sent events) and the finished file lands in your library.
1643
+ */
1644
+ downloadVideo(input) {
1645
+ return this.client.request("POST", "/v1/download-video", { body: input });
1646
+ }
1647
+ /**
1648
+ * Copy an external media URL into your Nodaro storage (`POST /v1/save-to-storage`)
1649
+ * — a server-side fetch, so nothing round-trips through the client. Poll
1650
+ * `jobs.get(jobId)`.
1651
+ */
1652
+ saveToStorage(input) {
1653
+ return this.client.request("POST", "/v1/save-to-storage", { body: input });
1654
+ }
1655
+ /**
1656
+ * Trim a video to a range (`POST /v1/trim-video`). Give the range in whichever
1657
+ * unit fits: `startTime`/`endTime` seconds, `trim*Frames`, `trim*Seconds`, or
1658
+ * `keepFirst`/`keepLastSeconds`. Poll `jobs.get(jobId)`.
1659
+ */
1660
+ trimVideo(input) {
1661
+ return this.client.request("POST", "/v1/trim-video", { body: input });
1662
+ }
1663
+ /**
1664
+ * Trim (and extract) audio from a video or audio source
1665
+ * (`POST /v1/trim-audio`) to `[startTime, endTime]` seconds, in `audioFormat`
1666
+ * (`mp3` default / `wav` / `aac`). Poll `jobs.get(jobId)`.
1667
+ */
1668
+ trimAudio(input) {
1669
+ return this.client.request("POST", "/v1/trim-audio", { body: input });
1670
+ }
1671
+ /**
1672
+ * Probe a social video's metadata (`POST /v1/video-metadata`) — duration,
1673
+ * dimensions, title, live status — WITHOUT downloading it. A direct read, not a
1674
+ * job. Use it to decide whether to trim before importing.
1675
+ */
1676
+ videoMetadata(input) {
1677
+ return this.client.request("POST", "/v1/video-metadata", { body: input });
1678
+ }
1679
+ };
1680
+
1681
+ // src/resources/audio.ts
1682
+ var AudioResource = class {
1683
+ constructor(client) {
1684
+ this.client = client;
1685
+ }
1686
+ client;
1687
+ /**
1688
+ * Separate an audio track into stems (`POST /v1/audio-separation`, Demucs).
1689
+ * `mode` `"vocal_instrumental"` (default) splits voice from music/SFX;
1690
+ * `"stems"` returns the full drums/bass/other/… breakdown. `quality`
1691
+ * `auto` (default) / `fast` / `best`.
1692
+ */
1693
+ separate(input) {
1694
+ return this.client.request("POST", "/v1/audio-separation", { body: input });
1695
+ }
1696
+ /** Isolate the primary voice and strip background noise (`POST /v1/audio-isolation`, ElevenLabs). */
1697
+ isolate(input) {
1698
+ return this.client.request("POST", "/v1/audio-isolation", { body: input });
1699
+ }
1700
+ /**
1701
+ * Apply a reverb / echo / telephone / megaphone effect to an audio track
1702
+ * (`POST /v1/audio-fx`) — the same presets VCP's `voiceFx` uses, standalone.
1703
+ * `mix` (0–100) is the reverb wet/dry; `delayMs` + `decay` drive `echo`/`custom`;
1704
+ * `eqLow`/`eqHigh` (dB) shape telephone/megaphone.
1705
+ */
1706
+ applyFx(input) {
1707
+ return this.client.request("POST", "/v1/audio-fx", { body: input });
1708
+ }
1709
+ /**
1710
+ * Layer multiple audio tracks into one (`POST /v1/mix-audio`). `audioUrls`
1711
+ * (2–20) are summed; optional `trackVolumes` (0–200% each, positionally) set
1712
+ * per-track level.
1713
+ */
1714
+ mix(input) {
1715
+ return this.client.request("POST", "/v1/mix-audio", { body: input });
1716
+ }
1717
+ /**
1718
+ * Adjust an audio (or a video's audio) level (`POST /v1/adjust-volume`):
1719
+ * `volume` % (default 100), `normalize` to loudnorm, and `fadeIn`/`fadeOut`
1720
+ * seconds. Provide `audioUrl` or `videoUrl`.
1721
+ */
1722
+ adjustVolume(input) {
1723
+ return this.client.request("POST", "/v1/adjust-volume", { body: input });
1724
+ }
1725
+ /**
1726
+ * Concatenate audio segments end-to-end (`POST /v1/combine-audio`). Each
1727
+ * segment is a `url` with an optional `[startTime, endTime]` sub-range.
1728
+ */
1729
+ combine(input) {
1730
+ return this.client.request("POST", "/v1/combine-audio", { body: input });
1731
+ }
1553
1732
  };
1554
1733
 
1555
1734
  // src/resources/credits.ts
@@ -1852,6 +2031,8 @@ var NodaroClient = class {
1852
2031
  reduce;
1853
2032
  promptHelper;
1854
2033
  voices;
2034
+ media;
2035
+ audio;
1855
2036
  credits;
1856
2037
  uploads;
1857
2038
  library;
@@ -1879,6 +2060,8 @@ var NodaroClient = class {
1879
2060
  this.reduce = new ReduceResource(this);
1880
2061
  this.promptHelper = new PromptHelperResource(this);
1881
2062
  this.voices = new VoicesResource(this);
2063
+ this.media = new MediaResource(this);
2064
+ this.audio = new AudioResource(this);
1882
2065
  this.credits = new CreditsResource(this);
1883
2066
  this.uploads = new UploadsResource(this);
1884
2067
  this.library = new LibraryResource(this);
@@ -1976,6 +2159,6 @@ function supabaseAuth(supabase) {
1976
2159
  };
1977
2160
  }
1978
2161
 
1979
- export { AppsResource, CREATURE_ASSET_TYPES, CallbackAuth, CharactersResource, CommunityResource, CreaturesResource, CreditsResource, DeveloperAppsResource, ExecutionsResource, ForbiddenError, InsufficientCreditsError, JobAbortedError, JobFailedError, JobTimeoutError, JobsResource, LibraryResource, LocationsResource, NodaroClient, NodaroError, NodesResource, NotFoundError, OAuthResource, ObjectsResource, PickerCatalogsResource, PipelinesResource, PresetsResource, ProjectsResource, PromptHelperResource, RateLimitedError, ReduceResource, StaticTokenAuth, StorageExceededError, UnauthorizedError, UploadsResource, VoicesResource, WorkflowsResource, buildPersonSeedPrompt, createClient, supabaseAuth, throwFromResponse };
2162
+ export { AppsResource, AudioResource, CREATURE_ASSET_TYPES, CallbackAuth, CharactersResource, CommunityResource, CreaturesResource, CreditsResource, DeveloperAppsResource, ExecutionsResource, ForbiddenError, InsufficientCreditsError, JobAbortedError, JobFailedError, JobTimeoutError, JobsResource, LibraryResource, LocationsResource, MediaResource, NodaroClient, NodaroError, NodesResource, NotFoundError, OAuthResource, ObjectsResource, PickerCatalogsResource, PipelinesResource, PresetsResource, ProjectsResource, PromptHelperResource, RateLimitedError, ReduceResource, StaticTokenAuth, StorageExceededError, UnauthorizedError, UploadsResource, VoicesResource, WorkflowsResource, buildPersonSeedPrompt, createClient, supabaseAuth, throwFromResponse };
1980
2163
  //# sourceMappingURL=index.js.map
1981
2164
  //# sourceMappingURL=index.js.map