Files
voicebox/docs2/openapi.json
T
Jamie Pine f090759d8f Add Docker support and update dependencies
- Introduced Docker support with CPU-only and GPU-enabled configurations via Dockerfiles and docker-compose files.
- Added a .dockerignore file to exclude unnecessary files from Docker images.
- Updated bun.lock and package.json to include new dependencies for icon handling.
- Enhanced README with Docker usage instructions and deployment options.
- Refactored components to utilize new icon libraries for improved UI consistency.
2026-02-02 02:19:05 -08:00

878 lines
28 KiB
JSON

{
"openapi": "3.1.0",
"info": {
"title": "voicebox API",
"description": "Production-quality Qwen3-TTS voice cloning API",
"version": "0.1.0"
},
"servers": [{ "url": "http://localhost:8000", "description": "Local development server" }],
"paths": {
"/": {
"get": {
"summary": "Root",
"description": "Root endpoint.",
"operationId": "root__get",
"responses": {
"200": {
"description": "Successful Response",
"content": { "application/json": { "schema": {} } }
}
}
}
},
"/health": {
"get": {
"summary": "Health",
"description": "Health check endpoint.",
"operationId": "health_health_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": { "schema": { "$ref": "#/components/schemas/HealthResponse" } }
}
}
}
}
},
"/profiles": {
"get": {
"summary": "List Profiles",
"description": "List all voice profiles.",
"operationId": "list_profiles_profiles_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"items": { "$ref": "#/components/schemas/VoiceProfileResponse" },
"type": "array",
"title": "Response List Profiles Profiles Get"
}
}
}
}
}
},
"post": {
"summary": "Create Profile",
"description": "Create a new voice profile.",
"operationId": "create_profile_profiles_post",
"requestBody": {
"content": {
"application/json": { "schema": { "$ref": "#/components/schemas/VoiceProfileCreate" } }
},
"required": true
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/VoiceProfileResponse" }
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
}
},
"/profiles/{profile_id}": {
"get": {
"summary": "Get Profile",
"description": "Get a voice profile by ID.",
"operationId": "get_profile_profiles__profile_id__get",
"parameters": [
{
"name": "profile_id",
"in": "path",
"required": true,
"schema": { "type": "string", "title": "Profile Id" }
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/VoiceProfileResponse" }
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
},
"put": {
"summary": "Update Profile",
"description": "Update a voice profile.",
"operationId": "update_profile_profiles__profile_id__put",
"parameters": [
{
"name": "profile_id",
"in": "path",
"required": true,
"schema": { "type": "string", "title": "Profile Id" }
}
],
"requestBody": {
"required": true,
"content": {
"application/json": { "schema": { "$ref": "#/components/schemas/VoiceProfileCreate" } }
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/VoiceProfileResponse" }
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
},
"delete": {
"summary": "Delete Profile",
"description": "Delete a voice profile.",
"operationId": "delete_profile_profiles__profile_id__delete",
"parameters": [
{
"name": "profile_id",
"in": "path",
"required": true,
"schema": { "type": "string", "title": "Profile Id" }
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": { "application/json": { "schema": {} } }
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
}
},
"/profiles/{profile_id}/samples": {
"post": {
"summary": "Add Profile Sample",
"description": "Add a sample to a voice profile.",
"operationId": "add_profile_sample_profiles__profile_id__samples_post",
"parameters": [
{
"name": "profile_id",
"in": "path",
"required": true,
"schema": { "type": "string", "title": "Profile Id" }
}
],
"requestBody": {
"required": true,
"content": {
"multipart/form-data": {
"schema": {
"$ref": "#/components/schemas/Body_add_profile_sample_profiles__profile_id__samples_post"
}
}
}
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/ProfileSampleResponse" }
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
},
"get": {
"summary": "Get Profile Samples",
"description": "Get all samples for a profile.",
"operationId": "get_profile_samples_profiles__profile_id__samples_get",
"parameters": [
{
"name": "profile_id",
"in": "path",
"required": true,
"schema": { "type": "string", "title": "Profile Id" }
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": { "$ref": "#/components/schemas/ProfileSampleResponse" },
"title": "Response Get Profile Samples Profiles Profile Id Samples Get"
}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
}
},
"/profiles/samples/{sample_id}": {
"delete": {
"summary": "Delete Profile Sample",
"description": "Delete a profile sample.",
"operationId": "delete_profile_sample_profiles_samples__sample_id__delete",
"parameters": [
{
"name": "sample_id",
"in": "path",
"required": true,
"schema": { "type": "string", "title": "Sample Id" }
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": { "application/json": { "schema": {} } }
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
}
},
"/generate": {
"post": {
"summary": "Generate Speech",
"description": "Generate speech from text using a voice profile.",
"operationId": "generate_speech_generate_post",
"requestBody": {
"content": {
"application/json": { "schema": { "$ref": "#/components/schemas/GenerationRequest" } }
},
"required": true
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/GenerationResponse" }
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
}
},
"/history": {
"get": {
"summary": "List History",
"description": "List generation history with optional filters.",
"operationId": "list_history_history_get",
"parameters": [
{
"name": "profile_id",
"in": "query",
"required": false,
"schema": { "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Profile Id" }
},
{
"name": "search",
"in": "query",
"required": false,
"schema": { "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Search" }
},
{
"name": "limit",
"in": "query",
"required": false,
"schema": { "type": "integer", "default": 50, "title": "Limit" }
},
{
"name": "offset",
"in": "query",
"required": false,
"schema": { "type": "integer", "default": 0, "title": "Offset" }
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HistoryListResponse" }
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
}
},
"/history/{generation_id}": {
"get": {
"summary": "Get Generation",
"description": "Get a generation by ID.",
"operationId": "get_generation_history__generation_id__get",
"parameters": [
{
"name": "generation_id",
"in": "path",
"required": true,
"schema": { "type": "string", "title": "Generation Id" }
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": { "schema": { "$ref": "#/components/schemas/HistoryResponse" } }
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
},
"delete": {
"summary": "Delete Generation",
"description": "Delete a generation.",
"operationId": "delete_generation_history__generation_id__delete",
"parameters": [
{
"name": "generation_id",
"in": "path",
"required": true,
"schema": { "type": "string", "title": "Generation Id" }
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": { "application/json": { "schema": {} } }
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
}
},
"/history/stats": {
"get": {
"summary": "Get Stats",
"description": "Get generation statistics.",
"operationId": "get_stats_history_stats_get",
"responses": {
"200": {
"description": "Successful Response",
"content": { "application/json": { "schema": {} } }
}
}
}
},
"/transcribe": {
"post": {
"summary": "Transcribe Audio",
"description": "Transcribe audio file to text.",
"operationId": "transcribe_audio_transcribe_post",
"requestBody": {
"content": {
"multipart/form-data": {
"schema": { "$ref": "#/components/schemas/Body_transcribe_audio_transcribe_post" }
}
},
"required": true
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/TranscriptionResponse" }
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
}
},
"/audio/{generation_id}": {
"get": {
"summary": "Get Audio",
"description": "Serve generated audio file.",
"operationId": "get_audio_audio__generation_id__get",
"parameters": [
{
"name": "generation_id",
"in": "path",
"required": true,
"schema": { "type": "string", "title": "Generation Id" }
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": { "application/json": { "schema": {} } }
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
}
},
"/models/load": {
"post": {
"summary": "Load Model",
"description": "Manually load TTS model.",
"operationId": "load_model_models_load_post",
"parameters": [
{
"name": "model_size",
"in": "query",
"required": false,
"schema": { "type": "string", "default": "1.7B", "title": "Model Size" }
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": { "application/json": { "schema": {} } }
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
}
},
"/models/unload": {
"post": {
"summary": "Unload Model",
"description": "Unload TTS model to free memory.",
"operationId": "unload_model_models_unload_post",
"responses": {
"200": {
"description": "Successful Response",
"content": { "application/json": { "schema": {} } }
}
}
}
},
"/models/progress/{model_name}": {
"get": {
"summary": "Get Model Progress",
"description": "Get model download progress via Server-Sent Events.",
"operationId": "get_model_progress_models_progress__model_name__get",
"parameters": [
{
"name": "model_name",
"in": "path",
"required": true,
"schema": { "type": "string", "title": "Model Name" }
}
],
"responses": {
"200": {
"description": "Successful Response",
"content": { "application/json": { "schema": {} } }
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
}
},
"/models/status": {
"get": {
"summary": "Get Model Status",
"description": "Get status of all available models.",
"operationId": "get_model_status_models_status_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/ModelStatusListResponse" }
}
}
}
}
}
},
"/models/download": {
"post": {
"summary": "Trigger Model Download",
"description": "Trigger download of a specific model.",
"operationId": "trigger_model_download_models_download_post",
"requestBody": {
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/ModelDownloadRequest" }
}
},
"required": true
},
"responses": {
"200": {
"description": "Successful Response",
"content": { "application/json": { "schema": {} } }
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/HTTPValidationError" }
}
}
}
}
}
}
},
"components": {
"schemas": {
"Body_add_profile_sample_profiles__profile_id__samples_post": {
"properties": {
"file": { "type": "string", "format": "binary", "title": "File" },
"reference_text": { "type": "string", "title": "Reference Text" }
},
"type": "object",
"required": ["file", "reference_text"],
"title": "Body_add_profile_sample_profiles__profile_id__samples_post"
},
"Body_transcribe_audio_transcribe_post": {
"properties": {
"file": { "type": "string", "format": "binary", "title": "File" },
"language": { "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Language" }
},
"type": "object",
"required": ["file"],
"title": "Body_transcribe_audio_transcribe_post"
},
"GenerationRequest": {
"properties": {
"profile_id": { "type": "string", "title": "Profile Id" },
"text": { "type": "string", "maxLength": 5000, "minLength": 1, "title": "Text" },
"language": {
"type": "string",
"pattern": "^(en|zh)$",
"title": "Language",
"default": "en"
},
"seed": {
"anyOf": [{ "type": "integer", "minimum": 0.0 }, { "type": "null" }],
"title": "Seed"
},
"model_size": {
"anyOf": [{ "type": "string", "pattern": "^(1\\.7B|0\\.6B)$" }, { "type": "null" }],
"title": "Model Size",
"default": "1.7B"
}
},
"type": "object",
"required": ["profile_id", "text"],
"title": "GenerationRequest",
"description": "Request model for voice generation."
},
"GenerationResponse": {
"properties": {
"id": { "type": "string", "title": "Id" },
"profile_id": { "type": "string", "title": "Profile Id" },
"text": { "type": "string", "title": "Text" },
"language": { "type": "string", "title": "Language" },
"audio_path": { "type": "string", "title": "Audio Path" },
"duration": { "type": "number", "title": "Duration" },
"seed": { "anyOf": [{ "type": "integer" }, { "type": "null" }], "title": "Seed" },
"created_at": { "type": "string", "format": "date-time", "title": "Created At" }
},
"type": "object",
"required": [
"id",
"profile_id",
"text",
"language",
"audio_path",
"duration",
"seed",
"created_at"
],
"title": "GenerationResponse",
"description": "Response model for voice generation."
},
"HTTPValidationError": {
"properties": {
"detail": {
"items": { "$ref": "#/components/schemas/ValidationError" },
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
},
"HealthResponse": {
"properties": {
"status": { "type": "string", "title": "Status" },
"model_loaded": { "type": "boolean", "title": "Model Loaded" },
"model_downloaded": {
"anyOf": [{ "type": "boolean" }, { "type": "null" }],
"title": "Model Downloaded"
},
"model_size": {
"anyOf": [{ "type": "string" }, { "type": "null" }],
"title": "Model Size"
},
"gpu_available": { "type": "boolean", "title": "Gpu Available" },
"vram_used_mb": {
"anyOf": [{ "type": "number" }, { "type": "null" }],
"title": "Vram Used Mb"
}
},
"type": "object",
"required": ["status", "model_loaded", "gpu_available"],
"title": "HealthResponse",
"description": "Response model for health check."
},
"HistoryListResponse": {
"properties": {
"items": {
"items": { "$ref": "#/components/schemas/HistoryResponse" },
"type": "array",
"title": "Items"
},
"total": { "type": "integer", "title": "Total" }
},
"type": "object",
"required": ["items", "total"],
"title": "HistoryListResponse",
"description": "Response model for history list."
},
"HistoryResponse": {
"properties": {
"id": { "type": "string", "title": "Id" },
"profile_id": { "type": "string", "title": "Profile Id" },
"profile_name": { "type": "string", "title": "Profile Name" },
"text": { "type": "string", "title": "Text" },
"language": { "type": "string", "title": "Language" },
"audio_path": { "type": "string", "title": "Audio Path" },
"duration": { "type": "number", "title": "Duration" },
"seed": { "anyOf": [{ "type": "integer" }, { "type": "null" }], "title": "Seed" },
"created_at": { "type": "string", "format": "date-time", "title": "Created At" }
},
"type": "object",
"required": [
"id",
"profile_id",
"profile_name",
"text",
"language",
"audio_path",
"duration",
"seed",
"created_at"
],
"title": "HistoryResponse",
"description": "Response model for history entry (includes profile name)."
},
"ModelDownloadRequest": {
"properties": { "model_name": { "type": "string", "title": "Model Name" } },
"type": "object",
"required": ["model_name"],
"title": "ModelDownloadRequest",
"description": "Request model for triggering model download."
},
"ModelStatus": {
"properties": {
"model_name": { "type": "string", "title": "Model Name" },
"display_name": { "type": "string", "title": "Display Name" },
"downloaded": { "type": "boolean", "title": "Downloaded" },
"size_mb": { "anyOf": [{ "type": "number" }, { "type": "null" }], "title": "Size Mb" },
"loaded": { "type": "boolean", "title": "Loaded", "default": false }
},
"type": "object",
"required": ["model_name", "display_name", "downloaded"],
"title": "ModelStatus",
"description": "Response model for model status."
},
"ModelStatusListResponse": {
"properties": {
"models": {
"items": { "$ref": "#/components/schemas/ModelStatus" },
"type": "array",
"title": "Models"
}
},
"type": "object",
"required": ["models"],
"title": "ModelStatusListResponse",
"description": "Response model for model status list."
},
"ProfileSampleResponse": {
"properties": {
"id": { "type": "string", "title": "Id" },
"profile_id": { "type": "string", "title": "Profile Id" },
"audio_path": { "type": "string", "title": "Audio Path" },
"reference_text": { "type": "string", "title": "Reference Text" }
},
"type": "object",
"required": ["id", "profile_id", "audio_path", "reference_text"],
"title": "ProfileSampleResponse",
"description": "Response model for profile sample."
},
"TranscriptionResponse": {
"properties": {
"text": { "type": "string", "title": "Text" },
"duration": { "type": "number", "title": "Duration" }
},
"type": "object",
"required": ["text", "duration"],
"title": "TranscriptionResponse",
"description": "Response model for transcription."
},
"ValidationError": {
"properties": {
"loc": {
"items": { "anyOf": [{ "type": "string" }, { "type": "integer" }] },
"type": "array",
"title": "Location"
},
"msg": { "type": "string", "title": "Message" },
"type": { "type": "string", "title": "Error Type" }
},
"type": "object",
"required": ["loc", "msg", "type"],
"title": "ValidationError"
},
"VoiceProfileCreate": {
"properties": {
"name": { "type": "string", "maxLength": 100, "minLength": 1, "title": "Name" },
"description": {
"anyOf": [{ "type": "string", "maxLength": 500 }, { "type": "null" }],
"title": "Description"
},
"language": {
"type": "string",
"pattern": "^(en|zh)$",
"title": "Language",
"default": "en"
}
},
"type": "object",
"required": ["name"],
"title": "VoiceProfileCreate",
"description": "Request model for creating a voice profile."
},
"VoiceProfileResponse": {
"properties": {
"id": { "type": "string", "title": "Id" },
"name": { "type": "string", "title": "Name" },
"description": {
"anyOf": [{ "type": "string" }, { "type": "null" }],
"title": "Description"
},
"language": { "type": "string", "title": "Language" },
"created_at": { "type": "string", "format": "date-time", "title": "Created At" },
"updated_at": { "type": "string", "format": "date-time", "title": "Updated At" }
},
"type": "object",
"required": ["id", "name", "description", "language", "created_at", "updated_at"],
"title": "VoiceProfileResponse",
"description": "Response model for voice profile."
}
}
}
}