ggml: synteza mowy, rozpoznawanie mowy,
wyrównanie (alignment), diaryzacja, separacja i nie tylko, w ponad 80 rodzinach
modeli. GoModel ma dla niego dedykowany typ providera audiocpp.
To provider wyłącznie audio. /v1/audio/speech i /v1/audio/transcriptions
są do niego kierowane; czat, /responses i /v1/embeddings zwracają
invalid_request_error, ponieważ audiocpp_server nie ma takich endpointów.
Najpierw uruchom serwer z konfiguracją wymieniającą modele, które udostępnia:
Konfiguracja
Bazowy URL jest wymagany i rejestruje providera – domyślny portaudiocpp_server
(8080) koliduje z portem samego GoModel, więc nie ma wartości domyślnej:
AUDIOCPP_API_KEY jest opcjonalny i zwykle nieustawiony: audio.cpp nie ma
własnego uwierzytelniania. Ustaw go tylko wtedy, gdy reverse proxy przed serwerem
oczekuje bearer tokena.
Te przykłady zakładają, że GoModel działa w Dockerze, a audio.cpp na hoście –
stąd
host.docker.internal. Jeśli GoModel działa bezpośrednio na hoście, użyj
http://localhost:8099. Końcowe /v1 jest akceptowane i obcinane, więc oba
zapisy wskazują ten sam serwer. Uruchamiasz kilka instancji? Zarejestruj każdą
pod nazwą z sufiksem: AUDIOCPP_GPU_BASE_URL=... tworzy providera
audiocpp-gpu.Weryfikacja
Głosy to nazwy audio.cpp, a nie OpenAI
voice wskazuje preset głosu audio.cpp, id głosu z cache’u lub plik wav
w skonfigurowanej bibliotece głosów – audio.cpp nie ma stałego zestawu głosów,
więc alloy/nova/… z OpenAI nic dla niego nie znaczą. Listę głosów oferowanych
przez model uzyskasz przez GET /p/audiocpp/audio/voices?model=<id>.
voice jest wymagane w /v1/audio/speech, tak jak w API OpenAI. Aby audio.cpp
zastosował zamiast tego skonfigurowany dla modelu default_voice_preset, wywołaj
trasę przez passthrough: POST /p/audiocpp/audio/speech.
Parametry klonowania (voice_ref, reference_text, seed, max_tokens,
options, …) są przekazywane bez zmian, więc własne pola requestu audio.cpp
działają przez standardowy endpoint – z jednym wyjątkiem: voice_ref wskazującym
ścieżkę po stronie serwera (zobacz niżej):
Formaty audio
Synteza zwraca WAV niezależnie od żądanegoresponse_format, chyba że serwer
zbudowano z modułem frontendu MP3. Odpowiedź jest oznaczona typem, który audio.cpp
faktycznie zwrócił (audio/wav), a nie tym, o który poproszono.
Pliki do transkrypcji muszą być w formacie WAV; serwer odrzuca inne kontenery,
chyba że zbudowano go z modułem frontendu audio_decode, który dodaje MP3 i FLAC.
Transkrypcja bez uploadu
audio.cpp potrafi też odczytywać audio z maszyny, na której działa, a jego trasa live przyjmuje surowe PCM bez żadnego pliku. Żadna z tych form nie jest dostępna na/v1/audio/transcriptions: obie pozwalają wywołującemu wybrać, co odczytuje
host audio.cpp lub jak długo trzyma model, a uprawnienie do modelu nie oznacza
uprawnienia do żadnej z nich. Pozostają na natywnej powierzchni opisanej niżej,
którą operator włącza świadomie i udostępnia tylko zaufanym wywołującym.
Z tego samego powodu voice_ref w /v1/audio/speech musi zawierać audio inline
w base64; {"type": "path"} i sama ścieżka w postaci tekstu są odrzucane i dostępne
tylko przez passthrough.
Streaming
Dla modelu skonfigurowanego z"mode": "streaming" stream=true zwraca zdarzenia
transkrypcji audio.cpp w kształcie OpenAI (transcript.text.delta,
transcript.text.done, [DONE]). GoModel przekazuje strumień zdarzeń bez zmian,
ale najpierw odczytuje go do końca, więc nie skraca to niczego od początku do
końca – to trasa live opisana niżej emituje tekst, gdy mówca nadal mówi.
Natywne endpointy
Trasy audio.cpp bez odpowiednika w OpenAI są dostępne przez passthrough pod/p/audiocpp/..., gdy operator
je włączy:
/models/load, /tasks/unload_models) i ścieżki plików
lokalnych serwera. Włączaj ją tylko dla zaufanych wywołujących.
Prefiks /v1 jest opcjonalny (/p/audiocpp/audio/voices
i /p/audiocpp/v1/audio/voices to ta sama trasa); /health jest obsługiwane
z katalogu głównego serwera.
Trasa live to ta, która transkrybuje mowę w trakcie nagrywania – nie ma pliku,
a audio nigdy nie musi istnieć na dysku:
-T - utrzymuje tryb na żywo: --data-binary @- opróżnia stdin przed otwarciem
połączenia, co z powrotem zamienia nagrywanie w upload pliku. To, czy częściowy
tekst pojawia się w trakcie nagrywania, zależy od modelu, a nie od trasy.
Metadane modeli
GET /v1/models raportuje to, co audio.cpp mówi o każdym skonfigurowanym modelu:
- Rodzina – rodzina modeli audio.cpp (
pocket_tts,moonshine_asr, …). - Tryb –
audio_speechdla modeluttsiaudio_transcriptiondla modeluasr. Modele zarejestrowane do innych zadań (align, diaryzacja, separacja, …) pozostają na liście bez trybu: GoModel nie ma endpointu, do którego mógłby je kierować, więc są dostępne przez passthrough. - Możliwości –
streamingdla modelu skonfigurowanego z"mode": "streaming".