GitHub Raw JSON API

modelscope / FunASR

19,806 Python

Open-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.

FunASR OpenAI-Compatible API Specification

Located in examples/openai_api/openapi.json on branch HEAD

3.0.3 JSON 3 Endpoints 9.6 KB

Operations & Route Endpoints (3)

POST /v1/audio/transcriptions
Transcribe an audio file
GET /v1/models
List model aliases
GET /health
Health check
Raw JSON Specification
{
  "openapi": "3.0.3",
  "info": {
    "title": "FunASR OpenAI-Compatible API",
    "version": "1.0.0",
    "description": "Static OpenAPI description for the FunASR OpenAI-compatible speech transcription server. The running FastAPI service also exposes Swagger UI at /docs and an OpenAPI document at /openapi.json."
  },
  "servers": [
    {
      "url": "http://localhost:8000",
      "description": "Local development server"
    },
    {
      "url": "http://funasr-api:8000",
      "description": "Example Docker Compose or internal service name"
    }
  ],
  "tags": [
    {
      "name": "Transcription",
      "description": "OpenAI-compatible speech transcription"
    },
    {
      "name": "Models",
      "description": "Model discovery"
    },
    {
      "name": "Health",
      "description": "Readiness and loaded model status"
    }
  ],
  "paths": {
    "/v1/audio/transcriptions": {
      "post": {
        "tags": [
          "Transcription"
        ],
        "summary": "Transcribe an audio file",
        "description": "Upload an audio file with multipart/form-data and receive an OpenAI-compatible transcript response. Set response_format=verbose_json to include segments and timing metadata.",
        "operationId": "createTranscription",
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TranscriptionRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Transcription result",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/TranscriptionTextResponse"
                    },
                    {
                      "$ref": "#/components/schemas/VerboseTranscriptionResponse"
                    }
                  ]
                },
                "examples": {
                  "json": {
                    "summary": "Default text response",
                    "value": {
                      "text": "Welcome to FunASR."
                    }
                  },
                  "verbose_json": {
                    "summary": "Verbose response",
                    "value": {
                      "text": "Welcome to FunASR.",
                      "segments": [
                        {
                          "start": 0,
                          "end": 1.6,
                          "text": "Welcome to FunASR.",
                          "speaker": null
                        }
                      ],
                      "language": "auto",
                      "duration": 0.843,
                      "model": "sensevoice"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Unknown model alias",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Invalid multipart request"
          },
          "500": {
            "description": "Transcription runtime error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/v1/models": {
      "get": {
        "tags": [
          "Models"
        ],
        "summary": "List model aliases",
        "description": "Return OpenAI-style model objects for the aliases configured by the FunASR server.",
        "operationId": "listModels",
        "responses": {
          "200": {
            "description": "Model list",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModelsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/health": {
      "get": {
        "tags": [
          "Health"
        ],
        "summary": "Health check",
        "description": "Check server readiness, selected device, loaded models, and available model aliases.",
        "operationId": "getHealth",
        "responses": {
          "200": {
            "description": "Server health",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthResponse"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "TranscriptionRequest": {
        "type": "object",
        "required": [
          "file"
        ],
        "properties": {
          "file": {
            "type": "string",
            "format": "binary",
            "description": "Audio file such as wav, mp3, flac, m4a, ogg, or webm."
          },
          "model": {
            "type": "string",
            "enum": [
              "sensevoice",
              "paraformer",
              "paraformer-en",
              "fun-asr-nano"
            ],
            "default": "sensevoice",
            "description": "FunASR model alias."
          },
          "language": {
            "type": "string",
            "nullable": true,
            "description": "Optional language hint passed to FunASR."
          },
          "response_format": {
            "type": "string",
            "enum": [
              "json",
              "verbose_json"
            ],
            "default": "json",
            "description": "Use verbose_json to include segments and timing metadata."
          }
        }
      },
      "TranscriptionTextResponse": {
        "type": "object",
        "required": [
          "text"
        ],
        "properties": {
          "text": {
            "type": "string",
            "description": "Cleaned transcript text."
          }
        }
      },
      "VerboseTranscriptionResponse": {
        "type": "object",
        "required": [
          "text",
          "segments",
          "language",
          "duration",
          "model"
        ],
        "properties": {
          "text": {
            "type": "string"
          },
          "segments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TranscriptionSegment"
            }
          },
          "language": {
            "type": "string",
            "example": "auto"
          },
          "duration": {
            "type": "number",
            "format": "float",
            "description": "Server-side transcription latency in seconds."
          },
          "model": {
            "type": "string",
            "example": "sensevoice"
          }
        }
      },
      "TranscriptionSegment": {
        "type": "object",
        "required": [
          "start",
          "end",
          "text"
        ],
        "properties": {
          "start": {
            "type": "number",
            "format": "float",
            "description": "Segment start time in seconds."
          },
          "end": {
            "type": "number",
            "format": "float",
            "description": "Segment end time in seconds."
          },
          "text": {
            "type": "string"
          },
          "speaker": {
            "type": "string",
            "nullable": true,
            "description": "Speaker label when available."
          }
        }
      },
      "ModelObject": {
        "type": "object",
        "required": [
          "id",
          "object",
          "created",
          "owned_by",
          "ready"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "sensevoice"
          },
          "object": {
            "type": "string",
            "example": "model"
          },
          "created": {
            "type": "integer",
            "example": 1700000000
          },
          "owned_by": {
            "type": "string",
            "example": "funasr"
          },
          "ready": {
            "type": "boolean",
            "description": "Whether this alias is already loaded in memory."
          }
        }
      },
      "ModelsResponse": {
        "type": "object",
        "required": [
          "object",
          "data"
        ],
        "properties": {
          "object": {
            "type": "string",
            "example": "list"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ModelObject"
            }
          }
        }
      },
      "HealthResponse": {
        "type": "object",
        "required": [
          "status",
          "device",
          "models_loaded",
          "models_available"
        ],
        "properties": {
          "status": {
            "type": "string",
            "example": "ok"
          },
          "device": {
            "type": "string",
            "example": "cuda"
          },
          "models_loaded": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "models_available": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "required": [
          "detail"
        ],
        "properties": {
          "detail": {
            "type": "string"
          }
        }
      }
    }
  }
}