Arpeggi Labs Voice Conversion API
Convert an input performance to a target voice model.
Convert an input performance to a target voice model.
openapi: 3.0.3
info:
title: Kits AI Stem Splitter Voice Conversion API
version: v1
description: 'The Kits AI API (operated by Arpeggi Labs) provides studio-quality AI music and audio tools as asynchronous inference jobs: voice conversion, vocal separation, stem splitting, and voice-model blending, plus a catalog of royalty-free artist voice models. All create endpoints enqueue a job and return its status; poll the corresponding fetch endpoint for the signed output file URLs. This specification was generated by API Evangelist from the published Kits AI documentation (https://docs.kits.ai/); the provider lists an openapi.json in its llms.txt but the file was not retrievable at generation time.'
contact:
name: Kits AI Support
url: https://help.kits.ai/
x-generated-by: api-evangelist-enrichment
x-source: https://docs.kits.ai/api-reference
servers:
- url: https://arpeggi.io/api/kits/v1
description: Production
security:
- bearerAuth: []
tags:
- name: Voice Conversion
description: Convert an input performance to a target voice model.
paths:
/voice-conversions:
post:
tags:
- Voice Conversion
operationId: createVoiceConversion
summary: Create a new voice conversion job
description: Creates a voice conversion inference job and adds it to the inference queue. All requests must be made as multipart form requests. The response contains the job status.
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required:
- voiceModelId
- soundFile
properties:
voiceModelId:
type: integer
description: ID of the voice model.
soundFile:
type: string
format: binary
description: Input audio. Supports wav, mp3, or flac. Max 100MB.
conversionStrength:
type: number
minimum: 0
maximum: 1
description: Amount of accent from the voice model (0 to 1).
modelVolumeMix:
type: number
minimum: 0
maximum: 1
description: Mix between input volume and model volume (0 to 1).
pitchShift:
type: number
minimum: -24
maximum: 24
description: Semitones to shift the input audio (-24 to 24).
pre:
$ref: '#/components/schemas/PreProcessingEffects'
post:
$ref: '#/components/schemas/PostProcessingEffects'
responses:
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/InferenceJob'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/UnprocessableEntity'
'429':
$ref: '#/components/responses/TooManyRequests'
get:
tags:
- Voice Conversion
operationId: listVoiceConversions
summary: Fetch voice conversions
description: Returns a paginated list of voice conversion inference jobs.
parameters:
- $ref: '#/components/parameters/Order'
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/PerPage'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedInferenceJobs'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/TooManyRequests'
/voice-conversions/{id}:
get:
tags:
- Voice Conversion
operationId: getVoiceConversion
summary: Fetch a voice conversion by ID
description: Returns a single voice conversion inference job by id.
parameters:
- $ref: '#/components/parameters/JobId'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/InferenceJob'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/TooManyRequests'
components:
parameters:
JobId:
name: id
in: path
required: true
schema:
type: integer
PerPage:
name: perPage
in: query
description: Page size (default 10).
schema:
type: integer
default: 10
Page:
name: page
in: query
description: Page offset (default 1).
schema:
type: integer
default: 1
Order:
name: order
in: query
description: Sort order, asc (default) or desc.
schema:
type: string
enum:
- asc
- desc
default: asc
schemas:
PaginatedInferenceJobs:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/InferenceJob'
meta:
$ref: '#/components/schemas/PaginationMeta'
InferenceJob:
type: object
description: An inference job created through the API.
properties:
id:
type: integer
createdAt:
type: string
type:
type: string
enum:
- infer
- tts
status:
type: string
enum:
- running
- success
- error
- cancelled
jobStartTime:
type: string
nullable: true
jobEndTime:
type: string
nullable: true
outputFileUrl:
type: string
nullable: true
description: Signed URL for the output file (expires in 4 hours).
lossyOutputFileUrl:
type: string
nullable: true
recombinedAudioFileUrl:
type: string
nullable: true
voiceModelId:
type: integer
nullable: true
model:
allOf:
- $ref: '#/components/schemas/VoiceModel'
nullable: true
PostProcessingEffects:
type: object
description: Effects run on the output file after conversion.
properties:
Chorus:
type: object
properties:
rate_hz:
type: number
minimum: 0
maximum: 100
depth:
type: number
centre_delay_ms:
type: number
feedback:
type: number
mix:
type: number
Reverb:
type: object
properties:
room_size:
type: number
minimum: 0
maximum: 1
damping:
type: number
minimum: 0
maximum: 1
wet_level:
type: number
minimum: 0
maximum: 1
dry_level:
type: number
minimum: 0
maximum: 1
width:
type: number
freeze_mode:
type: number
Compressor:
type: object
properties:
threshold_db:
type: number
ratio:
type: number
attack_ms:
type: number
release_ms:
type: number
Delay:
type: object
properties:
delay_seconds:
type: number
feedback:
type: number
mix:
type: number
minimum: 0
maximum: 1
PreProcessingEffects:
type: object
description: Effects run on the input file before conversion.
properties:
NoiseGate:
type: object
properties:
threshold_db:
type: number
ratio:
type: number
attack_ms:
type: number
release_ms:
type: number
HighPassFilter:
type: object
properties:
cutoff_frequency_hz:
type: number
minimum: 0
maximum: 99999
LowPassFilter:
type: object
properties:
cutoff_frequency_hz:
type: number
minimum: 0
maximum: 99999
Compressor:
type: object
properties:
threshold_db:
type: number
ratio:
type: number
attack_ms:
type: number
release_ms:
type: number
VoiceModel:
type: object
description: A voice model that may be user created or internal to Kits.ai.
properties:
id:
type: integer
title:
type: string
isUsable:
type: boolean
tags:
type: array
nullable: true
items:
type: string
imageUrl:
type: string
nullable: true
demoUrl:
type: string
nullable: true
twitterLink:
type: string
nullable: true
instagramLink:
type: string
nullable: true
tiktokLink:
type: string
nullable: true
spotifyLink:
type: string
nullable: true
youtubeLink:
type: string
nullable: true
PaginationMeta:
type: object
properties:
total:
type: integer
perPage:
type: integer
currentPage:
type: integer
lastPage:
type: integer
firstPage:
type: integer
firstPageUrl:
type: string
lastPageUrl:
type: string
nextPageUrl:
type: string
nullable: true
previousPageUrl:
type: string
nullable: true
responses:
TooManyRequests:
description: Rate limit exceeded.
content:
text/plain:
schema:
type: string
Forbidden:
description: Attempted to fetch a resource that does not belong to the requesting user.
content:
text/plain:
schema:
type: string
Unauthorized:
description: Authentication was not provided or was invalid.
content:
text/plain:
schema:
type: string
UnprocessableEntity:
description: Request body or query params are invalid.
content:
text/plain:
schema:
type: string
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: 'API key issued from the Kits AI API access page (https://app.kits.ai/api-access), sent as `Authorization: Bearer <api-key>`.'