generateSpeechStream method

  1. @override
Stream<GoogleTTSStreamEvent> generateSpeechStream(
  1. GoogleTTSRequest request
)
override

Generate speech with streaming output

request - The TTS request configuration

Returns a stream of audio events

Implementation

@override
Stream<GoogleTTSStreamEvent> generateSpeechStream(
    GoogleTTSRequest request) async* {
  try {
    final requestBody = request.toJson();

    // Use the appropriate TTS model if not specified
    final model = request.model ?? _config.model;

    final stream = _client.postStream(
      'models/$model:streamGenerateContent',
      data: requestBody,
    );

    await for (final chunk in stream) {
      try {
        final data = chunk.data;
        if (data is Map<String, dynamic>) {
          // Check if this chunk contains audio data
          final candidate = data['candidates']?[0];
          final content = candidate?['content'];
          final parts = content?['parts'];
          final inlineData = parts?[0]?['inlineData'];
          final audioData = inlineData?['data'] as String?;

          if (audioData != null) {
            // Decode base64 audio data
            final audioBytes = base64.decode(audioData);
            yield GoogleTTSAudioDataEvent(data: audioBytes);
          }

          // Check for completion
          if (candidate?['finishReason'] != null) {
            final response = GoogleTTSResponse.fromApiResponse(data);
            yield GoogleTTSCompletionEvent(response);
          }
        }
      } catch (e) {
        yield GoogleTTSErrorEvent(
            message: 'Error processing stream chunk: $e');
      }
    }
  } catch (e) {
    yield GoogleTTSErrorEvent(message: 'Google TTS streaming failed: $e');
  }
}