Module: RubyLLM::Providers::Mistral::Speech

Included in:
ChatCompletions
Defined in:
lib/ruby_llm/providers/mistral/speech.rb

Overview

Speech dialect for the Mistral API, which requires a voice from its own catalog and returns JSON with base64 audio instead of raw bytes.

Class Method Summary collapse

Class Method Details

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



40
41
42
43
44
45
46
47
# File 'lib/ruby_llm/providers/mistral/speech.rb', line 40

def parse_speech_response(response, model:, voice:, format:)
  RubyLLM::Speech.new(
    data: Base64.decode64(response.body['audio_data'].to_s),
    model: model,
    voice: voice,
    format: (format || 'mp3').to_s
  )
end

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



31
32
33
34
35
36
37
38
# File 'lib/ruby_llm/providers/mistral/speech.rb', line 31

def render_speech_payload(input, model:, voice:, format:, provider_options: {})
  {
    model: model,
    input: input,
    voice_id: voice,
    response_format: format
  }.compact.merge(provider_options)
end

.stream_speech(payload, model:, voice:, format:) ⇒ Object

Raises:



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/ruby_llm/providers/mistral/speech.rb', line 11

def stream_speech(payload, model:, voice:, format:)
  audio = +''.b
  final = nil
  stream_events(speech_url(model:), payload.merge(stream: true)) do |event|
    case event['type']
    when 'speech.audio.delta'
      data = Base64.strict_decode64(event.fetch('audio_data'))
      audio << data
      yield SpeechChunk.new(data:, format: format || 'mp3') unless data.empty?
    when 'speech.audio.done'
      final = event
    end
  end
  raise Error, 'Mistral speech stream ended before its completion event' unless final

  usage = final['usage'] || {}
  RubyLLM::Speech.new(data: audio, model:, voice:, format: format || 'mp3',
                      input_tokens: usage['prompt_tokens'], output_tokens: usage['completion_tokens'])
end