diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-02 17:31:29 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-02 17:31:29 +0300 |
| commit | f3b5f58a171eeb47716e2d15a40c4c480d2d5ef9 (patch) | |
| tree | cf461894a613e0d7bad1a36e04dd420654514391 /internal/processor | |
| parent | 4d16684f92544d1cf90dfc5080378ca2f1abe18e (diff) | |
task 002: centralize Gemini voice fallbacks
Diffstat (limited to 'internal/processor')
| -rw-r--r-- | internal/processor/processor.go | 39 | ||||
| -rw-r--r-- | internal/processor/processor_test.go | 4 |
2 files changed, 14 insertions, 29 deletions
diff --git a/internal/processor/processor.go b/internal/processor/processor.go index 38c2413..f6eb706 100644 --- a/internal/processor/processor.go +++ b/internal/processor/processor.go @@ -344,31 +344,6 @@ func (p *Processor) logSelectedAudioVoice(provider, voice string) { } } -func (p *Processor) generateGeminiAudioWithFallbacks(initialVoice string, generate func(voice string) error) error { - attempted := make([]string, 0, len(audio.GeminiVoices)) - var lastErr error - - for i, voice := range audio.GeminiVoiceFallbacks(initialVoice) { - if i > 0 { - fmt.Printf(" Retrying Gemini audio with voice: %s\n", voice) - } - - attempted = append(attempted, voice) - err := generate(voice) - if err == nil { - return nil - } - if !audio.IsGeminiNoAudioDataError(err) { - return err - } - - lastErr = err - fmt.Printf(" Warning: Gemini returned no audio for voice %s\n", voice) - } - - return fmt.Errorf("Gemini returned no audio for voices %s: %w", strings.Join(attempted, ", "), lastErr) -} - // generateAudio generates audio files for a word func (p *Processor) generateAudio(word string) error { provider := p.audioProviderName() @@ -381,9 +356,13 @@ func (p *Processor) generateAudio(word string) error { voice := p.audioVoiceForProvider() p.logSelectedAudioVoice(provider, voice) if provider == "gemini" && p.geminiVoice() == "" { - return p.generateGeminiAudioWithFallbacks(voice, func(candidate string) error { + _, err := audio.RunWithVoiceFallbacks(voice, func(candidate string) error { + if candidate != voice { + fmt.Printf(" Retrying Gemini audio with voice: %s\n", candidate) + } return p.generateAudioWithVoice(word, candidate) }) + return err } voices = []string{voice} } @@ -427,7 +406,13 @@ func (p *Processor) generateAudioBgBg(front, back string) error { } if provider == "gemini" && p.geminiVoice() == "" { - return p.generateGeminiAudioWithFallbacks(voice, generatePair) + _, err := audio.RunWithVoiceFallbacks(voice, func(candidate string) error { + if candidate != voice { + fmt.Printf(" Retrying Gemini audio with voice: %s\n", candidate) + } + return generatePair(candidate) + }) + return err } if err := generatePair(voice); err != nil { diff --git a/internal/processor/processor_test.go b/internal/processor/processor_test.go index a0c6ae1..cd6e2eb 100644 --- a/internal/processor/processor_test.go +++ b/internal/processor/processor_test.go @@ -712,10 +712,10 @@ func TestGenerateGeminiAudioWithFallbacksRetriesAlternateVoice(t *testing.T) { flags.AudioProvider = "gemini" p := NewProcessor(flags) - if err := p.generateGeminiAudioWithFallbacks("Charon", func(voice string) error { + if _, err := audio.RunWithVoiceFallbacks("Charon", func(voice string) error { return p.generateAudioWithVoice("ябълка", voice) }); err != nil { - t.Fatalf("generateGeminiAudioWithFallbacks() unexpected error: %v", err) + t.Fatalf("RunWithVoiceFallbacks() unexpected error: %v", err) } if got, want := strings.Join(attemptedVoices, ","), "Charon,Kore"; got != want { |
