├── .gitignore ├── Assembly-CSharp.Player.csproj ├── Assembly-CSharp.csproj ├── Assets ├── Plugins.meta ├── Plugins │ ├── Newtonsoft.Json.dll │ ├── Newtonsoft.Json.dll.meta │ └── UWP.meta ├── Scenes.meta ├── Scenes │ ├── DemoScene.unity │ └── DemoScene.unity.meta ├── Scripts.meta ├── Scripts │ ├── CogSvcSocketAuthentication.cs │ ├── CogSvcSocketAuthentication.cs.meta │ ├── RecognitionContent.cs │ ├── RecognitionContent.cs.meta │ ├── SecretHelper.cs │ ├── SecretHelper.cs.meta │ ├── SpeechManager.cs │ ├── SpeechManager.cs.meta │ ├── SpeechRecognitionService.cs │ ├── SpeechRecognitionService.cs.meta │ ├── SpeechServiceResult.cs │ ├── SpeechServiceResult.cs.meta │ ├── Telemetry.cs │ ├── Telemetry.cs.meta │ ├── UnityDispatcher.cs │ └── UnityDispatcher.cs.meta ├── StreamingAssets.meta ├── StreamingAssets │ ├── Thisisatest.wav │ └── Thisisatest.wav.meta ├── WSATestCertificate.pfx ├── WSATestCertificate.pfx.meta ├── mcs.rsp └── mcs.rsp.meta ├── LICENSE ├── ProjectSettings ├── AudioManager.asset ├── ClusterInputManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── NavMeshAreas.asset ├── NetworkManager.asset ├── Physics2DSettings.asset ├── PresetManager.asset ├── ProjectSettings.asset ├── ProjectVersion.txt ├── QualitySettings.asset ├── TagManager.asset ├── TimeManager.asset └── UnityConnectSettings.asset ├── README.md ├── Screenshots └── SpeechRecoExample01.gif ├── Unity-MS-SpeechSDK.Player.csproj ├── Unity-MS-SpeechSDK.csproj └── Unity-MS-SpeechSDK.sln /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | [Rr]ef/ 19 | x64/ 20 | x86/ 21 | [Bb]uild/* 22 | [Bb]uilds/* 23 | bld/ 24 | [Bb]in/ 25 | [Oo]bj/ 26 | 27 | # Packaging libraries 28 | [Pp]ackaging/Builds/* 29 | [Pp]ackaging/Packages/* 30 | 31 | # Packaging content OK 32 | ![Pp]ackaging/Content/** 33 | 34 | # Always get Unity root tools 35 | ![U]nity/** 36 | 37 | # Always include Unity Assets 38 | ![Aa]ssets/AssetStoreTools/** 39 | ![Aa]ssets/** 40 | 41 | # Always ignore Unity Library and Temp folders 42 | **/[Ll]ibrary/* 43 | **/[Tt]emp/ 44 | 45 | # Always ignore Unity ML-Agents Tensorflow plugins folder (they're way too big) 46 | [Aa]ssets/[Mm][Ll]-[Aa]gents/[Pp]lugins/** 47 | 48 | # Ignore UWP folder for projects that target this 49 | **/[Uu]WP/* 50 | 51 | # Visual Studo 2015 cache/options directory 52 | .vs/ 53 | 54 | # MSTest test Results 55 | [Tt]est[Rr]esult*/ 56 | [Bb]uild[Ll]og.* 57 | 58 | # NUNIT 59 | *.VisualState.xml 60 | TestResult.xml 61 | 62 | # Build Results of an ATL Project 63 | [Dd]ebugPS/ 64 | [Rr]eleasePS/ 65 | dlldata.c 66 | 67 | *_i.c 68 | *_p.c 69 | *_i.h 70 | *.ilk 71 | *.obj 72 | *.pch 73 | *.pdb 74 | *.pgc 75 | *.pgd 76 | *.sbr 77 | *.tlb 78 | *.tli 79 | *.tlh 80 | *.tmp 81 | *.tmp_proj 82 | *.log 83 | *.vspscc 84 | *.vssscc 85 | .builds 86 | *.pidb 87 | *.svclog 88 | *.scc 89 | 90 | # Chutzpah Test files 91 | _Chutzpah* 92 | 93 | # Visual C++ cache files 94 | ipch/ 95 | *.aps 96 | *.ncb 97 | *.opensdf 98 | *.sdf 99 | *.cachefile 100 | 101 | # Visual Studio profiler 102 | *.psess 103 | *.vsp 104 | *.vspx 105 | 106 | # TFS 2012 Local Workspace 107 | $tf/ 108 | 109 | # Guidance Automation Toolkit 110 | *.gpState 111 | 112 | # ReSharper is a .NET coding add-in 113 | _ReSharper*/ 114 | *.[Rr]e[Ss]harper 115 | *.DotSettings.user 116 | 117 | # JustCode is a .NET coding addin-in 118 | .JustCode 119 | 120 | # TeamCity is a build add-in 121 | _TeamCity* 122 | 123 | # DotCover is a Code Coverage Tool 124 | *.dotCover 125 | 126 | # NCrunch 127 | _NCrunch_* 128 | .*crunch*.local.xml 129 | 130 | # MightyMoose 131 | *.mm.* 132 | AutoTest.Net/ 133 | 134 | # Web workbench (sass) 135 | .sass-cache/ 136 | 137 | # Installshield output folder 138 | [Ee]xpress/ 139 | 140 | # DocProject is a documentation generator add-in 141 | DocProject/buildhelp/ 142 | DocProject/Help/*.HxT 143 | DocProject/Help/*.HxC 144 | DocProject/Help/*.hhc 145 | DocProject/Help/*.hhk 146 | DocProject/Help/*.hhp 147 | DocProject/Help/Html2 148 | DocProject/Help/html 149 | 150 | # Click-Once directory 151 | publish/ 152 | 153 | # Publish Web Output 154 | *.[Pp]ublish.xml 155 | *.azurePubxml 156 | # TODO: Comment the next line if you want to checkin your web deploy settings 157 | # but database connection strings (with potential passwords) will be unencrypted 158 | *.pubxml 159 | *.publishproj 160 | 161 | # NuGet Packages 162 | *.nupkg 163 | # The packages folder can be ignored because of Package Restore 164 | **/packages/* 165 | # except build/, which is used as an MSBuild target. 166 | !**/packages/build/ 167 | # Uncomment if necessary however generally it will be regenerated when needed 168 | #!**/packages/repositories.config 169 | # VSIX Packages OK 170 | !**/VisualStudio/VSFeatureEngine/Packages/* 171 | # Lock files 172 | **/project.lock.json 173 | 174 | # Windows Azure Build Output 175 | csx/ 176 | *.build.csdef 177 | 178 | # Windows Store app package directory 179 | AppPackages/ 180 | 181 | # Others 182 | *.[Cc]ache 183 | ClientBin/ 184 | [Ss]tyle[Cc]op.* 185 | ~$* 186 | *~ 187 | *.dbmdl 188 | *.dbproj.schemaview 189 | # *.pfx // Allowing PFX because all PFX files are for samples 190 | *.publishsettings 191 | node_modules/ 192 | bower_components/ 193 | 194 | # RIA/Silverlight projects 195 | Generated_Code/ 196 | 197 | # Backup & report files from converting an old project file 198 | # to a newer Visual Studio version. Backup files are not needed, 199 | # because we have git ;-) 200 | _UpgradeReport_Files/ 201 | Backup*/ 202 | UpgradeLog*.XML 203 | UpgradeLog*.htm 204 | 205 | # SQL Server files 206 | *.mdf 207 | *.ldf 208 | 209 | # Business Intelligence projects 210 | *.rdl.data 211 | *.bim.layout 212 | *.bim_*.settings 213 | 214 | # Microsoft Fakes 215 | FakesAssemblies/ 216 | 217 | # Node.js Tools for Visual Studio 218 | .ntvs_analysis.dat 219 | 220 | # Visual Studio 6 build log 221 | *.plg 222 | 223 | # Visual Studio 6 workspace options file 224 | *.opt 225 | -------------------------------------------------------------------------------- /Assembly-CSharp.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 6 5 | 6 | 7 | Debug 8 | AnyCPU 9 | 10.0.20506 10 | 2.0 11 | 12 | {F3E48ABF-828A-2E3A-DF90-868EDB1B039E} 13 | Library 14 | Properties 15 | Assembly-CSharp 16 | v4.7.1 17 | 512 18 | . 19 | 20 | 21 | true 22 | full 23 | false 24 | Temp\bin\Debug\ 25 | DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_2_20;UNITY_2018_2;UNITY_2018;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_SPRITES;ENABLE_GRID;ENABLE_TILEMAP;ENABLE_TERRAIN;ENABLE_TEXTURE_STREAMING;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;INCLUDE_PUBNUB;ENABLE_VIDEO;ENABLE_PACKMAN;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_LOCALIZATION;PLATFORM_ANDROID;UNITY_ANDROID;UNITY_ANDROID_API;ENABLE_SUBSTANCE;ENABLE_EGL;ENABLE_NETWORK;ENABLE_RUNTIME_GI;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_EVENT_QUEUE;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_NATIVE_CRASH_REPORTING;PLATFORM_SUPPORTS_ADS_ID;UNITY_CAN_SHOW_SPLASH_SCREEN;ENABLE_VR;ENABLE_AR;ENABLE_SPATIALTRACKING;ENABLE_UNITYADS_RUNTIME;UNITY_UNITYADS_API;ENABLE_MONO;NET_4_6;DEVELOPMENT_BUILD;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_VSTU;UNITY_PRO_LICENSE;UNITY_HAS_GOOGLEVR;UNITY_HAS_TANGO 26 | prompt 27 | 4 28 | 0169 29 | False 30 | 31 | 32 | pdbonly 33 | true 34 | Temp\bin\Release\ 35 | prompt 36 | 4 37 | 0169 38 | False 39 | 40 | 41 | true 42 | true 43 | false 44 | false 45 | false 46 | 47 | 48 | {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 49 | Unity/VSTU 50 | Game:1 51 | Android:13 52 | 2018.2.20f1 53 | 54 | 55 | 56 | C:\Program Files\Unity\Hub\Editor\2018.2.20f1\Editor\Data\Managed/UnityEngine/UnityEngine.dll 57 | 58 | 59 | C:\Program Files\Unity\Hub\Editor\2018.2.20f1\Editor\Data\Managed/UnityEditor.dll 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | D:/Dev/Git/Unity-MS-SpeechSDK/Library/ScriptAssemblies/Unity.PackageManagerUI.Editor.dll 73 | 74 | 75 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.AIModule.dll 76 | 77 | 78 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.ARModule.dll 79 | 80 | 81 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.AccessibilityModule.dll 82 | 83 | 84 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.AnimationModule.dll 85 | 86 | 87 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.AssetBundleModule.dll 88 | 89 | 90 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.AudioModule.dll 91 | 92 | 93 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.BaselibModule.dll 94 | 95 | 96 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.ClothModule.dll 97 | 98 | 99 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.CloudWebServicesModule.dll 100 | 101 | 102 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.CoreModule.dll 103 | 104 | 105 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.CrashReportingModule.dll 106 | 107 | 108 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.DirectorModule.dll 109 | 110 | 111 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.FacebookModule.dll 112 | 113 | 114 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.FileSystemHttpModule.dll 115 | 116 | 117 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.GameCenterModule.dll 118 | 119 | 120 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.GridModule.dll 121 | 122 | 123 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.HotReloadModule.dll 124 | 125 | 126 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.IMGUIModule.dll 127 | 128 | 129 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.ImageConversionModule.dll 130 | 131 | 132 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.InputModule.dll 133 | 134 | 135 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll 136 | 137 | 138 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.LocalizationModule.dll 139 | 140 | 141 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll 142 | 143 | 144 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.ParticlesLegacyModule.dll 145 | 146 | 147 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll 148 | 149 | 150 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.PhysicsModule.dll 151 | 152 | 153 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.Physics2DModule.dll 154 | 155 | 156 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.ProfilerModule.dll 157 | 158 | 159 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll 160 | 161 | 162 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll 163 | 164 | 165 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.SpatialTrackingModule.dll 166 | 167 | 168 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll 169 | 170 | 171 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll 172 | 173 | 174 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.StreamingModule.dll 175 | 176 | 177 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.StyleSheetsModule.dll 178 | 179 | 180 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.SubstanceModule.dll 181 | 182 | 183 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.TLSModule.dll 184 | 185 | 186 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainModule.dll 187 | 188 | 189 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll 190 | 191 | 192 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.TextRenderingModule.dll 193 | 194 | 195 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.TilemapModule.dll 196 | 197 | 198 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.TimelineModule.dll 199 | 200 | 201 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.UIModule.dll 202 | 203 | 204 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.UIElementsModule.dll 205 | 206 | 207 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.UNETModule.dll 208 | 209 | 210 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.UmbraModule.dll 211 | 212 | 213 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll 214 | 215 | 216 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityConnectModule.dll 217 | 218 | 219 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll 220 | 221 | 222 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll 223 | 224 | 225 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll 226 | 227 | 228 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll 229 | 230 | 231 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll 232 | 233 | 234 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.VRModule.dll 235 | 236 | 237 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.VehiclesModule.dll 238 | 239 | 240 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.VideoModule.dll 241 | 242 | 243 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.WindModule.dll 244 | 245 | 246 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.XRModule.dll 247 | 248 | 249 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/Managed/Unity.Locator.dll 250 | 251 | 252 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll 253 | 254 | 255 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll 256 | 257 | 258 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll 259 | 260 | 261 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/PlaybackEngines/VuforiaSupport/Managed/Runtime/Vuforia.UnityExtensions.dll 262 | 263 | 264 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/UnityExtensions/Unity/UnityGoogleAudioSpatializer/RuntimeEditor/UnityEngine.GoogleAudioSpatializer.dll 265 | 266 | 267 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/UnityExtensions/Unity/UnityHoloLens/RuntimeEditor/UnityEngine.HoloLens.dll 268 | 269 | 270 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/UnityExtensions/Unity/UnitySpatialTracking/RuntimeEditor/UnityEngine.SpatialTracking.dll 271 | 272 | 273 | D:/Dev/Git/Unity-MS-SpeechSDK/Assets/Plugins/Newtonsoft.Json.dll 274 | 275 | 276 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/mscorlib.dll 277 | 278 | 279 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.dll 280 | 281 | 282 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Core.dll 283 | 284 | 285 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Runtime.Serialization.dll 286 | 287 | 288 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Xml.dll 289 | 290 | 291 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Xml.Linq.dll 292 | 293 | 294 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Numerics.dll 295 | 296 | 297 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Numerics.Vectors.dll 298 | 299 | 300 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Net.Http.dll 301 | 302 | 303 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Microsoft.CSharp.dll 304 | 305 | 306 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Data.dll 307 | 308 | 309 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/Microsoft.Win32.Primitives.dll 310 | 311 | 312 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/netstandard.dll 313 | 314 | 315 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.AppContext.dll 316 | 317 | 318 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.Concurrent.dll 319 | 320 | 321 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.dll 322 | 323 | 324 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.NonGeneric.dll 325 | 326 | 327 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Collections.Specialized.dll 328 | 329 | 330 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.Annotations.dll 331 | 332 | 333 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.dll 334 | 335 | 336 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.EventBasedAsync.dll 337 | 338 | 339 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.Primitives.dll 340 | 341 | 342 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ComponentModel.TypeConverter.dll 343 | 344 | 345 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Console.dll 346 | 347 | 348 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Data.Common.dll 349 | 350 | 351 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Contracts.dll 352 | 353 | 354 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Debug.dll 355 | 356 | 357 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.FileVersionInfo.dll 358 | 359 | 360 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Process.dll 361 | 362 | 363 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.StackTrace.dll 364 | 365 | 366 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.TextWriterTraceListener.dll 367 | 368 | 369 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.Tools.dll 370 | 371 | 372 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Diagnostics.TraceSource.dll 373 | 374 | 375 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Drawing.Primitives.dll 376 | 377 | 378 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Dynamic.Runtime.dll 379 | 380 | 381 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.Calendars.dll 382 | 383 | 384 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.dll 385 | 386 | 387 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Globalization.Extensions.dll 388 | 389 | 390 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.Compression.ZipFile.dll 391 | 392 | 393 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.dll 394 | 395 | 396 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.dll 397 | 398 | 399 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.DriveInfo.dll 400 | 401 | 402 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.Primitives.dll 403 | 404 | 405 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.FileSystem.Watcher.dll 406 | 407 | 408 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.IsolatedStorage.dll 409 | 410 | 411 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.MemoryMappedFiles.dll 412 | 413 | 414 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.Pipes.dll 415 | 416 | 417 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.IO.UnmanagedMemoryStream.dll 418 | 419 | 420 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.dll 421 | 422 | 423 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Expressions.dll 424 | 425 | 426 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Parallel.dll 427 | 428 | 429 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Linq.Queryable.dll 430 | 431 | 432 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Http.Rtc.dll 433 | 434 | 435 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.NameResolution.dll 436 | 437 | 438 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.NetworkInformation.dll 439 | 440 | 441 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Ping.dll 442 | 443 | 444 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Primitives.dll 445 | 446 | 447 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Requests.dll 448 | 449 | 450 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Security.dll 451 | 452 | 453 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.Sockets.dll 454 | 455 | 456 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebHeaderCollection.dll 457 | 458 | 459 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebSockets.Client.dll 460 | 461 | 462 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Net.WebSockets.dll 463 | 464 | 465 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ObjectModel.dll 466 | 467 | 468 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.dll 469 | 470 | 471 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.dll 472 | 473 | 474 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.ILGeneration.dll 475 | 476 | 477 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Emit.Lightweight.dll 478 | 479 | 480 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Extensions.dll 481 | 482 | 483 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Reflection.Primitives.dll 484 | 485 | 486 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.Reader.dll 487 | 488 | 489 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.ResourceManager.dll 490 | 491 | 492 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Resources.Writer.dll 493 | 494 | 495 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.CompilerServices.VisualC.dll 496 | 497 | 498 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.dll 499 | 500 | 501 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Extensions.dll 502 | 503 | 504 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Handles.dll 505 | 506 | 507 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.dll 508 | 509 | 510 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.RuntimeInformation.dll 511 | 512 | 513 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.InteropServices.WindowsRuntime.dll 514 | 515 | 516 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Numerics.dll 517 | 518 | 519 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Formatters.dll 520 | 521 | 522 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Json.dll 523 | 524 | 525 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Primitives.dll 526 | 527 | 528 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Runtime.Serialization.Xml.dll 529 | 530 | 531 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Claims.dll 532 | 533 | 534 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Algorithms.dll 535 | 536 | 537 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Csp.dll 538 | 539 | 540 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Encoding.dll 541 | 542 | 543 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.Primitives.dll 544 | 545 | 546 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Cryptography.X509Certificates.dll 547 | 548 | 549 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.Principal.dll 550 | 551 | 552 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Security.SecureString.dll 553 | 554 | 555 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Duplex.dll 556 | 557 | 558 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Http.dll 559 | 560 | 561 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.NetTcp.dll 562 | 563 | 564 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Primitives.dll 565 | 566 | 567 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ServiceModel.Security.dll 568 | 569 | 570 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.Encoding.dll 571 | 572 | 573 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.Encoding.Extensions.dll 574 | 575 | 576 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Text.RegularExpressions.dll 577 | 578 | 579 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.dll 580 | 581 | 582 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Overlapped.dll 583 | 584 | 585 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Tasks.dll 586 | 587 | 588 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Tasks.Parallel.dll 589 | 590 | 591 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Thread.dll 592 | 593 | 594 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.ThreadPool.dll 595 | 596 | 597 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Threading.Timer.dll 598 | 599 | 600 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.ValueTuple.dll 601 | 602 | 603 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.ReaderWriter.dll 604 | 605 | 606 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XDocument.dll 607 | 608 | 609 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XmlDocument.dll 610 | 611 | 612 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XmlSerializer.dll 613 | 614 | 615 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XPath.dll 616 | 617 | 618 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/Facades/System.Xml.XPath.XDocument.dll 619 | 620 | 621 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/UnityScript.dll 622 | 623 | 624 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/UnityScript.Lang.dll 625 | 626 | 627 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/unityscript/Boo.Lang.dll 628 | 629 | 630 | C:/Program Files/Unity/Hub/Editor/2018.2.20f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/System.Net.Http.dll 631 | 632 | 633 | 634 | 635 | 642 | -------------------------------------------------------------------------------- /Assets/Plugins.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 09a2e18e03c7a63418f69e8ace80ba7c 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Plugins/Newtonsoft.Json.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ActiveNick/Unity-MS-SpeechSDK/213df35b2e91be47827f87d0fa9e8fbdc9250abb/Assets/Plugins/Newtonsoft.Json.dll -------------------------------------------------------------------------------- /Assets/Plugins/Newtonsoft.Json.dll.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d087ad3f7f2212d418dbf39dc5559cd7 3 | PluginImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | iconMap: {} 7 | executionOrder: {} 8 | isPreloaded: 0 9 | isOverridable: 0 10 | platformData: 11 | - first: 12 | '': Any 13 | second: 14 | enabled: 0 15 | settings: 16 | Exclude Android: 0 17 | Exclude Editor: 0 18 | Exclude Linux: 0 19 | Exclude Linux64: 0 20 | Exclude LinuxUniversal: 0 21 | Exclude OSXIntel: 1 22 | Exclude OSXIntel64: 1 23 | Exclude OSXUniversal: 0 24 | Exclude WebGL: 1 25 | Exclude Win: 0 26 | Exclude Win64: 0 27 | Exclude WindowsStoreApps: 1 28 | - first: 29 | Android: Android 30 | second: 31 | enabled: 1 32 | settings: 33 | CPU: ARMv7 34 | - first: 35 | Any: 36 | second: 37 | enabled: 0 38 | settings: {} 39 | - first: 40 | Editor: Editor 41 | second: 42 | enabled: 1 43 | settings: 44 | CPU: AnyCPU 45 | DefaultValueInitialized: true 46 | OS: AnyOS 47 | - first: 48 | Facebook: Win 49 | second: 50 | enabled: 0 51 | settings: 52 | CPU: AnyCPU 53 | - first: 54 | Facebook: Win64 55 | second: 56 | enabled: 0 57 | settings: 58 | CPU: AnyCPU 59 | - first: 60 | Standalone: Linux 61 | second: 62 | enabled: 1 63 | settings: 64 | CPU: x86 65 | - first: 66 | Standalone: Linux64 67 | second: 68 | enabled: 1 69 | settings: 70 | CPU: x86_64 71 | - first: 72 | Standalone: LinuxUniversal 73 | second: 74 | enabled: 1 75 | settings: 76 | CPU: AnyCPU 77 | - first: 78 | Standalone: OSXIntel 79 | second: 80 | enabled: 0 81 | settings: 82 | CPU: AnyCPU 83 | - first: 84 | Standalone: OSXIntel64 85 | second: 86 | enabled: 0 87 | settings: 88 | CPU: AnyCPU 89 | - first: 90 | Standalone: OSXUniversal 91 | second: 92 | enabled: 1 93 | settings: 94 | CPU: None 95 | - first: 96 | Standalone: Win 97 | second: 98 | enabled: 1 99 | settings: 100 | CPU: AnyCPU 101 | - first: 102 | Standalone: Win64 103 | second: 104 | enabled: 1 105 | settings: 106 | CPU: AnyCPU 107 | - first: 108 | WebGL: WebGL 109 | second: 110 | enabled: 0 111 | settings: {} 112 | - first: 113 | Windows Store Apps: WindowsStoreApps 114 | second: 115 | enabled: 0 116 | settings: 117 | CPU: AnyCPU 118 | DontProcess: false 119 | PlaceholderPath: 120 | SDK: AnySDK 121 | ScriptingBackend: AnyScriptingBackend 122 | userData: 123 | assetBundleName: 124 | assetBundleVariant: 125 | -------------------------------------------------------------------------------- /Assets/Plugins/UWP.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5459def2bca99f24fa2e7ead4d3eb304 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4f704ae4b4f98ae41a0bce26658850c1 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scenes/DemoScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 99c9720ab356a0642a771bea13969a05 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 56e3e1dd41bcd0442bdd81f033bcb5b5 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/CogSvcSocketAuthentication.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // Licensed under the MIT license. 4 | // 5 | // Microsoft Cognitive Services (formerly Project Oxford): 6 | // https://www.microsoft.com/cognitive-services 7 | // 8 | // New Speech Service: 9 | // https://docs.microsoft.com/en-us/azure/cognitive-services/Speech-Service/ 10 | // Old Bing Speech SDK: 11 | // https://docs.microsoft.com/en-us/azure/cognitive-services/Speech/home 12 | // 13 | // Copyright (c) Microsoft Corporation 14 | // All rights reserved. 15 | // 16 | // MIT License: 17 | // Permission is hereby granted, free of charge, to any person obtaining 18 | // a copy of this software and associated documentation files (the 19 | // "Software"), to deal in the Software without restriction, including 20 | // without limitation the rights to use, copy, modify, merge, publish, 21 | // distribute, sublicense, and/or sell copies of the Software, and to 22 | // permit persons to whom the Software is furnished to do so, subject to 23 | // the following conditions: 24 | // 25 | // The above copyright notice and this permission notice shall be 26 | // included in all copies or substantial portions of the Software. 27 | // 28 | // THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, 29 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 30 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 31 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 32 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 33 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 34 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 35 | // 36 | 37 | using System; 38 | using System.Net.Http; 39 | using System.Threading; 40 | using System.Threading.Tasks; 41 | using UnityEngine; 42 | 43 | namespace SpeechRecognitionService 44 | { 45 | public class CogSvcSocketAuthentication 46 | { 47 | public static string AuthenticationUri; 48 | private string subscriptionKey; 49 | private string token; 50 | private Timer accessTokenRenewer; 51 | 52 | //Access token expires every 10 minutes. Renew it every 9 minutes. 53 | private const int RefreshTokenDuration = 9; 54 | 55 | // Set usebingspeechservice to true in the client constructor if you want to use the old Bing Speech SDK 56 | // instead of the new Speech Service (new API is the default). 57 | public async Task Authenticate(string subscriptionKey, string region, bool usebingspeechservice = false) 58 | { 59 | try 60 | { 61 | // Important: The Bing Speech service and the new Speech Service DO NOT use the same Uri 62 | if (!usebingspeechservice) 63 | { 64 | AuthenticationUri = $"https://{region}.api.cognitive.microsoft.com/sts/v1.0"; 65 | } 66 | else 67 | { 68 | // The region is ignored for the old Bing Speech service 69 | AuthenticationUri = "https://api.cognitive.microsoft.com/sts/v1.0"; 70 | } 71 | 72 | this.subscriptionKey = subscriptionKey; 73 | this.token = await FetchToken(AuthenticationUri, subscriptionKey); 74 | 75 | // Renew the token based on a fixed interval using a Timer 76 | accessTokenRenewer = new Timer(new TimerCallback(OnTokenExpiredCallback), 77 | this, 78 | TimeSpan.FromMinutes(RefreshTokenDuration), 79 | TimeSpan.FromMilliseconds(-1)); 80 | return this.token; 81 | } 82 | catch (Exception ex) 83 | { 84 | Debug.Log($"An exception occurred during authentication:{Environment.NewLine}{ex.Message}"); 85 | return null; 86 | } 87 | } 88 | 89 | public string GetAccessToken() 90 | { 91 | return this.token; 92 | } 93 | 94 | private async void RenewAccessToken() 95 | { 96 | this.token = await FetchToken(AuthenticationUri, this.subscriptionKey); 97 | Debug.Log($"Renewed authentication token: {this.token}"); 98 | } 99 | 100 | private void OnTokenExpiredCallback(object stateInfo) 101 | { 102 | try 103 | { 104 | RenewAccessToken(); 105 | } 106 | catch (Exception ex) 107 | { 108 | Debug.Log($"Failed renewing access token. Details: {ex.Message}"); 109 | } 110 | finally 111 | { 112 | try 113 | { 114 | accessTokenRenewer.Change(TimeSpan.FromMinutes(RefreshTokenDuration), TimeSpan.FromMilliseconds(-1)); 115 | } 116 | catch (Exception ex) 117 | { 118 | Debug.Log($"Failed to reschedule the timer to renew access token. Details: {ex.Message}"); 119 | } 120 | } 121 | } 122 | 123 | private async Task FetchToken(string fetchUri, string subscriptionKey) 124 | { 125 | using (var client = new HttpClient()) 126 | { 127 | client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey); 128 | UriBuilder uriBuilder = new UriBuilder(fetchUri); 129 | uriBuilder.Path += "/issueToken"; 130 | 131 | // Using ConfigureAwait(false) to configures the awaiter used to await this Task to prevent 132 | // the attempt to marshal the continuation back to the original context captured. 133 | var result = await client.PostAsync(uriBuilder.Uri.AbsoluteUri, null).ConfigureAwait(false); 134 | Debug.Log("Token Uri: " + uriBuilder.Uri.AbsoluteUri); 135 | return await result.Content.ReadAsStringAsync(); 136 | } 137 | } 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /Assets/Scripts/CogSvcSocketAuthentication.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 10e27baaaab3fe24692a829d626a09b0 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/RecognitionContent.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // Licensed under the MIT license. 4 | // 5 | // Microsoft Cognitive Services (formerly Project Oxford): 6 | // https://www.microsoft.com/cognitive-services 7 | // 8 | // New Speech Service: 9 | // https://docs.microsoft.com/en-us/azure/cognitive-services/Speech-Service/ 10 | // Old Bing Speech SDK: 11 | // https://docs.microsoft.com/en-us/azure/cognitive-services/Speech/home 12 | // 13 | // Copyright (c) Microsoft Corporation 14 | // All rights reserved. 15 | // 16 | // MIT License: 17 | // Permission is hereby granted, free of charge, to any person obtaining 18 | // a copy of this software and associated documentation files (the 19 | // "Software"), to deal in the Software without restriction, including 20 | // without limitation the rights to use, copy, modify, merge, publish, 21 | // distribute, sublicense, and/or sell copies of the Software, and to 22 | // permit persons to whom the Software is furnished to do so, subject to 23 | // the following conditions: 24 | // 25 | // The above copyright notice and this permission notice shall be 26 | // included in all copies or substantial portions of the Software. 27 | // 28 | // THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, 29 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 30 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 31 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 32 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 33 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 34 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 35 | // 36 | 37 | namespace SpeechRecognitionService 38 | { 39 | public class RecognitionContent 40 | { 41 | public Context context { get; set; } 42 | public string RecognitionStatus { get; set; } 43 | /// 44 | /// The Text field is used when a recognition HYPOTHESIS is produced. 45 | /// 46 | public string Text { get; set; } 47 | /// 48 | /// The Displaytext field is used when the final recognized PHRASE is produced. 49 | /// 50 | public string DisplayText { get; set; } 51 | public int Offset { get; set; } 52 | public int Duration { get; set; } 53 | } 54 | 55 | public class Context 56 | { 57 | public string serviceTag { get; set; } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Assets/Scripts/RecognitionContent.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 060e48221a0433541abb36c54c95a189 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/SecretHelper.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // Licensed under the MIT license. 4 | // 5 | // MIT License: 6 | // Permission is hereby granted, free of charge, to any person obtaining 7 | // a copy of this software and associated documentation files (the 8 | // "Software"), to deal in the Software without restriction, including 9 | // without limitation the rights to use, copy, modify, merge, publish, 10 | // distribute, sublicense, and/or sell copies of the Software, and to 11 | // permit persons to whom the Software is furnished to do so, subject to 12 | // the following conditions: 13 | // 14 | // The above copyright notice and this permission notice shall be 15 | // included in all copies or substantial portions of the Software. 16 | // 17 | // THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, 18 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 21 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 | // 25 | 26 | using System; 27 | using System.Reflection; 28 | using UnityEngine; 29 | 30 | namespace Microsoft.Unity 31 | { 32 | /// 33 | /// An attribute that can be used to designate where a secret value is held. 34 | /// 35 | /// 36 | /// This attribute is used by . Please see that class for usage. 37 | /// 38 | [AttributeUsage(validOn: AttributeTargets.Field, AllowMultiple = false, Inherited = false)] 39 | public class SecretValueAttribute : Attribute 40 | { 41 | #region Member Variables 42 | private string name; 43 | #endregion // Member Variables 44 | 45 | #region Constructors 46 | /// 47 | /// Initializes a new instance. 48 | /// 49 | /// 50 | /// The name of the secret value. 51 | /// 52 | public SecretValueAttribute(string name) 53 | { 54 | // Validate 55 | if (string.IsNullOrEmpty(name)) throw new ArgumentException(nameof(name)); 56 | 57 | // Store 58 | this.name = name; 59 | } 60 | #endregion // Constructors 61 | 62 | #region Public Properties 63 | /// 64 | /// Gets the name of the secret. 65 | /// 66 | public string Name => name; 67 | #endregion // Public Properties 68 | } 69 | 70 | /// 71 | /// A class built to help keep API keys and other secret values out of public source control. 72 | /// 73 | /// 74 | /// 75 | /// To use , apply the SecretValue 76 | /// attribute to any inspector fields that you would like kept secret. Next, place the values in the 77 | /// corresponding environment variable. Finally, in your behavior's Awake or Start method, call 78 | /// SecretHelper.LoadSecrets(this). 79 | /// 80 | /// 81 | /// For an example of using , please see LuisManager. 82 | /// 83 | /// 84 | /// IMPORTANT: Please be aware that Unity Editor only loads environment variables once on start. 85 | /// You will need to close Unity and open it again for changes to environment variables to take effect. 86 | /// Also, Unity Hub acts as a parent process when starting Unity from the Hub. Therefore you will need 87 | /// to close not only Unity but also Unity Hub (which runs in the tray) before changes will take effect. 88 | /// 89 | /// 90 | static public class SecretHelper 91 | { 92 | #region Internal Methods 93 | /// 94 | /// Gets the default value for a specified type. 95 | /// 96 | /// 97 | /// The type to obtain the default for. 98 | /// 99 | /// 100 | /// The default value for the type. 101 | /// 102 | static private object GetDefaultValue(Type t) 103 | { 104 | if (t.IsValueType) 105 | { 106 | return Activator.CreateInstance(t); 107 | } 108 | else 109 | { 110 | return null; 111 | } 112 | } 113 | 114 | /// 115 | /// Attempts to load a secret value into the specified field. 116 | /// 117 | /// 118 | /// A that indicates the source of the secret value. 119 | /// 120 | /// 121 | /// The field where the value will be loaded. 122 | /// 123 | /// 124 | /// The object instance where the value will be set. 125 | /// 126 | /// 127 | /// true to overwrite non-default values; otherwise false. The default is false. 128 | /// 129 | /// 130 | /// By default will only update fields that are set to default values 131 | /// (e.g. 0 for int and null or "" for string). This allows values set in the Unity inspector to 132 | /// override values stored in the environment. If values in the environment should always take 133 | /// precedence over values stored in the field set to true. 134 | /// 135 | static private void TryLoadValue(SecretValueAttribute sva, FieldInfo field, object obj, bool overwrite = false) 136 | { 137 | // Validate 138 | if (sva == null) throw new ArgumentNullException(nameof(sva)); 139 | if (field == null) throw new ArgumentNullException(nameof(field)); 140 | if (obj == null) throw new ArgumentNullException(nameof(obj)); 141 | 142 | // Now get the current value of the field 143 | object curValue = field.GetValue(obj); 144 | 145 | // If we're not overwriting values, we need to check to check and make sure a non-default value is not already set 146 | if (!overwrite) 147 | { 148 | // What is the default value for the field? 149 | object defValue = GetDefaultValue(field.FieldType); 150 | 151 | // Is it the current value the same as the default value? 152 | bool isDefaultValue = ((curValue == defValue) || ((field.FieldType == typeof(string)) && (string.IsNullOrEmpty((string)curValue)))); 153 | 154 | // If the current value is not the default value, the secret has already been supplied 155 | // and we don't need to do any more work. 156 | if (!isDefaultValue) { return; } 157 | } 158 | 159 | // Either in overwrite mode or a default value. Let's try to read the environment variable. 160 | string svalue = Environment.GetEnvironmentVariable(sva.Name); 161 | 162 | // Check for no environment variable or no value set. 163 | if (string.IsNullOrEmpty(svalue)) 164 | { 165 | Debug.LogWarning($"{obj.GetType().Name}.{field.Name} has the default value '{curValue}' but the environment variable {sva.Name} is missing or not set."); 166 | return; 167 | } 168 | 169 | // If string, just assign. Otherwise attempt to convert. 170 | if (field.FieldType == typeof(string)) 171 | { 172 | field.SetValue(obj, svalue); 173 | } 174 | else 175 | { 176 | try 177 | { 178 | object cvalue = Convert.ChangeType(svalue, field.FieldType); 179 | field.SetValue(obj, cvalue); 180 | } 181 | catch (Exception ex) 182 | { 183 | Debug.LogWarning($"The value '{svalue}' of environment variable {sva.Name} could not be converted to {field.FieldType.Name}. {ex.Message}"); 184 | } 185 | } 186 | } 187 | #endregion // Internal Methods 188 | 189 | #region Public Methods 190 | /// 191 | /// Attempts to load all secret values for the specified object. 192 | /// 193 | /// 194 | /// The object where secret values will be loaded. 195 | /// 196 | static public void LoadSecrets(object obj) 197 | { 198 | // Validate 199 | if (obj == null) throw new ArgumentNullException(nameof(obj)); 200 | 201 | // Get all fields 202 | FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); 203 | 204 | // Look for secret fields 205 | foreach (var field in fields) 206 | { 207 | // Try to get attribute 208 | SecretValueAttribute sva = field.GetCustomAttribute(); 209 | 210 | // If not a secret, skip 211 | if (sva == null) { continue; } 212 | 213 | // Try to load the value 214 | TryLoadValue(sva, field, obj); 215 | } 216 | } 217 | #endregion // Public Methods 218 | } 219 | } -------------------------------------------------------------------------------- /Assets/Scripts/SecretHelper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 185d71c739e2d0e448449f48c24d24a3 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/SpeechManager.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // Licensed under the MIT license. 4 | // 5 | // Microsoft Cognitive Services (formerly Project Oxford): 6 | // https://www.microsoft.com/cognitive-services 7 | // 8 | // New Speech Service: 9 | // https://docs.microsoft.com/en-us/azure/cognitive-services/Speech-Service/ 10 | // Old Bing Speech SDK: 11 | // https://docs.microsoft.com/en-us/azure/cognitive-services/Speech/home 12 | // 13 | // Copyright (c) Microsoft Corporation 14 | // All rights reserved. 15 | // 16 | // MIT License: 17 | // Permission is hereby granted, free of charge, to any person obtaining 18 | // a copy of this software and associated documentation files (the 19 | // "Software"), to deal in the Software without restriction, including 20 | // without limitation the rights to use, copy, modify, merge, publish, 21 | // distribute, sublicense, and/or sell copies of the Software, and to 22 | // permit persons to whom the Software is furnished to do so, subject to 23 | // the following conditions: 24 | // 25 | // The above copyright notice and this permission notice shall be 26 | // included in all copies or substantial portions of the Software. 27 | // 28 | // THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, 29 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 30 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 31 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 32 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 33 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 34 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 35 | // 36 | 37 | // Comment the following line if you want to use the old Bing Speech SDK 38 | // instead of the new Speech Service. 39 | #define USENEWSPEECHSDK 40 | 41 | using System; 42 | using System.Collections; 43 | using System.Collections.Generic; 44 | using System.IO; 45 | using System.Threading; 46 | using System.Threading.Tasks; 47 | using UnityEngine; 48 | using UnityEngine.UI; 49 | using SpeechRecognitionService; 50 | using Microsoft.Unity; 51 | 52 | public class SpeechManager : MonoBehaviour { 53 | 54 | // Public fields 55 | public Text DisplayLabel; 56 | 57 | [Tooltip("Connection string to Azure Storage account.")] 58 | [SecretValue("SpeechService_APIKey")] 59 | public string SpeechServiceAPIKey = string.Empty; 60 | 61 | [Tooltip("Whether or not the Speech Manager should trigger the end of dictation through the use of silence detection, which is confirgurable via the the Silence Treshold and Silence Timeout settings below. Service-side silence detection is enabled by default.")] 62 | public bool UseClientSideSilenceDetection = false; 63 | 64 | [Tooltip("The amplitude under which the sound will be considered silent.")] 65 | [Range(0.0f, 0.1f)] 66 | public float SilenceThreshold = 0.002f; 67 | 68 | [Tooltip("The duration of silence, in seconds, for the end of speech to be detected.")] 69 | [Range(1.0f, 10f)] 70 | public float SilenceTimeout = 3.0f; 71 | 72 | // Private fields 73 | CogSvcSocketAuthentication auth; 74 | SpeechRecognitionClient recoServiceClient; 75 | AudioSource audiosource; 76 | bool isAuthenticated = false; 77 | bool isRecording = false; 78 | bool isRecognizing = false; 79 | bool isSilent = false; 80 | string requestId; 81 | int maxRecordingDuration = 10; // in seconds 82 | string region; 83 | bool silenceNotified = false; 84 | long silenceStarted = 0; 85 | 86 | // Microphone Recording Parameters 87 | int numChannels = 2; 88 | int samplingResolution = 16; 89 | int samplingRate = 44100; 90 | int recordingSamples = 0; 91 | List recordingData; 92 | 93 | /// 94 | /// This event is called when speech has ended. 95 | /// 96 | /// 97 | /// This may come from client-side (optional) or service-side (always on) silence detection. 98 | /// 99 | public event EventHandler SpeechEnded; 100 | 101 | private void Awake() 102 | { 103 | // Attempt to load API secrets 104 | SecretHelper.LoadSecrets(this); 105 | } 106 | 107 | // Use this for initialization 108 | void Start () { 109 | // Make sure to comment the following line unless you're debugging 110 | //Debug.LogError("This message should make the console appear in Development Builds"); 111 | 112 | audiosource = GetComponent(); 113 | Debug.Log($"Audio settings playback rate currently set to {AudioSettings.outputSampleRate}Hz"); 114 | // We need to make sure the microphone records at the same sampling rate as the audio 115 | // settings since we are using an audio filter to capture samples. 116 | samplingRate = AudioSettings.outputSampleRate; 117 | 118 | Debug.Log($"Initiating Cognitive Services Speech Recognition Service."); 119 | InitializeSpeechRecognitionService(); 120 | } 121 | 122 | // Update is called once per frame 123 | void Update () { 124 | 125 | } 126 | 127 | /// 128 | /// InitializeSpeechRecognitionService is used to authenticate the client app 129 | /// with the Speech API Cognitive Services. A subscription key is passed to 130 | /// obtain a token, which is then used in the header of every APi call. 131 | /// 132 | private void InitializeSpeechRecognitionService() 133 | { 134 | // If you see an API key below, it's a trial key and will either expire soon or get invalidated. Please get your own key. 135 | // Get your own trial key to Bing Speech or the new Speech Service at https://azure.microsoft.com/try/cognitive-services 136 | // Create an Azure Cognitive Services Account: https://docs.microsoft.com/azure/cognitive-services/cognitive-services-apis-create-account 137 | 138 | // DELETE THE NEXT THREE LINE ONCE YOU HAVE OBTAINED YOUR OWN SPEECH API KEY 139 | //Debug.Log("You forgot to initialize the sample with your own Speech API key. Visit https://azure.microsoft.com/try/cognitive-services to get started."); 140 | //Console.ReadLine(); 141 | //return; 142 | // END DELETE 143 | #if USENEWSPEECHSDK 144 | bool useClassicBingSpeechService = false; 145 | string authenticationKey = SpeechServiceAPIKey; 146 | #else 147 | bool useClassicBingSpeechService = true; 148 | string authenticationKey = SpeechServiceAPIKey; 149 | #endif 150 | 151 | try 152 | { 153 | Debug.Log($"Instantiating Cognitive Services Speech Recognition Service client."); 154 | recoServiceClient = new SpeechRecognitionClient(useClassicBingSpeechService); 155 | 156 | // Make sure to match the region to the Azure region where you created the service. 157 | // Note the region is NOT used for the old Bing Speech service 158 | region = "westus"; 159 | 160 | auth = new CogSvcSocketAuthentication(); 161 | Task authenticating = auth.Authenticate(authenticationKey, region, useClassicBingSpeechService); 162 | 163 | // Since the authentication process needs to run asynchronously, we run the code in a coroutine to 164 | // avoid blocking the main Unity thread. 165 | // Make sure you have successfully obtained a token before making any Speech Service calls. 166 | StartCoroutine(AuthenticateSpeechService(authenticating)); 167 | 168 | // Register an event to capture recognition events 169 | Debug.Log($"Registering Speech Recognition event handler."); 170 | recoServiceClient.OnMessageReceived += RecoServiceClient_OnMessageReceived; 171 | 172 | } 173 | catch (Exception ex) 174 | { 175 | string msg = String.Format("Error: Initialization failed. See error details below:{0}{1}{2}{3}", 176 | Environment.NewLine, ex.ToString(), Environment.NewLine, ex.Message); 177 | Debug.LogError(msg); 178 | UpdateUICanvasLabel(msg, FontStyle.Normal); 179 | } 180 | } 181 | 182 | /// 183 | /// CoRoutine that checks to see if the async authentication process has completed. Once it completes, 184 | /// retrieves the token that will be used for subsequent Cognitive Services Text-to-Speech API calls. 185 | /// 186 | /// 187 | /// 188 | private IEnumerator AuthenticateSpeechService(Task authenticating) 189 | { 190 | // Yield control back to the main thread as long as the task is still running 191 | while (!authenticating.IsCompleted) 192 | { 193 | yield return null; 194 | } 195 | 196 | try 197 | { 198 | if (auth.GetAccessToken() != null && auth.GetAccessToken().Length > 0) 199 | { 200 | isAuthenticated = true; 201 | Debug.Log($"Authentication token obtained: {auth.GetAccessToken()}"); 202 | } else 203 | { 204 | string msg = "Cognitive Services authentication failed. Please check your subscription key and try again."; 205 | Debug.Log(msg); 206 | UpdateUICanvasLabel(msg, FontStyle.Normal); 207 | } 208 | } 209 | catch (Exception ex) 210 | { 211 | string msg = String.Format("Cognitive Services authentication failed. Please check your subscription key and try again. See error details below:{0}{1}{2}{3}", 212 | Environment.NewLine, ex.ToString(), Environment.NewLine, ex.Message); 213 | Debug.LogError(msg); 214 | UpdateUICanvasLabel(msg, FontStyle.Normal); 215 | } 216 | } 217 | 218 | /// 219 | /// Feeds a pre-recorded speech audio file to the Speech Recognition service. 220 | /// Triggered from btnStartReco UI Canvas button. 221 | /// 222 | public void StartSpeechRecognitionFromFile() 223 | { 224 | try 225 | { 226 | if (isAuthenticated) 227 | { 228 | // Replace this with your own file. Add it to the project and mark it as "Content" and "Copy if newer". 229 | //string audioFilePath = Path.Combine(Application.streamingAssetsPath, "Thisisatest.wav"); 230 | string audioFilePath = Path.Combine(Application.temporaryCachePath, "recording.wav"); 231 | 232 | if (!File.Exists(audioFilePath)) 233 | { 234 | UpdateUICanvasLabel("The file 'recording.wav' was not found. make sure to record one before starting recognition.", FontStyle.Normal); 235 | return; 236 | } 237 | 238 | Debug.Log($"Using speech audio file located at {audioFilePath}"); 239 | 240 | Debug.Log($"Creating Speech Recognition job from audio file."); 241 | Task recojob = recoServiceClient.CreateSpeechRecognitionJobFromFile(audioFilePath, auth.GetAccessToken(), region); 242 | 243 | StartCoroutine(CompleteSpeechRecognitionJob(recojob)); 244 | Debug.Log($"Speech Recognition job started."); 245 | } 246 | else 247 | { 248 | string msg = "Cannot start speech recognition job since authentication has not successfully completed."; 249 | Debug.Log(msg); 250 | UpdateUICanvasLabel(msg, FontStyle.Normal); 251 | } 252 | 253 | } 254 | catch (Exception ex) 255 | { 256 | string msg = String.Format("Error: Something went wrong when starting the recognition process from a file. See error details below:{0}{1}{2}{3}", 257 | Environment.NewLine, ex.ToString(), Environment.NewLine, ex.Message); 258 | Debug.LogError(msg); 259 | UpdateUICanvasLabel(msg, FontStyle.Normal); 260 | } 261 | } 262 | 263 | /// 264 | /// Starts recording the user's voice via microphone and then feeds the audio data 265 | /// to the Speech Recognition service. 266 | /// Triggered from btnStartMicrophone UI Canvas button. 267 | /// 268 | public void StartSpeechRecognitionFromMicrophone() 269 | { 270 | try 271 | { 272 | if (isAuthenticated) 273 | { 274 | Debug.Log($"Creating Speech Recognition job from microphone."); 275 | Task recojob = recoServiceClient.CreateSpeechRecognitionJobFromVoice(auth.GetAccessToken(), region, samplingResolution, numChannels, samplingRate); 276 | 277 | StartCoroutine(WaitUntilRecoServiceIsReady()); 278 | } 279 | else 280 | { 281 | string msg = "Cannot start speech recognition job since authentication has not successfully completed."; 282 | Debug.Log(msg); 283 | UpdateUICanvasLabel(msg, FontStyle.Normal); 284 | } 285 | 286 | } 287 | catch (Exception ex) 288 | { 289 | string msg = String.Format("Error: Something went wrong when starting the recognition process from the microphone. See error details below:{0}{1}{2}{3}", 290 | Environment.NewLine, ex.ToString(), Environment.NewLine, ex.Message); 291 | Debug.LogError(msg); 292 | UpdateUICanvasLabel(msg, FontStyle.Normal); 293 | } 294 | } 295 | 296 | /// 297 | /// CoRoutine that waits until the Speech Recognition job has been started. 298 | /// 299 | /// 300 | IEnumerator WaitUntilRecoServiceIsReady() 301 | { 302 | while (recoServiceClient.State != SpeechRecognitionClient.JobState.ReadyForAudioPackets && 303 | recoServiceClient.State != SpeechRecognitionClient.JobState.Error) 304 | { 305 | yield return null; 306 | } 307 | 308 | try 309 | { 310 | if (recoServiceClient.State == SpeechRecognitionClient.JobState.ReadyForAudioPackets) 311 | { 312 | 313 | requestId = recoServiceClient.CurrentRequestId; 314 | 315 | Debug.Log("Initializing microphone for recording."); 316 | // Passing null for deviceName in Microphone methods to use the default microphone. 317 | audiosource.clip = Microphone.Start(null, true, maxRecordingDuration, samplingRate); 318 | audiosource.loop = true; 319 | 320 | // Wait until the microphone starts recording 321 | while (!(Microphone.GetPosition(null) > 0)) { }; 322 | isRecognizing = true; 323 | audiosource.Play(); 324 | Debug.Log("Microphone recording has started."); 325 | UpdateUICanvasLabel("Microphone is live, start talking now...", FontStyle.Normal); 326 | } 327 | else 328 | { 329 | // Something went wrong during job initialization, handle it 330 | Debug.Log("Something went wrong during job initialization."); 331 | } 332 | 333 | } 334 | catch (Exception ex) 335 | { 336 | string msg = String.Format("Error: Something went wrong when starting the microphone for audio recording. See error details below:{0}{1}{2}{3}", 337 | Environment.NewLine, ex.ToString(), Environment.NewLine, ex.Message); 338 | Debug.LogError(msg); 339 | UpdateUICanvasLabel(msg, FontStyle.Normal); 340 | } 341 | } 342 | 343 | IEnumerator CompleteSpeechRecognitionJob(Task recojob) 344 | { 345 | // Yield control back to the main thread as long as the task is still running 346 | while (!recojob.IsCompleted) 347 | { 348 | yield return null; 349 | } 350 | Debug.Log($"Speech Recognition job completed."); 351 | } 352 | 353 | /// 354 | /// RecoServiceClient_OnMessageReceived event handler: 355 | /// This event handler gets fired every time a new message comes back via WebSocket. 356 | /// 357 | /// 358 | private void RecoServiceClient_OnMessageReceived(SpeechServiceResult result) 359 | { 360 | try 361 | { 362 | if (result.Path == SpeechServiceResult.SpeechMessagePaths.SpeechHypothesis) 363 | { 364 | 365 | UpdateUICanvasLabel(result.Result.Text, FontStyle.Italic); 366 | } 367 | else if (result.Path == SpeechServiceResult.SpeechMessagePaths.SpeechPhrase) 368 | { 369 | if (isRecognizing) 370 | { 371 | StopRecording(); 372 | } 373 | 374 | UpdateUICanvasLabel(result.Result.DisplayText, FontStyle.Normal); 375 | 376 | Debug.Log("* RECOGNITION STATUS: " + result.Result.RecognitionStatus); 377 | Debug.Log("* FINAL RESULT: " + result.Result.DisplayText); 378 | } 379 | 380 | } 381 | catch (Exception ex) 382 | { 383 | string msg = String.Format("Error: Something went wrong when posting speech recognition results. See error details below:{0}{1}{2}{3}", 384 | Environment.NewLine, ex.ToString(), Environment.NewLine, ex.Message); 385 | Debug.LogError(msg); 386 | UpdateUICanvasLabel(msg, FontStyle.Normal); 387 | } 388 | } 389 | 390 | private void UpdateUICanvasLabel(string text, FontStyle style) 391 | { 392 | UnityDispatcher.InvokeOnAppThread(() => 393 | { 394 | DisplayLabel.text = text; 395 | DisplayLabel.fontStyle = style; 396 | }); 397 | } 398 | 399 | /// 400 | /// OnAudioFilterRead is used to capture live microphone audio when recording or recognizing. 401 | /// When OnAudioFilterRead is implemented, Unity inserts a custom filter into the audio DSP chain. 402 | /// The filter is inserted in the same order as the MonoBehaviour script is shown in the inspector. 403 | /// OnAudioFilterRead is called every time a chunk of audio is sent to the filter (this happens 404 | /// frequently, every ~20ms depending on the sample rate and platform). 405 | /// 406 | /// The audio data is an array of floats ranging from[-1.0f;1.0f]. Here it contains 407 | /// audio from AudioClip on the AudioSource, which itself receives data from the microphone. 408 | /// 409 | void OnAudioFilterRead(float[] data, int channels) 410 | { 411 | try 412 | { 413 | //Debug.Log($"Received audio data of size: {data.Length} - First sample: {data[0]}"); 414 | 415 | // Debug.Log($"Received audio data: {channels} channel(s), size {data.Length} samples."); 416 | 417 | float maxAudio = 0f; 418 | 419 | //Debug.Log($"Received audio data: {channels} channel(s), size {data.Length} samples."); 420 | 421 | if (isRecording || isRecognizing) 422 | { 423 | byte[] audiodata = ConvertAudioClipDataToInt16ByteArray(data); 424 | for (int i = 0; i < data.Length; i++) 425 | { 426 | if (UseClientSideSilenceDetection) 427 | { 428 | // Get the max amplitude out of the sample 429 | maxAudio = Mathf.Max(maxAudio, Mathf.Abs(data[i])); 430 | } 431 | 432 | // Mute all the samples to avoid audio feedback into the microphone 433 | data[i] = 0.0f; 434 | } 435 | 436 | if (UseClientSideSilenceDetection) 437 | { 438 | // Was THIS sample silent? 439 | bool silentThisSample = (maxAudio <= SilenceThreshold); 440 | if (silentThisSample) 441 | { 442 | // Yes this sample was silent. 443 | // If we haven't been in silence yet, notify that we're entering silence 444 | if (!isSilent) 445 | { 446 | Debug.Log($"Silence Starting... ({maxAudio})"); 447 | isSilent = true; 448 | silenceStarted = DateTime.Now.Ticks; // Must use ticks since Unity's Time class can't be used on this thread. 449 | silenceNotified = false; 450 | } 451 | else 452 | { 453 | // Looks like we've been in silence for a while. 454 | // If we haven't already notified of a timeout, check to see if a timeout has occurred. 455 | if (!silenceNotified) 456 | { 457 | // Have we crossed the silence threshold 458 | TimeSpan duration = TimeSpan.FromTicks(DateTime.Now.Ticks - silenceStarted); 459 | if (duration.TotalSeconds >= SilenceTimeout) 460 | { 461 | Debug.Log("Silence Timeout"); 462 | 463 | // Mark notified 464 | silenceNotified = true; 465 | 466 | // Notify 467 | OnSpeechEnded(); 468 | } 469 | } 470 | } 471 | } 472 | else 473 | { 474 | // No this sample was not silent. 475 | // Check to see if we're leaving silence. 476 | if (isSilent) 477 | { 478 | Debug.Log($"Silence Ended ({maxAudio})"); 479 | 480 | // No longer silent 481 | isSilent = false; 482 | } 483 | } 484 | 485 | } 486 | if (isRecording) // We're only concerned with saving all audio data if we're persist to a file 487 | { 488 | recordingData.AddRange(audiodata); 489 | recordingSamples += audiodata.Length; 490 | } 491 | else // if we're not recording, then we're in recognition mode 492 | { 493 | recoServiceClient.SendAudioPacket(requestId, audiodata); 494 | } 495 | } 496 | 497 | } 498 | catch (Exception ex) 499 | { 500 | string msg = String.Format("Error: Something went wrong when reading live audio data from the microphone. See error details below:{0}{1}{2}{3}", 501 | Environment.NewLine, ex.ToString(), Environment.NewLine, ex.Message); 502 | Debug.LogError(msg); 503 | UpdateUICanvasLabel(msg, FontStyle.Normal); 504 | } 505 | } 506 | 507 | /// 508 | /// Converts audio data from Unity's array of floats to a WAV-compatible byte array. 509 | /// Thanks to my colleague David Douglas for this method from his WavUtility class. 510 | /// Source: https://github.com/deadlyfingers/UnityWav/blob/master/WavUtility.cs 511 | /// 512 | private static byte[] ConvertAudioClipDataToInt16ByteArray(float[] data) 513 | { 514 | MemoryStream dataStream = new MemoryStream(); 515 | 516 | int x = sizeof(Int16); 517 | Int16 maxValue = Int16.MaxValue; 518 | int i = 0; 519 | while (i < data.Length) 520 | { 521 | dataStream.Write(BitConverter.GetBytes(Convert.ToInt16(data[i] * maxValue)), 0, x); 522 | ++i; 523 | } 524 | byte[] bytes = dataStream.ToArray(); 525 | 526 | // Validate converted bytes 527 | Debug.AssertFormat(data.Length * x == bytes.Length, "Unexpected float[] to Int16 to byte[] size: {0} == {1}", data.Length * x, bytes.Length); 528 | 529 | dataStream.Dispose(); 530 | return bytes; 531 | } 532 | 533 | /// 534 | /// Used only to record the microphone to a WAV file for testing purposes. 535 | /// 536 | public void StartRecording() 537 | { 538 | Debug.Log("Initializing microphone for recording to audio file."); 539 | recordingData = new List(); 540 | recordingSamples = 0; 541 | 542 | // Passing null for deviceName in Microphone methods to use the default microphone. 543 | audiosource.clip = Microphone.Start(null, true, 1, samplingRate); 544 | audiosource.loop = true; 545 | 546 | // Wait until the microphone starts recording 547 | while (!(Microphone.GetPosition(null) > 0)) { }; 548 | isRecording = true; 549 | audiosource.Play(); 550 | Debug.Log("Microphone recording has started."); 551 | UpdateUICanvasLabel("Microphone is live, start talking now... press STOP when done.", FontStyle.Normal); 552 | } 553 | 554 | /// 555 | /// Stops the microphone recording and saves to a WAV file. Used to validate WAV format. 556 | /// 557 | public void StopRecording() 558 | { 559 | Debug.Log("Stopping microphone recording."); 560 | 561 | UnityDispatcher.InvokeOnAppThread(() => 562 | { 563 | audiosource.Stop(); 564 | Microphone.End(null); 565 | if (isRecording) 566 | { 567 | var audioData = new byte[recordingData.Count]; 568 | recordingData.CopyTo(audioData); 569 | WriteAudioDataToRiffWAVFile(audioData, "recording.wav"); 570 | isRecording = false; 571 | isRecognizing = false; 572 | } 573 | Debug.Log($"Microphone stopped recording at frequency {audiosource.clip.frequency}Hz."); 574 | }); 575 | UpdateUICanvasLabel("Recording stopped. Audio saved to file 'recording.wav'.", FontStyle.Normal); 576 | } 577 | 578 | /// 579 | /// Called when speech has ended. 580 | /// 581 | /// 582 | /// This may come from client-side or service-side silence detection. 583 | /// 584 | protected virtual void OnSpeechEnded() 585 | { 586 | Debug.Log("Speech Ended"); 587 | if (SpeechEnded != null) { SpeechEnded(this, EventArgs.Empty); } 588 | } 589 | 590 | /// 591 | /// Saves a byte array of audio samples to a properly formatted WAV file. 592 | /// 593 | /// 594 | private void WriteAudioDataToRiffWAVFile(byte[] audiodata, string filename) 595 | { 596 | try 597 | { 598 | string filePath = Path.Combine(Application.temporaryCachePath, filename); 599 | Debug.Log($"Opening new WAV file for recording: {filePath}"); 600 | 601 | FileStream fs = new FileStream(filePath, FileMode.Create); 602 | BinaryWriter wr = new BinaryWriter(fs); 603 | 604 | // Writing WAV header 605 | Debug.Log($"Writing WAV header to file with a count of {recordingSamples} samples."); 606 | var header = recoServiceClient.BuildRiffWAVHeader(recordingSamples, samplingResolution, numChannels, samplingRate); 607 | wr.Write(header, 0, header.Length); 608 | 609 | // Write the audio data to the main file body 610 | Debug.Log($"Writing {audiodata.Length} WAV data samples to file."); 611 | wr.Write(audiodata, 0, audiodata.Length); 612 | 613 | wr.Dispose(); 614 | fs.Dispose(); 615 | Debug.Log($"Completed writing {audiodata.Length} WAV data samples to file."); 616 | 617 | } 618 | catch (Exception ex) 619 | { 620 | string msg = String.Format("Error: Something went wrong when saving the audio data to a WAV file. See error details below:{0}{1}{2}{3}", 621 | Environment.NewLine, ex.ToString(), Environment.NewLine, ex.Message); 622 | Debug.LogError(msg); 623 | UpdateUICanvasLabel(msg, FontStyle.Normal); 624 | } 625 | } 626 | } 627 | -------------------------------------------------------------------------------- /Assets/Scripts/SpeechManager.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 46128bdf74d4cf743a1c0e224bb3be56 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/SpeechRecognitionService.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // Licensed under the MIT license. 4 | // 5 | // Microsoft Cognitive Services (formerly Project Oxford): 6 | // https://www.microsoft.com/cognitive-services 7 | // 8 | // New Speech Service: 9 | // https://docs.microsoft.com/en-us/azure/cognitive-services/Speech-Service/ 10 | // Old Bing Speech SDK: 11 | // https://docs.microsoft.com/en-us/azure/cognitive-services/Speech/home 12 | // 13 | // Copyright (c) Microsoft Corporation 14 | // All rights reserved. 15 | // 16 | // MIT License: 17 | // Permission is hereby granted, free of charge, to any person obtaining 18 | // a copy of this software and associated documentation files (the 19 | // "Software"), to deal in the Software without restriction, including 20 | // without limitation the rights to use, copy, modify, merge, publish, 21 | // distribute, sublicense, and/or sell copies of the Software, and to 22 | // permit persons to whom the Software is furnished to do so, subject to 23 | // the following conditions: 24 | // 25 | // The above copyright notice and this permission notice shall be 26 | // included in all copies or substantial portions of the Software. 27 | // 28 | // THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, 29 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 30 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 31 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 32 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 33 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 34 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 35 | // 36 | 37 | using System; 38 | using System.Collections.Generic; 39 | using System.IO; 40 | using System.Linq; 41 | using System.Text; 42 | using System.Threading; 43 | using System.Threading.Tasks; 44 | using Newtonsoft.Json; 45 | using UnityEngine; 46 | // .NET and UWP have different namespaces, classes and APIs for WebSockets 47 | #if WINDOWS_UWP 48 | using Windows.Networking.Sockets; 49 | using Windows.Storage.Streams; 50 | #else 51 | using System.Net.WebSockets; 52 | #endif 53 | 54 | namespace SpeechRecognitionService 55 | { 56 | public class SpeechRecognitionClient 57 | { 58 | // The various job states of the service. Ready & Completed both indicate the service is ready to 59 | // receive a new job. The latter indicates a job was completed and a new one is ready. 60 | public enum JobState { Initializing, Ready, PreparingJob, ReadyForAudioPackets, ProcessingAudio, Completed, Error } 61 | 62 | // Public Fields 63 | public string RecognizedText { get; set; } 64 | public SpeechServiceResult LastMessageReceived { get; set; } 65 | #if WINDOWS_UWP 66 | public MessageWebSocket SpeechWebSocketClient { get; set; } 67 | #else 68 | public ClientWebSocket SpeechWebSocketClient { get; set; } 69 | #endif 70 | public string CurrentRequestId { get; set; } 71 | //private Telemetry jobtelemetry; 72 | public JobState State 73 | { 74 | get { return state; } 75 | } 76 | 77 | // Private fields 78 | bool useClassicBingSpeechService = false; 79 | private JobState state; 80 | private string lineSeparator; 81 | 82 | // Events Definition 83 | public delegate void MessageReceived(SpeechServiceResult result); 84 | public event MessageReceived OnMessageReceived; 85 | 86 | public SpeechRecognitionClient(bool usebingspeechservice = false) 87 | { 88 | lineSeparator = "\r\n"; // Environment.NewLine; 89 | 90 | state = JobState.Initializing; 91 | // Set usebingspeechservice to true in the client constructor if you want to use the old Bing Speech SDK 92 | // instead of the new Speech Service. 93 | useClassicBingSpeechService = usebingspeechservice; 94 | 95 | state = JobState.Ready; 96 | } 97 | 98 | public async Task CreateSpeechRecognitionJobFromFile(string audioFilePath, string authenticationToken, string region) 99 | { 100 | try 101 | { 102 | state = JobState.PreparingJob; 103 | SpeechWebSocketClient = await InitializeSpeechWebSocketClient(authenticationToken, region); 104 | 105 | #if !WINDOWS_UWP 106 | Task receiving = Receiving(SpeechWebSocketClient); 107 | #endif 108 | var sending = Task.Run(async () => 109 | { 110 | // Create a unique request ID, must be a UUID in "no-dash" format 111 | var requestId = Guid.NewGuid().ToString("N"); 112 | //jobtelemetry = new Telemetry(); 113 | ArraySegment buffer = CreateSpeechConfigMessagePayloadBuffer(requestId); 114 | 115 | if (!IsWebSocketClientOpen(SpeechWebSocketClient)) return; 116 | Debug.Log("Sending speech.config..."); 117 | // Send speech.config to Speech Service 118 | await SendToWebSocket(SpeechWebSocketClient, buffer, false); 119 | //await SpeechWebSocketClient.SendAsync(buffer, WebSocketMessageType.Text, true, new CancellationToken()); 120 | Debug.Log("speech.config sent successfully!"); 121 | 122 | // SENDING AUDIO TO SPEECH SERVICE: 123 | // Speech-enabled client applications send audio to Speech Service by converting the audio stream 124 | // into a series of audio chunks. Each chunk of audio carries a segment of the spoken audio that's 125 | // to be transcribed by the service. The maximum size of a single audio chunk is 8,192 bytes. 126 | // Audio stream messages are Binary WebSocket messages. 127 | Debug.Log($"Preparing to send audio file: {audioFilePath}"); 128 | FileInfo audioFileInfo = new FileInfo(audioFilePath); 129 | FileStream audioFileStream = audioFileInfo.OpenRead(); 130 | 131 | state = JobState.ProcessingAudio; 132 | 133 | byte[] headerBytes; 134 | byte[] headerHead; 135 | for (int cursor = 0; cursor < audioFileInfo.Length; cursor++) 136 | { 137 | headerBytes = BuildAudioPacketHeader(requestId); 138 | headerHead = BuildAudioPacketHeaderHead(headerBytes); 139 | 140 | // PCM audio must be sampled at 16 kHz with 16 bits per sample and one channel (riff-16khz-16bit-mono-pcm). 141 | var byteLen = 8192 - headerBytes.Length - 2; 142 | var fbuff = new byte[byteLen]; 143 | audioFileStream.Read(fbuff, 0, byteLen); 144 | 145 | var arr = headerHead.Concat(headerBytes).Concat(fbuff).ToArray(); 146 | var arrSeg = new ArraySegment(arr, 0, arr.Length); 147 | 148 | Debug.Log($"Sending audio data from position: {cursor}"); 149 | if (!IsWebSocketClientOpen(SpeechWebSocketClient)) return; 150 | cursor += byteLen; 151 | var end = cursor >= audioFileInfo.Length; 152 | //await SpeechWebSocketClient.SendAsync(arrSeg, WebSocketMessageType.Binary, true, new CancellationToken()); 153 | await SendToWebSocket(SpeechWebSocketClient, arrSeg, true); 154 | Debug.Log($"Audio data from file {audioFilePath} sent successfully!"); 155 | 156 | //var dt = Encoding.UTF8.GetString(arr); 157 | } 158 | await SendEmptyAudioMessageToWebSocketClient(SpeechWebSocketClient, requestId); 159 | audioFileStream.Dispose(); 160 | }); 161 | 162 | #if WINDOWS_UWP 163 | await Task.WhenAll(sending); 164 | #else 165 | // Wait for tasks to complete 166 | await Task.WhenAll(sending, receiving); 167 | if (receiving.IsFaulted) 168 | { 169 | var err = receiving.Exception; 170 | throw err; 171 | } 172 | #endif 173 | if (sending.IsFaulted) 174 | { 175 | var err = sending.Exception; 176 | throw err; 177 | } 178 | 179 | return true; 180 | } 181 | catch (Exception ex) 182 | { 183 | state = JobState.Error; 184 | Debug.Log($"An exception occurred during creation of Speech Recognition job from audio file {audioFilePath}:" 185 | + lineSeparator + ex.Message); 186 | return false; 187 | } 188 | } 189 | 190 | /// 191 | /// prepares a new speech recognition job, sending the proper headers including the audio data header 192 | /// 193 | /// 194 | /// 195 | /// 196 | /// 197 | /// 198 | /// 199 | public async Task CreateSpeechRecognitionJobFromVoice(string authenticationToken, string region, int resolution, int channels, int rate) 200 | { 201 | try 202 | { 203 | state = JobState.PreparingJob; 204 | SpeechWebSocketClient = await InitializeSpeechWebSocketClient(authenticationToken, region); 205 | 206 | #if !WINDOWS_UWP 207 | Task receiving = Receiving(SpeechWebSocketClient); 208 | #endif 209 | var sending = Task.Run(async () => 210 | { 211 | // Create a unique request ID, must be a UUID in "no-dash" format 212 | CurrentRequestId = Guid.NewGuid().ToString("N"); 213 | //jobtelemetry = new Telemetry(); 214 | ArraySegment buffer = CreateSpeechConfigMessagePayloadBuffer(CurrentRequestId); 215 | 216 | if (!IsWebSocketClientOpen(SpeechWebSocketClient)) return; 217 | 218 | Debug.Log("Sending speech.config..."); 219 | // Send speech.config to Speech Service 220 | await SendToWebSocket(SpeechWebSocketClient, buffer, false); 221 | //await SpeechWebSocketClient.SendAsync(buffer, WebSocketMessageType.Text, true, new CancellationToken()); 222 | Debug.Log("speech.config sent successfully!"); 223 | 224 | // SENDING AUDIO TO SPEECH SERVICE: 225 | // Speech-enabled client applications send audio to Speech Service by converting the audio stream 226 | // into a series of audio chunks. Each chunk of audio carries a segment of the spoken audio that's 227 | // to be transcribed by the service. The maximum size of a single audio chunk is 8,192 bytes. 228 | // Audio stream messages are Binary WebSocket messages. 229 | // First we need to send an audio packet with the RIFF PCM (WAV) data header. Note that we don't know how 230 | // many samples we'll have since we are recording live, so we set nbsamples to zero. 231 | 232 | // The WebSocket Speech protocol docs state that PCM audio must be sampled at 16 kHz with 16 bits per sample 233 | // and one channel (riff-16khz-16bit-mono-pcm) but 48kHz-16-bit-stereo works too, more testing is required. 234 | var wavHeader = BuildRiffWAVHeader(0, resolution, channels, rate); 235 | await SendAudioPacket(CurrentRequestId, wavHeader); 236 | Debug.Log($"First Audio data paket with WAV header sent successfully!"); 237 | 238 | Debug.Log($"WebSocket Client is now ready to receive audio packets from the microphone."); 239 | state = JobState.ReadyForAudioPackets; 240 | }); 241 | 242 | #if WINDOWS_UWP 243 | await Task.WhenAll(sending); 244 | #else 245 | // Wait for tasks to complete 246 | await Task.WhenAll(sending, receiving); 247 | if (receiving.IsFaulted) 248 | { 249 | var err = receiving.Exception; 250 | throw err; 251 | } 252 | #endif 253 | if (sending.IsFaulted) 254 | { 255 | var err = sending.Exception; 256 | throw err; 257 | } 258 | 259 | return true; 260 | } 261 | catch (Exception ex) 262 | { 263 | Debug.Log($"An exception occurred during creation of Speech Recognition job from microphone:" 264 | + lineSeparator + ex.Message); 265 | return false; 266 | } 267 | } 268 | 269 | #if WINDOWS_UWP 270 | /// 271 | /// Prepares the WebSocket Client with the proper header and Uri for the Speech Service. 272 | /// 273 | /// 274 | /// 275 | /// 276 | private async Task InitializeSpeechWebSocketClient(string authenticationToken, string region) 277 | { 278 | // Configuring Speech Service Web Socket client header 279 | Debug.Log("Connecting to Speech Service via Web Socket."); 280 | MessageWebSocket websocketClient = new MessageWebSocket(); 281 | 282 | string connectionId = Guid.NewGuid().ToString("N"); 283 | 284 | // Make sure to change the region & culture to match your recorded audio file. 285 | string lang = "en-US"; 286 | websocketClient.SetRequestHeader("X-ConnectionId", connectionId); 287 | websocketClient.SetRequestHeader("Authorization", "Bearer " + authenticationToken); 288 | 289 | // Clients must use an appropriate endpoint of Speech Service. The endpoint is based on recognition mode and language. 290 | // The supported recognition modes are: 291 | // - interactive 292 | // - conversation 293 | // - dictation 294 | var url = ""; 295 | if (!useClassicBingSpeechService) 296 | { 297 | // New Speech Service endpoint. 298 | url = $"wss://{region}.stt.speech.microsoft.com/speech/recognition/interactive/cognitiveservices/v1?format=simple&language={lang}"; 299 | } 300 | else 301 | { 302 | // Bing Speech endpoint 303 | url = $"wss://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?format=simple&language={lang}"; 304 | } 305 | 306 | websocketClient.MessageReceived += WebSocket_MessageReceived; 307 | websocketClient.Closed += WebSocket_Closed; 308 | 309 | await websocketClient.ConnectAsync(new Uri(url)); 310 | Debug.Log("Web Socket successfully connected."); 311 | 312 | return websocketClient; 313 | } 314 | 315 | private async Task SendToWebSocket(MessageWebSocket client, ArraySegment buffer, bool isBinary) 316 | { 317 | client.Control.MessageType = (isBinary ? SocketMessageType.Binary : SocketMessageType.Utf8); 318 | using (var dataWriter = new DataWriter(client.OutputStream)) 319 | { 320 | dataWriter.WriteBytes(buffer.Array); 321 | await dataWriter.StoreAsync(); 322 | dataWriter.DetachStream(); 323 | } 324 | } 325 | 326 | private bool IsWebSocketClientOpen(MessageWebSocket client) 327 | { 328 | return (client != null); 329 | } 330 | 331 | private void WebSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) 332 | { 333 | try 334 | { 335 | SpeechServiceResult wssr; 336 | using (DataReader dataReader = args.GetDataReader()) 337 | { 338 | dataReader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8; 339 | string resStr = dataReader.ReadString(dataReader.UnconsumedBufferLength); 340 | Debug.Log("Message received from MessageWebSocket: " + resStr); 341 | //this.messageWebSocket.Dispose(); 342 | 343 | switch (args.MessageType) 344 | { 345 | // Incoming text messages can be hypotheses about the words the service recognized or the final 346 | // phrase, which is a recognition result that won't change. 347 | case SocketMessageType.Utf8: 348 | wssr = ParseWebSocketSpeechResult(resStr); 349 | Debug.Log(resStr + Environment.NewLine + "*** Message End ***" + Environment.NewLine); 350 | 351 | // Set the recognized text field in the client for future lookup, this can be stored 352 | // in either the Text property (for hypotheses) or DisplayText (for final phrases). 353 | if (wssr.Path == SpeechServiceResult.SpeechMessagePaths.SpeechHypothesis) 354 | { 355 | RecognizedText = wssr.Result.Text; 356 | } 357 | else if (wssr.Path == SpeechServiceResult.SpeechMessagePaths.SpeechPhrase) 358 | { 359 | RecognizedText = wssr.Result.DisplayText; 360 | } 361 | // Raise an event with the message we just received. 362 | // We also keep the last message received in case the client app didn't subscribe to the event. 363 | LastMessageReceived = wssr; 364 | if (OnMessageReceived != null) 365 | { 366 | OnMessageReceived?.Invoke(wssr); 367 | } 368 | break; 369 | 370 | case SocketMessageType.Binary: 371 | Debug.Log("Binary messages are not suppported by this application."); 372 | break; 373 | 374 | //case WebSocketMessageType.Close: 375 | // string description = client.CloseStatusDescription; 376 | // Debug.Log($"Closing WebSocket with Status: {description}"); 377 | // await client.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None); 378 | // isReceiving = false; 379 | // break; 380 | 381 | default: 382 | Debug.Log("The WebSocket message type was not recognized."); 383 | break; 384 | } 385 | } 386 | } 387 | catch (Exception ex) 388 | { 389 | //Windows.Web.WebErrorStatus webErrorStatus = WebSocketError.GetStatus(ex.GetBaseException().HResult); 390 | Debug.Log("An exception occurred while receiving a message:" + Environment.NewLine + ex.Message); 391 | // Add additional code here to handle exceptions. 392 | } 393 | } 394 | 395 | private void WebSocket_Closed(Windows.Networking.Sockets.IWebSocket sender, Windows.Networking.Sockets.WebSocketClosedEventArgs args) 396 | { 397 | Debug.Log($"Closing WebSocket: Code: {args.Code}, Reason: {args.Reason}"); 398 | // Add additional code here to handle the WebSocket being closed. 399 | } 400 | #else 401 | /// 402 | /// Prepares the WebSocket Client with the proper header and Uri for the Speech Service. 403 | /// 404 | /// 405 | /// 406 | /// 407 | private async Task InitializeSpeechWebSocketClient(string authenticationToken, string region) 408 | { 409 | // Configuring Speech Service Web Socket client header 410 | Debug.Log("Connecting to Speech Service via Web Socket."); 411 | ClientWebSocket websocketClient = new ClientWebSocket(); 412 | 413 | string connectionId = Guid.NewGuid().ToString("N"); 414 | 415 | // Make sure to change the region & culture to match your recorded audio file. 416 | string lang = "en-US"; 417 | websocketClient.Options.SetRequestHeader("X-ConnectionId", connectionId); 418 | websocketClient.Options.SetRequestHeader("Authorization", "Bearer " + authenticationToken); 419 | 420 | // Clients must use an appropriate endpoint of Speech Service. The endpoint is based on recognition mode and language. 421 | // The supported recognition modes are: 422 | // - interactive 423 | // - conversation 424 | // - dictation 425 | var url = ""; 426 | if (!useClassicBingSpeechService) 427 | { 428 | // New Speech Service endpoint. 429 | url = $"wss://{region}.stt.speech.microsoft.com/speech/recognition/interactive/cognitiveservices/v1?format=simple&language={lang}"; 430 | } 431 | else 432 | { 433 | // Bing Speech endpoint 434 | url = $"wss://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?format=simple&language={lang}"; 435 | } 436 | 437 | await websocketClient.ConnectAsync(new Uri(url), new CancellationToken()); 438 | Debug.Log("Web Socket successfully connected."); 439 | 440 | return websocketClient; 441 | } 442 | 443 | private async Task SendToWebSocket(ClientWebSocket client, ArraySegment buffer, bool isBinary) 444 | { 445 | if (client.State != WebSocketState.Open) return; 446 | await client.SendAsync(buffer, (isBinary ? WebSocketMessageType.Binary : WebSocketMessageType.Text), true, new CancellationToken()); 447 | } 448 | 449 | private bool IsWebSocketClientOpen(ClientWebSocket client) 450 | { 451 | return (client.State == WebSocketState.Open); 452 | } 453 | 454 | // Allows the WebSocket client to receive messages in a background task 455 | private async Task Receiving(ClientWebSocket client) 456 | { 457 | try 458 | { 459 | var buffer = new byte[512]; 460 | bool isReceiving = true; 461 | 462 | while (isReceiving) 463 | { 464 | var wsResult = await client.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); 465 | 466 | SpeechServiceResult wssr; 467 | 468 | var resStr = Encoding.UTF8.GetString(buffer, 0, wsResult.Count); 469 | 470 | switch (wsResult.MessageType) 471 | { 472 | // Incoming text messages can be hypotheses about the words the service recognized or the final 473 | // phrase, which is a recognition result that won't change. 474 | case WebSocketMessageType.Text: 475 | wssr = ParseWebSocketSpeechResult(resStr); 476 | Debug.Log(resStr + Environment.NewLine + "*** Message End ***" + Environment.NewLine); 477 | 478 | // Set the recognized text field in the client for future lookup, this can be stored 479 | // in either the Text property (for hypotheses) or DisplayText (for final phrases). 480 | if (wssr.Path == SpeechServiceResult.SpeechMessagePaths.SpeechHypothesis) 481 | { 482 | RecognizedText = wssr.Result.Text; 483 | } 484 | else if (wssr.Path == SpeechServiceResult.SpeechMessagePaths.SpeechPhrase) 485 | { 486 | RecognizedText = wssr.Result.DisplayText; 487 | } 488 | // Raise an event with the message we just received. 489 | // We also keep the last message received in case the client app didn't subscribe to the event. 490 | LastMessageReceived = wssr; 491 | if (OnMessageReceived != null) 492 | { 493 | OnMessageReceived?.Invoke(wssr); 494 | } 495 | break; 496 | 497 | case WebSocketMessageType.Binary: 498 | Debug.Log("Binary messages are not suppported by this application."); 499 | break; 500 | 501 | case WebSocketMessageType.Close: 502 | string description = client.CloseStatusDescription; 503 | Debug.Log($"Closing WebSocket with Status: {description}"); 504 | await client.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None); 505 | isReceiving = false; 506 | break; 507 | 508 | default: 509 | Debug.Log("The message type was not recognized."); 510 | break; 511 | } 512 | } 513 | } 514 | catch (Exception ex) 515 | { 516 | string msg = String.Format("Error: Something went while receiving a message. See error details below:{0}{1}{2}{3}", 517 | Environment.NewLine, ex.ToString(), Environment.NewLine, ex.Message); 518 | } 519 | } 520 | #endif 521 | 522 | /// 523 | /// Prepares the payload (with headers) for the very first config message to be sent over WebSocket. 524 | /// 525 | /// 526 | /// 527 | private ArraySegment CreateSpeechConfigMessagePayloadBuffer(string requestId) 528 | { 529 | dynamic SpeechConfigPayload = CreateSpeechConfigPayload(); 530 | 531 | // Convert speech.config payload to JSON 532 | var SpeechConfigPayloadJson = JsonConvert.SerializeObject(SpeechConfigPayload, Formatting.None); 533 | 534 | // Create speech.config message from required headers and JSON payload 535 | StringBuilder speechMsgBuilder = new StringBuilder(); 536 | speechMsgBuilder.Append("path:speech.config" + lineSeparator); 537 | speechMsgBuilder.Append("x-requestid:" + requestId + lineSeparator); 538 | speechMsgBuilder.Append($"x-timestamp:{DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffK")}" + lineSeparator); 539 | speechMsgBuilder.Append($"content-type:application/json; charset=utf-8" + lineSeparator); 540 | speechMsgBuilder.Append(lineSeparator); 541 | speechMsgBuilder.Append(SpeechConfigPayloadJson); 542 | var strh = speechMsgBuilder.ToString(); 543 | 544 | var encoded = Encoding.UTF8.GetBytes(speechMsgBuilder.ToString()); 545 | var buffer = new ArraySegment(encoded, 0, encoded.Length); 546 | return buffer; 547 | } 548 | 549 | private bool SendEndTurnTelemetry() 550 | { 551 | string turnInfobBodyJSON = ""; 552 | 553 | // Create speech.config message from required headers and JSON payload 554 | StringBuilder speechMsgBuilder = new StringBuilder(); 555 | speechMsgBuilder.Append("path:telemetry" + lineSeparator); 556 | speechMsgBuilder.Append("x-requestid:" + CurrentRequestId + lineSeparator); 557 | speechMsgBuilder.Append($"x-timestamp:{DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffK")}" + lineSeparator); 558 | speechMsgBuilder.Append($"content-type:application/json; charset=utf-8" + lineSeparator); 559 | speechMsgBuilder.Append(lineSeparator); 560 | speechMsgBuilder.Append(turnInfobBodyJSON); 561 | var strh = speechMsgBuilder.ToString(); 562 | 563 | var encoded = Encoding.UTF8.GetBytes(speechMsgBuilder.ToString()); 564 | var buffer = new ArraySegment(encoded, 0, encoded.Length); 565 | 566 | // send it 567 | 568 | return true; 569 | } 570 | 571 | /// 572 | /// CONFIGURING SPEECH SERVICE 573 | /// The payload of the speech.config message is a JSON structure 574 | /// that contains information about the application. 575 | /// 576 | /// 577 | private static dynamic CreateSpeechConfigPayload() 578 | { 579 | return new 580 | { 581 | context = new 582 | { 583 | system = new 584 | { 585 | version = "1.0.00000" 586 | }, 587 | os = new 588 | { 589 | platform = "Speech Service WebSocket Console App", 590 | name = "Sample", 591 | version = "1.0.00000" 592 | }, 593 | device = new 594 | { 595 | manufacturer = "Microsoft", 596 | model = "SpeechSample", 597 | version = "1.0.00000" 598 | } 599 | } 600 | }; 601 | } 602 | 603 | public async Task SendAudioPacket(string requestId, byte[] data) 604 | { 605 | byte[] headerBytes; 606 | byte[] headerHead; 607 | headerBytes = BuildAudioPacketHeader(requestId); 608 | headerHead = BuildAudioPacketHeaderHead(headerBytes); 609 | 610 | // The WebSocket Speech protocol docs state that PCM audio must be sampled at 16 kHz with 16 bits per sample 611 | // and one channel (riff-16khz-16bit-mono-pcm) but 48kHz-16-bit-stereo works too, more testing is required. 612 | var arr = headerHead.Concat(headerBytes).Concat(data).ToArray(); 613 | var arrSeg = new ArraySegment(arr, 0, arr.Length); 614 | 615 | // Debug.Log($"Sending audio data sample from microphone."); 616 | if (!IsWebSocketClientOpen(SpeechWebSocketClient)) return; 617 | await SendToWebSocket(SpeechWebSocketClient, arrSeg, true); 618 | //SpeechWebSocketClient.SendAsync(arrSeg, WebSocketMessageType.Binary, true, new CancellationToken()); 619 | // Debug.Log($"Audio data packet from microphone sent successfully!"); 620 | 621 | //var dt = Encoding.UTF8.GetString(arr); 622 | } 623 | 624 | /// 625 | /// Send an audio message with a zero-length body. This message tells the service that the client knows 626 | /// that the user stopped speaking, the utterance is finished, and the microphone is turned off. 627 | /// 628 | /// 629 | /// 630 | /// 631 | #if WINDOWS_UWP 632 | private async Task SendEmptyAudioMessageToWebSocketClient(MessageWebSocket websocketClient, string requestId) 633 | #else 634 | private async Task SendEmptyAudioMessageToWebSocketClient(ClientWebSocket websocketClient, string requestId) 635 | #endif 636 | { 637 | byte[] headerBytes; 638 | byte[] headerHead; 639 | headerBytes = BuildAudioPacketHeader(requestId); 640 | headerHead = BuildAudioPacketHeaderHead(headerBytes); 641 | var arrEnd = headerHead.Concat(headerBytes).ToArray(); 642 | await SendToWebSocket(websocketClient, new ArraySegment(arrEnd, 0, arrEnd.Length), true); 643 | //await websocketClient.SendAsync(new ArraySegment(arrEnd, 0, arrEnd.Length), WebSocketMessageType.Binary, true, new CancellationToken()); 644 | } 645 | 646 | /// 647 | /// Creates the header for an audio message to be sent via WebSockets. 648 | /// 649 | /// 650 | /// 651 | private byte[] BuildAudioPacketHeader(string requestid) 652 | { 653 | StringBuilder speechMsgBuilder = new StringBuilder(); 654 | // Clients use the audio message to send an audio chunk to the service. 655 | speechMsgBuilder.Append("path:audio" + lineSeparator); 656 | speechMsgBuilder.Append($"x-requestid:{requestid}" + lineSeparator); 657 | speechMsgBuilder.Append($"x-timestamp:{DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffK")}" + lineSeparator); 658 | speechMsgBuilder.Append($"content-type:audio/x-wav" + lineSeparator + lineSeparator); 659 | 660 | return Encoding.UTF8.GetBytes(speechMsgBuilder.ToString()); 661 | } 662 | 663 | private byte[] BuildAudioPacketHeaderHead(byte[] headerBytes) 664 | { 665 | var headerbuffer = new ArraySegment(headerBytes, 0, headerBytes.Length); 666 | var str = "0x" + (headerBytes.Length).ToString("X"); 667 | var headerHeadBytes = BitConverter.GetBytes((UInt16)headerBytes.Length); 668 | var isBigEndian = !BitConverter.IsLittleEndian; 669 | var headerHead = !isBigEndian ? new byte[] { headerHeadBytes[1], headerHeadBytes[0] } : new byte[] { headerHeadBytes[0], headerHeadBytes[1] }; 670 | return headerHead; 671 | } 672 | 673 | /// 674 | /// Builds properly formatted header data for RIFF PCM (WAV) audio data 675 | /// 676 | /// The number of audio samples that will be saved. 677 | /// This value can be 0 when building a header for streaming data 678 | /// The resolution of the audio data (e.g. 8, 16, 24 bits) 679 | /// The number of audio channels (e.g. 1 for mono, 2 for stereo, etc.) 680 | /// The sampling rate of the audio data in Hz (e.g. 22050Hz, 44100Hz (CD quality), etc.) 681 | /// 682 | public byte[] BuildRiffWAVHeader(int nbsamples, int resolution, int channels, int rate) 683 | { 684 | List header = new List(); 685 | 686 | header.AddRange(System.Text.Encoding.UTF8.GetBytes("RIFF")); 687 | // 36 is the total size of the header that follows. We don't count the RIFF line above (4) and this number (4). 688 | // The data already takes the number of channels and bytes per sample since we converted from Unity data. 689 | header.AddRange(BitConverter.GetBytes(36 + nbsamples)); // * numChannels * bytesPerSample 690 | header.AddRange(System.Text.Encoding.UTF8.GetBytes("WAVE")); 691 | header.AddRange(System.Text.Encoding.UTF8.GetBytes("fmt ")); // Format chunk marker. Includes trailing null 692 | header.AddRange(BitConverter.GetBytes(resolution)); // e.g. 16 bits 693 | UInt16 audioFormat = 1; // Type of format (1 is PCM) - 2 byte integer 694 | header.AddRange(BitConverter.GetBytes(audioFormat)); 695 | header.AddRange(BitConverter.GetBytes(Convert.ToUInt16(channels))); 696 | header.AddRange(BitConverter.GetBytes(rate)); 697 | int bytesPerSample = resolution / 8; 698 | header.AddRange(BitConverter.GetBytes(rate * bytesPerSample * channels)); // byte rate 699 | header.AddRange(BitConverter.GetBytes(Convert.ToUInt16(bytesPerSample * channels))); // block align 700 | header.AddRange(BitConverter.GetBytes(Convert.ToUInt16(resolution))); // bit depth 701 | // Start of the data section 702 | header.AddRange(System.Text.Encoding.UTF8.GetBytes("data")); // "data" chunk header. Marks the beginning of the data section. 703 | header.AddRange(BitConverter.GetBytes(nbsamples)); // Size of the data section. // * bytesPerSample 704 | 705 | return header.ToArray(); 706 | } 707 | 708 | public static UInt16 ReverseBytes(UInt16 value) 709 | { 710 | return (UInt16)((value & 0xFFU) << 8 | (value & 0xFF00U) >> 8); 711 | } 712 | 713 | SpeechServiceResult ParseWebSocketSpeechResult(string result) 714 | { 715 | SpeechServiceResult wssr = new SpeechServiceResult(); 716 | 717 | using (StringReader sr = new StringReader(result)) 718 | { 719 | int linecount = 0; 720 | string line; 721 | bool isBodyStarted = false; 722 | string bodyJSON = ""; 723 | 724 | // Parse each line in the WebSocket results to extra the headers and JSON body. 725 | // The header is in the first 3 lines of the response, the rest is the body. 726 | while ((line = sr.ReadLine()) != null) 727 | { 728 | line = line.Trim(); 729 | if (line.Length > 0) 730 | { 731 | switch (linecount) 732 | { 733 | case 0: // X-RequestID 734 | if (line.Substring(0, 11).ToLower() == "x-requestid") 735 | { 736 | wssr.RequestId = line.Substring(12); 737 | } 738 | break; 739 | 740 | case 1: // Content-Type & charset on the same line, separated by a semi-colon 741 | var sublines = line.Split(new[] { ';' }); 742 | 743 | if (sublines[0].Trim().Substring(0, 12).ToLower() == "content-type") 744 | { 745 | wssr.ContentType = sublines[0].Trim().Substring(13); 746 | 747 | if (sublines.Length > 1) 748 | { 749 | if (sublines[1].Trim().Substring(0, 7).ToLower() == "charset") 750 | { 751 | wssr.CharSet = sublines[1].Trim().Substring(8); 752 | 753 | } 754 | } 755 | } 756 | break; 757 | 758 | case 2: // Path 759 | if (line.Substring(0, 4).ToLower() == "path") 760 | { 761 | string pathStr = line.Substring(5).Trim().ToLower(); 762 | switch (pathStr) 763 | { 764 | case "turn.start": 765 | wssr.Path = SpeechServiceResult.SpeechMessagePaths.TurnStart; 766 | break; 767 | case "speech.startdetected": 768 | wssr.Path = SpeechServiceResult.SpeechMessagePaths.SpeechStartDetected; 769 | break; 770 | case "speech.hypothesis": 771 | wssr.Path = SpeechServiceResult.SpeechMessagePaths.SpeechHypothesis; 772 | //jobtelemetry.ReceivedMessages.Append( 773 | // new Receivedmessage( 774 | 775 | // )); 776 | break; 777 | case "speech.enddetected": 778 | wssr.Path = SpeechServiceResult.SpeechMessagePaths.SpeechEndDetected; 779 | break; 780 | case "speech.phrase": 781 | wssr.Path = SpeechServiceResult.SpeechMessagePaths.SpeechPhrase; 782 | break; 783 | case "turn.end": 784 | wssr.Path = SpeechServiceResult.SpeechMessagePaths.SpeechEndDetected; 785 | break; 786 | default: 787 | break; 788 | } 789 | } 790 | break; 791 | 792 | default: 793 | if (!isBodyStarted) 794 | { 795 | // For all non-empty lines past the first three (header), once we encounter an opening brace '{' 796 | // we treat the rest of the response as the main results body which is formatted in JSON. 797 | if (line.Substring(0, 1) == "{") 798 | { 799 | isBodyStarted = true; 800 | bodyJSON += line + lineSeparator; 801 | } 802 | } 803 | else 804 | { 805 | bodyJSON += line + lineSeparator; 806 | } 807 | break; 808 | } 809 | } 810 | 811 | linecount++; 812 | } 813 | 814 | // Once the full response has been parsed between header and body components, 815 | // we need to parse the JSON content of the body itself. 816 | if (bodyJSON.Length > 0) 817 | { 818 | RecognitionContent srr = JsonConvert.DeserializeObject(bodyJSON); 819 | if (srr != null) 820 | { 821 | wssr.Result = srr; 822 | } 823 | } 824 | } 825 | 826 | return wssr; 827 | } 828 | } 829 | } 830 | -------------------------------------------------------------------------------- /Assets/Scripts/SpeechRecognitionService.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2a55329782e4f4e49bb9c0b94f640bd7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/SpeechServiceResult.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Microsoft. All rights reserved. 3 | // Licensed under the MIT license. 4 | // 5 | // Microsoft Cognitive Services (formerly Project Oxford): 6 | // https://www.microsoft.com/cognitive-services 7 | // 8 | // New Speech Service: 9 | // https://docs.microsoft.com/en-us/azure/cognitive-services/Speech-Service/ 10 | // Old Bing Speech SDK: 11 | // https://docs.microsoft.com/en-us/azure/cognitive-services/Speech/home 12 | // 13 | // Copyright (c) Microsoft Corporation 14 | // All rights reserved. 15 | // 16 | // MIT License: 17 | // Permission is hereby granted, free of charge, to any person obtaining 18 | // a copy of this software and associated documentation files (the 19 | // "Software"), to deal in the Software without restriction, including 20 | // without limitation the rights to use, copy, modify, merge, publish, 21 | // distribute, sublicense, and/or sell copies of the Software, and to 22 | // permit persons to whom the Software is furnished to do so, subject to 23 | // the following conditions: 24 | // 25 | // The above copyright notice and this permission notice shall be 26 | // included in all copies or substantial portions of the Software. 27 | // 28 | // THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, 29 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 30 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 31 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 32 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 33 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 34 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 35 | // 36 | 37 | namespace SpeechRecognitionService 38 | { 39 | public class SpeechServiceResult 40 | { 41 | public enum SpeechMessagePaths { None, TurnStart, SpeechStartDetected, SpeechHypothesis, SpeechEndDetected, SpeechPhrase, TurnEnd }; 42 | 43 | public string RequestId { get; set; } 44 | public string ContentType { get; set; } 45 | public string CharSet { get; set; } 46 | public SpeechMessagePaths Path { get; set; } 47 | public RecognitionContent Result { get; set; } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Assets/Scripts/SpeechServiceResult.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 99b4d6061dac52d4baa2c712d91d294c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Telemetry.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace SpeechRecognitionService 8 | { 9 | /// 10 | /// Used to send Telemetry after a speech recognition job has completed. 11 | /// Currently not in use (yet) in the sample. Work in progress. 12 | /// 13 | public class Telemetry 14 | { 15 | public Receivedmessage[] ReceivedMessages { get; set; } 16 | public Metric[] Metrics { get; set; } 17 | 18 | public Telemetry() 19 | { 20 | 21 | } 22 | } 23 | 24 | public class Receivedmessage 25 | { 26 | public DateTime[] speechhypothesis { get; set; } 27 | public DateTime speechendDetected { get; set; } 28 | public DateTime speechphrase { get; set; } 29 | public DateTime turnend { get; set; } 30 | } 31 | 32 | public class Metric 33 | { 34 | public string Name { get; set; } 35 | public string Id { get; set; } 36 | public DateTime Start { get; set; } 37 | public DateTime End { get; set; } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Assets/Scripts/Telemetry.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 21fa672363c61954faf8d311389e3ea8 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/UnityDispatcher.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | #if WINDOWS_UWP 6 | /// 7 | /// A helper class for dispatching actions to run on various Unity threads. 8 | /// 9 | static public class UnityDispatcher 10 | { 11 | /// 12 | /// Schedules the specified action to be run on Unity's main thread. 13 | /// 14 | /// 15 | /// The action to run. 16 | /// 17 | static public void InvokeOnAppThread(Action action) 18 | { 19 | if (UnityEngine.WSA.Application.RunningOnAppThread()) 20 | { 21 | // Already on app thread, just run inline 22 | action(); 23 | } 24 | else 25 | { 26 | // Schedule 27 | UnityEngine.WSA.Application.InvokeOnAppThread(() => action(), false); 28 | } 29 | } 30 | } 31 | #endif 32 | 33 | #if !WINDOWS_UWP 34 | /// 35 | /// A helper class for dispatching actions to run on various Unity threads. 36 | /// 37 | public class UnityDispatcher : MonoBehaviour 38 | { 39 | #region Member Variables 40 | static private UnityDispatcher instance; 41 | static private Queue queue = new Queue(8); 42 | static private volatile bool queued = false; 43 | #endregion // Member Variables 44 | 45 | #region Internal Methods 46 | [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] 47 | static private void Initialize() 48 | { 49 | if (instance == null) 50 | { 51 | instance = new GameObject("Dispatcher").AddComponent(); 52 | DontDestroyOnLoad(instance.gameObject); 53 | } 54 | } 55 | #endregion // Internal Methods 56 | 57 | #region Unity Overrides 58 | protected virtual void Update() 59 | { 60 | // Action placeholder 61 | Action action = null; 62 | 63 | // Do this as long as there's something in the queue 64 | while (queued) 65 | { 66 | // Lock only long enough to take an item 67 | lock (queue) 68 | { 69 | // Get the next action 70 | action = queue.Dequeue(); 71 | 72 | // Have we exhausted the queue? 73 | if (queue.Count == 0) { queued = false; } 74 | } 75 | 76 | // Execute the action outside of the lock 77 | action(); 78 | } 79 | } 80 | #endregion // Unity Overrides 81 | 82 | #region Public Methods 83 | /// 84 | /// Schedules the specified action to be run on Unity's main thread. 85 | /// 86 | /// 87 | /// The action to run. 88 | /// 89 | static public void InvokeOnAppThread(Action action) 90 | { 91 | // Validate 92 | if (action == null) throw new ArgumentNullException(nameof(action)); 93 | 94 | // Lock to be thread-safe 95 | lock (queue) 96 | { 97 | // Add the action 98 | queue.Enqueue(action); 99 | 100 | // Action is in the queue 101 | queued = true; 102 | } 103 | } 104 | #endregion // Public Methods 105 | } 106 | #endif -------------------------------------------------------------------------------- /Assets/Scripts/UnityDispatcher.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 51875d3910262b7418075bd7ed0bc37c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/StreamingAssets.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d2208f835e2a84a4fa900d29c5bdecba 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/StreamingAssets/Thisisatest.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ActiveNick/Unity-MS-SpeechSDK/213df35b2e91be47827f87d0fa9e8fbdc9250abb/Assets/StreamingAssets/Thisisatest.wav -------------------------------------------------------------------------------- /Assets/StreamingAssets/Thisisatest.wav.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6f311031ce4fe5c4eb36fdc4abd54e67 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/WSATestCertificate.pfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ActiveNick/Unity-MS-SpeechSDK/213df35b2e91be47827f87d0fa9e8fbdc9250abb/Assets/WSATestCertificate.pfx -------------------------------------------------------------------------------- /Assets/WSATestCertificate.pfx.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b9d5f1d82f69a58469f47fbf257221db 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/mcs.rsp: -------------------------------------------------------------------------------- 1 | -r:System.Net.Http.dll -------------------------------------------------------------------------------- /Assets/mcs.rsp.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cc464a4148337084e85dd3f38eccff17 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Nick Landry 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | m_Volume: 1 7 | Rolloff Scale: 1 8 | Doppler Factor: 1 9 | Default Speaker Mode: 2 10 | m_SampleRate: 0 11 | m_DSPBufferSize: 1024 12 | m_VirtualVoiceCount: 512 13 | m_RealVoiceCount: 32 14 | m_SpatializerPlugin: 15 | m_AmbisonicDecoderPlugin: 16 | m_DisableAudio: 0 17 | m_VirtualizeEffects: 1 18 | -------------------------------------------------------------------------------- /ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 7 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_SleepThreshold: 0.005 11 | m_DefaultContactOffset: 0.01 12 | m_DefaultSolverIterations: 6 13 | m_DefaultSolverVelocityIterations: 1 14 | m_QueriesHitBackfaces: 0 15 | m_QueriesHitTriggers: 1 16 | m_EnableAdaptiveForce: 0 17 | m_ClothInterCollisionDistance: 0 18 | m_ClothInterCollisionStiffness: 0 19 | m_ContactsGeneration: 1 20 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21 | m_AutoSimulation: 1 22 | m_AutoSyncTransforms: 1 23 | m_ClothInterCollisionSettingsToggle: 0 24 | m_ContactPairsMode: 0 25 | m_BroadphaseType: 0 26 | m_WorldBounds: 27 | m_Center: {x: 0, y: 0, z: 0} 28 | m_Extent: {x: 250, y: 250, z: 250} 29 | m_WorldSubdivisions: 8 30 | -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: 8 | - enabled: 1 9 | path: Assets/Scenes/SampleScene.unity 10 | guid: 99c9720ab356a0642a771bea13969a05 11 | m_configObjects: {} 12 | -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 7 7 | m_ExternalVersionControlSupport: Visible Meta Files 8 | m_SerializationMode: 2 9 | m_LineEndingsForNewScripts: 2 10 | m_DefaultBehaviorMode: 0 11 | m_SpritePackerMode: 0 12 | m_SpritePackerPaddingPower: 1 13 | m_EtcTextureCompressorBehavior: 1 14 | m_EtcTextureFastCompressor: 1 15 | m_EtcTextureNormalCompressor: 2 16 | m_EtcTextureBestCompressor: 4 17 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd 18 | m_ProjectGenerationRootNamespace: 19 | m_UserGeneratedProjectSuffix: 20 | m_CollabEditorSettings: 21 | inProgressEnabled: 1 22 | -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 12 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_AlwaysIncludedShaders: 32 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 33 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 38 | - {fileID: 17000, guid: 0000000000000000f000000000000000, type: 0} 39 | - {fileID: 16000, guid: 0000000000000000f000000000000000, type: 0} 40 | - {fileID: 16002, guid: 0000000000000000f000000000000000, type: 0} 41 | m_PreloadedShaders: [] 42 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, 43 | type: 0} 44 | m_CustomRenderPipeline: {fileID: 0} 45 | m_TransparencySortMode: 0 46 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 47 | m_DefaultRenderingPath: 1 48 | m_DefaultMobileRenderingPath: 1 49 | m_TierSettings: [] 50 | m_LightmapStripping: 0 51 | m_FogStripping: 0 52 | m_InstancingStripping: 0 53 | m_LightmapKeepPlain: 1 54 | m_LightmapKeepDirCombined: 1 55 | m_LightmapKeepDynamicPlain: 1 56 | m_LightmapKeepDynamicDirCombined: 1 57 | m_LightmapKeepShadowMask: 1 58 | m_LightmapKeepSubtractive: 1 59 | m_FogKeepLinear: 1 60 | m_FogKeepExp: 1 61 | m_FogKeepExp2: 1 62 | m_AlbedoSwatchInfos: [] 63 | m_LightsUseLinearIntensity: 0 64 | m_LightsUseColorTemperature: 0 65 | -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 3 17 | dead: 0.001 18 | sensitivity: 3 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 3 33 | dead: 0.001 34 | sensitivity: 3 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: left ctrl 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: 0.001 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: 0.001 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left shift 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: 0.001 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: 0.001 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: 0.1 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: 0.1 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: Mouse ScrollWheel 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: 0.1 147 | snap: 0 148 | invert: 0 149 | type: 1 150 | axis: 2 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: Horizontal 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: 0.19 162 | sensitivity: 1 163 | snap: 0 164 | invert: 0 165 | type: 2 166 | axis: 0 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Vertical 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: 0.19 178 | sensitivity: 1 179 | snap: 0 180 | invert: 1 181 | type: 2 182 | axis: 1 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Fire1 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: joystick button 0 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 1000 193 | dead: 0.001 194 | sensitivity: 1000 195 | snap: 0 196 | invert: 0 197 | type: 0 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Fire2 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: joystick button 1 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 1000 209 | dead: 0.001 210 | sensitivity: 1000 211 | snap: 0 212 | invert: 0 213 | type: 0 214 | axis: 0 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire3 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: 0.001 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Jump 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 3 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: 0.001 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Submit 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: return 254 | altNegativeButton: 255 | altPositiveButton: joystick button 0 256 | gravity: 1000 257 | dead: 0.001 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Submit 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: enter 270 | altNegativeButton: 271 | altPositiveButton: space 272 | gravity: 1000 273 | dead: 0.001 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Cancel 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: escape 286 | altNegativeButton: 287 | altPositiveButton: joystick button 1 288 | gravity: 1000 289 | dead: 0.001 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | -------------------------------------------------------------------------------- /ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | debug: 89 | m_Flags: 0 90 | m_SettingNames: 91 | - Humanoid 92 | -------------------------------------------------------------------------------- /ProjectSettings/NetworkManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!149 &1 4 | NetworkManager: 5 | m_ObjectHideFlags: 0 6 | m_DebugLevel: 0 7 | m_Sendrate: 15 8 | m_AssetToPrefab: {} 9 | -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 3 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_AutoSimulation: 1 23 | m_QueriesHitTriggers: 1 24 | m_QueriesStartInColliders: 1 25 | m_ChangeStopsCallbacks: 0 26 | m_CallbacksOnDisable: 1 27 | m_AutoSyncTransforms: 1 28 | m_AlwaysShowColliders: 0 29 | m_ShowColliderSleep: 1 30 | m_ShowColliderContacts: 0 31 | m_ShowColliderAABB: 0 32 | m_ContactArrowScale: 0.2 33 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 34 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 35 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 36 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 37 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 38 | -------------------------------------------------------------------------------- /ProjectSettings/PresetManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1386491679 &1 4 | PresetManager: 5 | m_ObjectHideFlags: 0 6 | m_DefaultList: 7 | - type: 8 | m_NativeTypeID: 108 9 | m_ManagedTypePPtr: {fileID: 0} 10 | m_ManagedTypeFallback: 11 | defaultPresets: 12 | - m_Preset: {fileID: 2655988077585873504, guid: c1cf8506f04ef2c4a88b64b6c4202eea, 13 | type: 2} 14 | - type: 15 | m_NativeTypeID: 1020 16 | m_ManagedTypePPtr: {fileID: 0} 17 | m_ManagedTypeFallback: 18 | defaultPresets: 19 | - m_Preset: {fileID: 2655988077585873504, guid: 0cd792cc87e492d43b4e95b205fc5cc6, 20 | type: 2} 21 | - type: 22 | m_NativeTypeID: 1006 23 | m_ManagedTypePPtr: {fileID: 0} 24 | m_ManagedTypeFallback: 25 | defaultPresets: 26 | - m_Preset: {fileID: 2655988077585873504, guid: 7a99f8aa944efe94cb9bd74562b7d5f9, 27 | type: 2} 28 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!129 &1 4 | PlayerSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 15 7 | productGUID: 6570aa436208c4e4b99161c0ff1abd62 8 | AndroidProfiler: 0 9 | AndroidFilterTouchesWhenObscured: 0 10 | AndroidEnableSustainedPerformanceMode: 0 11 | defaultScreenOrientation: 4 12 | targetDevice: 2 13 | useOnDemandResources: 0 14 | accelerometerFrequency: 60 15 | companyName: Microsoft 16 | productName: Unity-MS-SpeechSDK 17 | defaultCursor: {fileID: 0} 18 | cursorHotspot: {x: 0, y: 0} 19 | m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} 20 | m_ShowUnitySplashScreen: 1 21 | m_ShowUnitySplashLogo: 1 22 | m_SplashScreenOverlayOpacity: 1 23 | m_SplashScreenAnimation: 1 24 | m_SplashScreenLogoStyle: 1 25 | m_SplashScreenDrawMode: 0 26 | m_SplashScreenBackgroundAnimationZoom: 1 27 | m_SplashScreenLogoAnimationZoom: 1 28 | m_SplashScreenBackgroundLandscapeAspect: 1 29 | m_SplashScreenBackgroundPortraitAspect: 1 30 | m_SplashScreenBackgroundLandscapeUvs: 31 | serializedVersion: 2 32 | x: 0 33 | y: 0 34 | width: 1 35 | height: 1 36 | m_SplashScreenBackgroundPortraitUvs: 37 | serializedVersion: 2 38 | x: 0 39 | y: 0 40 | width: 1 41 | height: 1 42 | m_SplashScreenLogos: [] 43 | m_VirtualRealitySplashScreen: {fileID: 0} 44 | m_HolographicTrackingLossScreen: {fileID: 0} 45 | defaultScreenWidth: 1024 46 | defaultScreenHeight: 768 47 | defaultScreenWidthWeb: 960 48 | defaultScreenHeightWeb: 600 49 | m_StereoRenderingPath: 0 50 | m_ActiveColorSpace: 0 51 | m_MTRendering: 1 52 | m_StackTraceTypes: 010000000100000001000000010000000100000001000000 53 | iosShowActivityIndicatorOnLoading: -1 54 | androidShowActivityIndicatorOnLoading: -1 55 | iosAppInBackgroundBehavior: 0 56 | displayResolutionDialog: 1 57 | iosAllowHTTPDownload: 1 58 | allowedAutorotateToPortrait: 1 59 | allowedAutorotateToPortraitUpsideDown: 1 60 | allowedAutorotateToLandscapeRight: 1 61 | allowedAutorotateToLandscapeLeft: 1 62 | useOSAutorotation: 1 63 | use32BitDisplayBuffer: 1 64 | preserveFramebufferAlpha: 0 65 | disableDepthAndStencilBuffers: 0 66 | androidBlitType: 0 67 | defaultIsNativeResolution: 1 68 | macRetinaSupport: 1 69 | runInBackground: 1 70 | captureSingleScreen: 0 71 | muteOtherAudioSources: 0 72 | Prepare IOS For Recording: 0 73 | Force IOS Speakers When Recording: 0 74 | deferSystemGesturesMode: 0 75 | hideHomeButton: 0 76 | submitAnalytics: 1 77 | usePlayerLog: 1 78 | bakeCollisionMeshes: 0 79 | forceSingleInstance: 0 80 | resizableWindow: 0 81 | useMacAppStoreValidation: 0 82 | macAppStoreCategory: public.app-category.games 83 | gpuSkinning: 1 84 | graphicsJobs: 0 85 | xboxPIXTextureCapture: 0 86 | xboxEnableAvatar: 0 87 | xboxEnableKinect: 0 88 | xboxEnableKinectAutoTracking: 0 89 | xboxEnableFitness: 0 90 | visibleInBackground: 1 91 | allowFullscreenSwitch: 1 92 | graphicsJobMode: 0 93 | fullscreenMode: 1 94 | xboxSpeechDB: 0 95 | xboxEnableHeadOrientation: 0 96 | xboxEnableGuest: 0 97 | xboxEnablePIXSampling: 0 98 | metalFramebufferOnly: 0 99 | n3dsDisableStereoscopicView: 0 100 | n3dsEnableSharedListOpt: 1 101 | n3dsEnableVSync: 0 102 | xboxOneResolution: 0 103 | xboxOneSResolution: 0 104 | xboxOneXResolution: 3 105 | xboxOneMonoLoggingLevel: 0 106 | xboxOneLoggingLevel: 1 107 | xboxOneDisableEsram: 0 108 | xboxOnePresentImmediateThreshold: 0 109 | switchQueueCommandMemory: 0 110 | videoMemoryForVertexBuffers: 0 111 | psp2PowerMode: 0 112 | psp2AcquireBGM: 1 113 | vulkanEnableSetSRGBWrite: 0 114 | vulkanUseSWCommandBuffers: 0 115 | m_SupportedAspectRatios: 116 | 4:3: 1 117 | 5:4: 1 118 | 16:10: 1 119 | 16:9: 1 120 | Others: 1 121 | bundleVersion: 0.1 122 | preloadedAssets: [] 123 | metroInputSource: 0 124 | wsaTransparentSwapchain: 0 125 | m_HolographicPauseOnTrackingLoss: 1 126 | xboxOneDisableKinectGpuReservation: 0 127 | xboxOneEnable7thCore: 0 128 | isWsaHolographicRemotingEnabled: 0 129 | vrSettings: 130 | cardboard: 131 | depthFormat: 0 132 | enableTransitionView: 0 133 | daydream: 134 | depthFormat: 0 135 | useSustainedPerformanceMode: 0 136 | enableVideoLayer: 0 137 | useProtectedVideoMemory: 0 138 | minimumSupportedHeadTracking: 0 139 | maximumSupportedHeadTracking: 1 140 | hololens: 141 | depthFormat: 1 142 | depthBufferSharingEnabled: 0 143 | oculus: 144 | sharedDepthBuffer: 0 145 | dashSupport: 0 146 | enable360StereoCapture: 0 147 | protectGraphicsMemory: 0 148 | useHDRDisplay: 0 149 | m_ColorGamuts: 00000000 150 | targetPixelDensity: 30 151 | resolutionScalingMode: 0 152 | androidSupportedAspectRatio: 1 153 | androidMaxAspectRatio: 2.1 154 | applicationIdentifier: 155 | Android: com.microsoft.unitymsspeechsdk 156 | buildNumber: {} 157 | AndroidBundleVersionCode: 1 158 | AndroidMinSdkVersion: 23 159 | AndroidTargetSdkVersion: 0 160 | AndroidPreferredInstallLocation: 1 161 | aotOptions: 162 | stripEngineCode: 1 163 | iPhoneStrippingLevel: 0 164 | iPhoneScriptCallOptimization: 0 165 | ForceInternetPermission: 1 166 | ForceSDCardPermission: 0 167 | CreateWallpaper: 0 168 | APKExpansionFiles: 0 169 | keepLoadedShadersAlive: 0 170 | StripUnusedMeshComponents: 1 171 | VertexChannelCompressionMask: 4054 172 | iPhoneSdkVersion: 988 173 | iOSTargetOSVersionString: 8.0 174 | tvOSSdkVersion: 0 175 | tvOSRequireExtendedGameController: 0 176 | tvOSTargetOSVersionString: 9.0 177 | uIPrerenderedIcon: 0 178 | uIRequiresPersistentWiFi: 0 179 | uIRequiresFullScreen: 1 180 | uIStatusBarHidden: 1 181 | uIExitOnSuspend: 0 182 | uIStatusBarStyle: 0 183 | iPhoneSplashScreen: {fileID: 0} 184 | iPhoneHighResSplashScreen: {fileID: 0} 185 | iPhoneTallHighResSplashScreen: {fileID: 0} 186 | iPhone47inSplashScreen: {fileID: 0} 187 | iPhone55inPortraitSplashScreen: {fileID: 0} 188 | iPhone55inLandscapeSplashScreen: {fileID: 0} 189 | iPhone58inPortraitSplashScreen: {fileID: 0} 190 | iPhone58inLandscapeSplashScreen: {fileID: 0} 191 | iPadPortraitSplashScreen: {fileID: 0} 192 | iPadHighResPortraitSplashScreen: {fileID: 0} 193 | iPadLandscapeSplashScreen: {fileID: 0} 194 | iPadHighResLandscapeSplashScreen: {fileID: 0} 195 | appleTVSplashScreen: {fileID: 0} 196 | appleTVSplashScreen2x: {fileID: 0} 197 | tvOSSmallIconLayers: [] 198 | tvOSSmallIconLayers2x: [] 199 | tvOSLargeIconLayers: [] 200 | tvOSLargeIconLayers2x: [] 201 | tvOSTopShelfImageLayers: [] 202 | tvOSTopShelfImageLayers2x: [] 203 | tvOSTopShelfImageWideLayers: [] 204 | tvOSTopShelfImageWideLayers2x: [] 205 | iOSLaunchScreenType: 0 206 | iOSLaunchScreenPortrait: {fileID: 0} 207 | iOSLaunchScreenLandscape: {fileID: 0} 208 | iOSLaunchScreenBackgroundColor: 209 | serializedVersion: 2 210 | rgba: 0 211 | iOSLaunchScreenFillPct: 100 212 | iOSLaunchScreenSize: 100 213 | iOSLaunchScreenCustomXibPath: 214 | iOSLaunchScreeniPadType: 0 215 | iOSLaunchScreeniPadImage: {fileID: 0} 216 | iOSLaunchScreeniPadBackgroundColor: 217 | serializedVersion: 2 218 | rgba: 0 219 | iOSLaunchScreeniPadFillPct: 100 220 | iOSLaunchScreeniPadSize: 100 221 | iOSLaunchScreeniPadCustomXibPath: 222 | iOSUseLaunchScreenStoryboard: 0 223 | iOSLaunchScreenCustomStoryboardPath: 224 | iOSDeviceRequirements: [] 225 | iOSURLSchemes: [] 226 | iOSBackgroundModes: 0 227 | iOSMetalForceHardShadows: 0 228 | metalEditorSupport: 1 229 | metalAPIValidation: 1 230 | iOSRenderExtraFrameOnPause: 0 231 | appleDeveloperTeamID: 232 | iOSManualSigningProvisioningProfileID: 233 | tvOSManualSigningProvisioningProfileID: 234 | iOSManualSigningProvisioningProfileType: 0 235 | tvOSManualSigningProvisioningProfileType: 0 236 | appleEnableAutomaticSigning: 0 237 | iOSRequireARKit: 0 238 | appleEnableProMotion: 0 239 | vulkanEditorSupport: 0 240 | clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea 241 | templatePackageId: com.unity.3d@1.0.2 242 | templateDefaultScene: Assets/Scenes/SampleScene.unity 243 | AndroidTargetArchitectures: 5 244 | AndroidSplashScreenScale: 0 245 | androidSplashScreen: {fileID: 0} 246 | AndroidKeystoreName: 247 | AndroidKeyaliasName: 248 | AndroidBuildApkPerCpuArchitecture: 0 249 | AndroidTVCompatibility: 1 250 | AndroidIsGame: 1 251 | AndroidEnableTango: 0 252 | androidEnableBanner: 1 253 | androidUseLowAccuracyLocation: 0 254 | m_AndroidBanners: 255 | - width: 320 256 | height: 180 257 | banner: {fileID: 0} 258 | androidGamepadSupportLevel: 0 259 | resolutionDialogBanner: {fileID: 0} 260 | m_BuildTargetIcons: [] 261 | m_BuildTargetPlatformIcons: 262 | - m_BuildTarget: Android 263 | m_Icons: 264 | - m_Textures: [] 265 | m_Width: 432 266 | m_Height: 432 267 | m_Kind: 2 268 | m_SubKind: 269 | - m_Textures: [] 270 | m_Width: 324 271 | m_Height: 324 272 | m_Kind: 2 273 | m_SubKind: 274 | - m_Textures: [] 275 | m_Width: 216 276 | m_Height: 216 277 | m_Kind: 2 278 | m_SubKind: 279 | - m_Textures: [] 280 | m_Width: 162 281 | m_Height: 162 282 | m_Kind: 2 283 | m_SubKind: 284 | - m_Textures: [] 285 | m_Width: 108 286 | m_Height: 108 287 | m_Kind: 2 288 | m_SubKind: 289 | - m_Textures: [] 290 | m_Width: 81 291 | m_Height: 81 292 | m_Kind: 2 293 | m_SubKind: 294 | - m_Textures: [] 295 | m_Width: 192 296 | m_Height: 192 297 | m_Kind: 1 298 | m_SubKind: 299 | - m_Textures: [] 300 | m_Width: 144 301 | m_Height: 144 302 | m_Kind: 1 303 | m_SubKind: 304 | - m_Textures: [] 305 | m_Width: 96 306 | m_Height: 96 307 | m_Kind: 1 308 | m_SubKind: 309 | - m_Textures: [] 310 | m_Width: 72 311 | m_Height: 72 312 | m_Kind: 1 313 | m_SubKind: 314 | - m_Textures: [] 315 | m_Width: 48 316 | m_Height: 48 317 | m_Kind: 1 318 | m_SubKind: 319 | - m_Textures: [] 320 | m_Width: 36 321 | m_Height: 36 322 | m_Kind: 1 323 | m_SubKind: 324 | - m_Textures: [] 325 | m_Width: 192 326 | m_Height: 192 327 | m_Kind: 0 328 | m_SubKind: 329 | - m_Textures: [] 330 | m_Width: 144 331 | m_Height: 144 332 | m_Kind: 0 333 | m_SubKind: 334 | - m_Textures: [] 335 | m_Width: 96 336 | m_Height: 96 337 | m_Kind: 0 338 | m_SubKind: 339 | - m_Textures: [] 340 | m_Width: 72 341 | m_Height: 72 342 | m_Kind: 0 343 | m_SubKind: 344 | - m_Textures: [] 345 | m_Width: 48 346 | m_Height: 48 347 | m_Kind: 0 348 | m_SubKind: 349 | - m_Textures: [] 350 | m_Width: 36 351 | m_Height: 36 352 | m_Kind: 0 353 | m_SubKind: 354 | m_BuildTargetBatching: 355 | - m_BuildTarget: Standalone 356 | m_StaticBatching: 1 357 | m_DynamicBatching: 0 358 | - m_BuildTarget: tvOS 359 | m_StaticBatching: 1 360 | m_DynamicBatching: 0 361 | - m_BuildTarget: Android 362 | m_StaticBatching: 1 363 | m_DynamicBatching: 0 364 | - m_BuildTarget: iPhone 365 | m_StaticBatching: 1 366 | m_DynamicBatching: 0 367 | - m_BuildTarget: WebGL 368 | m_StaticBatching: 0 369 | m_DynamicBatching: 0 370 | m_BuildTargetGraphicsAPIs: 371 | - m_BuildTarget: AndroidPlayer 372 | m_APIs: 0b00000015000000 373 | m_Automatic: 1 374 | - m_BuildTarget: iOSSupport 375 | m_APIs: 10000000 376 | m_Automatic: 1 377 | - m_BuildTarget: AppleTVSupport 378 | m_APIs: 10000000 379 | m_Automatic: 0 380 | - m_BuildTarget: WebGLSupport 381 | m_APIs: 0b000000 382 | m_Automatic: 1 383 | m_BuildTargetVRSettings: 384 | - m_BuildTarget: Standalone 385 | m_Enabled: 0 386 | m_Devices: 387 | - Oculus 388 | - OpenVR 389 | m_BuildTargetEnableVuforiaSettings: [] 390 | openGLRequireES31: 0 391 | openGLRequireES31AEP: 0 392 | m_TemplateCustomTags: {} 393 | mobileMTRendering: 394 | Android: 1 395 | iPhone: 1 396 | tvOS: 1 397 | m_BuildTargetGroupLightmapEncodingQuality: [] 398 | m_BuildTargetGroupLightmapSettings: [] 399 | playModeTestRunnerEnabled: 0 400 | runPlayModeTestAsEditModeTest: 0 401 | actionOnDotNetUnhandledException: 1 402 | enableInternalProfiler: 0 403 | logObjCUncaughtExceptions: 1 404 | enableCrashReportAPI: 0 405 | cameraUsageDescription: 406 | locationUsageDescription: 407 | microphoneUsageDescription: 408 | switchNetLibKey: 409 | switchSocketMemoryPoolSize: 6144 410 | switchSocketAllocatorPoolSize: 128 411 | switchSocketConcurrencyLimit: 14 412 | switchScreenResolutionBehavior: 2 413 | switchUseCPUProfiler: 0 414 | switchApplicationID: 0x01004b9000490000 415 | switchNSODependencies: 416 | switchTitleNames_0: 417 | switchTitleNames_1: 418 | switchTitleNames_2: 419 | switchTitleNames_3: 420 | switchTitleNames_4: 421 | switchTitleNames_5: 422 | switchTitleNames_6: 423 | switchTitleNames_7: 424 | switchTitleNames_8: 425 | switchTitleNames_9: 426 | switchTitleNames_10: 427 | switchTitleNames_11: 428 | switchTitleNames_12: 429 | switchTitleNames_13: 430 | switchTitleNames_14: 431 | switchPublisherNames_0: 432 | switchPublisherNames_1: 433 | switchPublisherNames_2: 434 | switchPublisherNames_3: 435 | switchPublisherNames_4: 436 | switchPublisherNames_5: 437 | switchPublisherNames_6: 438 | switchPublisherNames_7: 439 | switchPublisherNames_8: 440 | switchPublisherNames_9: 441 | switchPublisherNames_10: 442 | switchPublisherNames_11: 443 | switchPublisherNames_12: 444 | switchPublisherNames_13: 445 | switchPublisherNames_14: 446 | switchIcons_0: {fileID: 0} 447 | switchIcons_1: {fileID: 0} 448 | switchIcons_2: {fileID: 0} 449 | switchIcons_3: {fileID: 0} 450 | switchIcons_4: {fileID: 0} 451 | switchIcons_5: {fileID: 0} 452 | switchIcons_6: {fileID: 0} 453 | switchIcons_7: {fileID: 0} 454 | switchIcons_8: {fileID: 0} 455 | switchIcons_9: {fileID: 0} 456 | switchIcons_10: {fileID: 0} 457 | switchIcons_11: {fileID: 0} 458 | switchIcons_12: {fileID: 0} 459 | switchIcons_13: {fileID: 0} 460 | switchIcons_14: {fileID: 0} 461 | switchSmallIcons_0: {fileID: 0} 462 | switchSmallIcons_1: {fileID: 0} 463 | switchSmallIcons_2: {fileID: 0} 464 | switchSmallIcons_3: {fileID: 0} 465 | switchSmallIcons_4: {fileID: 0} 466 | switchSmallIcons_5: {fileID: 0} 467 | switchSmallIcons_6: {fileID: 0} 468 | switchSmallIcons_7: {fileID: 0} 469 | switchSmallIcons_8: {fileID: 0} 470 | switchSmallIcons_9: {fileID: 0} 471 | switchSmallIcons_10: {fileID: 0} 472 | switchSmallIcons_11: {fileID: 0} 473 | switchSmallIcons_12: {fileID: 0} 474 | switchSmallIcons_13: {fileID: 0} 475 | switchSmallIcons_14: {fileID: 0} 476 | switchManualHTML: 477 | switchAccessibleURLs: 478 | switchLegalInformation: 479 | switchMainThreadStackSize: 1048576 480 | switchPresenceGroupId: 481 | switchLogoHandling: 0 482 | switchReleaseVersion: 0 483 | switchDisplayVersion: 1.0.0 484 | switchStartupUserAccount: 0 485 | switchTouchScreenUsage: 0 486 | switchSupportedLanguagesMask: 0 487 | switchLogoType: 0 488 | switchApplicationErrorCodeCategory: 489 | switchUserAccountSaveDataSize: 0 490 | switchUserAccountSaveDataJournalSize: 0 491 | switchApplicationAttribute: 0 492 | switchCardSpecSize: -1 493 | switchCardSpecClock: -1 494 | switchRatingsMask: 0 495 | switchRatingsInt_0: 0 496 | switchRatingsInt_1: 0 497 | switchRatingsInt_2: 0 498 | switchRatingsInt_3: 0 499 | switchRatingsInt_4: 0 500 | switchRatingsInt_5: 0 501 | switchRatingsInt_6: 0 502 | switchRatingsInt_7: 0 503 | switchRatingsInt_8: 0 504 | switchRatingsInt_9: 0 505 | switchRatingsInt_10: 0 506 | switchRatingsInt_11: 0 507 | switchLocalCommunicationIds_0: 508 | switchLocalCommunicationIds_1: 509 | switchLocalCommunicationIds_2: 510 | switchLocalCommunicationIds_3: 511 | switchLocalCommunicationIds_4: 512 | switchLocalCommunicationIds_5: 513 | switchLocalCommunicationIds_6: 514 | switchLocalCommunicationIds_7: 515 | switchParentalControl: 0 516 | switchAllowsScreenshot: 1 517 | switchAllowsVideoCapturing: 1 518 | switchAllowsRuntimeAddOnContentInstall: 0 519 | switchDataLossConfirmation: 0 520 | switchUserAccountLockEnabled: 0 521 | switchSupportedNpadStyles: 3 522 | switchNativeFsCacheSize: 32 523 | switchIsHoldTypeHorizontal: 0 524 | switchSupportedNpadCount: 8 525 | switchSocketConfigEnabled: 0 526 | switchTcpInitialSendBufferSize: 32 527 | switchTcpInitialReceiveBufferSize: 64 528 | switchTcpAutoSendBufferSizeMax: 256 529 | switchTcpAutoReceiveBufferSizeMax: 256 530 | switchUdpSendBufferSize: 9 531 | switchUdpReceiveBufferSize: 42 532 | switchSocketBufferEfficiency: 4 533 | switchSocketInitializeEnabled: 1 534 | switchNetworkInterfaceManagerInitializeEnabled: 1 535 | switchPlayerConnectionEnabled: 1 536 | ps4NPAgeRating: 12 537 | ps4NPTitleSecret: 538 | ps4NPTrophyPackPath: 539 | ps4ParentalLevel: 11 540 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000 541 | ps4Category: 0 542 | ps4MasterVersion: 01.00 543 | ps4AppVersion: 01.00 544 | ps4AppType: 0 545 | ps4ParamSfxPath: 546 | ps4VideoOutPixelFormat: 0 547 | ps4VideoOutInitialWidth: 1920 548 | ps4VideoOutBaseModeInitialWidth: 1920 549 | ps4VideoOutReprojectionRate: 60 550 | ps4PronunciationXMLPath: 551 | ps4PronunciationSIGPath: 552 | ps4BackgroundImagePath: 553 | ps4StartupImagePath: 554 | ps4StartupImagesFolder: 555 | ps4IconImagesFolder: 556 | ps4SaveDataImagePath: 557 | ps4SdkOverride: 558 | ps4BGMPath: 559 | ps4ShareFilePath: 560 | ps4ShareOverlayImagePath: 561 | ps4PrivacyGuardImagePath: 562 | ps4NPtitleDatPath: 563 | ps4RemotePlayKeyAssignment: -1 564 | ps4RemotePlayKeyMappingDir: 565 | ps4PlayTogetherPlayerCount: 0 566 | ps4EnterButtonAssignment: 1 567 | ps4ApplicationParam1: 0 568 | ps4ApplicationParam2: 0 569 | ps4ApplicationParam3: 0 570 | ps4ApplicationParam4: 0 571 | ps4DownloadDataSize: 0 572 | ps4GarlicHeapSize: 2048 573 | ps4ProGarlicHeapSize: 2560 574 | ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ 575 | ps4pnSessions: 1 576 | ps4pnPresence: 1 577 | ps4pnFriends: 1 578 | ps4pnGameCustomData: 1 579 | playerPrefsSupport: 0 580 | enableApplicationExit: 0 581 | restrictedAudioUsageRights: 0 582 | ps4UseResolutionFallback: 0 583 | ps4ReprojectionSupport: 0 584 | ps4UseAudio3dBackend: 0 585 | ps4SocialScreenEnabled: 0 586 | ps4ScriptOptimizationLevel: 0 587 | ps4Audio3dVirtualSpeakerCount: 14 588 | ps4attribCpuUsage: 0 589 | ps4PatchPkgPath: 590 | ps4PatchLatestPkgPath: 591 | ps4PatchChangeinfoPath: 592 | ps4PatchDayOne: 0 593 | ps4attribUserManagement: 0 594 | ps4attribMoveSupport: 0 595 | ps4attrib3DSupport: 0 596 | ps4attribShareSupport: 0 597 | ps4attribExclusiveVR: 0 598 | ps4disableAutoHideSplash: 0 599 | ps4videoRecordingFeaturesUsed: 0 600 | ps4contentSearchFeaturesUsed: 0 601 | ps4attribEyeToEyeDistanceSettingVR: 0 602 | ps4IncludedModules: [] 603 | monoEnv: 604 | psp2Splashimage: {fileID: 0} 605 | psp2NPTrophyPackPath: 606 | psp2NPSupportGBMorGJP: 0 607 | psp2NPAgeRating: 12 608 | psp2NPTitleDatPath: 609 | psp2NPCommsID: 610 | psp2NPCommunicationsID: 611 | psp2NPCommsPassphrase: 612 | psp2NPCommsSig: 613 | psp2ParamSfxPath: 614 | psp2ManualPath: 615 | psp2LiveAreaGatePath: 616 | psp2LiveAreaBackroundPath: 617 | psp2LiveAreaPath: 618 | psp2LiveAreaTrialPath: 619 | psp2PatchChangeInfoPath: 620 | psp2PatchOriginalPackage: 621 | psp2PackagePassword: F69AzBlax3CF3EDNhm3soLBPh71Yexui 622 | psp2KeystoneFile: 623 | psp2MemoryExpansionMode: 0 624 | psp2DRMType: 0 625 | psp2StorageType: 0 626 | psp2MediaCapacity: 0 627 | psp2DLCConfigPath: 628 | psp2ThumbnailPath: 629 | psp2BackgroundPath: 630 | psp2SoundPath: 631 | psp2TrophyCommId: 632 | psp2TrophyPackagePath: 633 | psp2PackagedResourcesPath: 634 | psp2SaveDataQuota: 10240 635 | psp2ParentalLevel: 1 636 | psp2ShortTitle: Not Set 637 | psp2ContentID: IV0000-ABCD12345_00-0123456789ABCDEF 638 | psp2Category: 0 639 | psp2MasterVersion: 01.00 640 | psp2AppVersion: 01.00 641 | psp2TVBootMode: 0 642 | psp2EnterButtonAssignment: 2 643 | psp2TVDisableEmu: 0 644 | psp2AllowTwitterDialog: 1 645 | psp2Upgradable: 0 646 | psp2HealthWarning: 0 647 | psp2UseLibLocation: 0 648 | psp2InfoBarOnStartup: 0 649 | psp2InfoBarColor: 0 650 | psp2ScriptOptimizationLevel: 0 651 | splashScreenBackgroundSourceLandscape: {fileID: 0} 652 | splashScreenBackgroundSourcePortrait: {fileID: 0} 653 | spritePackerPolicy: 654 | webGLMemorySize: 256 655 | webGLExceptionSupport: 1 656 | webGLNameFilesAsHashes: 0 657 | webGLDataCaching: 1 658 | webGLDebugSymbols: 0 659 | webGLEmscriptenArgs: 660 | webGLModulesDirectory: 661 | webGLTemplate: APPLICATION:Default 662 | webGLAnalyzeBuildSize: 0 663 | webGLUseEmbeddedResources: 0 664 | webGLCompressionFormat: 1 665 | webGLLinkerTarget: 1 666 | scriptingDefineSymbols: {} 667 | platformArchitecture: {} 668 | scriptingBackend: 669 | Android: 0 670 | Metro: 2 671 | Standalone: 0 672 | il2cppCompilerConfiguration: {} 673 | incrementalIl2cppBuild: {} 674 | allowUnsafeCode: 0 675 | additionalIl2CppArgs: 676 | scriptingRuntimeVersion: 1 677 | apiCompatibilityLevelPerPlatform: 678 | Metro: 3 679 | Standalone: 3 680 | m_RenderingPath: 1 681 | m_MobileRenderingPath: 1 682 | metroPackageName: Template3D 683 | metroPackageVersion: 1.0.0.0 684 | metroCertificatePath: Assets\WSATestCertificate.pfx 685 | metroCertificatePassword: 686 | metroCertificateSubject: Microsoft 687 | metroCertificateIssuer: Microsoft 688 | metroCertificateNotAfter: 00f584577a55d501 689 | metroApplicationDescription: Template_3D 690 | wsaImages: {} 691 | metroTileShortName: 692 | metroTileShowName: 0 693 | metroMediumTileShowName: 0 694 | metroLargeTileShowName: 0 695 | metroWideTileShowName: 0 696 | metroDefaultTileSize: 1 697 | metroTileForegroundText: 2 698 | metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} 699 | metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, 700 | a: 1} 701 | metroSplashScreenUseBackgroundColor: 0 702 | platformCapabilities: 703 | WindowsStoreApps: 704 | AllJoyn: False 705 | Appointments: False 706 | BackgroundMediaPlayback: False 707 | BlockedChatMessages: False 708 | Bluetooth: False 709 | Chat: False 710 | CodeGeneration: False 711 | Contacts: False 712 | EnterpriseAuthentication: False 713 | HumanInterfaceDevice: False 714 | InputInjectionBrokered: False 715 | InternetClient: True 716 | InternetClientServer: False 717 | Location: False 718 | LowLevelDevices: False 719 | Microphone: True 720 | MusicLibrary: False 721 | Objects3D: False 722 | OfflineMapsManagement: False 723 | PhoneCall: False 724 | PhoneCallHistoryPublic: False 725 | PicturesLibrary: False 726 | PointOfService: False 727 | PrivateNetworkClientServer: False 728 | Proximity: False 729 | RecordedCallsFolder: False 730 | RemoteSystem: False 731 | RemovableStorage: False 732 | SharedUserCertificates: False 733 | SpatialPerception: False 734 | SystemManagement: False 735 | UserAccountInformation: False 736 | UserDataTasks: False 737 | UserNotificationListener: False 738 | VideosLibrary: False 739 | VoipCall: False 740 | WebCam: False 741 | metroFTAName: 742 | metroFTAFileTypes: [] 743 | metroProtocolName: 744 | metroCompilationOverrides: 1 745 | n3dsUseExtSaveData: 0 746 | n3dsCompressStaticMem: 1 747 | n3dsExtSaveDataNumber: 0x12345 748 | n3dsStackSize: 131072 749 | n3dsTargetPlatform: 2 750 | n3dsRegion: 7 751 | n3dsMediaSize: 0 752 | n3dsLogoStyle: 3 753 | n3dsTitle: GameName 754 | n3dsProductCode: 755 | n3dsApplicationId: 0xFF3FF 756 | XboxOneProductId: 757 | XboxOneUpdateKey: 758 | XboxOneSandboxId: 759 | XboxOneContentId: 760 | XboxOneTitleId: 761 | XboxOneSCId: 762 | XboxOneGameOsOverridePath: 763 | XboxOnePackagingOverridePath: 764 | XboxOneAppManifestOverridePath: 765 | XboxOneVersion: 1.0.0.0 766 | XboxOnePackageEncryption: 0 767 | XboxOnePackageUpdateGranularity: 2 768 | XboxOneDescription: 769 | XboxOneLanguage: 770 | - enus 771 | XboxOneCapability: [] 772 | XboxOneGameRating: {} 773 | XboxOneIsContentPackage: 0 774 | XboxOneEnableGPUVariability: 0 775 | XboxOneSockets: {} 776 | XboxOneSplashScreen: {fileID: 0} 777 | XboxOneAllowedProductIds: [] 778 | XboxOnePersistentLocalStorageSize: 0 779 | XboxOneXTitleMemory: 8 780 | xboxOneScriptCompiler: 0 781 | vrEditorSettings: 782 | daydream: 783 | daydreamIconForeground: {fileID: 0} 784 | daydreamIconBackground: {fileID: 0} 785 | cloudServicesEnabled: 786 | UNet: 1 787 | facebookSdkVersion: 7.9.4 788 | apiCompatibilityLevel: 3 789 | cloudProjectId: 790 | projectName: 791 | organizationId: 792 | cloudEnabled: 0 793 | enableNativePlatformBackendsForNewInputSystem: 0 794 | disableOldInputManagerSupport: 0 795 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2018.2.20f1 2 | -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 4 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Very Low 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | blendWeights: 1 22 | textureQuality: 1 23 | anisotropicTextures: 0 24 | antiAliasing: 0 25 | softParticles: 0 26 | softVegetation: 0 27 | realtimeReflectionProbes: 0 28 | billboardsFaceCameraPosition: 0 29 | vSyncCount: 0 30 | lodBias: 0.3 31 | maximumLODLevel: 0 32 | particleRaycastBudget: 4 33 | asyncUploadTimeSlice: 2 34 | asyncUploadBufferSize: 4 35 | resolutionScalingFixedDPIFactor: 1 36 | excludedTargetPlatforms: [] 37 | - serializedVersion: 2 38 | name: Low 39 | pixelLightCount: 0 40 | shadows: 0 41 | shadowResolution: 0 42 | shadowProjection: 1 43 | shadowCascades: 1 44 | shadowDistance: 20 45 | shadowNearPlaneOffset: 3 46 | shadowCascade2Split: 0.33333334 47 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 48 | shadowmaskMode: 0 49 | blendWeights: 2 50 | textureQuality: 0 51 | anisotropicTextures: 0 52 | antiAliasing: 0 53 | softParticles: 0 54 | softVegetation: 0 55 | realtimeReflectionProbes: 0 56 | billboardsFaceCameraPosition: 0 57 | vSyncCount: 0 58 | lodBias: 0.4 59 | maximumLODLevel: 0 60 | particleRaycastBudget: 16 61 | asyncUploadTimeSlice: 2 62 | asyncUploadBufferSize: 4 63 | resolutionScalingFixedDPIFactor: 1 64 | excludedTargetPlatforms: [] 65 | - serializedVersion: 2 66 | name: Medium 67 | pixelLightCount: 1 68 | shadows: 1 69 | shadowResolution: 0 70 | shadowProjection: 1 71 | shadowCascades: 1 72 | shadowDistance: 20 73 | shadowNearPlaneOffset: 3 74 | shadowCascade2Split: 0.33333334 75 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 76 | shadowmaskMode: 0 77 | blendWeights: 2 78 | textureQuality: 0 79 | anisotropicTextures: 1 80 | antiAliasing: 0 81 | softParticles: 0 82 | softVegetation: 0 83 | realtimeReflectionProbes: 0 84 | billboardsFaceCameraPosition: 0 85 | vSyncCount: 1 86 | lodBias: 0.7 87 | maximumLODLevel: 0 88 | particleRaycastBudget: 64 89 | asyncUploadTimeSlice: 2 90 | asyncUploadBufferSize: 4 91 | resolutionScalingFixedDPIFactor: 1 92 | excludedTargetPlatforms: [] 93 | - serializedVersion: 2 94 | name: High 95 | pixelLightCount: 2 96 | shadows: 2 97 | shadowResolution: 1 98 | shadowProjection: 1 99 | shadowCascades: 2 100 | shadowDistance: 40 101 | shadowNearPlaneOffset: 3 102 | shadowCascade2Split: 0.33333334 103 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 104 | shadowmaskMode: 1 105 | blendWeights: 2 106 | textureQuality: 0 107 | anisotropicTextures: 1 108 | antiAliasing: 2 109 | softParticles: 0 110 | softVegetation: 1 111 | realtimeReflectionProbes: 1 112 | billboardsFaceCameraPosition: 1 113 | vSyncCount: 1 114 | lodBias: 1 115 | maximumLODLevel: 0 116 | particleRaycastBudget: 256 117 | asyncUploadTimeSlice: 2 118 | asyncUploadBufferSize: 4 119 | resolutionScalingFixedDPIFactor: 1 120 | excludedTargetPlatforms: [] 121 | - serializedVersion: 2 122 | name: Very High 123 | pixelLightCount: 3 124 | shadows: 2 125 | shadowResolution: 2 126 | shadowProjection: 1 127 | shadowCascades: 2 128 | shadowDistance: 40 129 | shadowNearPlaneOffset: 3 130 | shadowCascade2Split: 0.33333334 131 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 132 | shadowmaskMode: 1 133 | blendWeights: 4 134 | textureQuality: 0 135 | anisotropicTextures: 1 136 | antiAliasing: 4 137 | softParticles: 1 138 | softVegetation: 1 139 | realtimeReflectionProbes: 1 140 | billboardsFaceCameraPosition: 1 141 | vSyncCount: 1 142 | lodBias: 1.5 143 | maximumLODLevel: 0 144 | particleRaycastBudget: 1024 145 | asyncUploadTimeSlice: 2 146 | asyncUploadBufferSize: 4 147 | resolutionScalingFixedDPIFactor: 1 148 | excludedTargetPlatforms: [] 149 | - serializedVersion: 2 150 | name: Ultra 151 | pixelLightCount: 4 152 | shadows: 2 153 | shadowResolution: 2 154 | shadowProjection: 1 155 | shadowCascades: 4 156 | shadowDistance: 150 157 | shadowNearPlaneOffset: 3 158 | shadowCascade2Split: 0.33333334 159 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 160 | shadowmaskMode: 1 161 | blendWeights: 4 162 | textureQuality: 0 163 | anisotropicTextures: 1 164 | antiAliasing: 4 165 | softParticles: 1 166 | softVegetation: 1 167 | realtimeReflectionProbes: 1 168 | billboardsFaceCameraPosition: 1 169 | vSyncCount: 1 170 | lodBias: 2 171 | maximumLODLevel: 0 172 | particleRaycastBudget: 4096 173 | asyncUploadTimeSlice: 2 174 | asyncUploadBufferSize: 4 175 | resolutionScalingFixedDPIFactor: 1 176 | excludedTargetPlatforms: [] 177 | m_PerPlatformDefaultQuality: 178 | Android: 2 179 | Nintendo 3DS: 5 180 | Nintendo Switch: 5 181 | PS4: 5 182 | PSP2: 2 183 | Standalone: 5 184 | Tizen: 2 185 | WebGL: 3 186 | WiiU: 5 187 | Windows Store Apps: 5 188 | XboxOne: 5 189 | iPhone: 2 190 | tvOS: 2 191 | -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 14 | - 15 | - 16 | - PostProcessing 17 | - 18 | - 19 | - 20 | - 21 | - 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.1 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | m_Enabled: 1 7 | m_TestMode: 0 8 | m_TestEventUrl: 9 | m_TestConfigUrl: 10 | m_TestInitMode: 0 11 | CrashReportingSettings: 12 | m_EventUrl: https://perf-events.cloud.unity3d.com/api/events/crashes 13 | m_NativeEventUrl: https://perf-events.cloud.unity3d.com/symbolicate 14 | m_Enabled: 0 15 | m_CaptureEditorExceptions: 1 16 | UnityPurchasingSettings: 17 | m_Enabled: 0 18 | m_TestMode: 0 19 | UnityAnalyticsSettings: 20 | m_Enabled: 1 21 | m_InitializeOnStartup: 1 22 | m_TestMode: 0 23 | m_TestEventUrl: 24 | m_TestConfigUrl: 25 | UnityAdsSettings: 26 | m_Enabled: 0 27 | m_InitializeOnStartup: 1 28 | m_TestMode: 0 29 | m_IosGameId: 30 | m_AndroidGameId: 31 | m_GameIds: {} 32 | m_GameId: 33 | PerformanceReportingSettings: 34 | m_Enabled: 0 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Unity-MS-SpeechSDK 2 | Sample Unity project used to demonstrate Speech Recognition (aka Speech-to-Text) using the new [Microsoft Speech Service](https://docs.microsoft.com/en-us/azure/cognitive-services/Speech-Service/) (currently in Preview) via WebSockets. The Microsoft Speech Service is part of [Microsoft Azure Cognitive Services](https://www.microsoft.com/cognitive-services). **This is a work in progress**. 3 | 4 | * **Unity version:** 2018.2.5f1 5 | * **Speech Service version:** 0.6.0 (Preview) 6 | * **Target platforms tested:** Unity Editor/Mono, Windows Desktop x64, Android, UWP (*to be tested*: iOS) 7 | 8 | ![Screenshot](Screenshots/SpeechRecoExample01.gif) 9 | 10 | ## Implementation Notes 11 | * This sample uses the [Speech Service WebSocket protocol](https://docs.microsoft.com/en-us/azure/cognitive-services/speech/api-reference-rest/websocketprotocol) to interact with the Speech Service and generate speech recognition hypotheses in real-time. 12 | * This sample is compatible with both the new Cognitive Services Speech Service (Preview) and the classic Bing Speech API. The default and recommended approach is the new service. 13 | * You will need an Azure Cognitive Services account to use this sample: [Create an account here](https://docs.microsoft.com/azure/cognitive-services/cognitive-services-apis-create-account). 14 | * If you see any API keys in the code, these are either trial keys that will expire soon or temporary keys that may get invalidated. Please get your own keys. [Get your own trial key to Bing Speech or the new Speech Service here](https://azure.microsoft.com/try/cognitive-services). A free tier is available allowing 5,000 transactions per month, at a rate of 20 per minute. 15 | * This sample supports two methods to perform speech recognition: 16 | * **METHOD #1**: The UI Canvas button **Start Recognizer from File** uploads a speech audio file to perform the recognition. You can use the buttons **Start Recording** & **Stop** to first record an audio file. The sample uses the same audio file for recording and recognition upload by default. 17 | * **METHOD #2**: The UI Canvas button **Start Recognition from Microphone** uses the *default* microphone to record the user's voice and send audio packets for real-time recognition. The service automatically detects silences and issues an end of speech event to stop the microphone recording automatically. 18 | * The speech recognition results are posted in the UI Canvas Text label as well as the Unity Debug Console window in real-time as the paudio packets are received by the Speech service. 19 | * The **SpeechManager** also includes support for client-side silence detection, which has configurable parameters. Thanks to my colleague [Jared Bienz](https://github.com/jbienzms) for this feature. 20 | * *NOTE: This project contains incomplete artifacts in progress*. 21 | 22 | ## Resource Links 23 | * [Microsoft Cognitive Services](https://www.microsoft.com/cognitive-services) (formerly Project Oxford) 24 | * [New Cognitive Services Speech Service](https://docs.microsoft.com/en-us/azure/cognitive-services/Speech-Service/) (currently in Preview) 25 | * [Classic Bing Speech Service](https://docs.microsoft.com/en-us/azure/cognitive-services/Speech/home) (legacy) 26 | * [Unity Speech Synthesis Sample](https://github.com/ActiveNick/Unity-Text-to-Speech) (aka Text-to-Speech) 27 | 28 | ## Follow Me 29 | * Twitter: [@ActiveNick](http://twitter.com/ActiveNick) 30 | * Blog: [AgeofMobility.com](http://AgeofMobility.com) 31 | * SlideShare: [http://www.slideshare.net/ActiveNick](http://www.slideshare.net/ActiveNick) 32 | -------------------------------------------------------------------------------- /Screenshots/SpeechRecoExample01.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ActiveNick/Unity-MS-SpeechSDK/213df35b2e91be47827f87d0fa9e8fbdc9250abb/Screenshots/SpeechRecoExample01.gif -------------------------------------------------------------------------------- /Unity-MS-SpeechSDK.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Assembly-CSharp", "Assembly-CSharp.csproj", "{F3E48ABF-828A-2E3A-DF90-868EDB1B039E}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Any CPU = Debug|Any CPU 9 | Release|Any CPU = Release|Any CPU 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {F3E48ABF-828A-2E3A-DF90-868EDB1B039E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 13 | {F3E48ABF-828A-2E3A-DF90-868EDB1B039E}.Debug|Any CPU.Build.0 = Debug|Any CPU 14 | {F3E48ABF-828A-2E3A-DF90-868EDB1B039E}.Release|Any CPU.ActiveCfg = Release|Any CPU 15 | {F3E48ABF-828A-2E3A-DF90-868EDB1B039E}.Release|Any CPU.Build.0 = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | --------------------------------------------------------------------------------