Im vorherigen Beitrag habe ich mir angesehen, was Fish Audio als Unternehmen ausmacht und warum drei seiner Modelle offen sind, während das Flaggschiff hinter einer kostenpflichtigen API steckt. Dieser hier ist die andere Hälfte: wie man es tatsächlich in etwas einbindet. Authentifizierung, der Endpunkt, das Python-SDK, beide Wege zum Voice Cloning, Streaming, das zu sprechen beginnt, bevor Ihr Sprachmodell zu Ende gedacht hat, und die Preisarithmetik, die darüber entscheidet, ob sich das Ganze bei Ihrem Volumen rechnet. Alles Folgende stammt aus der aktuellen Dokumentation und nicht aus der Erinnerung.
Die Kurzfassung
- Ein POST an https://api.fish.audio/v1/tts mit einem Bearer-Token liefert Audio; das Modell wird über einen Header gewählt, nicht über ein Body-Feld
- Das Modell s2.1-pro-free ist dasselbe Modell wie s2.1-pro, jedoch kostenlos, gedacht für Tests und Prototyping, was die Evaluierung wirklich kostenfrei macht
- Die Abrechnung erfolgt mit 15 Dollar pro Million UTF-8-Bytes, das entspricht ungefähr 180.000 englischen Wörtern oder etwa 12 Stunden Sprache
- Voice Cloning gibt es in zwei Formen: ein dauerhaftes, wiederverwendbares Stimmmodell oder Zero-Shot-Referenzen, die inline mit einer einzelnen Anfrage übergeben werden
- Der Websocket-Modus akzeptiert einen Generator von Text-Tokens, sodass Sie eine LLM-Antwort sprechen lassen können, während sie erzeugt wird, anstatt darauf zu warten
- Ihr Ratenlimit ist nebenläufigkeitsbasiert und steigt mit den Gesamtausgaben, beginnend bei 5 gleichzeitigen Anfragen
Das kleinste funktionierende Beispiel
Bevor Sie etwas installieren, überprüfen Sie, ob Ihr Schlüssel mit einer einzigen Anfrage funktioniert. Der Endpunkt ist POST https://api.fish.audio/v1/tts, die Authentifizierung erfolgt über ein Standard-Bearer-Token, und die Antwort ist ein chunked Audiostream und keine JSON-Hülle, die eine URL enthält.
# The model is selected with a header, which is unusual enough to trip people up.
# s2.1-pro-free costs nothing, so use it while you are still experimenting.
curl --request POST \
--url https://api.fish.audio/v1/tts \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--header 'model: s2.1-pro-free' \
--data '{"text": "Hello! Welcome to Fish Audio."}' \
--output hello.mp3
Zwei Details in dieser Anfrage sind wichtiger, als sie aussehen. Der model Header legt die Engine fest, sodass eine Anfrage, die Ihre Modellwahl zu ignorieren scheint, meist eine ist, bei der der Wert stattdessen im JSON-Body platziert wurde. Und die Antwort streamt direkt als Audio-Bytes; wenn Sie also debuggen, indem Sie den Body ausgeben, erhalten Sie binäres Rauschen statt einer Fehlermeldung.
Das Python-SDK
Für alles, was über einen Smoke-Test hinausgeht, ist das SDK weniger Arbeit. Eine Sache, die Sie vor dem Start beachten sollten: Das Paket, das Sie installieren, und das Modul, das Sie importieren, werden nicht gleich geschrieben, was einige verwirrte Minuten kostet.
pip install fish-audio-sdk # note the hyphens
export FISH_API_KEY=your_api_key_here
from fishaudio import FishAudio # but the module has no hyphens
from fishaudio.utils import save
client = FishAudio() # reads FISH_API_KEY from the environment
# or be explicit: FishAudio(api_key="...")
# AsyncFishAudio is the asyncio variant
audio = client.tts.convert(text="Hello from Fish Audio!")
save(audio, "out.mp3")
Ausgabeformat, Abtastrate und Sprechgeschwindigkeit sind alle einstellbar. Das Standardformat ist mp3, was für die Auslieferung an einen Browser richtig ist und falsch für alles, was Sie weiterverarbeiten wollen, denn dafür brauchen Sie unkomprimierte Frames.
from fishaudio.types import TTSConfig
# wav or pcm when the audio feeds another system, mp3 or opus when it feeds a person
audio = client.tts.convert(
text="High quality narration for the archive.",
config=TTSConfig(format="wav", sample_rate=44100),
)
# Speed accepts 0.5 to 2.0. Small adjustments read as natural, large ones do not.
brisk = client.tts.convert(text="Speaking a little faster.", speed=1.2)
# Pick a specific voice by id
branded = client.tts.convert(
text="This uses a specific voice.",
reference_id="9a9cf47702da476aa4629e2506d4a857",
)
Für lange Dokumente verwenden Sie stream anstelle von convert. Es liefert Chunks, anstatt den gesamten Clip im Speicher aufzubauen, was wichtig wird, sobald Sie etwas in Buchlänge vertonen.
with open("chapter.mp3", "wb") as f:
for chunk in client.tts.stream(text=very_long_passage):
f.write(chunk)
Welches Modell Sie verwenden sollten, und die kostenlose Stufe, die kein Downgrade ist
Dieser Teil ist sorgfältig zu lesen, denn die Benennung verbirgt etwas wirklich Nützliches. Die Dokumentation beschreibt s2.1-pro als das empfohlene Produktionsmodell mit verbesserter Qualität, Latenz und Durchsatz gegenüber dem vorherigen S2-Pro. Sie beschreibt s2.1-pro-free als dasselbe Modell zu Nullkosten, gedacht für Tests, Prototyping und Entwicklung.
| Modell | Preis | Verwendungszweck |
|---|---|---|
| s2.1-pro | 15,00 Dollar pro Million UTF-8-Bytes | Produktion, der empfohlene Standard |
| s2.1-pro-free | 0,00 Dollar | Evaluierung, Prototyping, Entwicklung |
| s2-pro | 15,00 Dollar pro Million UTF-8-Bytes | Vorherige Generation, abgelöst |
| s1 | 15,00 Dollar pro Million UTF-8-Bytes | Legacy, nur für bestehende Integrationen |
| transcribe-1 | 0,36 Dollar pro Audiostunde | Sprache zu Text, sekundengenau abgerechnet |
| voice-design-1 | 0,01 Dollar pro erfolgreicher Anfrage | Erzeugung einer Stimme aus einer Beschreibung |
Die praktische Konsequenz ist, dass Sie das tatsächliche Produktionsmodell mit Ihren echten Inhalten, in Ihren echten Sprachen, kostenlos evaluieren können, bevor Sie auch nur eine Rupie oder einen Dollar ausgeben. Das beseitigt die übliche Ausrede, auf einer schwächeren Stufe zu benchmarken und dann in der Produktion überrascht zu werden. Führen Sie Ihre Qualitätstests mit dem kostenlosen Modell durch und ändern Sie einen Header-Wert, wenn Sie live gehen.
Tipp
Evaluieren Sie auf dem Modell, das Sie ausliefern werden
Da s2.1-pro-free dokumentiert als dasselbe Modell zu Nullkosten gilt, gibt es keinen Grund, die Qualität mit etwas anderem zu bewerten. Jagen Sie Ihren schlimmsten Text hindurch, die Produktnamen, die Zahlen, die Abkürzungen, und entscheiden Sie erst dann, ob die kostenpflichtige Stufe ihren Platz verdient.
Voice Cloning, beide Wege
Es gibt zwei Ansätze, und sie passen zu unterschiedlichen Produkten. Erstellen Sie ein dauerhaftes Stimmmodell, wenn dieselbe Stimme wiederverwendet wird, denn Sie klonen einmal und referenzieren dann für immer eine ID. Verwenden Sie Zero-Shot-Referenzen, wenn die Stimme pro Anfrage geliefert wird und nichts zu behalten ist.
# Route 1: a reusable voice model. Clone once, reference the id afterwards.
with open("sample.wav", "rb") as f:
voice = client.voices.create(
title="Narrator",
voices=[f.read()],
description="Cloned from a studio sample",
visibility="private", # private is the default; unlist and public also exist
)
print(voice.id, voice.state)
audio = client.tts.convert(
text="Now I speak in the cloned voice.",
reference_id=voice.id,
)
# Route 2: zero shot. Nothing is stored, the reference travels with the request.
from fishaudio.types import ReferenceAudio
with open("reference.wav", "rb") as f:
audio = client.tts.convert(
text="This will sound like the reference voice.",
references=[ReferenceAudio(
audio=f.read(),
text="The exact words spoken in the reference clip.",
)],
)
Beachten Sie das Transkript im Zero-Shot-Pfad. Sie übergeben sowohl das Audio als auch die tatsächlich darin gesprochenen Wörter, und die Genauigkeit dort beeinflusst das Ergebnis messbar. Ein Transkript, das nicht zum Audio passt, erzeugt einen schlechteren Klon als gar kein Versuch.
Zum Quellmaterial macht die Dokumentation klare Vorgaben: WAV, MP3, M4A oder Opus, mindestens zehn Sekunden pro Clip und optimalerweise ein bis zwei Minuten klare Sprache eines einzelnen Sprechers. Diese letzte Angabe sollte man ernst nehmen. Zehn Sekunden funktionieren, aber der Unterschied zwischen dem Minimum und einer ordentlichen Minute sauberen Audios ist hörbar: und es ist die günstigste Qualitätsverbesserung, die man bekommen kann. Eine Audioverbesserung für verrauschte Aufnahmen ist standardmäßig aktiviert.
Warnung
Die Einwilligung liegt in Ihrer Verantwortung
Zehn Sekunden Audiomaterial reichen aus, um jemanden zu imitieren. Wenn Nutzer Referenzaudio hochladen können, haben Sie ein Voice-Cloning-Werkzeug ausgeliefert. Stellen Sie sicher, dass der Hochladende die Rechte an der Stimme besitzt, protokollieren Sie, welches Konto welchen Clip erzeugt hat, und weisen Sie Hörer auf synthetisches Audio hin. Nichts davon wird von der API bereitgestellt.
Streaming und Sprechen, während das Modell noch denkt
Für Sprachagenten und Assistenten ist der HTTP-Streaming-Pfad immer noch zu langsam, da er erst beginnen kann, wenn Ihr Sprachmodell den vollständigen Text erzeugt hat. Der Websocket-Modus beseitigt diese Wartezeit vollständig. Er akzeptiert einen Generator von Text-Token und beginnt mit der Audioausgabe, sobald die Wörter eintreffen.
from fishaudio import FishAudio
from fishaudio.utils import play
client = FishAudio()
def llm_tokens():
# In production this yields tokens from your LLM stream, not a fixed list
for token in ["The ", "first ", "move ", "sets ", "everything ", "in ", "motion."]:
yield token
for chunk in client.tts.stream_websocket(llm_tokens(), reference_id="YOUR_VOICE_ID"):
play(chunk)
Das ist das wichtigste Muster der gesamten Integration für alles Konversationelle. Ohne es setzt sich die wahrgenommene Latenz aus der Generierungszeit des Sprachmodells plus der Synthesezeit zusammen. Mit ihm überlappen sich beide, und der Nutzer hört die ersten Worte, während das Modell noch den Rest formuliert. Dieser Unterschied ist meist die Grenze zwischen einem Assistenten, der reaktionsschnell wirkt, und einem, der sich kaputt anfühlt.
Es gibt einen latency Parameter mit zwei Einstellungen, und die Dokumentation nennt konkrete Zahlen dazu. normal wird als beste Qualität mit etwa 500 Millisekunden beschrieben, und balanced als gute Qualität mit etwa 300 Millisekunden. Für alles Konversationelle ist dieser Unterschied von 200 Millisekunden mehr wert als der Qualitätszuwachs, und die Dokumentation selbst empfiehlt den ausbalancierten Modus, wenn der Audiostart zu lange dauert. Heben Sie sich normal für vorgerendertes Audio auf, bei dem niemand wartet. Ein asynchroner Client, AsyncFishAudio, akzeptiert asynchrone Generatoren in derselben Form.
| Modus | Angegebene Qualität | Angegebene Latenz | Einsatz für |
|---|---|---|---|
| balanced | Gute Qualität | ca. 300 ms | Sprachagenten, Assistenten, alles Interaktive |
| normal | Beste Qualität | ca. 500 ms | Erzählungen und vorgerendertes Audio |
Profi-Tipp
Messen Sie die Zeit bis zum ersten Audio-Byte auf Client-Seite, nicht auf Server-Seite. Serverseitige Zeitmessungen übersehen routinemäßig 100 bis 300 Millisekunden Pufferung und Wiedergabestart: genau der Bereich, in dem eine Benutzeroberfläche aufhört, sich unmittelbar anzufühlen.
Was es kostet, in Zahlen, mit denen man planen kann
Die Abrechnung erfolgt pro Million UTF-8-Bytes, nicht pro Zeichen oder pro Sekunde, was schwer einzuschätzen ist, bis man es umrechnet. Die Dokumentation setzt eine Million UTF-8-Bytes mit etwa 180.000 englischen Wörtern oder rund 12 Stunden Sprache gleich. Bei 15 Dollar pro Million ergeben sich einige nützliche Referenzpunkte.
| Arbeitslast | Ungefähre Größe | Ungefähre Kosten |
|---|---|---|
| Ein vorgelesener Artikel mit 1.500 Wörtern | ca. 8.300 Bytes | ca. 0,13 Dollar |
| 100 solcher Artikel | ca. 830.000 Bytes | ca. 12,50 Dollar |
| 12 Stunden ununterbrochene Sprache | ca. 1.000.000 Bytes | ca. 15 Dollar |
| Eine 30-Wort-Benachrichtigung, 10.000 Mal | ca. 1.700.000 Bytes | ca. 25 Dollar |
Seien Sie vorsichtig mit dem UTF-8-Detail, wenn Sie mit nicht-lateinischen Schriften arbeiten. Die Abrechnung zählt Bytes, nicht Zeichen, und Singhalesisch, Tamil, Chinesisch, Japanisch, Arabisch und ähnliche Schriften verwenden mehrere Bytes pro Zeichen. Text, der genauso lang aussieht wie ein englischer Satz, kann zwei- oder dreimal so viel kosten. Es lohnt sich, das zu modellieren, bevor Sie ein lokalisiertes Produkt starten, anstatt es auf einer Rechnung zu entdecken.
Die andere Grenze, die man einplanen sollte, ist die Gleichzeitigkeit und nicht das Volumen. Ratenlimits werden als gleichzeitige Anfragen ausgedrückt und steigen mit den kumulierten Ausgaben.
| Stufe | Schwelle | Gleichzeitige Anfragen |
|---|---|---|
| Starter | Unter 100 Dollar bezahlt | 5 |
| Erhöht | 100 Dollar oder mehr bezahlt | 15 |
| Hohes Volumen | 1.000 Dollar oder mehr bezahlt | 50 |
| Enterprise | Individuell | Individuell |
Fünf gleichzeitige Anfragen sind komfortabel für eine Content-Pipeline und knapp für alles Benutzerzugewandte in großem Maßstab. Stellen Sie Ihre Arbeit daher in eine Warteschlange, anstatt Anfragen bei Eingang sofort abzusetzen. Ein einfacher Worker-Pool, der auf Ihre Stufe zugeschnitten ist, mit Wiederholungen bei Ablehnung, verhindert den Fehlermodus, bei dem eine Verkehrsspitze zu einer Wand von Fehlern wird.
Die Produktions-Checkliste
Vier Dinge trennen einen funktionierenden Prototyp von etwas, das man laufen lassen kann.
1. Cache on a hash of text + voice + parameters.
Applications repeat far more utterances than anyone expects,
and cached audio costs nothing to serve.
2. Normalise text before synthesis.
Expand currency, dates, units and known acronyms into the words
you want spoken. This removes most reported quality complaints.
3. Queue to your concurrency tier.
Five simultaneous requests on the starter tier. Size a worker pool
to match and retry on rejection instead of failing the user.
4. Log voice provenance.
Which voice, which account, which authorisation, retained.
You cannot answer the only question that matters after an incident
without it.
! Häufige Fehler, die es zu vermeiden gilt
-
✕Den Modellnamen in den JSON-Body setzen.
✓Das Modell wird mit einem Request-Header ausgewählt. Ein Body-Feld wird stillschweigend ignoriert, sodass Sie das Standardmodell erhalten und zu dem Schluss kommen, Ihre Modellwahl funktioniere nicht.
-
✕Qualität auf einer schwächeren Stufe bewerten und auf dem Flaggschiff ausliefern.
✓Das kostenlose Modell ist als dasselbe Modell wie s2.1-pro dokumentiert, und das zu Nullkosten. Testen Sie darauf und ändern Sie einen Header, wenn Sie live gehen.
-
✕Ein Transkript übergeben, das nicht zum Referenzaudio passt.
✓Zero-Shot-Klonen nutzt das Transkript als Konditionierung. Ein unpassendes Transkript liefert ein schlechteres Ergebnis als ein sorgfältiges, genaues Transkript dessen, was tatsächlich gesagt wurde.
-
✕Warten auf die vollständige LLM-Antwort, bevor die Synthese aufgerufen wird.
✓Nutzen Sie den Websocket-Modus mit einem Token-Generator. Generierung und Synthese überlappen sich, wodurch die Denkzeit des Modells vollständig aus der wahrgenommenen Latenz verschwindet.
-
✕Budgetierung pro Zeichen, wenn Ihr Inhalt nicht in lateinischer Schrift vorliegt.
✓Die Abrechnung zählt UTF-8-Bytes. Viele Schriftsysteme verwenden zwei bis vier Bytes pro Zeichen. Modellieren Sie daher Ihre tatsächlichen Sprachen, bevor Sie sich auf einen Preis pro Artikel festlegen.
-
✕Anfragen direkt bei Eingang absenden und Parallelitätsgrenzen ignorieren.
✓Die Grenzwerte beziehen sich auf gleichzeitige Anfragen, beginnend bei fünf. Leiten Sie die Anfragen über einen Worker-Pool, der auf Ihre Stufe abgestimmt ist, damit eine Lastspitze kontrolliert abgebaut wird, anstatt Fehler zu verursachen.
? Häufig gestellte Fragen
Was ist der Fish-Audio-API-Endpunkt? +
Text-to-Speech erfolgt per POST an https://api.fish.audio/v1/tts mit einem Authorization-Bearer-Header. Das Modell wird über einen separaten Model-Header ausgewählt, und die Antwort ist ein chunked Audiostream, kein JSON.
Gibt es eine wirklich kostenlose Möglichkeit, es zu testen? +
Ja. Das Modell s2.1-pro-free ist dokumentiert als dasselbe Modell wie s2.1-pro, jedoch zum Nulltarif. Es ist für Tests, Prototyping und Entwicklung gedacht, sodass Sie die Produktionsqualität bewerten können, bevor Sie bezahlen.
Wie viel kostet Fish Audio? +
Die kostenpflichtigen Sprachmodelle kosten 15 Dollar pro einer Million UTF-8-Bytes, was laut Dokumentation etwa 180.000 englischen Wörtern oder rund 12 Stunden Sprache entspricht. Die Transkription kostet 0,36 Dollar pro Audiostunde.
Wie viel Referenzaudio benötige ich, um eine Stimme zu klonen? +
Mindestens zehn Sekunden pro Clip, wobei ein bis zwei Minuten klarer Einzelsprecheraufnahme als optimal beschrieben werden. Akzeptierte Formate sind WAV, MP3, M4A und Opus, und die Audioverbesserung ist standardmäßig aktiviert.
Was ist der Unterschied zwischen reference_id und references? +
reference_id verweist auf ein gespeichertes Stimmmodell, das Sie zuvor erstellt haben und wiederverwenden möchten. references überträgt das Referenzaudio direkt mit einer einzelnen Anfrage für Zero-Shot-Klonen, ohne dass etwas gespeichert wird.
Kann ich Audio von einem LLM streamen, während es generiert? +
Ja, genau dafür ist der Websocket-Modus gedacht. Er akzeptiert einen Generator, der Text-Tokens liefert, und gibt Audio-Chunks zurück, sobald sie produziert werden. So überlappt die Synthese die Generierung, anstatt ihr zu folgen.
Wie heißt das pip-Paket? +
Installieren Sie fish-audio-sdk mit Bindestrichen und importieren Sie dann fishaudio ohne. Die Diskrepanz zwischen Paketname und Modulname sorgt beim Einstieg oft für ein paar Minuten Verwirrung.
Welchen Latenzmodus sollte ich verwenden? +
Balanced für alles Interaktive, dokumentiert mit guter Qualität und etwa 300 Millisekunden, gegenüber Normal mit bester Qualität und etwa 500 Millisekunden. Die Dokumentation empfiehlt Balanced, wenn die Audiowiedergabe verzögert startet.
Welche Ratenlimits gibt es? +
Sie basieren auf Gleichzeitigkeit und skalieren mit den Gesamtausgaben: 5 gleichzeitige Anfragen unter 100 Dollar, 15 ab 100 Dollar, 50 ab 1.000 Dollar und individuelle Limits für Enterprise-Kunden.
Zusammenfassung
Die Integration selbst ist wirklich überschaubar. Ein Bearer-Token, ein Endpunkt, ein Header zur Modellauswahl und eine Handvoll Parameter. Die Arbeit, die darüber entscheidet, ob das Ergebnis überzeugt, liegt auf beiden Seiten dieses Aufrufs: Ihren Text so normalisieren, dass Zahlen und Akronyme korrekt gesprochen werden, Caching, damit Sie nicht zweimal für denselben Satz bezahlen, Warteschlangen entsprechend Ihrer Parallelitätsstufe, Streaming von Ihrem Sprachmodell, damit sich die beiden Phasen überlappen, und eine ehrliche Dokumentation, wessen Stimme Sie verwenden und warum. Beginnen Sie mit dem kostenlosen Modell und Ihren schlechtesten Inhalten und wechseln Sie erst zur kostenpflichtigen Stufe, wenn Sie genau wissen, wofür Sie bezahlen.
Hinweis
Spezifikationen in diesem Beitrag
Endpunktpfade, Parameternamen, Standardwerte, Preise und Ratenlimits stammen aus der offiziellen Dokumentation zum Zeitpunkt der Erstellung und können sich ohne große Vorankündigung ändern. Überprüfen Sie die aktuellen Dokumente, bevor Sie sich in der Produktion auf eine dieser Angaben verlassen.
Kommentare
0Noch keine Kommentare. Teile als Erste oder Erster deine Gedanken.