init
This commit is contained in:
8
Assets/Oculus/Voice/Features/Dictation/Plugins.meta
Normal file
8
Assets/Oculus/Voice/Features/Dictation/Plugins.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ce565818b48ace445bb96419f9c2646a
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,32 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c752b70a94dcf04498081eda98206e9c
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 1
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Android: Android
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/Oculus/Voice/Features/Dictation/Prefabs.meta
Normal file
8
Assets/Oculus/Voice/Features/Dictation/Prefabs.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1d52e6a286831c642b5fbb7d06f80182
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,67 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &7025344876703661356
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 3310282155954220998}
|
||||
- component: {fileID: 1323671023378674162}
|
||||
m_Layer: 0
|
||||
m_Name: DictationService
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &3310282155954220998
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7025344876703661356}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 1.0366372, y: -4.517428, z: 17.832829}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &1323671023378674162
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7025344876703661356}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: a0020bf728a658b4dbbd34ac2be0e14e, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
configuration:
|
||||
multiPhrase: 0
|
||||
scenario: default
|
||||
inputType: text_default
|
||||
onPartialTranscriptionChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
onFinalTranscriptionReceived:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
onDictationError:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
onMicrophoneLevelChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
onDictationStarted:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
onDictationStopped:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ba31729cfe8be2642a8bcac537765e59
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/Oculus/Voice/Features/Dictation/Scripts.meta
Normal file
8
Assets/Oculus/Voice/Features/Dictation/Scripts.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2a72e9375732a1c439d3e991372e6a25
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ad3861f68f5f6ec4e8ccc1ddfbd7129c
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* 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.IO;
|
||||
using Meta.WitAi;
|
||||
using Meta.WitAi.Dictation;
|
||||
using Meta.WitAi.Windows;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Oculus.Voice.Dictation
|
||||
{
|
||||
[CustomEditor(typeof(AppDictationExperience))]
|
||||
public class AppDictationExperienceEditor : Editor
|
||||
{
|
||||
[SerializeField] private string transcribeFile;
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
base.OnInspectorGUI();
|
||||
|
||||
if (EditorApplication.isPlaying)
|
||||
{
|
||||
GUILayout.BeginVertical(EditorStyles.helpBox);
|
||||
GUILayout.Label("File Transcriber");
|
||||
GUILayout.BeginHorizontal();
|
||||
transcribeFile = EditorGUILayout.TextField(transcribeFile);
|
||||
if (GUILayout.Button("Browse", GUILayout.Width(75)))
|
||||
{
|
||||
var pickedFile = EditorUtility.OpenFilePanel("Select File", "", "wav");
|
||||
if (!string.IsNullOrEmpty(pickedFile))
|
||||
{
|
||||
transcribeFile = pickedFile;
|
||||
}
|
||||
}
|
||||
|
||||
GUILayout.EndHorizontal();
|
||||
if (File.Exists(transcribeFile) && GUILayout.Button("Transcribe"))
|
||||
{
|
||||
var dictationService = ((AppDictationExperience)target).GetComponent<WitDictation>();
|
||||
dictationService.TranscribeFile(transcribeFile);
|
||||
}
|
||||
|
||||
GUILayout.EndVertical();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 294403565ca76cd44a221a07f911e80d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 95c8c3f7c517467f9a7d4365ca7f1f19
|
||||
timeCreated: 1656510929
|
||||
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* 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 Meta.WitAi.Configuration;
|
||||
using Meta.WitAi.Data;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Oculus.Voice.Dictation.Data
|
||||
{
|
||||
public class AppDictationDataCreation
|
||||
{
|
||||
[MenuItem("Assets/Create/Voice SDK/Add App Dictation Experience to Scene", false, 100)]
|
||||
public static void AddVoiceCommandServiceToScene()
|
||||
{
|
||||
var witGo = new GameObject();
|
||||
witGo.name = "App Dictation Experience";
|
||||
var wit = witGo.AddComponent<AppDictationExperience>();
|
||||
wit.RuntimeDictationConfiguration = new WitDictationRuntimeConfiguration
|
||||
{
|
||||
witConfiguration = WitDataCreation.FindDefaultWitConfig()
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 55d3bf29671d34b9c84160431ee2429d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c6000f2708bf4d37b50eddbac06db445
|
||||
timeCreated: 1656458466
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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 UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Oculus.Voice.Dictation.Inspectors
|
||||
{
|
||||
[CustomPropertyDrawer(typeof(WitDictationRuntimeConfigDrawer))]
|
||||
public class WitDictationRuntimeConfigDrawer : PropertyDrawer
|
||||
{
|
||||
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
||||
{
|
||||
base.OnGUI(position, property, label);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ad073cad346af44a281dd01c4d8a4a3c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "VoiceSDK.Dictation.Editor",
|
||||
"rootNamespace": "",
|
||||
"references": [
|
||||
"GUID:7fc7076089fdfbc4399cba40cc3b0dd6",
|
||||
"GUID:910a956078d2ff4429c717211dcfaecb",
|
||||
"GUID:fa958eb9f0171754fb207d563a15ddfa",
|
||||
"GUID:4504b1a6e0fdcc3498c30b266e4a63bf",
|
||||
"GUID:1c28d8b71ced07540b7c271537363cc6"
|
||||
],
|
||||
"includePlatforms": [
|
||||
"Editor"
|
||||
],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fb043033254d90e46b4abaa2879909ea
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c0babb0488968124c85712d1bf12da58
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c188f83b2845a4c6db26cf96dc004cf2
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ea91106e590de2945938dd234262b37e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Oculus.Voice.Dictation.Configuration
|
||||
{
|
||||
[Serializable]
|
||||
public class DictationConfiguration
|
||||
{
|
||||
[Tooltip("Re-open the mic after the final transcription. Useful for long form content/messaging.")]
|
||||
public bool multiPhrase;
|
||||
[Tooltip("Hint about the scenario that the user is dictating. Default to package name. In the future we might have messaging, search, general, etc")]
|
||||
public string scenario = "default";
|
||||
[Tooltip("Input types: text_default: Normal text, numeric: Numbers, email: Email addresses")]
|
||||
public string inputType = "text_default";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 07b07eeddd4fd7847a488c8fb590b5e9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6b7302946fb0f1e4299eb699e30c7449
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,40 @@
|
||||
namespace Oculus.Voice.Dictation.Listeners
|
||||
{
|
||||
public interface DictationListener
|
||||
{
|
||||
/// <summary>
|
||||
/// Called when dictation has started
|
||||
/// </summary>
|
||||
void OnStart(DictationListener listener);
|
||||
|
||||
/// <summary>
|
||||
/// Called when mic level changes. Used for building UI.
|
||||
/// </summary>
|
||||
/// <param name="micLevel"></param>
|
||||
void OnMicAudioLevel(float micLevel);
|
||||
|
||||
/// <summary>
|
||||
/// Called with current predicted transcription. Could change as user speaks.
|
||||
/// </summary>
|
||||
/// <param name="transcription"></param>
|
||||
void OnPartialTranscription(string transcription);
|
||||
|
||||
/// <summary>
|
||||
/// Final transcription of what the user has said
|
||||
/// </summary>
|
||||
/// <param name="transcription"></param>
|
||||
void OnFinalTranscription(string transcription);
|
||||
|
||||
/// <summary>
|
||||
/// Called when there was an error with the dictation service
|
||||
/// </summary>
|
||||
/// <param name="errorType">The type of error encountered</param>
|
||||
/// <param name="errorMessage">Human readable message describing the error</param>
|
||||
void OnError(string errorType, string errorMessage);
|
||||
|
||||
/// <summary>
|
||||
/// Called when the dictation session is done
|
||||
/// </summary>
|
||||
void OnStopped(DictationListener listener);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 809d25c26f051e44991a37caa328aa7a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0768efab3897ba744a6ad727b7bc28ee
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,464 @@
|
||||
/*
|
||||
* 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 System;
|
||||
using System.Globalization;
|
||||
using Meta.Voice;
|
||||
using Meta.WitAi;
|
||||
using Meta.WitAi.Json;
|
||||
using Meta.WitAi.Configuration;
|
||||
using Meta.WitAi.Data.Configuration;
|
||||
using Meta.WitAi.Dictation;
|
||||
using Meta.WitAi.Dictation.Data;
|
||||
using Meta.WitAi.Interfaces;
|
||||
using Meta.WitAi.Requests;
|
||||
using Oculus.Voice.Dictation.Bindings.Android;
|
||||
using Oculus.VoiceSDK.Utilities;
|
||||
using Oculus.Voice.Core.Bindings.Android.PlatformLogger;
|
||||
using Oculus.Voice.Core.Bindings.Interfaces;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Oculus.Voice.Dictation
|
||||
{
|
||||
public class AppDictationExperience : DictationService, IWitRuntimeConfigProvider, IWitConfigurationProvider
|
||||
{
|
||||
[SerializeField] private WitDictationRuntimeConfiguration runtimeConfiguration;
|
||||
[Tooltip("Uses platform dictation service instead of accessing wit directly from within the application.")]
|
||||
[SerializeField] private bool usePlatformServices;
|
||||
|
||||
[Tooltip("Dictation will not fallback to Wit if platform dictation is not available. Not applicable in Unity Editor")]
|
||||
[SerializeField] private bool doNotFallbackToWit;
|
||||
[Tooltip("Enables logs related to the interaction to be displayed on console")]
|
||||
[SerializeField] private bool enableConsoleLogging;
|
||||
|
||||
public WitRuntimeConfiguration RuntimeConfiguration => runtimeConfiguration;
|
||||
public WitDictationRuntimeConfiguration RuntimeDictationConfiguration
|
||||
{
|
||||
get => runtimeConfiguration;
|
||||
set => runtimeConfiguration = value;
|
||||
}
|
||||
public WitConfiguration Configuration => RuntimeConfiguration?.witConfiguration;
|
||||
|
||||
private IDictationService _dictationServiceImpl;
|
||||
private IVoiceSDKLogger _voiceSDKLogger;
|
||||
/// <summary>
|
||||
/// True if the user currently has requested dictation to be active. This will remain true until a Deactivate
|
||||
/// method is called and we will reactivate when the mic stops as a result.
|
||||
/// </summary>
|
||||
private bool _isActive;
|
||||
|
||||
private DictationSession _activeSession;
|
||||
private WitRequestOptions _activeRequestOptions;
|
||||
|
||||
public DictationSession ActiveSession => _activeSession;
|
||||
public WitRequestOptions ActiveRequestOptions => _activeRequestOptions;
|
||||
|
||||
public event Action OnInitialized;
|
||||
|
||||
#if UNITY_ANDROID && !UNITY_EDITOR
|
||||
// This version is auto-updated for a release build
|
||||
private readonly string PACKAGE_VERSION = "54.0.0.135.284";
|
||||
#endif
|
||||
|
||||
#if UNITY_ANDROID && !UNITY_EDITOR
|
||||
public bool HasPlatformIntegrations => usePlatformServices && _dictationServiceImpl is PlatformDictationImpl;
|
||||
#else
|
||||
public bool HasPlatformIntegrations => false;
|
||||
#endif
|
||||
|
||||
public bool UsePlatformIntegrations
|
||||
{
|
||||
get => usePlatformServices;
|
||||
set
|
||||
{
|
||||
// If we're trying to turn on platform services and they're not currently active we
|
||||
// will forcably reinit and try to set the state.
|
||||
if (usePlatformServices != value || HasPlatformIntegrations != value)
|
||||
{
|
||||
usePlatformServices = value;
|
||||
#if UNITY_ANDROID && !UNITY_EDITOR
|
||||
VLog.D($"{(usePlatformServices ? "Enabling" : "Disabling")} platform integration.");
|
||||
InitDictation();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool DoNotFallbackToWit
|
||||
{
|
||||
get => doNotFallbackToWit;
|
||||
set => doNotFallbackToWit = value;
|
||||
}
|
||||
|
||||
private void InitDictation()
|
||||
{
|
||||
// Clean up if we're switching to native C# wit impl
|
||||
if (!UsePlatformIntegrations)
|
||||
{
|
||||
if (_dictationServiceImpl is PlatformDictationImpl)
|
||||
{
|
||||
((PlatformDictationImpl) _dictationServiceImpl).Disconnect();
|
||||
}
|
||||
|
||||
if (_voiceSDKLogger is VoiceSDKPlatformLoggerImpl)
|
||||
{
|
||||
try
|
||||
{
|
||||
((VoiceSDKPlatformLoggerImpl)_voiceSDKLogger).Disconnect();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
VLog.E($"Disconnection error: {e.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
#if UNITY_ANDROID && !UNITY_EDITOR
|
||||
var loggerImpl = new VoiceSDKPlatformLoggerImpl();
|
||||
loggerImpl.Connect(PACKAGE_VERSION);
|
||||
_voiceSDKLogger = loggerImpl;
|
||||
|
||||
if (UsePlatformIntegrations)
|
||||
{
|
||||
VLog.D("Checking platform dictation capabilities...");
|
||||
var platformDictationImpl = new PlatformDictationImpl(this);
|
||||
platformDictationImpl.OnServiceNotAvailableEvent += OnPlatformServiceNotAvailable;
|
||||
platformDictationImpl.Connect(PACKAGE_VERSION);
|
||||
if (platformDictationImpl.PlatformSupportsDictation)
|
||||
{
|
||||
_dictationServiceImpl = platformDictationImpl;
|
||||
_dictationServiceImpl.DictationEvents = DictationEvents;
|
||||
_dictationServiceImpl.TelemetryEvents = TelemetryEvents;
|
||||
platformDictationImpl.SetDictationRuntimeConfiguration(RuntimeDictationConfiguration);
|
||||
VLog.D("Dictation platform init complete");
|
||||
_voiceSDKLogger.IsUsingPlatformIntegration = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
OnPlatformServiceNotAvailable();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
RevertToWitDictation();
|
||||
}
|
||||
#else
|
||||
_voiceSDKLogger = new VoiceSDKConsoleLoggerImpl();
|
||||
RevertToWitDictation();
|
||||
#endif
|
||||
_voiceSDKLogger.WitApplication = RuntimeDictationConfiguration?.witConfiguration?.GetLoggerAppId();
|
||||
_voiceSDKLogger.ShouldLogToConsole = enableConsoleLogging;
|
||||
|
||||
OnInitialized?.Invoke();
|
||||
}
|
||||
|
||||
private void OnPlatformServiceNotAvailable()
|
||||
{
|
||||
#if !UNITY_EDITOR
|
||||
if (DoNotFallbackToWit)
|
||||
{
|
||||
VLog.D("Platform dictation service unavailable. Falling back to WitDictation is disabled");
|
||||
DictationEvents.OnError?.Invoke("Platform dictation unavailable", "Platform dictation service is not available");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
VLog.D("Platform dictation service unavailable. Falling back to WitDictation");
|
||||
RevertToWitDictation();
|
||||
}
|
||||
|
||||
private void OnDictationServiceNotAvailable()
|
||||
{
|
||||
VLog.D("Dictation service unavailable");
|
||||
DictationEvents.OnError?.Invoke("Dictation unavailable", "Dictation service is not available");
|
||||
}
|
||||
|
||||
private void RevertToWitDictation()
|
||||
{
|
||||
WitDictation witDictation = GetComponent<WitDictation>();
|
||||
if (null == witDictation)
|
||||
{
|
||||
witDictation = gameObject.AddComponent<WitDictation>();
|
||||
witDictation.hideFlags = HideFlags.HideInInspector;
|
||||
}
|
||||
|
||||
witDictation.RuntimeConfiguration = RuntimeDictationConfiguration;
|
||||
witDictation.DictationEvents = DictationEvents;
|
||||
witDictation.TelemetryEvents = TelemetryEvents;
|
||||
_dictationServiceImpl = witDictation;
|
||||
VLog.D("WitDictation init complete");
|
||||
_voiceSDKLogger.IsUsingPlatformIntegration = false;
|
||||
}
|
||||
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
if (MicPermissionsManager.HasMicPermission())
|
||||
{
|
||||
InitDictation();
|
||||
}
|
||||
else
|
||||
{
|
||||
MicPermissionsManager.RequestMicPermission((e) => InitDictation());
|
||||
}
|
||||
|
||||
DictationEvents.OnStartListening.AddListener(OnStarted);
|
||||
DictationEvents.OnStoppedListening.AddListener(OnStopped);
|
||||
DictationEvents.OnComplete.AddListener(OnComplete);
|
||||
DictationEvents.OnDictationSessionStarted.AddListener(OnDictationSessionStarted);
|
||||
DictationEvents.OnPartialTranscription.AddListener(OnPartialTranscription);
|
||||
DictationEvents.OnFullTranscription.AddListener(OnFullTranscription);
|
||||
TelemetryEvents.OnAudioTrackerFinished.AddListener(OnAudioDurationTrackerFinished);
|
||||
}
|
||||
|
||||
protected override void OnDisable()
|
||||
{
|
||||
#if UNITY_ANDROID
|
||||
if (_dictationServiceImpl is PlatformDictationImpl platformDictationImpl)
|
||||
{
|
||||
platformDictationImpl.Disconnect();
|
||||
}
|
||||
|
||||
if (_voiceSDKLogger is VoiceSDKPlatformLoggerImpl loggerImpl)
|
||||
{
|
||||
loggerImpl.Disconnect();
|
||||
}
|
||||
#endif
|
||||
_dictationServiceImpl = null;
|
||||
_voiceSDKLogger = null;
|
||||
DictationEvents.OnStartListening.RemoveListener(OnStarted);
|
||||
DictationEvents.OnStoppedListening.RemoveListener(OnStopped);
|
||||
DictationEvents.OnComplete.RemoveListener(OnComplete);
|
||||
DictationEvents.OnDictationSessionStarted.RemoveListener(OnDictationSessionStarted);
|
||||
DictationEvents.OnPartialTranscription.RemoveListener(OnPartialTranscription);
|
||||
DictationEvents.OnFullTranscription.RemoveListener(OnFullTranscription);
|
||||
TelemetryEvents.OnAudioTrackerFinished.RemoveListener(OnAudioDurationTrackerFinished);
|
||||
base.OnDisable();
|
||||
}
|
||||
|
||||
#region DictationService properties
|
||||
|
||||
public override bool Active => _dictationServiceImpl != null && _dictationServiceImpl.Active;
|
||||
public override bool IsRequestActive => _dictationServiceImpl != null && _dictationServiceImpl.IsRequestActive;
|
||||
|
||||
public override ITranscriptionProvider TranscriptionProvider
|
||||
{
|
||||
get => _dictationServiceImpl.TranscriptionProvider;
|
||||
set => _dictationServiceImpl.TranscriptionProvider = value;
|
||||
|
||||
}
|
||||
public override bool MicActive => null != _dictationServiceImpl && _dictationServiceImpl.MicActive;
|
||||
protected override bool ShouldSendMicData => RuntimeConfiguration.sendAudioToWit ||
|
||||
null == TranscriptionProvider;
|
||||
#endregion
|
||||
|
||||
#region DictationService APIs
|
||||
/// <summary>
|
||||
/// Toggle dictation activation from on->off or off->on depending on the current active state.
|
||||
/// </summary>
|
||||
public void Toggle()
|
||||
{
|
||||
if(Active) Deactivate();
|
||||
else Activate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Activate the microphone and send data to Wit for NLU processing.
|
||||
/// </summary>
|
||||
public override VoiceServiceRequest Activate(WitRequestOptions requestOptions, VoiceServiceRequestEvents requestEvents)
|
||||
{
|
||||
if (_dictationServiceImpl == null)
|
||||
{
|
||||
OnDictationServiceNotAvailable();
|
||||
return null;
|
||||
}
|
||||
|
||||
if (null == requestOptions) requestOptions = new WitRequestOptions();
|
||||
|
||||
if (!_isActive)
|
||||
{
|
||||
_activeSession = new DictationSession();
|
||||
DictationEvents.OnDictationSessionStarted.Invoke(_activeSession);
|
||||
}
|
||||
|
||||
_activeRequestOptions = requestOptions;
|
||||
_isActive = true;
|
||||
_voiceSDKLogger.LogInteractionStart(requestOptions.RequestId, "dictation");
|
||||
LogRequestConfig();
|
||||
return _dictationServiceImpl.Activate(requestOptions, requestEvents);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Activates immediately and starts sending data to the server. This will not wait for min wake threshold
|
||||
/// </summary>
|
||||
/// <param name="options"></param>
|
||||
public override VoiceServiceRequest ActivateImmediately(WitRequestOptions requestOptions, VoiceServiceRequestEvents requestEvents)
|
||||
{
|
||||
if (_dictationServiceImpl == null)
|
||||
{
|
||||
OnDictationServiceNotAvailable();
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!_isActive)
|
||||
{
|
||||
_activeSession = new DictationSession();
|
||||
DictationEvents.OnDictationSessionStarted.Invoke(_activeSession);
|
||||
}
|
||||
|
||||
_activeRequestOptions = requestOptions;
|
||||
_isActive = true;
|
||||
_voiceSDKLogger.LogInteractionStart(requestOptions.RequestId, "dictation");
|
||||
LogRequestConfig();
|
||||
return _dictationServiceImpl.ActivateImmediately(requestOptions, requestEvents);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deactivates. If a transcription is in progress the network request will complete and any additional
|
||||
/// transcription values will be returned.
|
||||
/// </summary>
|
||||
public override void Deactivate()
|
||||
{
|
||||
if (_dictationServiceImpl == null)
|
||||
{
|
||||
OnDictationServiceNotAvailable();
|
||||
return;
|
||||
}
|
||||
|
||||
_isActive = false;
|
||||
_dictationServiceImpl.Deactivate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deactivates and ignores any pending transcription content.
|
||||
/// </summary>
|
||||
public override void Cancel()
|
||||
{
|
||||
if (_dictationServiceImpl == null)
|
||||
{
|
||||
OnDictationServiceNotAvailable();
|
||||
return;
|
||||
}
|
||||
|
||||
_dictationServiceImpl.Cancel();
|
||||
CleanupSession();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Listeners for logging
|
||||
|
||||
void OnStarted()
|
||||
{
|
||||
_voiceSDKLogger.LogInteractionPoint("startedListening");
|
||||
}
|
||||
|
||||
void OnStopped()
|
||||
{
|
||||
_voiceSDKLogger.LogInteractionPoint("stoppedListening");
|
||||
|
||||
if (RuntimeDictationConfiguration.dictationConfiguration.multiPhrase && _isActive)
|
||||
{
|
||||
Activate(_activeRequestOptions);
|
||||
}
|
||||
}
|
||||
|
||||
void OnDictationSessionStarted(DictationSession session)
|
||||
{
|
||||
if (session is PlatformDictationSession platformDictationSession)
|
||||
{
|
||||
_activeSession = session;
|
||||
_voiceSDKLogger.LogAnnotation("platformInteractionId", platformDictationSession.platformSessionId);
|
||||
}
|
||||
}
|
||||
|
||||
void OnAudioDurationTrackerFinished(long timestamp, double audioDuration)
|
||||
{
|
||||
_voiceSDKLogger.LogAnnotation("adt_duration", audioDuration.ToString(CultureInfo.InvariantCulture));
|
||||
_voiceSDKLogger.LogAnnotation("adt_finished", timestamp.ToString());
|
||||
}
|
||||
|
||||
void OnPartialTranscription(string text)
|
||||
{
|
||||
_voiceSDKLogger.LogFirstTranscriptionTime();
|
||||
}
|
||||
|
||||
void OnFullTranscription(string text)
|
||||
{
|
||||
_voiceSDKLogger.LogInteractionPoint("fullTranscriptionTime");
|
||||
}
|
||||
|
||||
void OnComplete(VoiceServiceRequest request)
|
||||
{
|
||||
if (request.State == VoiceRequestState.Failed)
|
||||
{
|
||||
VLog.E($"Dictation Request Failed\nError: {request.Results.Message}");
|
||||
_voiceSDKLogger.LogInteractionEndFailure(request.Results.Message);
|
||||
}
|
||||
else if (request.State == VoiceRequestState.Canceled)
|
||||
{
|
||||
VLog.W($"Dictation Request Canceled\nMessage: {request.Results.Message}");
|
||||
_voiceSDKLogger.LogInteractionEndFailure("aborted");
|
||||
}
|
||||
else
|
||||
{
|
||||
VLog.D($"Dictation Request Success");
|
||||
var tokens = request.ResponseData?["speech"]?["tokens"];
|
||||
if (tokens != null)
|
||||
{
|
||||
int speechTokensLength = tokens.Count;
|
||||
string speechLength = request.ResponseData["speech"]["tokens"][speechTokensLength - 1]?["end"]?.Value;
|
||||
_voiceSDKLogger.LogAnnotation("audioLength", speechLength);
|
||||
}
|
||||
_voiceSDKLogger.LogInteractionEndSuccess();
|
||||
}
|
||||
if (!_isActive)
|
||||
{
|
||||
DictationEvents.OnDictationSessionStopped?.Invoke(_activeSession);
|
||||
CleanupSession();
|
||||
}
|
||||
}
|
||||
|
||||
void LogRequestConfig()
|
||||
{
|
||||
#if UNITY_ANDROID && !UNITY_EDITOR
|
||||
_voiceSDKLogger.LogAnnotation("clientSDKVersion", PACKAGE_VERSION);
|
||||
#endif
|
||||
_voiceSDKLogger.LogAnnotation("minWakeThreshold",
|
||||
RuntimeConfiguration?.soundWakeThreshold.ToString(CultureInfo.InvariantCulture));
|
||||
_voiceSDKLogger.LogAnnotation("minKeepAliveTimeSec",
|
||||
RuntimeConfiguration?.minKeepAliveTimeInSeconds.ToString(CultureInfo.InvariantCulture));
|
||||
_voiceSDKLogger.LogAnnotation("minTranscriptionKeepAliveTimeSec",
|
||||
RuntimeConfiguration?.minTranscriptionKeepAliveTimeInSeconds.ToString(CultureInfo.InvariantCulture));
|
||||
_voiceSDKLogger.LogAnnotation("maxRecordingTime",
|
||||
RuntimeConfiguration?.maxRecordingTime.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Cleanup
|
||||
|
||||
private void CleanupSession()
|
||||
{
|
||||
_activeSession = null;
|
||||
_activeRequestOptions = null;
|
||||
_isActive = false;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f6da0ed72f4541d7b52607891bafa6f3
|
||||
timeCreated: 1652467620
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 86035a05c90f4460fbac04a0c49be3d7
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 99387caa63da84115b622a0d8cdfeaa9
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* 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.Configuration;
|
||||
using Oculus.Voice.Dictation.Configuration;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Oculus.Voice.Dictation.Bindings.Android
|
||||
{
|
||||
public class DictationConfigurationBinding
|
||||
{
|
||||
private readonly WitDictationRuntimeConfiguration _runtimeConfiguration;
|
||||
private readonly DictationConfiguration _dictationConfiguration;
|
||||
private readonly int MAX_PLATFORM_SUPPORTED_RECORDING_TIME_SECONDS = 300;
|
||||
|
||||
public DictationConfigurationBinding(WitDictationRuntimeConfiguration runtimeConfiguration)
|
||||
{
|
||||
if (null == runtimeConfiguration)
|
||||
{
|
||||
// No config defined, use the default configuration.
|
||||
VLog.W("No dictation config has been defined. Using the default configuration.");
|
||||
_dictationConfiguration = new DictationConfiguration();
|
||||
}
|
||||
else
|
||||
{
|
||||
_dictationConfiguration = runtimeConfiguration.dictationConfiguration;
|
||||
_runtimeConfiguration = runtimeConfiguration;
|
||||
}
|
||||
}
|
||||
|
||||
public AndroidJavaObject ToJavaObject()
|
||||
{
|
||||
AndroidJavaObject jo = new AndroidJavaObject("com.oculus.assistant.api.voicesdk.dictation.PlatformDictationConfiguration");
|
||||
jo.Set("multiPhrase", _dictationConfiguration.multiPhrase);
|
||||
jo.Set("scenario", _dictationConfiguration.scenario);
|
||||
jo.Set("inputType", _dictationConfiguration.inputType);
|
||||
if (_runtimeConfiguration != null)
|
||||
{
|
||||
int maxRecordingTime = (int) _runtimeConfiguration.maxRecordingTime;
|
||||
if (maxRecordingTime < 0)
|
||||
{
|
||||
maxRecordingTime = MAX_PLATFORM_SUPPORTED_RECORDING_TIME_SECONDS;
|
||||
}
|
||||
jo.Set("interactionTimeoutSeconds", maxRecordingTime);
|
||||
}
|
||||
|
||||
return jo;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c72e9e84ab9e87741986d6efe576e0d9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
* 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 UnityEngine;
|
||||
using Meta.WitAi;
|
||||
using Meta.WitAi.Dictation;
|
||||
using Meta.WitAi.Dictation.Data;
|
||||
using Meta.WitAi.Dictation.Events;
|
||||
|
||||
namespace Oculus.Voice.Dictation.Bindings.Android
|
||||
{
|
||||
public class DictationListenerBinding : AndroidJavaProxy
|
||||
{
|
||||
private IDictationService _dictationService;
|
||||
private IServiceEvents _serviceEvents;
|
||||
private DictationEvents DictationEvents => _dictationService.DictationEvents;
|
||||
|
||||
public DictationListenerBinding(IDictationService dictationService, IServiceEvents serviceEvents)
|
||||
: base("com.oculus.assistant.api.voicesdk.dictation.PlatformDictationListener")
|
||||
{
|
||||
_dictationService = dictationService;
|
||||
_serviceEvents = serviceEvents;
|
||||
}
|
||||
|
||||
public void onStart(string sessionId)
|
||||
{
|
||||
DictationEvents.OnStartListening?.Invoke();
|
||||
DictationSession session = new PlatformDictationSession()
|
||||
{
|
||||
dictationService = _dictationService,
|
||||
platformSessionId = sessionId
|
||||
};
|
||||
}
|
||||
|
||||
public void onMicAudioLevel(string sessionId, int micLevel)
|
||||
{
|
||||
DictationEvents.OnMicAudioLevelChanged?.Invoke(micLevel / 100.0f);
|
||||
}
|
||||
|
||||
public void onPartialTranscription(string sessionId, string transcription)
|
||||
{
|
||||
DictationEvents.OnPartialTranscription?.Invoke(transcription);
|
||||
}
|
||||
|
||||
public void onFinalTranscription(string sessionId, string transcription)
|
||||
{
|
||||
DictationEvents.OnFullTranscription?.Invoke(transcription);
|
||||
}
|
||||
|
||||
public void onError(string sessionId, string errorType, string errorMessage)
|
||||
{
|
||||
DictationEvents.OnError?.Invoke(errorType, errorMessage);
|
||||
}
|
||||
|
||||
public void onStopped(string sessionId)
|
||||
{
|
||||
DictationEvents.OnStoppedListening?.Invoke();
|
||||
DictationSession session = new PlatformDictationSession()
|
||||
{
|
||||
dictationService = _dictationService,
|
||||
platformSessionId = sessionId
|
||||
};
|
||||
}
|
||||
|
||||
public void onServiceNotAvailable(string error, string message)
|
||||
{
|
||||
VLog.W("Platform dictation service is not available");
|
||||
_serviceEvents.OnServiceNotAvailable(error, message);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9ae8a1a01ce0f484eafa3e39954356dc
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
namespace Oculus.Voice.Dictation.Bindings.Android
|
||||
{
|
||||
public interface IServiceEvents
|
||||
{
|
||||
void OnServiceNotAvailable(string error, string message);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d37d74b88e6244ad83c9242662e8dd7c
|
||||
timeCreated: 1655489373
|
||||
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
* 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 System;
|
||||
using Meta.WitAi.Configuration;
|
||||
using Meta.WitAi.Dictation;
|
||||
using Meta.WitAi.Dictation.Events;
|
||||
using Meta.WitAi.Events;
|
||||
using Meta.WitAi.Interfaces;
|
||||
using Meta.WitAi.Requests;
|
||||
using Meta.WitAi.Utilities;
|
||||
using Oculus.Voice.Core.Bindings.Android;
|
||||
using Oculus.Voice.Dictation.Configuration;
|
||||
using UnityEngine.Events;
|
||||
|
||||
namespace Oculus.Voice.Dictation.Bindings.Android
|
||||
{
|
||||
public class PlatformDictationImpl : BaseAndroidConnectionImpl<PlatformDictationSDKBinding>, IDictationService, IServiceEvents
|
||||
{
|
||||
private readonly IDictationService _baseService;
|
||||
private bool _serviceAvailable = true;
|
||||
private WitDictationRuntimeConfiguration _dictationRuntimeConfiguration;
|
||||
public PlatformDictationImpl(IDictationService dictationService)
|
||||
: base("com.oculus.assistant.api.unity.dictation.UnityDictationServiceFragment")
|
||||
{
|
||||
_baseService = dictationService;
|
||||
}
|
||||
|
||||
private DictationListenerBinding _listenerBinding;
|
||||
|
||||
public bool PlatformSupportsDictation => service.IsSupported && _serviceAvailable;
|
||||
public bool Active => service.Active;
|
||||
public bool IsRequestActive => service.IsRequestActive;
|
||||
public bool MicActive => service.Active;
|
||||
public ITranscriptionProvider TranscriptionProvider { get; set; }
|
||||
|
||||
public DictationEvents DictationEvents
|
||||
{
|
||||
get => _baseService.DictationEvents;
|
||||
set => _baseService.DictationEvents = value;
|
||||
}
|
||||
|
||||
public TelemetryEvents TelemetryEvents
|
||||
{
|
||||
get => _baseService.TelemetryEvents;
|
||||
set => _baseService.TelemetryEvents = value;
|
||||
}
|
||||
|
||||
public Action OnServiceNotAvailableEvent;
|
||||
|
||||
public override void Connect(string version)
|
||||
{
|
||||
base.Connect(version);
|
||||
_listenerBinding = new DictationListenerBinding(this, this);
|
||||
service.SetListener(_listenerBinding);
|
||||
}
|
||||
|
||||
public override void Disconnect()
|
||||
{
|
||||
base.Disconnect();
|
||||
}
|
||||
|
||||
public void SetDictationRuntimeConfiguration(WitDictationRuntimeConfiguration configuration)
|
||||
{
|
||||
_dictationRuntimeConfiguration = configuration;
|
||||
}
|
||||
|
||||
private void Activate()
|
||||
{
|
||||
service.StartDictation(new DictationConfigurationBinding(_dictationRuntimeConfiguration));
|
||||
}
|
||||
|
||||
public VoiceServiceRequest Activate(WitRequestOptions requestOptions, VoiceServiceRequestEvents requestEvents)
|
||||
{
|
||||
Activate();
|
||||
return null;
|
||||
}
|
||||
|
||||
public VoiceServiceRequest ActivateImmediately(WitRequestOptions requestOptions, VoiceServiceRequestEvents requestEvents)
|
||||
{
|
||||
Activate();
|
||||
return null;
|
||||
}
|
||||
|
||||
public void Deactivate()
|
||||
{
|
||||
service.StopDictation();
|
||||
}
|
||||
|
||||
public void Cancel()
|
||||
{
|
||||
// TODO: T141779167
|
||||
service.StopDictation();
|
||||
}
|
||||
|
||||
public void OnServiceNotAvailable(string error, string message)
|
||||
{
|
||||
_serviceAvailable = false;
|
||||
OnServiceNotAvailableEvent?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5199f2cf269c82348a4fe76b61d885e4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* 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 UnityEngine;
|
||||
using Oculus.Voice.Core.Bindings.Android;
|
||||
|
||||
namespace Oculus.Voice.Dictation.Bindings.Android
|
||||
{
|
||||
public class PlatformDictationSDKBinding : BaseServiceBinding
|
||||
{
|
||||
public bool Active => binding.Call<bool>("isActive");
|
||||
public bool IsRequestActive => binding.Call<bool>("isRequestActive");
|
||||
public bool IsSupported => binding.Call<bool>("isSupported");
|
||||
|
||||
public PlatformDictationSDKBinding(AndroidJavaObject sdkInstance) : base(sdkInstance) {}
|
||||
|
||||
public void StartDictation(DictationConfigurationBinding configuration)
|
||||
{
|
||||
binding.Call("startDictation", configuration.ToJavaObject());
|
||||
}
|
||||
|
||||
public void StopDictation()
|
||||
{
|
||||
binding.Call("stopDictation");
|
||||
}
|
||||
|
||||
public void SetListener(DictationListenerBinding listenerBinding)
|
||||
{
|
||||
binding.Call("setListener", listenerBinding);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 41af6918ebf13234e857ebfc290db6ec
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* 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.Dictation.Data;
|
||||
|
||||
namespace Oculus.Voice.Dictation.Bindings.Android
|
||||
{
|
||||
public class PlatformDictationSession : DictationSession
|
||||
{
|
||||
/// <summary>
|
||||
/// Session ID provided by the platform
|
||||
/// </summary>
|
||||
public string platformSessionId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 87bac4c0262b45dcbbf302346ee10eb4
|
||||
timeCreated: 1657570862
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a5fa86a298d2494f86ac7aecc353f4c8
|
||||
timeCreated: 1656459347
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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 Oculus.Voice.Dictation.Configuration;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Meta.WitAi.Configuration
|
||||
{
|
||||
[Serializable]
|
||||
public class WitDictationRuntimeConfiguration : WitRuntimeConfiguration
|
||||
{
|
||||
[Header("Dictation")]
|
||||
[SerializeField] public DictationConfiguration dictationConfiguration;
|
||||
|
||||
protected override Vector2 RecordingTimeRange => new Vector2(-1, 300);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eb3fd791afefd4a92a13c4a6149df2c0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5cdab34009d641eca671e122e8760e38
|
||||
timeCreated: 1655147987
|
||||
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
* 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;
|
||||
|
||||
namespace Oculus.Interaction.Deprecated
|
||||
{
|
||||
[Obsolete("Replaced by Oculus.VoiceSDK.Utilities.MicPermissionsManager")]
|
||||
public static class MicPermissionsManager { }
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 080297442637404fbb0aeb74058cb4e6
|
||||
MonoImporter:
|
||||
labels: ["oculus_interaction_deprecated"]
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "VoiceSDK.Dictation.Runtime",
|
||||
"rootNamespace": "",
|
||||
"references": [
|
||||
"GUID:a7c32ded21d3b9b42a71cdf39f2ed8da",
|
||||
"GUID:4504b1a6e0fdcc3498c30b266e4a63bf",
|
||||
"GUID:910a956078d2ff4429c717211dcfaecb",
|
||||
"GUID:e545cc0678493234a9368f4e470c29e8",
|
||||
"GUID:1c28d8b71ced07540b7c271537363cc6"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7fc7076089fdfbc4399cba40cc3b0dd6
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user