Skip to content

Commit 2b24298

Browse files
committed
First prototype for SpeechInputHandler
1 parent 0fe54c1 commit 2b24298

File tree

5 files changed

+318
-36
lines changed

5 files changed

+318
-36
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License. See LICENSE in the project root for license information.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using UnityEngine;
7+
using UnityEngine.Events;
8+
9+
namespace HoloToolkit.Unity.InputModule
10+
{
11+
public class SpeechInputHandler : MonoBehaviour, ISpeechHandler
12+
{
13+
[System.Serializable]
14+
public struct KeywordAndResponse
15+
{
16+
[Tooltip("The keyword to recognize.")]
17+
public string Keyword;
18+
[Tooltip("The UnityEvent to be invoked when the keyword is recognized.")]
19+
public UnityEvent Response;
20+
}
21+
22+
[Tooltip("An array of string keywords and UnityEvents, to be set in the Inspector.")]
23+
public KeywordAndResponse[] KeywordsAndResponses;
24+
25+
private readonly Dictionary<string, UnityEvent> responses = new Dictionary<string, UnityEvent>();
26+
27+
// Use this for initialization
28+
protected virtual void Start()
29+
{
30+
int keywordCount = KeywordsAndResponses.Length;
31+
if (keywordCount > 0)
32+
{
33+
try
34+
{
35+
// Convert the struct array into a dictionary, with the keywords and the keys and the methods as the values.
36+
// This helps easily link the keyword recognized to the UnityEvent to be invoked.
37+
for (int index = 0; index < keywordCount; index++)
38+
{
39+
KeywordAndResponse keywordAndResponse = KeywordsAndResponses[index];
40+
responses[keywordAndResponse.Keyword.ToLower()] = keywordAndResponse.Response;
41+
}
42+
}
43+
catch (ArgumentException)
44+
{
45+
Debug.LogError("Duplicate keywords specified in the Inspector on " + gameObject.name + ".");
46+
}
47+
}
48+
else
49+
{
50+
Debug.LogError("Must have at least one keyword specified in the Inspector on " + gameObject.name + ".");
51+
}
52+
}
53+
54+
void ISpeechHandler.OnSpeechKeywordRecognized(SpeechKeywordRecognizedEventData eventData)
55+
{
56+
UnityEvent keywordResponse;
57+
58+
// Check to make sure the recognized keyword exists in the methods dictionary, then invoke the corresponding method.
59+
if (enabled && responses.TryGetValue(eventData.RecognizedText.ToLower(), out keywordResponse))
60+
{
61+
keywordResponse.Invoke();
62+
}
63+
}
64+
}
65+
}

Assets/HoloToolkit/Input/Tests/Scripts/SphereGlobalKeywords.cs.meta renamed to Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputHandler.cs.meta

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/HoloToolkit/Input/Tests/Scenes/SpeechInputSource.unity

Lines changed: 223 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ GameObject:
229229
- component: {fileID: 1071413367}
230230
- component: {fileID: 1071413366}
231231
- component: {fileID: 1071413365}
232+
- component: {fileID: 1071413368}
232233
- component: {fileID: 1071413364}
233234
m_Layer: 0
234235
m_Name: Sphere
@@ -311,6 +312,69 @@ MeshFilter:
311312
m_PrefabInternal: {fileID: 0}
312313
m_GameObject: {fileID: 1071413362}
313314
m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
315+
--- !u!114 &1071413368
316+
MonoBehaviour:
317+
m_ObjectHideFlags: 0
318+
m_PrefabParentObject: {fileID: 0}
319+
m_PrefabInternal: {fileID: 0}
320+
m_GameObject: {fileID: 1071413362}
321+
m_Enabled: 1
322+
m_EditorHideFlags: 0
323+
m_Script: {fileID: 11500000, guid: e7d6513c2cdf97f409654a2a4114d9b1, type: 3}
324+
m_Name:
325+
m_EditorClassIdentifier:
326+
KeywordsAndResponses:
327+
- Keyword: Red
328+
Response:
329+
m_PersistentCalls:
330+
m_Calls:
331+
- m_Target: {fileID: 1071413364}
332+
m_MethodName: ChangeColor
333+
m_Mode: 5
334+
m_Arguments:
335+
m_ObjectArgument: {fileID: 0}
336+
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
337+
m_IntArgument: 0
338+
m_FloatArgument: 0
339+
m_StringArgument: Red
340+
m_BoolArgument: 0
341+
m_CallState: 2
342+
m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine, Version=0.0.0.0, Culture=neutral,
343+
PublicKeyToken=null
344+
- Keyword: Green
345+
Response:
346+
m_PersistentCalls:
347+
m_Calls:
348+
- m_Target: {fileID: 1071413364}
349+
m_MethodName: ChangeColor
350+
m_Mode: 5
351+
m_Arguments:
352+
m_ObjectArgument: {fileID: 0}
353+
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
354+
m_IntArgument: 0
355+
m_FloatArgument: 0
356+
m_StringArgument: Green
357+
m_BoolArgument: 0
358+
m_CallState: 2
359+
m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine, Version=0.0.0.0, Culture=neutral,
360+
PublicKeyToken=null
361+
- Keyword: Blue
362+
Response:
363+
m_PersistentCalls:
364+
m_Calls:
365+
- m_Target: {fileID: 1071413364}
366+
m_MethodName: ChangeColor
367+
m_Mode: 5
368+
m_Arguments:
369+
m_ObjectArgument: {fileID: 0}
370+
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
371+
m_IntArgument: 0
372+
m_FloatArgument: 0
373+
m_StringArgument: Blue
374+
m_BoolArgument: 0
375+
m_CallState: 2
376+
m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine, Version=0.0.0.0, Culture=neutral,
377+
PublicKeyToken=null
314378
--- !u!1 &1073894170
315379
GameObject:
316380
m_ObjectHideFlags: 0
@@ -351,6 +415,7 @@ GameObject:
351415
m_Component:
352416
- component: {fileID: 1117903547}
353417
- component: {fileID: 1117903549}
418+
- component: {fileID: 1117903550}
354419
- component: {fileID: 1117903548}
355420
m_Layer: 0
356421
m_Name: Spheres
@@ -383,7 +448,7 @@ MonoBehaviour:
383448
m_GameObject: {fileID: 1117903546}
384449
m_Enabled: 1
385450
m_EditorHideFlags: 0
386-
m_Script: {fileID: 11500000, guid: a47655a0fed0e3f48a16805b10ac8225, type: 3}
451+
m_Script: {fileID: 11500000, guid: ec2809d00e1924343b61a3db70c2a77d, type: 3}
387452
m_Name:
388453
m_EditorClassIdentifier:
389454
--- !u!114 &1117903549
@@ -397,6 +462,35 @@ MonoBehaviour:
397462
m_Script: {fileID: 11500000, guid: cae8f3c88e9704a4393cb8d904b62372, type: 3}
398463
m_Name:
399464
m_EditorClassIdentifier:
465+
--- !u!114 &1117903550
466+
MonoBehaviour:
467+
m_ObjectHideFlags: 0
468+
m_PrefabParentObject: {fileID: 0}
469+
m_PrefabInternal: {fileID: 0}
470+
m_GameObject: {fileID: 1117903546}
471+
m_Enabled: 1
472+
m_EditorHideFlags: 0
473+
m_Script: {fileID: 11500000, guid: e7d6513c2cdf97f409654a2a4114d9b1, type: 3}
474+
m_Name:
475+
m_EditorClassIdentifier:
476+
KeywordsAndResponses:
477+
- Keyword: Reset All
478+
Response:
479+
m_PersistentCalls:
480+
m_Calls:
481+
- m_Target: {fileID: 1117903548}
482+
m_MethodName: ResetAll
483+
m_Mode: 1
484+
m_Arguments:
485+
m_ObjectArgument: {fileID: 0}
486+
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
487+
m_IntArgument: 0
488+
m_FloatArgument: 0
489+
m_StringArgument:
490+
m_BoolArgument: 0
491+
m_CallState: 2
492+
m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine, Version=0.0.0.0, Culture=neutral,
493+
PublicKeyToken=null
400494
--- !u!1 &1525392731
401495
GameObject:
402496
m_ObjectHideFlags: 0
@@ -408,6 +502,7 @@ GameObject:
408502
- component: {fileID: 1525392736}
409503
- component: {fileID: 1525392735}
410504
- component: {fileID: 1525392734}
505+
- component: {fileID: 1525392737}
411506
- component: {fileID: 1525392733}
412507
m_Layer: 0
413508
m_Name: Sphere
@@ -490,6 +585,69 @@ MeshFilter:
490585
m_PrefabInternal: {fileID: 0}
491586
m_GameObject: {fileID: 1525392731}
492587
m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
588+
--- !u!114 &1525392737
589+
MonoBehaviour:
590+
m_ObjectHideFlags: 0
591+
m_PrefabParentObject: {fileID: 0}
592+
m_PrefabInternal: {fileID: 0}
593+
m_GameObject: {fileID: 1525392731}
594+
m_Enabled: 1
595+
m_EditorHideFlags: 0
596+
m_Script: {fileID: 11500000, guid: e7d6513c2cdf97f409654a2a4114d9b1, type: 3}
597+
m_Name:
598+
m_EditorClassIdentifier:
599+
KeywordsAndResponses:
600+
- Keyword: Red
601+
Response:
602+
m_PersistentCalls:
603+
m_Calls:
604+
- m_Target: {fileID: 1525392733}
605+
m_MethodName: ChangeColor
606+
m_Mode: 5
607+
m_Arguments:
608+
m_ObjectArgument: {fileID: 0}
609+
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
610+
m_IntArgument: 0
611+
m_FloatArgument: 0
612+
m_StringArgument: Red
613+
m_BoolArgument: 0
614+
m_CallState: 2
615+
m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine, Version=0.0.0.0, Culture=neutral,
616+
PublicKeyToken=null
617+
- Keyword: Green
618+
Response:
619+
m_PersistentCalls:
620+
m_Calls:
621+
- m_Target: {fileID: 1525392733}
622+
m_MethodName: ChangeColor
623+
m_Mode: 5
624+
m_Arguments:
625+
m_ObjectArgument: {fileID: 0}
626+
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
627+
m_IntArgument: 0
628+
m_FloatArgument: 0
629+
m_StringArgument: Green
630+
m_BoolArgument: 0
631+
m_CallState: 2
632+
m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine, Version=0.0.0.0, Culture=neutral,
633+
PublicKeyToken=null
634+
- Keyword: Blue
635+
Response:
636+
m_PersistentCalls:
637+
m_Calls:
638+
- m_Target: {fileID: 1525392733}
639+
m_MethodName: ChangeColor
640+
m_Mode: 5
641+
m_Arguments:
642+
m_ObjectArgument: {fileID: 0}
643+
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
644+
m_IntArgument: 0
645+
m_FloatArgument: 0
646+
m_StringArgument: Blue
647+
m_BoolArgument: 0
648+
m_CallState: 2
649+
m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine, Version=0.0.0.0, Culture=neutral,
650+
PublicKeyToken=null
493651
--- !u!1 &1590076548
494652
GameObject:
495653
m_ObjectHideFlags: 0
@@ -806,6 +964,7 @@ GameObject:
806964
- component: {fileID: 2114791807}
807965
- component: {fileID: 2114791806}
808966
- component: {fileID: 2114791805}
967+
- component: {fileID: 2114791810}
809968
- component: {fileID: 2114791809}
810969
m_Layer: 0
811970
m_Name: Sphere
@@ -888,3 +1047,66 @@ MonoBehaviour:
8881047
m_Script: {fileID: 11500000, guid: ec2809d00e1924343b61a3db70c2a77d, type: 3}
8891048
m_Name:
8901049
m_EditorClassIdentifier:
1050+
--- !u!114 &2114791810
1051+
MonoBehaviour:
1052+
m_ObjectHideFlags: 0
1053+
m_PrefabParentObject: {fileID: 0}
1054+
m_PrefabInternal: {fileID: 0}
1055+
m_GameObject: {fileID: 2114791804}
1056+
m_Enabled: 1
1057+
m_EditorHideFlags: 0
1058+
m_Script: {fileID: 11500000, guid: e7d6513c2cdf97f409654a2a4114d9b1, type: 3}
1059+
m_Name:
1060+
m_EditorClassIdentifier:
1061+
KeywordsAndResponses:
1062+
- Keyword: Red
1063+
Response:
1064+
m_PersistentCalls:
1065+
m_Calls:
1066+
- m_Target: {fileID: 2114791809}
1067+
m_MethodName: ChangeColor
1068+
m_Mode: 5
1069+
m_Arguments:
1070+
m_ObjectArgument: {fileID: 0}
1071+
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
1072+
m_IntArgument: 0
1073+
m_FloatArgument: 0
1074+
m_StringArgument: Red
1075+
m_BoolArgument: 0
1076+
m_CallState: 2
1077+
m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine, Version=0.0.0.0, Culture=neutral,
1078+
PublicKeyToken=null
1079+
- Keyword: Green
1080+
Response:
1081+
m_PersistentCalls:
1082+
m_Calls:
1083+
- m_Target: {fileID: 2114791809}
1084+
m_MethodName: ChangeColor
1085+
m_Mode: 5
1086+
m_Arguments:
1087+
m_ObjectArgument: {fileID: 0}
1088+
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
1089+
m_IntArgument: 0
1090+
m_FloatArgument: 0
1091+
m_StringArgument: Green
1092+
m_BoolArgument: 0
1093+
m_CallState: 2
1094+
m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine, Version=0.0.0.0, Culture=neutral,
1095+
PublicKeyToken=null
1096+
- Keyword: Blue
1097+
Response:
1098+
m_PersistentCalls:
1099+
m_Calls:
1100+
- m_Target: {fileID: 2114791809}
1101+
m_MethodName: ChangeColor
1102+
m_Mode: 5
1103+
m_Arguments:
1104+
m_ObjectArgument: {fileID: 0}
1105+
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
1106+
m_IntArgument: 0
1107+
m_FloatArgument: 0
1108+
m_StringArgument: Blue
1109+
m_BoolArgument: 0
1110+
m_CallState: 2
1111+
m_TypeName: UnityEngine.Events.UnityEvent, UnityEngine, Version=0.0.0.0, Culture=neutral,
1112+
PublicKeyToken=null

Assets/HoloToolkit/Input/Tests/Scripts/SphereGlobalKeywords.cs

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)