summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-01 21:10:15 +0300
committerPaul Buetow <paul@buetow.org>2026-04-01 21:10:15 +0300
commitaeeb3c6ffea828773f849b88d97c5ffead706a97 (patch)
treee3d8cfbbc3728df7211e68f7d23de304b0449d52
parent7e1ab60bcff42d5e15aafc807781a6b3077b45f5 (diff)
Align Gemini audio defaults with TTS API
-rw-r--r--internal/audio/gemini_provider.go2
-rw-r--r--internal/audio/provider.go6
-rw-r--r--internal/audio/provider_test.go35
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