startVoiceMode method
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;
}