Class: Gemini::TTS

Inherits:
Object
  • Object
show all
Defined in:
lib/gemini/tts.rb

Constant Summary collapse

DEFAULT_MODEL =
"gemini-2.5-flash-preview-tts".freeze
VOICES =

30 prebuilt voice names available for the prebuiltVoiceConfig

%w[
  Zephyr Puck Charon Kore Fenrir Leda Orus Aoede Callirrhoe Autonoe
  Enceladus Iapetus Umbriel Algieba Despina Erinome Algenib Rasalgethi
  Laomedeia Achernar Alnilam Schedar Gacrux Pulcherrima Achird
  Zubenelgenubi Vindemiatrix Sadachbia Sadaltager Sulafat
].freeze

Instance Method Summary collapse

Constructor Details

#initialize(client:) ⇒ TTS

Returns a new instance of TTS.



13
14
15
# File 'lib/gemini/tts.rb', line 13

def initialize(client:)
  @client = client
end

Instance Method Details

#generate(text, voice: nil, multi_speaker: nil, model: DEFAULT_MODEL, speech_config: nil, **parameters) ⇒ Object

Generate speech audio from text.

text: prompt String (use style cues / bracket tags like [excited] for control,

or "Speaker 1: ... Speaker 2: ..." for multi-speaker).

voice: a single voice name (prebuiltVoiceConfig). Mutually exclusive with multi_speaker. multi_speaker: Array of { speaker:, voice: } Hashes for multi-speaker output. model: TTS preview model name. Defaults to gemini-2.5-flash-preview-tts. speech_config: raw speechConfig Hash override (skips voice/multi_speaker handling).

Raises:

  • (ArgumentError)


25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/gemini/tts.rb', line 25

def generate(text, voice: nil, multi_speaker: nil, model: DEFAULT_MODEL,
             speech_config: nil, **parameters)
  raise ArgumentError, "text is required" if text.nil? || text.to_s.empty?
  if voice && multi_speaker
    raise ArgumentError, "voice and multi_speaker are mutually exclusive"
  end

  resolved_speech_config = speech_config || build_speech_config(voice: voice, multi_speaker: multi_speaker)
  raise ArgumentError, "voice, multi_speaker, or speech_config is required" unless resolved_speech_config

  payload = {
    contents: [{ parts: [{ text: text }] }],
    generationConfig: {
      responseModalities: ["AUDIO"],
      speechConfig: resolved_speech_config
    }
  }

  payload.merge!(parameters) if parameters && !parameters.empty?

  response = @client.json_post(
    path: "models/#{normalize_model(model)}:generateContent",
    parameters: payload
  )
  Gemini::Response.new(response)
end