Module: RubyLLM::Protocols::Gemini::Speech

Defined in:
lib/ruby_llm/protocols/gemini/speech.rb

Overview

Speech generation methods for the Gemini API implementation

Instance Method Summary collapse

Instance Method Details

#parse_speech_response(response, model:, voice:, format:) ⇒ Object

rubocop:disable Lint/UnusedMethodArgument

Raises:



42
43
44
45
46
47
48
49
50
51
52
# File 'lib/ruby_llm/protocols/gemini/speech.rb', line 42

def parse_speech_response(response, model:, voice:, format:) # rubocop:disable Lint/UnusedMethodArgument
  audio = response.body.dig('candidates', 0, 'content', 'parts', 0, 'inlineData', 'data')
  raise Error, 'Unexpected response format from Gemini speech generation API' unless audio

  RubyLLM::Speech.new(
    data: Base64.decode64(audio),
    model: model,
    voice: voice || 'Kore',
    format: 'pcm'
  )
end

#render_speech_payload(input, model:, voice:, format:, provider_options: {}) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/ruby_llm/protocols/gemini/speech.rb', line 14

def render_speech_payload(input, model:, voice:, format:, provider_options: {})
  RubyLLM.logger.debug { "Ignoring speech format #{format}. Gemini returns PCM audio." } if format

  payload = {
    contents: [
      {
        role: 'user',
        parts: [
          { text: input }
        ]
      }
    ],
    generationConfig: {
      responseModalities: ['AUDIO'],
      speechConfig: {
        voiceConfig: {
          prebuiltVoiceConfig: {
            voiceName: voice || 'Kore'
          }
        }
      }
    },
    model: model
  }

  Support::Utils.deep_merge(payload, provider_options)
end

#speech_url(model:) ⇒ Object



10
11
12
# File 'lib/ruby_llm/protocols/gemini/speech.rb', line 10

def speech_url(model:)
  "models/#{model}:generateContent"
end