From e6a742387e8f50adc0b917682611bef7fc84a3c1 Mon Sep 17 00:00:00 2001 From: Udayshankar Ravikumar Date: Wed, 13 Nov 2024 17:14:26 +0530 Subject: [PATCH] Updated more stuff. --- README.md | 2 +- .../Data/BhashiniPipelineTaskType.cs.meta | 11 - ...iniPipelineTaskType.cs => BhashiniTask.cs} | 2 +- .../Runtime/Scripts/Data/BhashiniTask.cs.meta | 2 + .../BhashiniComputeConfiguration.cs.meta | 2 - .../Compute/Request/BhashiniComputeTask.cs | 10 +- ...cs => BhashiniComputeTaskConfiguration.cs} | 4 +- .../BhashiniComputeTaskConfiguration.cs.meta | 2 + .../Request/InputData/BhashiniInputData.cs | 54 +++- .../Response/BhashiniComputeResponse.cs | 2 +- .../BhashiniComputeResponseData.cs.meta | 2 - ...Data.cs => BhashiniComputeResponseTask.cs} | 6 +- .../BhashiniComputeResponseTask.cs.meta | 2 + ...ashiniComputeResponseTaskConfiguration.cs} | 4 +- ...iComputeResponseTaskConfiguration.cs.meta} | 0 .../Request/BhashiniPipelineRequestTask.cs | 8 +- .../Response/BhashiniPipelineConfiguration.cs | 7 +- .../Response/BhashiniPipelineResponse.cs | 19 ++ .../Data/PipelineComputationExtensions.cs | 18 +- .../Exceptions/BhashiniAudioIOException.cs | 1 - .../Scripts/Managers/BhashiniManager.cs | 263 +++++++----------- .../Samples~/ASR-Translate-TTS.meta | 8 - .../Scenes/ASR-Translate-TTS_Demo.unity | 16 +- .../Scripts/AsrTranslateTtsDemo.cs | 44 ++- .../SceneTemplateSettings.json | 5 + 25 files changed, 241 insertions(+), 253 deletions(-) delete mode 100644 UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/BhashiniPipelineTaskType.cs.meta rename UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/{BhashiniPipelineTaskType.cs => BhashiniTask.cs} (95%) create mode 100644 UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/BhashiniTask.cs.meta delete mode 100644 UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeConfiguration.cs.meta rename UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/{BhashiniComputeConfiguration.cs => BhashiniComputeTaskConfiguration.cs} (95%) create mode 100644 UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeTaskConfiguration.cs.meta delete mode 100644 UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseData.cs.meta rename UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/{BhashiniComputeResponseData.cs => BhashiniComputeResponseTask.cs} (89%) create mode 100644 UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseTask.cs.meta rename UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/{BhashiniComputeResponseConfiguration.cs => BhashiniComputeResponseTaskConfiguration.cs} (94%) rename UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/{BhashiniComputeResponseConfiguration.cs.meta => BhashiniComputeResponseTaskConfiguration.cs.meta} (100%) delete mode 100644 UBhashini/Packages/com.uralstech.ubhashini/Samples~/ASR-Translate-TTS.meta diff --git a/README.md b/README.md index 3f80220..6da8f9c 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ See the installation steps for the [Utilities.Audio](https://github.com/rageAgai ### Documentation -See . +See . --- diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/BhashiniPipelineTaskType.cs.meta b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/BhashiniPipelineTaskType.cs.meta deleted file mode 100644 index 43780d8..0000000 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/BhashiniPipelineTaskType.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 99c82b7234417a5469c6f1faf65f223d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/BhashiniPipelineTaskType.cs b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/BhashiniTask.cs similarity index 95% rename from UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/BhashiniPipelineTaskType.cs rename to UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/BhashiniTask.cs index 8e073e4..fae6a68 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/BhashiniPipelineTaskType.cs +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/BhashiniTask.cs @@ -8,7 +8,7 @@ namespace Uralstech.UBhashini.Data /// The type of task a pipeline should compute. /// [JsonConverter(typeof(StringEnumConverter))] - public enum BhashiniPipelineTaskType + public enum BhashiniTask { /// /// Default value. Do not use. diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/BhashiniTask.cs.meta b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/BhashiniTask.cs.meta new file mode 100644 index 0000000..9bb0568 --- /dev/null +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/BhashiniTask.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a1a76b96de0503e458aa02cdf5504b9e \ No newline at end of file diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeConfiguration.cs.meta b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeConfiguration.cs.meta deleted file mode 100644 index a17871a..0000000 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeConfiguration.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 1adbafe66117f514881f39871dfd1b55 \ No newline at end of file diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeTask.cs b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeTask.cs index 6fda394..99648cc 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeTask.cs +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeTask.cs @@ -15,7 +15,7 @@ public class BhashiniComputeTask /// /// [JsonProperty("taskType")] - public BhashiniPipelineTaskType Type; + public BhashiniTask Type; /// /// The configuration for the task. @@ -24,19 +24,19 @@ public class BhashiniComputeTask /// /// [JsonProperty("config")] - public BhashiniComputeConfiguration Configuration; + public BhashiniComputeTaskConfiguration Configuration; /// The task type. - public BhashiniComputeTask(BhashiniPipelineTaskType type) + public BhashiniComputeTask(BhashiniTask type) { Type = type; } /// The task type. /// The task configuration from a . - public BhashiniComputeTask(BhashiniPipelineTaskType type, Pipeline.BhashiniPipelineTaskConfiguration configuration) : this(type) + public BhashiniComputeTask(BhashiniTask type, Pipeline.BhashiniPipelineTaskConfiguration configuration) : this(type) { - Configuration = new BhashiniComputeConfiguration() + Configuration = new BhashiniComputeTaskConfiguration() { ServiceId = configuration.ServiceId, Language = configuration.Language, diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeConfiguration.cs b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeTaskConfiguration.cs similarity index 95% rename from UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeConfiguration.cs rename to UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeTaskConfiguration.cs index 797c024..91feb6b 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeConfiguration.cs +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeTaskConfiguration.cs @@ -7,7 +7,7 @@ namespace Uralstech.UBhashini.Data.Compute /// /// Configuration for a computation task. /// - public class BhashiniComputeConfiguration + public class BhashiniComputeTaskConfiguration { /// /// The service to use for computation. @@ -19,7 +19,7 @@ public class BhashiniComputeConfiguration public string ServiceId; /// - /// The language of the computation. + /// The language of the computation input and output. /// /// /// diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeTaskConfiguration.cs.meta b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeTaskConfiguration.cs.meta new file mode 100644 index 0000000..669fa42 --- /dev/null +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/BhashiniComputeTaskConfiguration.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c5dea06616b64e14dbc66f46ee99ae6d \ No newline at end of file diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/InputData/BhashiniInputData.cs b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/InputData/BhashiniInputData.cs index 6693a6b..f20625b 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/InputData/BhashiniInputData.cs +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Request/InputData/BhashiniInputData.cs @@ -1,4 +1,15 @@ using Newtonsoft.Json; +using System; +using UnityEngine; +using Uralstech.UBhashini.Exceptions; + +#if UTILITIES_ENCODING_WAV_1_0_0_OR_GREATER +using Utilities.Encoding.Wav; +#endif + +#if UTILITIES_AUDIO_1_0_0_OR_GREATER +using Utilities.Audio; +#endif namespace Uralstech.UBhashini.Data.Compute { @@ -26,7 +37,7 @@ public class BhashiniInputData public BhashiniAudioInput[] AudioData; /// Text input for translation and TTS requests. - /// Audio input for STT requests. + /// Base64 encoded audio input for STT requests. public BhashiniInputData(string text = null, string audio = null) { if (!string.IsNullOrEmpty(text)) @@ -40,5 +51,46 @@ public BhashiniInputData(string text = null, string audio = null) new(audio) }; } + +#if UTILITIES_ENCODING_WAV_1_0_0_OR_GREATER || UTILITIES_AUDIO_1_0_0_OR_GREATER + /// + /// Encodes the given to WAV* or PCM** base64. + ///

+ /// *Utilities.Encoding.Wav and Utilities.Audio are required. + ///
+ /// **Utilities.Audio is required. + ///
+ /// Audio input for STT requests. + /// The format to encode the audio in. + public BhashiniInputData(AudioClip audio, BhashiniAudioFormat audioFormat) + { + AudioData = new BhashiniAudioInput[1] + { + new(GetBase64Audio(audio, audioFormat)) + }; + } + +#pragma warning disable CS1998 + /// The clip to encode. + /// The format to encode the audio in. + /// The encoded audio. + /// Thrown when an unsupported audio encoding is encountered. + private string GetBase64Audio(AudioClip clip, BhashiniAudioFormat audioFormat) + { + return audioFormat switch + { +#if UTILITIES_ENCODING_WAV_1_0_0_OR_GREATER + BhashiniAudioFormat.Wav => Convert.ToBase64String(clip.EncodeToWav()), +#endif + +#if UTILITIES_AUDIO_1_0_0_OR_GREATER + BhashiniAudioFormat.Pcm => Convert.ToBase64String(clip.EncodeToPCM()), +#endif + + _ => throw new BhashiniAudioIOException($"Format not supported in operation!", audioFormat) + }; + } +#pragma warning restore CS1998 +#endif } } diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponse.cs b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponse.cs index a0cc2b4..afac379 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponse.cs +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponse.cs @@ -15,6 +15,6 @@ public class BhashiniComputeResponse /// ///
[JsonProperty("pipelineResponse")] - public BhashiniComputeResponseData[] TaskResults; + public BhashiniComputeResponseTask[] TaskResults; } } diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseData.cs.meta b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseData.cs.meta deleted file mode 100644 index 578e095..0000000 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseData.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: f473a5590caf42248ada0efddf7519f3 \ No newline at end of file diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseData.cs b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseTask.cs similarity index 89% rename from UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseData.cs rename to UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseTask.cs index 3707909..f581921 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseData.cs +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseTask.cs @@ -6,7 +6,7 @@ namespace Uralstech.UBhashini.Data.Compute /// /// Response data for a computed task result. /// - public class BhashiniComputeResponseData + public class BhashiniComputeResponseTask { /// /// The task type. @@ -15,7 +15,7 @@ public class BhashiniComputeResponseData /// /// [JsonProperty("taskType")] - public BhashiniPipelineTaskType TaskType; + public BhashiniTask Task; /// /// The configuration of the task's result. Can be for translation tasks. @@ -24,7 +24,7 @@ public class BhashiniComputeResponseData /// /// [JsonProperty("config")] - public BhashiniComputeResponseConfiguration TaskConfiguration; + public BhashiniComputeResponseTaskConfiguration TaskConfiguration; /// /// Text outputs for STT and translation tasks. diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseTask.cs.meta b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseTask.cs.meta new file mode 100644 index 0000000..3f5bc72 --- /dev/null +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseTask.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 95bc735c3ce4d894889a63b24edca687 \ No newline at end of file diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseConfiguration.cs b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseTaskConfiguration.cs similarity index 94% rename from UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseConfiguration.cs rename to UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseTaskConfiguration.cs index 93ab5b3..06ce7d8 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseConfiguration.cs +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseTaskConfiguration.cs @@ -8,7 +8,7 @@ namespace Uralstech.UBhashini.Data.Compute /// /// The configuration of the task's result. /// - public class BhashiniComputeResponseConfiguration + public class BhashiniComputeResponseTaskConfiguration { /// /// The service used to compute the result. @@ -47,7 +47,7 @@ public class BhashiniComputeResponseConfiguration public int SampleRate; /// - /// Additional data of an unknown format. + /// Additional data. /// /// /// diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseConfiguration.cs.meta b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseTaskConfiguration.cs.meta similarity index 100% rename from UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseConfiguration.cs.meta rename to UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Compute/Response/BhashiniComputeResponseTaskConfiguration.cs.meta diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Pipeline/Request/BhashiniPipelineRequestTask.cs b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Pipeline/Request/BhashiniPipelineRequestTask.cs index 883e2ae..4786a11 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Pipeline/Request/BhashiniPipelineRequestTask.cs +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Pipeline/Request/BhashiniPipelineRequestTask.cs @@ -15,7 +15,7 @@ public class BhashiniPipelineRequestTask /// /// [JsonProperty("taskType")] - public BhashiniPipelineTaskType Type; + public BhashiniTask Type; /// /// Optional extra configurations for the task. @@ -27,7 +27,7 @@ public class BhashiniPipelineRequestTask public BhashiniPipelineRequestTaskConfiguration Configuration = null; /// The type of the task. - public BhashiniPipelineRequestTask(BhashiniPipelineTaskType type) + public BhashiniPipelineRequestTask(BhashiniTask type) { Type = type; } @@ -35,14 +35,14 @@ public BhashiniPipelineRequestTask(BhashiniPipelineTaskType type) /// The type of the task. /// Source language for the task. /// Target language for the task. Optional, only for translation. - public BhashiniPipelineRequestTask(BhashiniPipelineTaskType type, string sourceLanguage, string targetLanguage = null) : this(type) + public BhashiniPipelineRequestTask(BhashiniTask type, string sourceLanguage, string targetLanguage = null) : this(type) { Configuration = new BhashiniPipelineRequestTaskConfiguration() { Language = new BhashiniLanguageData() { Source = sourceLanguage, - Target = targetLanguage ?? string.Empty, + Target = targetLanguage, }, }; } diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Pipeline/Response/BhashiniPipelineConfiguration.cs b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Pipeline/Response/BhashiniPipelineConfiguration.cs index 5ebc5d7..00439da 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Pipeline/Response/BhashiniPipelineConfiguration.cs +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Pipeline/Response/BhashiniPipelineConfiguration.cs @@ -15,7 +15,7 @@ public class BhashiniPipelineConfiguration /// /// [JsonProperty("taskType")] - public BhashiniPipelineTaskType Type; + public BhashiniTask Type; /// /// The supported configurations. @@ -25,5 +25,10 @@ public class BhashiniPipelineConfiguration /// [JsonProperty("config")] public BhashiniPipelineTaskConfiguration[] Configurations; + + /// + /// Gets the first in . + /// + public BhashiniPipelineTaskConfiguration First => Configurations.Length > 0 ? Configurations[0] : null; } } diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Pipeline/Response/BhashiniPipelineResponse.cs b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Pipeline/Response/BhashiniPipelineResponse.cs index ee5b154..b36f5a3 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Pipeline/Response/BhashiniPipelineResponse.cs +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/Pipeline/Response/BhashiniPipelineResponse.cs @@ -1,5 +1,6 @@ using Newtonsoft.Json; using Newtonsoft.Json.Serialization; +using System.Linq; namespace Uralstech.UBhashini.Data.Pipeline { @@ -80,5 +81,23 @@ public class BhashiniPipelineResponse /// [JsonProperty("pipelineInferenceAPIEndPoint")] public BhashiniPipelineInferenceEndpoint InferenceEndpoint; + + /// + /// Gets the first type in . + /// + public BhashiniPipelineConfiguration SpeechToTextConfiguration => _speechToTextConfiguration ??= PipelineConfigurations.Where(config => config.Type == BhashiniTask.SpeechToText).FirstOrDefault(); + private BhashiniPipelineConfiguration _speechToTextConfiguration; + + /// + /// Gets the first type in . + /// + public BhashiniPipelineConfiguration TranslateConfiguration => _translateConfiguration ??= PipelineConfigurations.Where(config => config.Type == BhashiniTask.Translation).FirstOrDefault(); + private BhashiniPipelineConfiguration _translateConfiguration; + + /// + /// Gets the first type in . + /// + public BhashiniPipelineConfiguration TextToSpeechConfiguration => _textToSpeechConfiguration ??= PipelineConfigurations.Where(config => config.Type == BhashiniTask.TextToSpeech).FirstOrDefault(); + private BhashiniPipelineConfiguration _textToSpeechConfiguration; } } diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/PipelineComputationExtensions.cs b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/PipelineComputationExtensions.cs index 9e2c1c3..49eb729 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/PipelineComputationExtensions.cs +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Data/PipelineComputationExtensions.cs @@ -24,7 +24,7 @@ public static class PipelineComputationExtensions /// A configured object. public static BhashiniComputeTask ToSpeechToTextTask(this BhashiniPipelineTaskConfiguration pipelineData, string sourceLanguage = null, BhashiniAudioFormat audioFormat = BhashiniAudioFormat.Wav, int sampleRate = 44100) { - BhashiniComputeTask task = new(BhashiniPipelineTaskType.SpeechToText, pipelineData); + BhashiniComputeTask task = new(BhashiniTask.SpeechToText, pipelineData); task.Configuration.AudioFormat = audioFormat; task.Configuration.SampleRate = sampleRate; @@ -43,7 +43,7 @@ public static BhashiniComputeTask ToSpeechToTextTask(this BhashiniPipelineTaskCo /// A configured object. public static BhashiniComputeTask ToTextToSpeechTask(this BhashiniPipelineTaskConfiguration pipelineData, BhashiniVoiceType voiceType = BhashiniVoiceType.Default, string sourceLanguage = null) { - BhashiniComputeTask task = new(BhashiniPipelineTaskType.TextToSpeech, pipelineData); + BhashiniComputeTask task = new(BhashiniTask.TextToSpeech, pipelineData); if (!string.IsNullOrEmpty(sourceLanguage)) task.Configuration.Language.Source = sourceLanguage; @@ -63,7 +63,7 @@ public static BhashiniComputeTask ToTextToSpeechTask(this BhashiniPipelineTaskCo /// A configured object. public static BhashiniComputeTask ToTranslateTask(this BhashiniPipelineTaskConfiguration pipelineData, string sourceLanguage = null, string targetLanguage = null) { - BhashiniComputeTask task = new(BhashiniPipelineTaskType.TextToSpeech, pipelineData); + BhashiniComputeTask task = new(BhashiniTask.TextToSpeech, pipelineData); if (!string.IsNullOrEmpty(sourceLanguage)) task.Configuration.Language.Source = sourceLanguage; @@ -81,9 +81,9 @@ public static BhashiniComputeTask ToTranslateTask(this BhashiniPipelineTaskConfi /// The transcribed text. public static string GetSpeechToTextResult(this BhashiniComputeResponse pipelineResponse) { - foreach (BhashiniComputeResponseData result in pipelineResponse.TaskResults) + foreach (BhashiniComputeResponseTask result in pipelineResponse.TaskResults) { - if (result.TaskType == BhashiniPipelineTaskType.SpeechToText) + if (result.Task == BhashiniTask.SpeechToText) return result.TextOutputs[0].Source; } @@ -97,9 +97,9 @@ public static string GetSpeechToTextResult(this BhashiniComputeResponse pipeline /// The translated text. public static string GetTranslateResult(this BhashiniComputeResponse pipelineResponse) { - foreach (BhashiniComputeResponseData result in pipelineResponse.TaskResults) + foreach (BhashiniComputeResponseTask result in pipelineResponse.TaskResults) { - if (result.TaskType == BhashiniPipelineTaskType.Translation) + if (result.Task == BhashiniTask.Translation) return result.TextOutputs[0].Target; } @@ -120,9 +120,9 @@ public static async Task GetTextToSpeechResult(this BhashiniComputeRe { byte[] audioData = null; BhashiniAudioFormat audioFormat = BhashiniAudioFormat.Default; - foreach (BhashiniComputeResponseData result in pipelineResponse.TaskResults) + foreach (BhashiniComputeResponseTask result in pipelineResponse.TaskResults) { - if (result.TaskType == BhashiniPipelineTaskType.TextToSpeech) + if (result.Task == BhashiniTask.TextToSpeech) { audioData = Convert.FromBase64String(result.AudioOutputs[0].Base64Audio); audioFormat = result.TaskConfiguration.AudioFormat; diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Exceptions/BhashiniAudioIOException.cs b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Exceptions/BhashiniAudioIOException.cs index 55edfb9..f7ab88a 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Exceptions/BhashiniAudioIOException.cs +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Exceptions/BhashiniAudioIOException.cs @@ -1,5 +1,4 @@ using System; -using Uralstech.UBhashini.Data; using Uralstech.UBhashini.Data.Compute; namespace Uralstech.UBhashini.Exceptions diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Managers/BhashiniManager.cs b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Managers/BhashiniManager.cs index b424281..0feaf17 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Managers/BhashiniManager.cs +++ b/UBhashini/Packages/com.uralstech.ubhashini/Runtime/Scripts/Managers/BhashiniManager.cs @@ -2,31 +2,17 @@ using System.Threading.Tasks; using UnityEngine; using UnityEngine.Networking; -using Uralstech.Utils.Singleton; -using Uralstech.UBhashini.Data; -using System; -using Uralstech.UBhashini.Exceptions; - -#if UTILITIES_ENCODING_WAV_1_0_0_OR_GREATER -using Utilities.Encoding.Wav; -using Uralstech.UBhashini.Data.Pipeline; using Uralstech.UBhashini.Data.Compute; -using UnityEngine.Serialization; - - - -#endif - -#if UTILITIES_AUDIO_1_0_0_OR_GREATER -using Utilities.Audio; -#endif +using Uralstech.UBhashini.Data.Pipeline; +using Uralstech.UBhashini.Exceptions; +using Uralstech.Utils.Singleton; namespace Uralstech.UBhashini { /// /// The script for managing all interactions with the Bhashini ULCA API. /// - [AddComponentMenu("Uralstech/UBhashini/Bhashini API Manager")] + [AddComponentMenu("Uralstech/UBhashini/Bhashini Manager")] public class BhashiniManager : Singleton { /// @@ -74,148 +60,101 @@ public void SetDetails(string ulcaUserId, string ulcaApiKey) _ulcaApiKey = ulcaApiKey; } - /// - /// Configures a pipeline for the given tasks for computation. - /// - /// The pipeline tasks. - /// The configuration response if successful and otherwise. - public async Task ConfigurePipeline(BhashiniPipelineRequestTask[] tasks) - { - BhashiniPipelineRequest request = new() - { - Tasks = tasks, - - Configuration = new() - { - ProviderId = PipelineProvider, - }, - }; - - Debug.Log("Starting pipeline configuration..."); - - string requestJson = JsonConvert.SerializeObject(request); - using UnityWebRequest webRequest = UnityWebRequest.Post(PipelineConfigurationEndpoint, requestJson, "application/json"); - - webRequest.SetRequestHeader(AuthUserIdHeader, _ulcaUserId); - webRequest.SetRequestHeader(AuthUlcaApiKeyHeader, _ulcaApiKey); - - UnityWebRequestAsyncOperation operation = webRequest.SendWebRequest(); - while (!operation.isDone) - await Task.Yield(); - - if (webRequest.result is not UnityWebRequest.Result.Success) - { - Debug.LogError($"Failed {nameof(ConfigurePipeline)} request: {webRequest.error} | {webRequest.downloadHandler.text}"); - return null; - } - - BhashiniPipelineResponse response = JsonConvert.DeserializeObject(webRequest.downloadHandler.text); - if (response is null) - { - Debug.LogError($"Failed {nameof(ConfigurePipeline)} request: Could not deserialize \"{webRequest.downloadHandler.text}\""); - return null; - } - - Debug.Log("Pipeline configuration completed."); - return response; - } - - #pragma warning disable CS1998 - /// - /// Encodes the given to WAV* or PCM** base64. - /// - /// - /// *Utilities.Encoding.Wav and Utilities.Audio are required. - ///
- /// **Utilities.Audio is required. - ///
- /// The clip to encode. - /// The tasks which specify the required audio format. - /// The encoding string, or if the task was not found. - /// Thrown when an unsupported audio encoding is encountered. - private async Task GetBase64Audio(AudioClip clip, BhashiniComputeTask[] tasks) - { - int taskIndex = Array.FindIndex(tasks, task => task.Type == BhashiniPipelineTaskType.SpeechToText); - if (taskIndex < 0) - return null; - - BhashiniComputeTask task = tasks[taskIndex]; - return task.Configuration.AudioFormat switch - { - #if UTILITIES_ENCODING_WAV_1_0_0_OR_GREATER - BhashiniAudioFormat.Wav => Convert.ToBase64String(await clip.EncodeToWavAsync()), - #endif - - #if UTILITIES_AUDIO_1_0_0_OR_GREATER - BhashiniAudioFormat.Pcm => Convert.ToBase64String(clip.EncodeToPCM()), - #endif - - _ => throw new BhashiniAudioIOException($"Format not supported in operation!", task.Configuration.AudioFormat) - }; - } - #pragma warning restore CS1998 - - /// - /// Runs the given computation tasks on a pipeline. - /// - /// - /// Provide audio data through , not if you are using any audio other than * or **. - ///
- ///
- /// *Utilities.Encoding.Wav and Utilities.Audio are required. - ///
- /// **Utilities.Audio is required. - ///
- /// The pipeline's inference endpoint. - /// The tasks to run on the pipeline. - /// The text input for the computation (for text to speech and translate). - /// The audio input for the computation (for speech to text). - /// The audio input for the computation (for speech to text). - /// The computation response if successful and otherwise. - /// Thrown when an unsupported audio encoding is encountered. - public async Task ComputeOnPipeline(BhashiniPipelineInferenceEndpoint inferenceEndpoint, - BhashiniComputeTask[] tasks, string textSource = null, AudioClip audioSource = null, string rawBase64AudioSource = null) - { - if (textSource is null && rawBase64AudioSource is null && audioSource == null) - { - Debug.LogError($"{nameof(textSource)}, {nameof(rawBase64AudioSource)} and {nameof(audioSource)} cannot all be null!"); - return null; - } - - BhashiniComputeRequest request = new() - { - Tasks = tasks, - Input = new BhashiniInputData(textSource, audioSource != null - ? await GetBase64Audio(audioSource, tasks) - : rawBase64AudioSource) - }; - - Debug.Log("Starting pipeline computation..."); - - string requestJson = JsonConvert.SerializeObject(request); - using UnityWebRequest webRequest = UnityWebRequest.Post(inferenceEndpoint.CallbackUrl, requestJson, "application/json"); - - webRequest.SetRequestHeader(inferenceEndpoint.ApiKey.Header, inferenceEndpoint.ApiKey.Token); - - UnityWebRequestAsyncOperation operation = webRequest.SendWebRequest(); - while (!operation.isDone) - await Task.Yield(); - - if (webRequest.result != UnityWebRequest.Result.Success) - { - Debug.LogError($"Failed {nameof(ComputeOnPipeline)} request: {webRequest.error} | {webRequest.downloadHandler.text}"); - return null; - } - - BhashiniComputeResponse response = JsonConvert.DeserializeObject(webRequest.downloadHandler.text); - if (response is null) - { - Debug.LogError($"Failed {nameof(ComputeOnPipeline)} request: Could not deserialize \"{webRequest.downloadHandler.text}\""); - return null; - } - - Debug.Log("Pipeline computation completed!"); - return response; - } - } + /// + /// Configures a pipeline for the given tasks for computation. + /// + /// The pipeline tasks. + /// The configuration response if successful and otherwise. + public async Task ConfigurePipeline(params BhashiniPipelineRequestTask[] tasks) + { + BhashiniPipelineRequest request = new() + { + Tasks = tasks, + Configuration = new() + { + ProviderId = PipelineProvider, + }, + }; + + Debug.Log("Starting pipeline configuration..."); + + string requestJson = JsonConvert.SerializeObject(request); + using UnityWebRequest webRequest = UnityWebRequest.Post(PipelineConfigurationEndpoint, requestJson, "application/json"); + + webRequest.SetRequestHeader(AuthUserIdHeader, _ulcaUserId); + webRequest.SetRequestHeader(AuthUlcaApiKeyHeader, _ulcaApiKey); + + UnityWebRequestAsyncOperation operation = webRequest.SendWebRequest(); + while (!operation.isDone) + await Task.Yield(); + + if (webRequest.result is not UnityWebRequest.Result.Success) + { + Debug.LogError($"Failed {nameof(ConfigurePipeline)} request: {webRequest.error} | {webRequest.downloadHandler.text}"); + return null; + } + + BhashiniPipelineResponse response = JsonConvert.DeserializeObject(webRequest.downloadHandler.text); + if (response is null) + { + Debug.LogError($"Failed {nameof(ConfigurePipeline)} request: Could not deserialize \"{webRequest.downloadHandler.text}\""); + return null; + } + + Debug.Log("Pipeline configuration completed."); + return response; + } + + /// + /// Runs the given computation tasks on a pipeline. + /// + /// + /// Provide audio data through , not if you are using any audio other than * or **. + ///
+ ///
+ /// *Utilities.Encoding.Wav and Utilities.Audio are required. + ///
+ /// **Utilities.Audio is required. + ///
+ /// The pipeline's inference endpoint. + /// Input data for the computation. + /// The tasks to run on the pipeline. + /// The computation response if successful and otherwise. + /// Thrown when an unsupported audio encoding is encountered. + public async Task ComputeOnPipeline(BhashiniPipelineInferenceEndpoint inferenceEndpoint, BhashiniInputData input, params BhashiniComputeTask[] tasks) + { + BhashiniComputeRequest request = new() + { + Tasks = tasks, + Input = input, + }; + + Debug.Log("Starting pipeline computation..."); + + string requestJson = JsonConvert.SerializeObject(request); + using UnityWebRequest webRequest = UnityWebRequest.Post(inferenceEndpoint.CallbackUrl, requestJson, "application/json"); + + webRequest.SetRequestHeader(inferenceEndpoint.ApiKey.Header, inferenceEndpoint.ApiKey.Token); + + UnityWebRequestAsyncOperation operation = webRequest.SendWebRequest(); + while (!operation.isDone) + await Task.Yield(); + + if (webRequest.result != UnityWebRequest.Result.Success) + { + Debug.LogError($"Failed {nameof(ComputeOnPipeline)} request: {webRequest.error} | {webRequest.downloadHandler.text}"); + return null; + } + + BhashiniComputeResponse response = JsonConvert.DeserializeObject(webRequest.downloadHandler.text); + if (response is null) + { + Debug.LogError($"Failed {nameof(ComputeOnPipeline)} request: Could not deserialize \"{webRequest.downloadHandler.text}\""); + return null; + } + + Debug.Log("Pipeline computation completed!"); + return response; + } + } } diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Samples~/ASR-Translate-TTS.meta b/UBhashini/Packages/com.uralstech.ubhashini/Samples~/ASR-Translate-TTS.meta deleted file mode 100644 index 4e6528c..0000000 --- a/UBhashini/Packages/com.uralstech.ubhashini/Samples~/ASR-Translate-TTS.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8d1a0484249d6b041b3289bb17b301b5 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Samples~/ASR-Translate-TTS/Scenes/ASR-Translate-TTS_Demo.unity b/UBhashini/Packages/com.uralstech.ubhashini/Samples~/ASR-Translate-TTS/Scenes/ASR-Translate-TTS_Demo.unity index bccdd1e..6ddccc5 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Samples~/ASR-Translate-TTS/Scenes/ASR-Translate-TTS_Demo.unity +++ b/UBhashini/Packages/com.uralstech.ubhashini/Samples~/ASR-Translate-TTS/Scenes/ASR-Translate-TTS_Demo.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 9 + serializedVersion: 10 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -42,8 +42,8 @@ RenderSettings: --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 1 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -66,9 +66,6 @@ LightmapSettings: m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 m_MixedBakeMode: 2 m_BakeBackend: 1 @@ -477,7 +474,7 @@ MonoBehaviour: m_TargetGraphic: {fileID: 1080123103} m_HandleRect: {fileID: 1080123102} m_Direction: 0 - m_Value: 0 + m_Value: 1 m_Size: 1 m_NumberOfSteps: 0 m_OnValueChanged: @@ -1266,7 +1263,7 @@ MonoBehaviour: m_TargetGraphic: {fileID: 1970536205} m_HandleRect: {fileID: 1970536204} m_Direction: 2 - m_Value: 0 + m_Value: 1 m_Size: 1 m_NumberOfSteps: 0 m_OnValueChanged: @@ -2651,6 +2648,7 @@ AudioSource: serializedVersion: 4 OutputAudioMixerGroup: {fileID: 0} m_audioClip: {fileID: 0} + m_Resource: {fileID: 0} m_PlayOnAwake: 0 m_Volume: 1 m_Pitch: 1 @@ -3166,7 +3164,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: PipelineConfigurationEndpoint: https://meity-auth.ulcacontrib.org/ulca/apis/v0/model/getModelsPipeline - PipelineId: 64392f96daac500b55c543cd + PipelineProvider: 64392f96daac500b55c543cd _ulcaUserId: _ulcaApiKey: --- !u!4 &1398634382 diff --git a/UBhashini/Packages/com.uralstech.ubhashini/Samples~/ASR-Translate-TTS/Scripts/AsrTranslateTtsDemo.cs b/UBhashini/Packages/com.uralstech.ubhashini/Samples~/ASR-Translate-TTS/Scripts/AsrTranslateTtsDemo.cs index bf07369..c6ed5a8 100644 --- a/UBhashini/Packages/com.uralstech.ubhashini/Samples~/ASR-Translate-TTS/Scripts/AsrTranslateTtsDemo.cs +++ b/UBhashini/Packages/com.uralstech.ubhashini/Samples~/ASR-Translate-TTS/Scripts/AsrTranslateTtsDemo.cs @@ -2,8 +2,8 @@ using UnityEngine.UI; using Uralstech.UBhashini; using Uralstech.UBhashini.Data; -using Uralstech.UBhashini.Data.Pipeline; using Uralstech.UBhashini.Data.Compute; +using Uralstech.UBhashini.Data.Pipeline; public class AsrTranslateTtsDemo : MonoBehaviour { @@ -11,7 +11,6 @@ public class AsrTranslateTtsDemo : MonoBehaviour private const string StopRecordingText = "Stop Recording"; [SerializeField] private AudioSource _audioSource; - [SerializeField] private Text _recordingButtonText; [SerializeField] private InputField _sourceLanguage; @@ -20,18 +19,15 @@ public class AsrTranslateTtsDemo : MonoBehaviour private AudioClip _audioClip; private string _microphoneDevice; - private BhashiniPipelineTaskConfiguration _sttData; - private BhashiniPipelineTaskConfiguration _translateData; - private BhashiniPipelineTaskConfiguration _ttsData; - private BhashiniPipelineInferenceEndpoint _inferenceData; + private BhashiniPipelineResponse _pipelines; private BhashiniVoiceType _voiceType; private int _sampleRate; - private void Awake() + protected void Awake() { _recordingButtonText.text = StartRecordingText; - + AudioConfiguration configuration = AudioSettings.GetConfiguration(); _sampleRate = configuration.sampleRate; @@ -64,25 +60,18 @@ public async void SetupPipelines() { Debug.Log("Setting up pipelines."); - BhashiniPipelineResponse response = await BhashiniManager.Instance.ConfigurePipeline(new BhashiniPipelineRequestTask[] - { - new BhashiniPipelineRequestTask(BhashiniPipelineTaskType.SpeechToText, _sourceLanguage.text), - new BhashiniPipelineRequestTask(BhashiniPipelineTaskType.Translation, _sourceLanguage.text, _targetLanguage.text), - new BhashiniPipelineRequestTask(BhashiniPipelineTaskType.TextToSpeech, _targetLanguage.text), - }); + _pipelines = await BhashiniManager.Instance.ConfigurePipeline( + new BhashiniPipelineRequestTask(BhashiniTask.SpeechToText, _sourceLanguage.text), + new BhashiniPipelineRequestTask(BhashiniTask.Translation, _sourceLanguage.text, _targetLanguage.text), + new BhashiniPipelineRequestTask(BhashiniTask.TextToSpeech, _targetLanguage.text) + ); - if (response is null) + if (_pipelines is null) { Debug.LogError("Could not configure pipline!"); return; } - _inferenceData = response.InferenceEndpoint; - - _sttData = response.PipelineConfigurations[0].Configurations[0]; - _translateData = response.PipelineConfigurations[1].Configurations[0]; - _ttsData = response.PipelineConfigurations[2].Configurations[0]; - Debug.Log("Pipeline configured!"); } @@ -95,14 +84,13 @@ private async void DoAsrTranslateTts() { Debug.Log("Doing computation..."); - BhashiniComputeTask[] tasks = new BhashiniComputeTask[] - { - _sttData.ToSpeechToTextTask(sampleRate: _sampleRate), - _translateData.ToTranslateTask(), - _ttsData.ToTextToSpeechTask(_voiceType), - }; + BhashiniInputData input = new(_audioClip, BhashiniAudioFormat.Wav); - BhashiniComputeResponse response = await BhashiniManager.Instance.ComputeOnPipeline(_inferenceData, tasks, audioSource: _audioClip); + BhashiniComputeResponse response = await BhashiniManager.Instance.ComputeOnPipeline(_pipelines.InferenceEndpoint, input, + _pipelines.SpeechToTextConfiguration.First.ToSpeechToTextTask(sampleRate: _sampleRate, audioFormat: BhashiniAudioFormat.Wav), + _pipelines.TranslateConfiguration.First.ToTranslateTask(), + _pipelines.TextToSpeechConfiguration.First.ToTextToSpeechTask(_voiceType) + ); if (response is null) { diff --git a/UBhashini/ProjectSettings/SceneTemplateSettings.json b/UBhashini/ProjectSettings/SceneTemplateSettings.json index 5e97f83..1edced2 100644 --- a/UBhashini/ProjectSettings/SceneTemplateSettings.json +++ b/UBhashini/ProjectSettings/SceneTemplateSettings.json @@ -61,6 +61,11 @@ "type": "UnityEngine.PhysicMaterial", "defaultInstantiationMode": 0 }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial", + "defaultInstantiationMode": 0 + }, { "userAdded": false, "type": "UnityEngine.PhysicsMaterial2D",