Titelbild für Fish Audio implementieren: API, Voice Cloning, Streaming und die tatsächlichen Kosten

Auf einen Blick

Lesezeit

~200 Wörter/Min.

Veröffentlicht

vor 2 Tagen

Aug 9, 2026

Aufrufe

79

Gesamt

Fish Audio implementieren: API, Voice Cloning, Streaming und die tatsächlichen Kosten

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.

Modelloptionen und aktuelle Preise
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.

Werbung

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.

Latenzmodi und wohin sie gehören
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.

Reale Kosten bei 15 Dollar pro Million UTF-8-Bytes
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.

Gleichzeitigkeitslimits nach Stufe
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.

Werbung

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.

Bishrul Haq

Written by

Bishrul Haq

Software engineer writing practical tutorials on Laravel, PHP, Python, and the tools behind real projects. More about me

Newsletter

Want more posts like this?

Get practical software notes and tutorials delivered when something new is published.

Kein Spam. Jederzeit abbestellbar.

Wie fandest du den Beitrag?

Kommentare

0
Anmelden oder Registrieren um mitzudiskutieren und auf diesen Beitrag zu reagieren.

Noch keine Kommentare. Teile als Erste oder Erster deine Gedanken.

Related posts

Wichtige Pandas-Funktionen in Python: Tricks und Features

Pandas ist eine meiner liebsten Bibliotheken in Python. Sie ist äußerst nützlich, um Daten übersichtlich und strukturiert darzustellen. Heute wird Pandas vielfach in Data Science, Machine Learning und anderen Bereichen eingesetzt.

vor 6 Jahren

Daten von Twitter mit Tweepy in Python abrufen

Um mit Python zu arbeiten, muss Python auf Ihrem Rechner installiert sein. Falls Sie Python noch nicht installiert haben, besuchen Sie die Python-Website und installieren Sie es.

vor 6 Jahren

Pro-Kopf-Einkommen der USA mit linearer Regression vorhersagen

Python ermöglicht es, beliebige Daten mithilfe der linearen Regression vorherzusagen und zu analysieren. Die lineare Regression ist eine grundlegende Methode des maschinellen Lernens und der Statistik, die zur Lösung komplexer Probleme entwickelt wurde.

vor 6 Jahren

Wichtige Sortieralgorithmen für Informatikstudenten

Algorithmen werden üblicherweise in Informatik- und Softwareentwicklungsstudiengängen im Bachelor oder Master gelehrt. Manchen fällt das Verständnis schwer, weil sie auf Auswendiglernen setzen.

vor 6 Jahren

KI-gestützten Blog-SEO-Generator mit Laravel und Ollama erstellen

Erstellen Sie einen praktischen KI-SEO-Generator für einen Laravel-Blog. Generieren Sie Meta-Titel, Beschreibungen, Keywords, FAQ-Schema, Slugs und Ideen für interne Links mit Ollama oder OpenAI.

vor 3 Monaten