{"id":45712740,"url":"https://github.com/fishaudio/fish-audio-go","last_synced_at":"2026-02-25T03:05:58.675Z","repository":{"id":329488897,"uuid":"1113499888","full_name":"fishaudio/fish-audio-go","owner":"fishaudio","description":"The official Go SDK for the Fish Audio API.","archived":false,"fork":false,"pushed_at":"2026-02-12T08:22:19.000Z","size":608,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-12T16:50:09.419Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fishaudio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-10T04:13:21.000Z","updated_at":"2026-02-12T08:22:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fishaudio/fish-audio-go","commit_stats":null,"previous_names":["fishaudio/fish-audio-go"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fishaudio/fish-audio-go","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fishaudio%2Ffish-audio-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fishaudio%2Ffish-audio-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fishaudio%2Ffish-audio-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fishaudio%2Ffish-audio-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fishaudio","download_url":"https://codeload.github.com/fishaudio/fish-audio-go/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fishaudio%2Ffish-audio-go/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29809151,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T22:43:48.403Z","status":"online","status_checked_at":"2026-02-25T02:00:07.329Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-02-25T03:05:56.205Z","updated_at":"2026-02-25T03:05:58.671Z","avatar_url":"https://github.com/fishaudio.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"![go.png](https://raw.githubusercontent.com/fishaudio/fish-audio-go/refs/heads/main/.github/assets/go.png)\n\n# Fish Audio Go SDK\n\n[![GitHub Release](https://img.shields.io/github/v/release/fishaudio/fish-audio-go)](https://github.com/fishaudio/fish-audio-go/releases)\n[![Go Reference](https://pkg.go.dev/badge/github.com/fishaudio/fish-audio-go.svg)](https://pkg.go.dev/github.com/fishaudio/fish-audio-go)\n[![Go Report Card](https://goreportcard.com/badge/github.com/fishaudio/fish-audio-go)](https://goreportcard.com/report/github.com/fishaudio/fish-audio-go)\n[![codecov](https://img.shields.io/codecov/c/github/fishaudio/fish-audio-go)](https://codecov.io/gh/fishaudio/fish-audio-go)\n[![License](https://img.shields.io/github/license/fishaudio/fish-audio-go)](https://github.com/fishaudio/fish-audio-go/blob/main/LICENSE)\n\nThe official Go library for the Fish Audio API\n\n**Documentation:** [Go SDK Guide](https://docs.fish.audio/developer-guide/sdk-guide/go/) | [API Reference](https://docs.fish.audio/api-reference/sdk/go/)\n\n## Installation\n\n```bash\ngo get github.com/fishaudio/fish-audio-go\n```\n\n## Authentication\n\nGet your API key from [fish.audio/app/api-keys](https://fish.audio/app/api-keys):\n\n```bash\nexport FISH_API_KEY=your_api_key_here\n```\n\nOr provide directly:\n\n```go\nimport fishaudio \"github.com/fishaudio/fish-audio-go\"\n\nclient := fishaudio.NewClient(fishaudio.WithAPIKey(\"your_api_key\"))\n```\n\n## Quick Start\n\n```go\npackage main\n\nimport (\n\t\"context\"\n\t\"log\"\n\t\"os\"\n\n\tfishaudio \"github.com/fishaudio/fish-audio-go\"\n)\n\nfunc main() {\n\tclient := fishaudio.NewClient() // reads from FISH_API_KEY\n\tdefer client.Close()\n\n\taudio, err := client.TTS.Convert(context.Background(), \u0026fishaudio.ConvertParams{\n\t\tText: \"Hello, world!\",\n\t})\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tos.WriteFile(\"output.mp3\", audio, 0644)\n}\n```\n\n## Core Features\n\n### Text-to-Speech\n\n**With custom voice:**\n\n```go\naudio, err := client.TTS.Convert(ctx, \u0026fishaudio.ConvertParams{\n\tText:        \"Custom voice\",\n\tReferenceID: \"802e3bc2b27e49c2995d23ef70e6ac89\",\n})\n```\n\n**With speed control:**\n\n```go\naudio, err := client.TTS.Convert(ctx, \u0026fishaudio.ConvertParams{\n\tText:  \"Speaking faster!\",\n\tSpeed: 1.5, // 1.5x speed\n})\n```\n\n**Reusable configuration:**\n\n```go\nconfig := \u0026fishaudio.TTSConfig{\n\tProsody:     \u0026fishaudio.Prosody{Speed: 1.2, Volume: -5},\n\tReferenceID: \"933563129e564b19a115bedd57b7406a\",\n\tFormat:      fishaudio.AudioFormatWAV,\n\tLatency:     fishaudio.LatencyBalanced,\n}\n\n// Reuse across generations\naudio1, _ := client.TTS.Convert(ctx, \u0026fishaudio.ConvertParams{Text: \"First message\", Config: config})\naudio2, _ := client.TTS.Convert(ctx, \u0026fishaudio.ConvertParams{Text: \"Second message\", Config: config})\n```\n\n**Chunk-by-chunk streaming:**\n\n```go\nstream, err := client.TTS.Stream(ctx, \u0026fishaudio.StreamParams{\n\tText: \"Long content to stream...\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer stream.Close()\n\nfor stream.Next() {\n\tchunk := stream.Bytes()\n\t// process each chunk as it arrives\n}\nif err := stream.Err(); err != nil {\n\tlog.Fatal(err)\n}\n\n// Or collect all chunks at once\nstream, _ := client.TTS.Stream(ctx, \u0026fishaudio.StreamParams{Text: \"Hello!\"})\naudio, err := stream.Collect()\n```\n\n[Learn more](https://docs.fish.audio/developer-guide/sdk-guide/go/text-to-speech)\n\n### Speech-to-Text\n\n```go\naudioData, _ := os.ReadFile(\"audio.wav\")\nresult, err := client.ASR.Transcribe(ctx, audioData, \u0026fishaudio.TranscribeParams{\n\tLanguage: \"en\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\n\nfmt.Println(result.Text)\n\n// Access timestamped segments\nfor _, seg := range result.Segments {\n\tfmt.Printf(\"[%.2fs - %.2fs] %s\\n\", seg.Start, seg.End, seg.Text)\n}\n```\n\n[Learn more](https://docs.fish.audio/developer-guide/sdk-guide/go/speech-to-text)\n\n### Real-time Streaming\n\nStream dynamically generated text for conversational AI and live applications:\n\n```go\ntextChan := make(chan string)\n\ngo func() {\n\tdefer close(textChan)\n\ttextChan \u003c- \"Hello, \"\n\ttextChan \u003c- \"this is \"\n\ttextChan \u003c- \"streaming!\"\n}()\n\nwsStream, err := client.TTS.StreamWebSocket(ctx, textChan, \u0026fishaudio.StreamParams{\n\tLatency: fishaudio.LatencyBalanced,\n}, nil)\nif err != nil {\n\tlog.Fatal(err)\n}\n\nfor wsStream.Next() {\n\tchunk := wsStream.Bytes()\n\t// play or process audio chunk\n}\nif err := wsStream.Err(); err != nil {\n\tlog.Fatal(err)\n}\n```\n\n[Learn more](https://docs.fish.audio/developer-guide/sdk-guide/go/websocket)\n\n### Voice Cloning\n\n**Instant cloning:**\n\n```go\nrefAudio, _ := os.ReadFile(\"reference.wav\")\naudio, err := client.TTS.Convert(ctx, \u0026fishaudio.ConvertParams{\n\tText: \"Cloned voice speaking\",\n\tReferences: []fishaudio.ReferenceAudio{{\n\t\tAudio: refAudio,\n\t\tText:  \"Text spoken in reference\",\n\t}},\n})\n```\n\n**Persistent voice models:**\n\n```go\n// Create a voice model for reuse\nsample, _ := os.ReadFile(\"voice_sample.wav\")\nvoice, err := client.Voices.Create(ctx, \u0026fishaudio.CreateVoiceParams{\n\tTitle:       \"My Voice\",\n\tVoices:      [][]byte{sample},\n\tDescription: \"Custom voice clone\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\n\n// Use the created model\naudio, err := client.TTS.Convert(ctx, \u0026fishaudio.ConvertParams{\n\tText:        \"Using my saved voice\",\n\tReferenceID: voice.ID,\n})\n```\n\n[Learn more](https://docs.fish.audio/developer-guide/sdk-guide/go/voice-cloning)\n\n## Resource Clients\n\n| Resource         | Description      | Key Methods                              |\n|------------------|------------------|------------------------------------------|\n| `client.TTS`     | Text-to-speech   | `Convert()`, `Stream()`, `StreamWebSocket()` |\n| `client.ASR`     | Speech recognition | `Transcribe()`                          |\n| `client.Voices`  | Voice management | `List()`, `Get()`, `Create()`, `Update()`, `Delete()` |\n| `client.Account` | Account info     | `GetCredits()`, `GetPackage()`           |\n\n## Error Handling\n\n```go\nimport \"errors\"\n\naudio, err := client.TTS.Convert(ctx, \u0026fishaudio.ConvertParams{Text: \"Hello!\"})\nif err != nil {\n\tvar authErr *fishaudio.AuthenticationError\n\tvar rateLimitErr *fishaudio.RateLimitError\n\tvar validationErr *fishaudio.ValidationError\n\tvar apiErr *fishaudio.APIError\n\n\tswitch {\n\tcase errors.As(err, \u0026authErr):\n\t\tfmt.Println(\"Invalid API key\")\n\tcase errors.As(err, \u0026rateLimitErr):\n\t\tfmt.Println(\"Rate limit exceeded\")\n\tcase errors.As(err, \u0026validationErr):\n\t\tfmt.Printf(\"Invalid request: %v\\n\", validationErr)\n\tcase errors.As(err, \u0026apiErr):\n\t\tfmt.Printf(\"API error: %v\\n\", apiErr)\n\tdefault:\n\t\tfmt.Printf(\"Error: %v\\n\", err)\n\t}\n}\n```\n\n## Resources\n\n- **Documentation:** [Go SDK Guide](https://docs.fish.audio/developer-guide/sdk-guide/go/) | [API Reference](https://docs.fish.audio/api-reference/sdk/go/)\n- **Package:** [pkg.go.dev](https://pkg.go.dev/github.com/fishaudio/fish-audio-go) | [GitHub](https://github.com/fishaudio/fish-audio-go)\n\n## License\n\nThis project is licensed under the Apache-2.0 License - see the [LICENSE](LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffishaudio%2Ffish-audio-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffishaudio%2Ffish-audio-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffishaudio%2Ffish-audio-go/lists"}