mirror of
https://github.com/jamiepine/voicebox.git
synced 2026-09-16 05:10:42 -07:00
- 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.
878 lines
28 KiB
JSON
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."
|
|
}
|
|
}
|
|
}
|
|
}
|