textToSpeech method

  1. @override
Future<TTSResponse> textToSpeech(
  1. TTSRequest request
)
override

Convert text to speech with full configuration support

Throws UnsupportedError if not supported. Check supportedFeatures first.

Implementation

@override
Future<TTSResponse> textToSpeech(TTSRequest request) async {
  // Basic validation - let the provider handle specific limits
  if (request.text.isEmpty) {
    throw const InvalidRequestError('Text input cannot be empty');
  }

  final requestBody = <String, dynamic>{
    'model': request.model ?? ProviderDefaults.openaiDefaultTTSModel,
    'input': request.text,
    'voice': request.voice ?? ProviderDefaults.openaiDefaultVoice,
    if (request.format != null) 'response_format': request.format,
    if (request.speed != null) 'speed': request.speed,
  };

  final audioData = await client.postRaw('audio/speech', requestBody);

  // Determine content type based on format
  String contentType = 'audio/mpeg'; // Default for mp3
  if (request.format != null) {
    switch (request.format!.toLowerCase()) {
      case 'mp3':
        contentType = 'audio/mpeg';
        break;
      case 'opus':
        contentType = 'audio/opus';
        break;
      case 'aac':
        contentType = 'audio/aac';
        break;
      case 'flac':
        contentType = 'audio/flac';
        break;
      case 'wav':
        contentType = 'audio/wav';
        break;
      case 'pcm':
        contentType = 'audio/pcm';
        break;
      default:
        contentType = 'audio/mpeg';
    }
  }

  return TTSResponse(
    audioData: audioData,
    contentType: contentType,
    voice: request.voice,
    model: request.model,
    duration: null, // OpenAI doesn't provide duration
    sampleRate: null, // OpenAI doesn't provide sample rate
    usage: null,
  );
}