Handling speech errors

programming
Nadine Ganz 2025-01-22 15:45:15 +01:00
parent 2bb1202530
commit e61d80f2aa
3 changed files with 143 additions and 74 deletions

View File

@ -1,9 +1,32 @@
Tree("Root") { Tree("Root") {
Composite(Sequence) { Composite(Sequence) {
BTC.InitializeSpeechManager() BTC.InitializeSpeechManager()
BTC.SetVoiceName("de-DE-SeraphinaMultilingualNeural")
RunTree("10_SBB_Zugabteil_Intro") Composite(Race) {
RunTree("10_SBB_Zugabteil_Szenenwahl_Selection") Composite(Sequence) {
// Error in Speech Service: Cancel BTC Trees
BTC.SpeechErrorOccured()
BTC.SetBool("error")
}
Composite(Sequence) {
BTC.SetVoiceName("de-DE-SeraphinaMultilingualNeural")
RunTree("10_SBB_Zugabteil_Intro")
}
}
Composite(Sequence) {
BTC.CompareBool("error")
// Error Handling
BTC.AbortSpeechEventListener()
BTC.StopSpeechIntentRecognition()
BTC.ClearPossbileSpeechIntents()
BTC.Set("TextMeshPro.HANDMENU.Option1Button", "text", "Restart")
BTC.Show("GO.HANDMENU.Option1Button")
BTC.Run("NamedEventTrigger.HANDMENU.Option1Button")
BTC.Hide("GO.HANDMENU.Option1Button")
}
} }
} }

View File

@ -1,17 +1,39 @@
Tree("Root") { Tree("Root") {
Composite(Sequence) { Composite(Sequence) {
BTC.InitializeSpeechManager() BTC.InitializeSpeechManager() // delete in finale productive version
//BTC.SetSpeechRecognitionLanguage("it-IT") //BTC.SetSpeechRecognitionLanguage("it-IT")
//RunTree("32_Grotto_Story_B_Grotto_Intro") Composite(Race) {
Composite(Sequence) {
// Error in Speech Service: Cancel BTC Trees
BTC.SpeechErrorOccured()
BTC.SetBool("error")
}
RunTree("32_Grotto_Kueche_Intro") Composite(Sequence) {
RunTree("32_Grotto_Kueche_Zwiebeln_schneiden") //RunTree("32_Grotto_Story_B_Grotto_Intro")
RunTree("32_Grotto_Kueche_alles_gefunden")
//RunTree("32_Grotto_Kueche_Kochen_Anzahl") RunTree("32_Grotto_Kueche_Intro")
//RunTree("32_Grotto_Kueche_Zusammen_Kochen") RunTree("32_Grotto_Kueche_Zwiebeln_schneiden")
//RunTree("32_Grotto_Im_Grotto_Essen_Intro") RunTree("32_Grotto_Kueche_alles_gefunden")
//RunTree("32_Grotto_Kueche_Kochen_Anzahl")
//RunTree("32_Grotto_Kueche_Zusammen_Kochen")
//RunTree("32_Grotto_Im_Grotto_Essen_Intro")
}
}
Composite(Sequence) {
BTC.CompareBool("error")
// Error Handling
BTC.AbortSpeechEventListener()
BTC.StopSpeechIntentRecognition()
BTC.ClearPossbileSpeechIntents()
BTC.Set("TextMeshPro.GO.Option1Button", "text", "Restart")
BTC.Show("GO.GO.Option1Button")
BTC.Run("NamedEventTrigger.GO.Option1Button")
BTC.Hide("GO.GO.Option1Button")
}
} }
} }
@ -234,27 +256,27 @@ Tree("32_Grotto_Story_B_Grotto_Intro") {
// Selector 3: Fallback Button // Selector 3: Fallback Button
Composite(Sequence) { Composite(Sequence) {
Composite(Marathon) { Composite(Marathon) {
BTC.Set("TextMeshPro.HANDMENU.Option1Button", "text", "Küche") BTC.Set("TextMeshPro.GO.Option1Button", "text", "Küche")
BTC.Show("GO.HANDMENU.Option1Button") BTC.Show("GO.GO.Option1Button")
BTC.Set("TextMeshPro.HANDMENU.Option2Button", "text", "Garten") BTC.Set("TextMeshPro.GO.Option2Button", "text", "Garten")
BTC.Show("GO.HANDMENU.Option2Button") BTC.Show("GO.GO.Option2Button")
} }
Composite(Race) { Composite(Race) {
Composite(Sequence) { Composite(Sequence) {
// Kueche // Kueche
BTC.Run("NamedEventTrigger.HANDMENU.Option1Button") BTC.Run("NamedEventTrigger.GO.Option1Button")
BTC.AbortEventListener("NamedEventTrigger.HANDMENU.Option2Button") BTC.AbortEventListener("NamedEventTrigger.GO.Option2Button")
BTC.Hide("GO.HANDMENU.Option1Button") BTC.Hide("GO.GO.Option1Button")
BTC.Hide("GO.HANDMENU.Option2Button") BTC.Hide("GO.GO.Option2Button")
RunTree("32_Grotto_Story_B_Grotto_Antwort_Nonna_Kueche") RunTree("32_Grotto_Story_B_Grotto_Antwort_Nonna_Kueche")
} }
Composite(Sequence) { Composite(Sequence) {
// Garten // Garten
BTC.Run("NamedEventTrigger.HANDMENU.Option2Button") BTC.Run("NamedEventTrigger.GO.Option2Button")
BTC.AbortEventListener("NamedEventTrigger.HANDMENU.Option1Button") BTC.AbortEventListener("NamedEventTrigger.GO.Option1Button")
BTC.Hide("GO.HANDMENU.Option1Button") BTC.Hide("GO.GO.Option1Button")
BTC.Hide("GO.HANDMENU.Option2Button") BTC.Hide("GO.GO.Option2Button")
RunTree("32_Grotto_Story_B_Grotto_Antwort_Nonna_Grotto") RunTree("32_Grotto_Story_B_Grotto_Antwort_Nonna_Grotto")
} }
} }
@ -843,27 +865,27 @@ Tree("32_Grotto_Kueche_alles_gefunden") {
// Fallback Button // Fallback Button
Composite(Marathon) { Composite(Marathon) {
BTC.Set("TextMeshPro.HANDMENU.Option1Button", "text", "Ja") BTC.Set("TextMeshPro.GO.Option1Button", "text", "Ja")
BTC.Show("GO.HANDMENU.Option1Button") BTC.Show("GO.GO.Option1Button")
BTC.Set("TextMeshPro.HANDMENU.Option2Button", "text", "Nein") BTC.Set("TextMeshPro.GO.Option2Button", "text", "Nein")
BTC.Show("GO.HANDMENU.Option2Button") BTC.Show("GO.GO.Option2Button")
} }
Composite(Race) { Composite(Race) {
Composite(Sequence) { Composite(Sequence) {
// Ja // Ja
BTC.Run("NamedEventTrigger.HANDMENU.Option1Button") BTC.Run("NamedEventTrigger.GO.Option1Button")
BTC.AbortEventListener("NamedEventTrigger.HANDMENU.Option2Button") BTC.AbortEventListener("NamedEventTrigger.GO.Option2Button")
BTC.Hide("GO.HANDMENU.Option1Button") BTC.Hide("GO.GO.Option1Button")
BTC.Hide("GO.HANDMENU.Option2Button") BTC.Hide("GO.GO.Option2Button")
RunTree("32_Grotto_Kueche_Interesse_Kochen") RunTree("32_Grotto_Kueche_Interesse_Kochen")
} }
Composite(Sequence) { Composite(Sequence) {
// Nein // Nein
BTC.Run("NamedEventTrigger.HANDMENU.Option2Button") BTC.Run("NamedEventTrigger.GO.Option2Button")
BTC.AbortEventListener("NamedEventTrigger.HANDMENU.Option1Button") BTC.AbortEventListener("NamedEventTrigger.GO.Option1Button")
BTC.Hide("GO.HANDMENU.Option1Button") BTC.Hide("GO.GO.Option1Button")
BTC.Hide("GO.HANDMENU.Option2Button") BTC.Hide("GO.GO.Option2Button")
RunTree("32_Grotto_Kueche_Zusammen_Kochen") RunTree("32_Grotto_Kueche_Zusammen_Kochen")
} }
} }
@ -881,27 +903,27 @@ Tree("32_Grotto_Kueche_alles_gefunden") {
// Fallback Button // Fallback Button
Composite(Marathon) { Composite(Marathon) {
BTC.Set("TextMeshPro.HANDMENU.Option1Button", "text", "Ja") BTC.Set("TextMeshPro.GO.Option1Button", "text", "Ja")
BTC.Show("GO.HANDMENU.Option1Button") BTC.Show("GO.GO.Option1Button")
BTC.Set("TextMeshPro.HANDMENU.Option2Button", "text", "Nein") BTC.Set("TextMeshPro.GO.Option2Button", "text", "Nein")
BTC.Show("GO.HANDMENU.Option2Button") BTC.Show("GO.GO.Option2Button")
} }
Composite(Race) { Composite(Race) {
Composite(Sequence) { Composite(Sequence) {
// Ja // Ja
BTC.Run("NamedEventTrigger.HANDMENU.Option1Button") BTC.Run("NamedEventTrigger.GO.Option1Button")
BTC.AbortEventListener("NamedEventTrigger.HANDMENU.Option2Button") BTC.AbortEventListener("NamedEventTrigger.GO.Option2Button")
BTC.Hide("GO.HANDMENU.Option1Button") BTC.Hide("GO.GO.Option1Button")
BTC.Hide("GO.HANDMENU.Option2Button") BTC.Hide("GO.GO.Option2Button")
RunTree("32_Grotto_Kueche_Interesse_Kochen") RunTree("32_Grotto_Kueche_Interesse_Kochen")
} }
Composite(Sequence) { Composite(Sequence) {
// Nein // Nein
BTC.Run("NamedEventTrigger.HANDMENU.Option2Button") BTC.Run("NamedEventTrigger.GO.Option2Button")
BTC.AbortEventListener("NamedEventTrigger.HANDMENU.Option1Button") BTC.AbortEventListener("NamedEventTrigger.GO.Option1Button")
BTC.Hide("GO.HANDMENU.Option1Button") BTC.Hide("GO.GO.Option1Button")
BTC.Hide("GO.HANDMENU.Option2Button") BTC.Hide("GO.GO.Option2Button")
RunTree("32_Grotto_Kueche_Zusammen_Kochen") RunTree("32_Grotto_Kueche_Zusammen_Kochen")
} }
} }
@ -915,24 +937,24 @@ Tree("32_Grotto_Kueche_Interesse_Kochen") {
Composite(Sequence) { Composite(Sequence) {
BTC.Run("AudioSource.AUDIO.Kueche1FInteresseK") BTC.Run("AudioSource.AUDIO.Kueche1FInteresseK")
// ToDo: Freie Antwort als Speech Input // ToDo: Freie Antwort als Speech Input
BTC.Set("TextMeshPro.HANDMENU.Option1Button", "text", "Lasagne") BTC.Set("TextMeshPro.GO.Option1Button", "text", "Lasagne")
BTC.Show("GO.HANDMENU.Option1Button") BTC.Show("GO.GO.Option1Button")
BTC.SetBool("32_Grotto_Kueche_Interesse_Kochen_Button_Clicked", false) BTC.SetBool("32_Grotto_Kueche_Interesse_Kochen_Button_Clicked", false)
Composite(Race) { Composite(Race) {
Composite(Sequence) { Composite(Sequence) {
// Lieblingsessen nennen // Lieblingsessen nennen
BTC.Run("NamedEventTrigger.HANDMENU.Option1Button") BTC.Run("NamedEventTrigger.GO.Option1Button")
BTC.SetBool("32_Grotto_Kueche_Interesse_Kochen_Button_Clicked") BTC.SetBool("32_Grotto_Kueche_Interesse_Kochen_Button_Clicked")
BTC.Hide("GO.HANDMENU.Option1Button") BTC.Hide("GO.GO.Option1Button")
RunTree("32_Grotto_Kueche_Kochen_Anzahl") RunTree("32_Grotto_Kueche_Kochen_Anzahl")
} }
Composite(Sequence) { Composite(Sequence) {
// keine Antwort // keine Antwort
BTC.Wait(5) BTC.Wait(5)
BTC.CompareBool("32_Grotto_Kueche_Interesse_Kochen_Button_Clicked", false) BTC.CompareBool("32_Grotto_Kueche_Interesse_Kochen_Button_Clicked", false)
BTC.AbortEventListener("NamedEventTrigger.HANDMENU.Option1Button") BTC.AbortEventListener("NamedEventTrigger.GO.Option1Button")
BTC.Hide("GO.HANDMENU.Option1Button") BTC.Hide("GO.GO.Option1Button")
RunTree("32_Grotto_Kueche_Zusammen_Kochen") RunTree("32_Grotto_Kueche_Zusammen_Kochen")
} }
} }
@ -980,27 +1002,27 @@ Tree("32_Grotto_Kueche_Kochen_Anzahl") {
// Fallback Button // Fallback Button
Composite(Marathon) { Composite(Marathon) {
BTC.Set("TextMeshPro.HANDMENU.Option1Button", "text", "sehr oft") BTC.Set("TextMeshPro.GO.Option1Button", "text", "sehr oft")
BTC.Show("GO.HANDMENU.Option1Button") BTC.Show("GO.GO.Option1Button")
BTC.Set("TextMeshPro.HANDMENU.Option2Button", "text", "selten") BTC.Set("TextMeshPro.GO.Option2Button", "text", "selten")
BTC.Show("GO.HANDMENU.Option2Button") BTC.Show("GO.GO.Option2Button")
} }
Composite(Race) { Composite(Race) {
Composite(Sequence) { Composite(Sequence) {
// sehr oft // sehr oft
BTC.Run("NamedEventTrigger.HANDMENU.Option1Button") BTC.Run("NamedEventTrigger.GO.Option1Button")
BTC.AbortEventListener("NamedEventTrigger.HANDMENU.Option2Button") BTC.AbortEventListener("NamedEventTrigger.GO.Option2Button")
BTC.Hide("GO.HANDMENU.Option1Button") BTC.Hide("GO.GO.Option1Button")
BTC.Hide("GO.HANDMENU.Option2Button") BTC.Hide("GO.GO.Option2Button")
RunTree("32_Grotto_Kueche_Selbststaendig_Kochen") RunTree("32_Grotto_Kueche_Selbststaendig_Kochen")
} }
Composite(Sequence) { Composite(Sequence) {
// selten // selten
BTC.Run("NamedEventTrigger.HANDMENU.Option2Button") BTC.Run("NamedEventTrigger.GO.Option2Button")
BTC.AbortEventListener("NamedEventTrigger.HANDMENU.Option1Button") BTC.AbortEventListener("NamedEventTrigger.GO.Option1Button")
BTC.Hide("GO.HANDMENU.Option1Button") BTC.Hide("GO.GO.Option1Button")
BTC.Hide("GO.HANDMENU.Option2Button") BTC.Hide("GO.GO.Option2Button")
RunTree("32_Grotto_Kueche_Zusammen_Kochen") RunTree("32_Grotto_Kueche_Zusammen_Kochen")
} }
} }
@ -1109,13 +1131,13 @@ Tree("32_Grotto_Kueche_Parmigiano") {
// Antwort User // Antwort User
// ToDo: Sprache fehlt // ToDo: Sprache fehlt
BTC.Set("TextMeshPro.HANDMENU.Option1Button", "text", "Ja") BTC.Set("TextMeshPro.GO.Option1Button", "text", "Ja")
BTC.Show("GO.HANDMENU.Option1Button") BTC.Show("GO.GO.Option1Button")
Composite(Race) { Composite(Race) {
BTC.Run("NamedEventTrigger.HANDMENU.Option1Button") BTC.Run("NamedEventTrigger.GO.Option1Button")
BTC.Wait(5) BTC.Wait(5)
} }
BTC.Hide("GO.HANDMENU.Option1Button") BTC.Hide("GO.GO.Option1Button")
BTC.SynthesizeText("Bitte stelle den Risotto hier hin.") BTC.SynthesizeText("Bitte stelle den Risotto hier hin.")
BTC.SpeechOutputEnded() BTC.SpeechOutputEnded()
@ -1159,10 +1181,10 @@ Tree("32_Grotto_Kueche_Parmigiano") {
BTC.ClearPossbileSpeechIntents() BTC.ClearPossbileSpeechIntents()
// Fallback Button // Fallback Button
BTC.Set("TextMeshPro.HANDMENU.Option1Button", "text", "Mein Name ist User.") BTC.Set("TextMeshPro.GO.Option1Button", "text", "Mein Name ist User.")
BTC.Show("GO.HANDMENU.Option1Button") BTC.Show("GO.GO.Option1Button")
BTC.Run("NamedEventTrigger.HANDMENU.Option1Button") BTC.Run("NamedEventTrigger.GO.Option1Button")
BTC.Hide("GO.HANDMENU.Option1Button") BTC.Hide("GO.GO.Option1Button")
} }
} }
} }

View File

@ -661,12 +661,14 @@ public class BTC : MonoBehaviour {
private ViaggioAIManager _speechMng { get { return ViaggioAIManager.Instance; } } private ViaggioAIManager _speechMng { get { return ViaggioAIManager.Instance; } }
private RequestDataModel _requestDataModel = new RequestDataModel(); private RequestDataModel _requestDataModel = new RequestDataModel();
private string _recognizedIntentID = ""; private string _recognizedIntentID = "";
private string _speechErrorText = "";
private bool _onIntentRecognitionSucceededEventTriggered = false; private bool _onIntentRecognitionSucceededEventTriggered = false;
private bool _onUserSpeechInputStartedEventTriggered = false; private bool _onUserSpeechInputStartedEventTriggered = false;
private bool _onIntentRecognitionFailedEventTriggered = false; private bool _onIntentRecognitionFailedEventTriggered = false;
private bool _onSpeechOutputStartedEventTriggered = false; private bool _onSpeechOutputStartedEventTriggered = false;
private bool _onSpeechOutputEndedEventTriggered = false; private bool _onSpeechOutputEndedEventTriggered = false;
private bool _abortSpeechEventListener = false; private bool _abortSpeechEventListener = false;
private bool _onErrorEventTriggered = false;
void OnDisable() void OnDisable()
{ {
@ -686,6 +688,9 @@ public class BTC : MonoBehaviour {
_speechMng.OnSpeechOutputStartedEvent += SpeechOutputStartedEventHandler; _speechMng.OnSpeechOutputStartedEvent += SpeechOutputStartedEventHandler;
_speechMng.OnSpeechOutputEndedEvent += SpeechOutputEndedEventHandler; _speechMng.OnSpeechOutputEndedEvent += SpeechOutputEndedEventHandler;
// Error Event
_speechMng.OnViaggioAIErrorEvent += SpeechErrorEventHandler;
Debug.Log("SubscribeToEvents successfull."); Debug.Log("SubscribeToEvents successfull.");
} }
} }
@ -699,6 +704,7 @@ public class BTC : MonoBehaviour {
_speechMng.OnIntentRecognitionFailedEvent -= IntentRecognitionFailedEventHandler; _speechMng.OnIntentRecognitionFailedEvent -= IntentRecognitionFailedEventHandler;
_speechMng.OnSpeechOutputStartedEvent -= SpeechOutputStartedEventHandler; _speechMng.OnSpeechOutputStartedEvent -= SpeechOutputStartedEventHandler;
_speechMng.OnSpeechOutputEndedEvent -= SpeechOutputEndedEventHandler; _speechMng.OnSpeechOutputEndedEvent -= SpeechOutputEndedEventHandler;
_speechMng.OnViaggioAIErrorEvent -= SpeechErrorEventHandler;
} }
} }
@ -728,6 +734,12 @@ public class BTC : MonoBehaviour {
_onSpeechOutputEndedEventTriggered = true; _onSpeechOutputEndedEventTriggered = true;
} }
private void SpeechErrorEventHandler(object sender, string errorText)
{
_onErrorEventTriggered = true;
_speechErrorText = errorText;
}
[Task] [Task]
public async void InitializeSpeechManager() public async void InitializeSpeechManager()
{ {
@ -943,6 +955,18 @@ public class BTC : MonoBehaviour {
return; return;
} }
} }
[Task]
public void SpeechErrorOccured()
{
if (_onErrorEventTriggered)
{
Task.SetSucceeded();
Debug.Log($"ERROR: Speech Service not working. Reason: {_speechErrorText}");
_onErrorEventTriggered = false;
return;
}
}
#endregion #endregion
#region Visited Stories Manager #region Visited Stories Manager