> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xhuoapi.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Instrukcja integracji Fish Model API

> Fish music generation 集成指南 - XHuoAPI

Niniejszy dokument przedstawia instrukcję integracji Fish Model API, które jest w pełni kompatybilne z [oficjalnym OpenAPI Fish Audio](https://docs.fish.audio/resources/api-reference/model) i obejmuje:

* `POST /fish/model`: tworzenie nowego klonowanego głosu (Voice Model) na podstawie próbki audio.
* `GET /fish/model`: paginowane pobieranie listy dostępnych głosów widocznych dla bieżącego konta lub na całej platformie.

## Proces aplikacji

Aby korzystać z API, należy najpierw złożyć wniosek o odpowiednią usługę na stronie [Fish Model API](https://api.xhuoapi.ai/services/caf99abc-ddcf-4714-b2a5-862d9b469509). Po wejściu na stronę kliknij przycisk „Acquire”.

Jeśli nie jesteś zalogowany lub zarejestrowany, zostaniesz automatycznie przekierowany na stronę logowania, gdzie możesz się zarejestrować i zalogować. Po zalogowaniu zostaniesz automatycznie przekierowany z powrotem na tę stronę.

Przy pierwszym zgłoszeniu otrzymasz darmowy limit na korzystanie z API.

## Różnice względem oficjalnego API

* **Metoda uwierzytelniania**: używa się nagłówka `Authorization: Bearer {token}`, gdzie `{token}` to klucz uzyskany na tej platformie.
* **Przesyłanie próbek przy tworzeniu modelu**: obecnie interfejs obsługuje wyłącznie przesyłanie danych w formacie JSON, gdzie próbki audio przekazywane są jako URL-e w polu `voices`. Oficjalne API Fish wspiera multipart/msgpack do bezpośredniego przesyłania binarnego, co nie jest jeszcze zaimplementowane na tej platformie. Forma URL pokrywa około 80% typowych scenariuszy.
* **Struktura odpowiedzi**: zarówno `POST /fish/model`, jak i `GET /fish/model` zwracają bezpośrednio odpowiedź z Fish, bez dodatkowego opakowania platformy. W przypadku błędu stosowana jest standardowa struktura platformy `{success:false, error:{code,message}, trace_id}`.

## Tworzenie głosu (POST /fish/model)

Minimalne żądanie tworzenia wymaga pól `title` oraz `voices`. `voices` to lista URL-i próbek audio, zaleca się, aby każdy plik miał ponad 30 sekund długości i próbkowanie co najmniej 16 kHz.

```shell theme={null}
curl -X POST 'https://api.xhuoapi.ai/v1/fish/model' \
  -H 'accept: application/json' \
  -H 'authorization: Bearer {token}' \
  -H 'content-type: application/json' \
  -d '{
    "title": "我的克隆音色",
    "description": "用一段播客录音克隆的音色",
    "voices": [
      "https://example.com/sample-voice.mp3"
    ],
    "cover_image": "https://example.com/cover.png",
    "visibility": "private"
  }'
```

W przypadku powodzenia odpowiedź zawiera bezpośrednio obiekt ModelEntity z platformy Fish:

```json theme={null}
{
  "_id": "d7900c21663f485ab63ebdb7e5905036",
  "type": "tts",
  "title": "我的克隆音色",
  "description": "用一段播客录音克隆的音色",
  "cover_image": "https://example.com/cover.png",
  "train_mode": "fast",
  "state": "trained",
  "tags": [],
  "samples": [],
  "created_at": "2025-05-09T12:34:56.789Z",
  "updated_at": "2025-05-09T12:34:56.789Z",
  "languages": ["zh", "en"],
  "visibility": "private",
  "lock_visibility": false,
  "like_count": 0,
  "mark_count": 0,
  "shared_count": 0,
  "task_count": 0,
  "author": {
    "_id": "user_id",
    "nickname": "user_nickname",
    "avatar": "user_avatar"
  }
}
```

Zwrócone `_id` może być użyte jako wartość pola `reference_id` w dalszych wywołaniach `POST /fish/tts` do syntezy mowy z użyciem tego klonowanego głosu.

## Pobieranie listy głosów (GET /fish/model)

```shell theme={null}
curl -G 'https://api.xhuoapi.ai/v1/fish/model' \
  -H 'accept: application/json' \
  -H 'authorization: Bearer {token}' \
  --data-urlencode 'page_size=10' \
  --data-urlencode 'page_number=1' \
  --data-urlencode 'self=true'
```

Dostępne parametry zapytania (zgodne z oficjalnym API Fish):

* `page_size`: liczba elementów na stronę, domyślnie 10.
* `page_number`: numer strony, zaczynając od 1.
* `title`: wyszukiwanie po tytule (fuzzy).
* `tag`: filtrowanie po tagu.
* `self`: jeśli `true`, zwraca tylko głosy utworzone przez bieżące konto.
* `author_id`: filtrowanie po autorze.
* `language`: filtrowanie po języku głosu.
* `title_language`: filtrowanie po języku tytułu.

W przypadku powodzenia odpowiedź zawiera bezpośrednio paginowaną strukturę z platformy Fish:

```json theme={null}
{
  "items": [
    {
      "_id": "d7900c21663f485ab63ebdb7e5905036",
      "title": "我的克隆音色",
      "description": "用一段播客录音克隆的音色",
      "cover_image": "https://example.com/cover.png",
      "type": "tts",
      "state": "trained",
      "tags": [],
      "languages": ["zh", "en"],
      "visibility": "private",
      "created_at": "2025-05-09T12:34:56.789Z",
      "updated_at": "2025-05-09T12:34:56.789Z"
    }
  ],
  "total": 1
}
```

## Informacje o rozliczeniach

Opłaty są naliczane tylko podczas „tworzenia głosu” (`POST /fish/model` z polem `voices` w ciele żądania). „Pobieranie listy głosów” (`GET /fish/model`) jest bezpłatne.

## Obsługa błędów

* `400 token_mismatched`: Niepoprawne żądanie, możliwe brak lub błędne parametry.
* `400 api_not_implemented`: Niepoprawne żądanie, możliwe brak lub błędne parametry.
* `401 invalid_token`: Brak autoryzacji, nieprawidłowy lub brakujący token.
* `429 too_many_requests`: Zbyt wiele żądań, przekroczono limit szybkości.
* `500 api_error`: Błąd wewnętrzny serwera.

### Przykład odpowiedzi błędu

```json theme={null}
{
  "success": false,
  "error": {
    "code": "api_error",
    "message": "fetch failed"
  },
  "trace_id": "2cf86e86-22a4-46e1-ac2f-032c0f2a4e89"
}
```

## Podsumowanie

Fish Model API jest w pełni kompatybilne z interfejsem ModelEntity oficjalnego OpenAPI Fish Audio, co pozwala na migrację istniejącego kodu zarządzającego klonowanymi głosami bez konieczności zmian w kodzie. Utworzony `_id` głosu można bezpośrednio przekazać do pola `reference_id` w [Fish TTS API](https://api.xhuoapi.ai/documents/77adcb84-d59f-5ef9-b8a0-8b35eb42a71d) w celu syntezy mowy.
