startVoiceMode method

  1. @override
Future<RealtimeModel> startVoiceMode()
override

Implementation

@override
Future<RealtimeModel> startVoiceMode() async {
  _logger.i('Starting voice mode');

  _isLoadingVoiceMode = true;
  _isVoiceMode = true;
  onStart();

  // Creating realtime model
  realtimeModel?.close();
  var rep = createRealtimeRepository();
  realtimeModel = rep;
  rep.open();

  rep.onResponse.listen((response) async {
    onResponse?.call(response);
  });

  // Creating realtime audio player
  realtimePlayer = createRealtimeAudioPlayer();
  realtimePlayer?.resetBuffer();

  realtimePlayer?.stopPlayStream.listen((_) {
    setStatus(ChatStatus.listeningToUser);
  });

  realtimePlayer?.volumeStream.listen((volume) {
    _audioVolumeStreamController.add(volume);
  });

  rep.onTranscriptionStart.listen((transcriptionStart) {
    onTranscriptionStart?.call(transcriptionStart);
  });

  var onTranscription = this.onTranscription;
  if (onTranscription != null) {
    rep.onTranscriptionItem.listen((transcription) {
      onTranscription(transcription);
    });
  }

  var onTranscriptionEnd = this.onTranscriptionEnd;
  if (onTranscriptionEnd != null) {
    rep.onTranscriptionEnd.listen((transcriptionEnd) {
      onTranscriptionEnd(transcriptionEnd);
    });
  }

  rep.onSpeech.listen((speech) {
    if (speech.role == Role.assistant) {
      setStatus(ChatStatus.speaking);
      _processAiBytes(speech.audioData);
    }
  });

  rep.onSpeechStart.listen((speechStart) {
    var role = speechStart.role;
    if (role == Role.assistant) {
      realtimePlayer?.resetBuffer();
    }
  });

  rep.onConnectionOpen.listen((_) {
    _isLoadingVoiceMode = false;
    _startRecording();
  });

  rep.onConnectionClose.listen((_) {
    setStatus(ChatStatus.idle);
  });

  rep.onError.listen((error) {
    String msg = getErrorMessage(error) ?? 'Falha desconhecida';
    onError(msg);
  });

  // Preventing turning off the screen while the user is interacting using voice.
  WakelockPlus.enable();

  return rep;
}