Initial Commit

This commit is contained in:
2025-07-04 20:33:06 +03:00
commit 8f09347ae0
9219 changed files with 2447903 additions and 0 deletions
@@ -0,0 +1,324 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the license found in the
* LICENSE file in the root directory of this source tree.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Meta.WitAi.Configuration;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Serialization;
using Meta.WitAi.Interfaces;
using Meta.WitAi.Requests;
namespace Meta.WitAi.Events
{
// A class for tracking events used for speech
[Serializable]
public class SpeechEvents : EventRegistry, ISpeechEvents, ITranscriptionEvent, IAudioInputEvents
{
#region Activation - Setup Events
protected const string EVENT_CATEGORY_ACTIVATION_SETUP = "Activation Setup Events";
[EventCategory(EVENT_CATEGORY_ACTIVATION_SETUP)]
[Tooltip("Called prior to initialization for WitRequestOption customization")]
[FormerlySerializedAs("OnRequestOptionSetup")] [SerializeField]
private WitRequestOptionsEvent _onRequestOptionSetup = new WitRequestOptionsEvent();
public WitRequestOptionsEvent OnRequestOptionSetup => _onRequestOptionSetup;
[EventCategory(EVENT_CATEGORY_ACTIVATION_SETUP)]
[Tooltip("Called when a request is created. This occurs as soon as a activation is called successfully.")]
[FormerlySerializedAs("OnRequestInitialized")] [SerializeField]
private VoiceServiceRequestEvent _onRequestInitialized = new VoiceServiceRequestEvent();
public VoiceServiceRequestEvent OnRequestInitialized => _onRequestInitialized;
[EventCategory(EVENT_CATEGORY_ACTIVATION_SETUP)]
[Tooltip("Called when a request is sent. This occurs immediately once data is being transmitted to the endpoint.")]
[FormerlySerializedAs("OnRequestCreated")] [SerializeField] [HideInInspector]
private WitRequestCreatedEvent _onRequestCreated = new WitRequestCreatedEvent();
[Obsolete("Deprecated for 'OnSend' event")]
public WitRequestCreatedEvent OnRequestCreated => _onRequestCreated;
[EventCategory(EVENT_CATEGORY_ACTIVATION_SETUP)]
[Tooltip("Called when a request is sent. This occurs immediately once data is being transmitted to the endpoint.")]
[SerializeField]
private VoiceServiceRequestEvent _onSend = new VoiceServiceRequestEvent();
public VoiceServiceRequestEvent OnSend => _onSend;
#endregion Activation - Setup Events
#region Activation - Info Events
protected const string EVENT_CATEGORY_ACTIVATION_INFO = "Activation Info Events";
[EventCategory(EVENT_CATEGORY_ACTIVATION_INFO)]
[Tooltip("Fired when the minimum wake threshold is hit after an activation. Not called for ActivateImmediately")]
[FormerlySerializedAs("OnMinimumWakeThresholdHit")] [SerializeField]
private UnityEvent _onMinimumWakeThresholdHit = new UnityEvent();
public UnityEvent OnMinimumWakeThresholdHit => _onMinimumWakeThresholdHit;
[EventCategory(EVENT_CATEGORY_ACTIVATION_INFO)]
[Tooltip("Fired when recording stops, the minimum volume threshold was hit, and data is being sent to the server.")]
[FormerlySerializedAs("OnMicDataSent")] [SerializeField]
private UnityEvent _onMicDataSent = new UnityEvent();
public UnityEvent OnMicDataSent => _onMicDataSent;
[EventCategory(EVENT_CATEGORY_ACTIVATION_INFO)]
[Tooltip("The Deactivate() method has been called ending the current activation.")]
[FormerlySerializedAs("OnStoppedListeningDueToDeactivation")] [SerializeField]
private UnityEvent _onStoppedListeningDueToDeactivation = new UnityEvent();
public UnityEvent OnStoppedListeningDueToDeactivation => _onStoppedListeningDueToDeactivation;
[EventCategory(EVENT_CATEGORY_ACTIVATION_INFO)]
[Tooltip("Called when the microphone input volume has been below the volume threshold for the specified duration and microphone data is no longer being collected")]
[FormerlySerializedAs("OnStoppedListeningDueToInactivity")] [SerializeField]
private UnityEvent _onStoppedListeningDueToInactivity = new UnityEvent();
public UnityEvent OnStoppedListeningDueToInactivity => _onStoppedListeningDueToInactivity;
[EventCategory(EVENT_CATEGORY_ACTIVATION_INFO)]
[Tooltip("The microphone has stopped recording because maximum recording time has been hit for this activation")]
[FormerlySerializedAs("OnStoppedListeningDueToTimeout")] [SerializeField]
private UnityEvent _onStoppedListeningDueToTimeout = new UnityEvent();
public UnityEvent OnStoppedListeningDueToTimeout => _onStoppedListeningDueToTimeout;
#endregion Activation - Info Events
#region Activation - Cancelation Events
protected const string EVENT_CATEGORY_ACTIVATION_CANCELATION = "Activation Cancelation Events";
[EventCategory(EVENT_CATEGORY_ACTIVATION_CANCELATION)]
[Tooltip("Called when the activation is about to be aborted by a direct user interaction via DeactivateAndAbort.")]
[FormerlySerializedAs("OnAborting")] [SerializeField]
private UnityEvent _onAborting = new UnityEvent();
public UnityEvent OnAborting => _onAborting;
[EventCategory(EVENT_CATEGORY_ACTIVATION_CANCELATION)]
[Tooltip("Called when the activation stopped because the network request was aborted. This can be via a timeout or call to DeactivateAndAbort.")]
[FormerlySerializedAs("OnAborted")] [SerializeField]
private UnityEvent _onAborted = new UnityEvent();
public UnityEvent OnAborted => _onAborted;
[EventCategory(EVENT_CATEGORY_ACTIVATION_CANCELATION)]
[Tooltip("Called when a request has been canceled either prior to or after a request has begun transmission. Returns the cancelation reason.")]
[FormerlySerializedAs("OnCanceled")] [SerializeField]
private WitTranscriptionEvent _onCanceled = new WitTranscriptionEvent();
public WitTranscriptionEvent OnCanceled => _onCanceled;
#endregion Activation - Cancelation Events
#region Activation - Response Events
protected const string EVENT_CATEGORY_ACTIVATION_RESPONSE = "Activation Response Events";
[EventCategory(EVENT_CATEGORY_ACTIVATION_RESPONSE)]
[Tooltip("Called when response from Wit.ai has been received from partial transcription")]
[FormerlySerializedAs("OnPartialResponse")] [SerializeField] [HideInInspector]
private WitResponseEvent _onPartialResponse = new WitResponseEvent();
public WitResponseEvent OnPartialResponse => _onPartialResponse;
[EventCategory(EVENT_CATEGORY_ACTIVATION_RESPONSE)]
[Tooltip("Called when a response from Wit.ai has been received")]
[FormerlySerializedAs("OnResponse")] [FormerlySerializedAs("onResponse")] [SerializeField]
private WitResponseEvent _onResponse = new WitResponseEvent();
public WitResponseEvent OnResponse => _onResponse;
[EventCategory(EVENT_CATEGORY_ACTIVATION_RESPONSE)]
[Tooltip("Called when there was an error with a WitRequest or the RuntimeConfiguration is not properly configured.")]
[FormerlySerializedAs("OnError")] [FormerlySerializedAs("onError")] [SerializeField]
private WitErrorEvent _onError = new WitErrorEvent();
public WitErrorEvent OnError => _onError;
[EventCategory(EVENT_CATEGORY_ACTIVATION_RESPONSE)]
[Tooltip("Called when a request has completed and all response and error callbacks have fired. This is not called if the request was aborted.")]
[FormerlySerializedAs("OnRequestCompleted")] [SerializeField]
private UnityEvent _onRequestCompleted = new UnityEvent();
public UnityEvent OnRequestCompleted => _onRequestCompleted;
[EventCategory(EVENT_CATEGORY_ACTIVATION_RESPONSE)]
[Tooltip("Called when a request has been canceled, failed, or successfully completed")]
[FormerlySerializedAs("OnComplete")] [SerializeField]
private VoiceServiceRequestEvent _onComplete = new VoiceServiceRequestEvent();
public VoiceServiceRequestEvent OnComplete => _onComplete;
#endregion Activation - Response Events
#region Audio Events
protected const string EVENT_CATEGORY_AUDIO_EVENTS = "Audio Events";
[EventCategory(EVENT_CATEGORY_AUDIO_EVENTS)]
[Tooltip("Called when the microphone has started collecting data collecting data to be sent to Wit.ai. There may be some buffering before data transmission starts.")]
[FormerlySerializedAs("OnStartListening")] [FormerlySerializedAs("onStart")] [SerializeField]
private UnityEvent _onStartListening = new UnityEvent();
public UnityEvent OnStartListening => _onStartListening;
public UnityEvent OnMicStartedListening => OnStartListening;
[EventCategory(EVENT_CATEGORY_AUDIO_EVENTS)]
[Tooltip("Called when the voice service is no longer collecting data from the microphone")]
[FormerlySerializedAs("OnStoppedListening")] [FormerlySerializedAs("onStopped")] [SerializeField]
private UnityEvent _onStoppedListening = new UnityEvent();
public UnityEvent OnStoppedListening => _onStoppedListening;
public UnityEvent OnMicStoppedListening => OnStoppedListening;
[EventCategory(EVENT_CATEGORY_AUDIO_EVENTS)]
[Tooltip("Called when the volume level of the mic input has changed")]
[FormerlySerializedAs("OnMicLevelChanged")] [SerializeField]
private WitMicLevelChangedEvent _onMicLevelChanged = new WitMicLevelChangedEvent();
public WitMicLevelChangedEvent OnMicLevelChanged => _onMicLevelChanged;
public WitMicLevelChangedEvent OnMicAudioLevelChanged => OnMicLevelChanged;
#endregion Audio Events
#region Transcription Events
protected const string EVENT_CATEGORY_TRANSCRIPTION_EVENTS = "Transcription Events";
[EventCategory(EVENT_CATEGORY_TRANSCRIPTION_EVENTS)]
[Tooltip("Message fired when a partial transcription has been received.")]
[FormerlySerializedAs("onPartialTranscription")] [FormerlySerializedAs("OnPartialTranscription")] [SerializeField]
private WitTranscriptionEvent _onPartialTranscription = new WitTranscriptionEvent();
public WitTranscriptionEvent OnPartialTranscription => _onPartialTranscription;
[Obsolete("Deprecated for 'OnPartialTranscription' event")]
public WitTranscriptionEvent onPartialTranscription => OnPartialTranscription;
[FormerlySerializedAs("OnFullTranscription")]
[EventCategory(EVENT_CATEGORY_TRANSCRIPTION_EVENTS)]
[Tooltip("Message received when a complete transcription is received.")]
[FormerlySerializedAs("onFullTranscription")] [FormerlySerializedAs("OnFullTranscription")] [SerializeField]
private WitTranscriptionEvent _onFullTranscription = new WitTranscriptionEvent();
public WitTranscriptionEvent OnFullTranscription => _onFullTranscription;
[Obsolete("Deprecated for 'OnPartialTranscription' event")]
public WitTranscriptionEvent onFullTranscription => OnFullTranscription;
#endregion Transcription Events
#region Listen Wrapping
// Listeners
private HashSet<SpeechEvents> _listeners = new HashSet<SpeechEvents>();
// Adds all listener events
public void AddListener(SpeechEvents listener)
{
// Ignore if null or already set
if (listener == null || _listeners.Contains(listener))
{
return;
}
// Add all events
if (_listeners.Count == 0)
{
SetEvents(true);
}
// Add listener
_listeners.Add(listener);
}
// Removes all listener events
public void RemoveListener(SpeechEvents listener)
{
// Ignore if null or not already set
if (listener == null || !_listeners.Contains(listener))
{
return;
}
// Remove listener
_listeners.Remove(listener);
// Remove all events
if (_listeners.Count == 0)
{
SetEvents(false);
}
}
// Set events
protected virtual void SetEvents(bool add)
{
SetEvent((events) => events?._onRequestOptionSetup, add);
SetEvent((events) => events?._onRequestInitialized, add);
SetEvent((events) => events?._onRequestCreated, add);
SetEvent((events) => events?._onSend, add);
SetEvent((events) => events?._onMinimumWakeThresholdHit, add);
SetEvent((events) => events?._onMicDataSent, add);
SetEvent((events) => events?._onStoppedListeningDueToDeactivation, add);
SetEvent((events) => events?._onStoppedListeningDueToInactivity, add);
SetEvent((events) => events?._onAborting, add);
SetEvent((events) => events?._onAborted, add);
SetEvent((events) => events?._onCanceled, add);
SetEvent((events) => events?._onPartialResponse, add);
SetEvent((events) => events?._onResponse, add);
SetEvent((events) => events?._onError, add);
SetEvent((events) => events?._onRequestCompleted, add);
SetEvent((events) => events?._onComplete, add);
SetEvent((events) => events?._onStartListening, add);
SetEvent((events) => events?._onStoppedListening, add);
SetEvent((events) => events?._onMicLevelChanged, add);
SetEvent((events) => events?._onPartialTranscription, add);
SetEvent((events) => events?._onFullTranscription, add);
}
// Set UnityEvent with no parameter
protected void SetEvent(Func<SpeechEvents, UnityEvent> getEvent, bool add)
{
// Get source event
UnityEvent sourceEvent = getEvent(this);
// Add event
if (!add)
{
sourceEvent?.RemoveAllListeners();
return;
}
// Add listener
sourceEvent?.AddListener(() =>
{
foreach (var listener in _listeners)
{
getEvent(listener)?.Invoke();
}
});
}
// Set UnityEvent with parameter
protected void SetEvent<T>(Func<SpeechEvents, UnityEvent<T>> getEvent, bool add)
{
// Get source event
UnityEvent<T> sourceEvent = getEvent(this);
// Add event
if (!add)
{
sourceEvent?.RemoveAllListeners();
return;
}
// Add listener
sourceEvent?.AddListener((param) =>
{
foreach (var listener in _listeners)
{
getEvent(listener)?.Invoke(param);
}
});
}
// Set UnityEvent with 2 parameters
protected void SetEvent<T, U>(Func<SpeechEvents, UnityEvent<T, U>> getEvent, bool add)
{
// Get source event
UnityEvent<T, U> sourceEvent = getEvent(this);
// Add event
if (!add)
{
sourceEvent?.RemoveAllListeners();
return;
}
// Add listener
sourceEvent?.AddListener((param1, param2) =>
{
foreach (var listener in _listeners)
{
getEvent(listener)?.Invoke(param1, param2);
}
});
}
#endregion Listen Wrapping
}
}