Skip to main content

Fish Audio Provider

Fish Audio provides text-to-speech and speech-to-text models. It does not offer language, embedding, or image models — LanguageModel, EmbeddingModel, and ImageModel all return errors.

Setup​

Installation​

import (
"github.com/digitallysavvy/go-ai/pkg/ai"
"github.com/digitallysavvy/go-ai/pkg/providers/fishaudio"
)

Configuration​

provider := fishaudio.New(fishaudio.Config{
APIKey: os.Getenv("FISH_AUDIO_API_KEY"),
})

fishaudio.Config also accepts BaseURL (default https://api.fish.audio).

Get API Key​

export FISH_AUDIO_API_KEY=...

Speech Synthesis​

speechModel, err := provider.SpeechModel(fishaudio.ModelS21Pro)
if err != nil {
log.Fatal(err)
}

result, err := ai.GenerateSpeech(ctx, ai.GenerateSpeechOptions{
Model: speechModel,
Text: "Hello from Fish Audio.",
ProviderOptions: map[string]interface{}{
"fishaudio": map[string]interface{}{
"referenceId": "some-voice-id",
"latency": "normal",
},
},
})

Model IDs: fishaudio.ModelS1 (s1), ModelS2Pro (s2-pro), ModelS21Pro (s2.1-pro, Fish Audio's recommended default), ModelS21ProFree (s2.1-pro-free, a free developer tier with no time-to-first-audio or data-processing guarantees — prefer ModelS21Pro for production).

Transcription​

POST /v1/asr has no model selector, so the model ID is only a routing label; it defaults to "transcribe-1" when left empty:

transcriptionModel, err := provider.TranscriptionModel(fishaudio.ModelTranscribe1)
if err != nil {
log.Fatal(err)
}

result, err := ai.Transcribe(ctx, ai.TranscribeOptions{
Model: transcriptionModel,
Audio: audioBytes,
})

Provider Options​

Speech options are passed under the "fishaudio" ProviderOptions key:

OptionTypeDescription
referenceIdstring or []stringVoice model; a slice enables S2-Pro multi-speaker dialogue. Takes precedence over the top-level Voice option.
sampleRateintOutput sample rate in Hz
mp3Bitrateintmp3 bitrate in kbps: 64, 128, or 192
opusBitrateintopus bitrate in bps, or -1000 for automatic
latencystringlow, normal, or balanced
volumefloat64Volume offset in dB
normalizeLoudness*boolLoudness normalization (S2 family only)
temperaturefloat64Expressiveness, 0 to 1
topPfloat64Nucleus sampling diversity, 0 to 1
chunkLengthintText segment size, 100 to 300
minChunkLengthintMinimum characters before a new chunk, 0 to 100
normalize*boolText normalization for English and Chinese
maxNewTokensintMaximum audio tokens per text chunk

Workflow Serialization​

Fish Audio speech and transcription models can cross a workflow boundary with provider.SerializeSpeechModel / DeserializeSpeechModel and provider.SerializeTranscriptionModel / DeserializeTranscriptionModel. See Provider Serialization for the mechanism.

See Also​