├── .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 | 
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 |
--------------------------------------------------------------------------------