Initialer Upload neues Unity-Projekt
This commit is contained in:
151
Assets/Oculus/Voice/Scripts/Runtime/UX/VoiceActivationButton.cs
Normal file
151
Assets/Oculus/Voice/Scripts/Runtime/UX/VoiceActivationButton.cs
Normal file
@ -0,0 +1,151 @@
|
||||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Licensed under the Oculus SDK License Agreement (the "License");
|
||||
* you may not use the Oculus SDK except in compliance with the License,
|
||||
* which is provided at the time of installation or download, or which
|
||||
* otherwise accompanies this software in either electronic or hard copy form.
|
||||
*
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://developer.oculus.com/licenses/oculussdk/
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, the Oculus SDK
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
using Meta.WitAi;
|
||||
using Meta.WitAi.Requests;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Oculus.VoiceSDK.UX
|
||||
{
|
||||
[RequireComponent(typeof(Button))]
|
||||
public class VoiceActivationButton : MonoBehaviour
|
||||
{
|
||||
// The button to be observed
|
||||
private Button _button;
|
||||
// The button label to be adjusted with state
|
||||
private Text _buttonLabel;
|
||||
|
||||
[Tooltip("Reference to the current voice service")]
|
||||
[SerializeField] private VoiceService _voiceService;
|
||||
|
||||
[Tooltip("Text to be shown while the voice service is not active")]
|
||||
[SerializeField] private string _activateText = "Activate";
|
||||
[Tooltip("Whether to immediately send data to service or to wait for the audio threshold")]
|
||||
[SerializeField] private bool _activateImmediately = false;
|
||||
|
||||
[Tooltip("Text to be shown while the voice service is active")]
|
||||
[SerializeField] private string _deactivateText = "Deactivate";
|
||||
[Tooltip("Whether to immediately abort request activation on deactivate")]
|
||||
[SerializeField] private bool _deactivateAndAbort = false;
|
||||
|
||||
// Current request
|
||||
private VoiceServiceRequest _request;
|
||||
private bool _isActive = false;
|
||||
|
||||
// Get button & label
|
||||
private void Awake()
|
||||
{
|
||||
_buttonLabel = GetComponentInChildren<Text>();
|
||||
_button = GetComponent<Button>();
|
||||
if (_voiceService == null)
|
||||
{
|
||||
_voiceService = FindObjectOfType<VoiceService>();
|
||||
}
|
||||
}
|
||||
// Add click delegate
|
||||
private void OnEnable()
|
||||
{
|
||||
RefreshActive();
|
||||
if (_button != null)
|
||||
{
|
||||
_button.onClick.AddListener(OnClick);
|
||||
}
|
||||
}
|
||||
// Remove click delegate
|
||||
private void OnDisable()
|
||||
{
|
||||
_isActive = false;
|
||||
if (_button != null)
|
||||
{
|
||||
_button.onClick.RemoveListener(OnClick);
|
||||
}
|
||||
}
|
||||
|
||||
// On click, activate if not active & deactivate if active
|
||||
private void OnClick()
|
||||
{
|
||||
if (!_isActive)
|
||||
{
|
||||
Activate();
|
||||
}
|
||||
else
|
||||
{
|
||||
Deactivate();
|
||||
}
|
||||
}
|
||||
|
||||
// Activate depending on settings
|
||||
private void Activate()
|
||||
{
|
||||
if (!_activateImmediately)
|
||||
{
|
||||
_request = _voiceService.Activate(GetRequestEvents());
|
||||
}
|
||||
else
|
||||
{
|
||||
_request = _voiceService.ActivateImmediately(GetRequestEvents());
|
||||
}
|
||||
}
|
||||
|
||||
// Deactivate depending on settings
|
||||
private void Deactivate()
|
||||
{
|
||||
if (!_deactivateAndAbort)
|
||||
{
|
||||
_request.DeactivateAudio();
|
||||
}
|
||||
else
|
||||
{
|
||||
_request.Cancel();
|
||||
}
|
||||
}
|
||||
|
||||
// Get events
|
||||
private VoiceServiceRequestEvents GetRequestEvents()
|
||||
{
|
||||
VoiceServiceRequestEvents events = new VoiceServiceRequestEvents();
|
||||
events.OnInit.AddListener(OnInit);
|
||||
events.OnComplete.AddListener(OnComplete);
|
||||
return events;
|
||||
}
|
||||
// Request initialized
|
||||
private void OnInit(VoiceServiceRequest request)
|
||||
{
|
||||
_isActive = true;
|
||||
RefreshActive();
|
||||
}
|
||||
// Request completed
|
||||
private void OnComplete(VoiceServiceRequest request)
|
||||
{
|
||||
_isActive = false;
|
||||
RefreshActive();
|
||||
}
|
||||
|
||||
// Refresh active text
|
||||
private void RefreshActive()
|
||||
{
|
||||
if (_buttonLabel != null)
|
||||
{
|
||||
_buttonLabel.text = _isActive ? _deactivateText : _activateText;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 172cb0882a19c114790c463ad582025d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,153 @@
|
||||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Licensed under the Oculus SDK License Agreement (the "License");
|
||||
* you may not use the Oculus SDK except in compliance with the License,
|
||||
* which is provided at the time of installation or download, or which
|
||||
* otherwise accompanies this software in either electronic or hard copy form.
|
||||
*
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://developer.oculus.com/licenses/oculussdk/
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, the Oculus SDK
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
using Meta.WitAi;
|
||||
using Meta.WitAi.Json;
|
||||
using Meta.WitAi.Requests;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Oculus.VoiceSDK.UX
|
||||
{
|
||||
[RequireComponent(typeof(Text))] [ExecuteInEditMode]
|
||||
public class VoiceTranscriptionLabel : MonoBehaviour
|
||||
{
|
||||
// The label to be updated
|
||||
public Text Label
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_label == null)
|
||||
{
|
||||
_label = gameObject.GetComponent<Text>();
|
||||
}
|
||||
return _label;
|
||||
}
|
||||
}
|
||||
private Text _label;
|
||||
|
||||
[Header("Listen Settings")]
|
||||
[Tooltip("Various voice services to be observed")]
|
||||
[SerializeField] private VoiceService[] _voiceServices;
|
||||
[Tooltip("Text color while receiving text")]
|
||||
[SerializeField] private Color _transcriptionColor = Color.black;
|
||||
|
||||
[Header("Prompt Settings")]
|
||||
[Tooltip("Color to be used for prompt text")]
|
||||
[SerializeField] private Color _promptColor = new Color(0.2f, 0.2f, 0.2f);
|
||||
[Tooltip("Prompt text that displays while listening but prior to completion")]
|
||||
[SerializeField] private string _promptDefault = "Press activate to begin listening";
|
||||
[Tooltip("Prompt text that displays while listening but prior to completion")]
|
||||
[SerializeField] private string _promptListening = "Listening...";
|
||||
|
||||
[Header("Error Settings")]
|
||||
[Tooltip("Color to be used for error text")]
|
||||
[SerializeField] private Color _errorColor = new Color(0.8f, 0.2f, 0.2f);
|
||||
|
||||
// If none found, grab all voice services
|
||||
private void Awake()
|
||||
{
|
||||
if (_voiceServices == null || _voiceServices.Length == 0)
|
||||
{
|
||||
_voiceServices = FindObjectsOfType<VoiceService>();
|
||||
}
|
||||
}
|
||||
|
||||
// Add service delegates
|
||||
private void OnEnable()
|
||||
{
|
||||
if (_voiceServices != null)
|
||||
{
|
||||
foreach (var service in _voiceServices)
|
||||
{
|
||||
service.VoiceEvents.OnStartListening.AddListener(OnStartListening);
|
||||
service.VoiceEvents.OnPartialTranscription.AddListener(OnTranscriptionChange);
|
||||
service.VoiceEvents.OnFullTranscription.AddListener(OnTranscriptionChange);
|
||||
service.VoiceEvents.OnError.AddListener(OnError);
|
||||
service.VoiceEvents.OnComplete.AddListener(OnComplete);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Remove service delegates
|
||||
private void OnDisable()
|
||||
{
|
||||
if (_voiceServices != null)
|
||||
{
|
||||
foreach (var service in _voiceServices)
|
||||
{
|
||||
service.VoiceEvents.OnStartListening.RemoveListener(OnStartListening);
|
||||
service.VoiceEvents.OnPartialTranscription.RemoveListener(OnTranscriptionChange);
|
||||
service.VoiceEvents.OnFullTranscription.RemoveListener(OnTranscriptionChange);
|
||||
service.VoiceEvents.OnError.RemoveListener(OnError);
|
||||
service.VoiceEvents.OnComplete.RemoveListener(OnComplete);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
// Refresh prompt
|
||||
private void Update()
|
||||
{
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
SetText(_promptDefault, _promptColor);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Set listening
|
||||
private void OnStartListening()
|
||||
{
|
||||
SetText(_promptListening, _promptColor);
|
||||
}
|
||||
// Set text change
|
||||
private void OnTranscriptionChange(string text)
|
||||
{
|
||||
SetText(text, _transcriptionColor);
|
||||
}
|
||||
// Apply error
|
||||
private void OnError(string status, string error)
|
||||
{
|
||||
SetText($"[{status}] {error}", _errorColor);
|
||||
}
|
||||
// If no text came through, show prompt
|
||||
private void OnComplete(VoiceServiceRequest request)
|
||||
{
|
||||
if (Label != null && string.Equals(Label?.text, _promptListening))
|
||||
{
|
||||
SetText(_promptDefault, _promptColor);
|
||||
}
|
||||
}
|
||||
|
||||
// Refresh text
|
||||
private void SetText(string newText, Color newColor)
|
||||
{
|
||||
// Ignore if same
|
||||
if (Label == null || string.Equals(newText, Label.text) && newColor == Label.color)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Apply text & color
|
||||
_label.text = newText;
|
||||
_label.color = newColor;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7d6b7f41315d58e4b84dde7885b2f192
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user