diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-01 21:10:15 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-01 21:10:15 +0300 |
| commit | aeeb3c6ffea828773f849b88d97c5ffead706a97 (patch) | |
| tree | e3d8cfbbc3728df7211e68f7d23de304b0449d52 /internal | |
| parent | 7e1ab60bcff42d5e15aafc807781a6b3077b45f5 (diff) | |
Align Gemini audio defaults with TTS API
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/audio/gemini_provider.go | 2 | ||||
| -rw-r--r-- | internal/audio/provider.go | 6 | ||||
| -rw-r--r-- | internal/audio/provider_test.go | 35 |
3 files changed, 35 insertions, 8 deletions
diff --git a/internal/audio/gemini_provider.go b/internal/audio/gemini_provider.go index 8d0c517..9900005 100644 --- a/internal/audio/gemini_provider.go +++ b/internal/audio/gemini_provider.go @@ -14,7 +14,7 @@ import ( ) const ( - defaultGeminiTTSModel = "gemini-2.5-flash" + defaultGeminiTTSModel = "gemini-2.5-flash-preview-tts" geminiTTSLanguageCode = "bg" geminiTTSChannels = 1 geminiTTSSampleRate = 24000 diff --git a/internal/audio/provider.go b/internal/audio/provider.go index d750f31..06ed6d0 100644 --- a/internal/audio/provider.go +++ b/internal/audio/provider.go @@ -32,7 +32,7 @@ type Config struct { // Gemini-specific settings GoogleAPIKey string - GeminiTTSModel string // "gemini-2.5-flash" + GeminiTTSModel string // "gemini-2.5-flash-preview-tts" GeminiVoice string // One of GeminiVoices, or empty for the model default. GeminiSpeed float64 // Prompt hint for desired speech speed } @@ -42,13 +42,13 @@ func DefaultProviderConfig() *Config { return &Config{ Provider: "gemini", OutputDir: "./", - OutputFormat: "mp3", + OutputFormat: "wav", OpenAIModel: "gpt-4o-mini-tts", // New model with voice instructions support OpenAIVoice: "alloy", OpenAISpeed: 1.0, // OpenAISpeed: 0.98, // Default speed for clarity OpenAIInstruction: "You are speaking Bulgarian language (български език). Pronounce the Bulgarian text with authentic Bulgarian phonetics, not Russian. Speak slowly and clearly for language learners.", - GeminiTTSModel: "gemini-2.5-flash", + GeminiTTSModel: "gemini-2.5-flash-preview-tts", GeminiSpeed: 1.0, } } diff --git a/internal/audio/provider_test.go b/internal/audio/provider_test.go index 0b04d20..64fbcc7 100644 --- a/internal/audio/provider_test.go +++ b/internal/audio/provider_test.go @@ -3,6 +3,8 @@ package audio import ( "context" "errors" + "path/filepath" + "strings" "testing" ) @@ -34,8 +36,8 @@ func TestDefaultProviderConfig(t *testing.T) { t.Errorf("Expected provider 'gemini', got '%s'", config.Provider) } - if config.OutputFormat != "mp3" { - t.Errorf("Expected output format 'mp3', got '%s'", config.OutputFormat) + if config.OutputFormat != "wav" { + t.Errorf("Expected output format 'wav', got '%s'", config.OutputFormat) } if config.OpenAIModel != "gpt-4o-mini-tts" { @@ -50,8 +52,8 @@ func TestDefaultProviderConfig(t *testing.T) { t.Errorf("Expected OpenAI speed 1.0, got %f", config.OpenAISpeed) } - if config.GeminiTTSModel != "gemini-2.5-flash" { - t.Errorf("Expected Gemini TTS model 'gemini-2.5-flash', got '%s'", config.GeminiTTSModel) + if config.GeminiTTSModel != "gemini-2.5-flash-preview-tts" { + t.Errorf("Expected Gemini TTS model 'gemini-2.5-flash-preview-tts', got '%s'", config.GeminiTTSModel) } if config.GeminiSpeed != 1.0 { @@ -59,6 +61,31 @@ func TestDefaultProviderConfig(t *testing.T) { } } +func TestDefaultProviderConfigIsGeminiCompatible(t *testing.T) { + config := DefaultProviderConfig() + + if config.Provider != "gemini" { + t.Fatalf("DefaultProviderConfig() Provider = %q, want %q", config.Provider, "gemini") + } + + if config.GeminiTTSModel != defaultGeminiTTSModel { + t.Fatalf("DefaultProviderConfig() GeminiTTSModel = %q, want %q", config.GeminiTTSModel, defaultGeminiTTSModel) + } + + outputFile := filepath.Join(t.TempDir(), "audio."+config.OutputFormat) + if filepath.Ext(outputFile) != ".wav" { + t.Fatalf("DefaultProviderConfig() output file %q is incompatible with Gemini TTS", outputFile) + } + + if !strings.HasSuffix(config.GeminiTTSModel, "-tts") { + t.Fatalf("DefaultProviderConfig() GeminiTTSModel = %q, want a TTS model variant", config.GeminiTTSModel) + } + + if err := writeGeminiAudioFile(outputFile, []byte{0x11, 0x22}, "audio/pcm"); err != nil { + t.Fatalf("writeGeminiAudioFile() with default Gemini output failed: %v", err) + } +} + func TestNewProvider(t *testing.T) { tests := []struct { name string |
