Created
July 14, 2016 14:20
-
-
Save flushpot1125/8babcdb5137a437fa6e32562ae5922f9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Collections.ObjectModel; | |
using System.Diagnostics; | |
using System.Threading.Tasks; | |
using Windows.Media.SpeechRecognition; | |
using Windows.Media.SpeechSynthesis; | |
using Windows.UI.Core; | |
using Windows.UI.Xaml; | |
using Windows.UI.Xaml.Controls; | |
using UnityEngine.Windows; | |
using UnityPlayer; | |
namespace Plugin.Windows10 | |
{ | |
public class VoiceSpeech | |
{ | |
static SpeechRecognizer speechRecognizer = null; | |
static bool isListening = false; | |
public static string Output; | |
public static MediaElement Media; | |
static List<string> questions = new List<string>(); | |
static List<string> answers = new List<string>(); | |
public static async void StartListening(object sender, EventArgs e) | |
{ | |
try | |
{ | |
Dictionary<string, string> qaList = sender as Dictionary<string, string>; | |
questions.Clear(); | |
answers.Clear(); | |
foreach (var entity in qaList) | |
{ | |
questions.Add(entity.Key); | |
answers.Add(entity.Value); | |
} | |
speechRecognizer = new SpeechRecognizer(); | |
speechRecognizer.Constraints.Add(new SpeechRecognitionListConstraint(questions, "AlwaysOnGrammar")); | |
SpeechRecognitionCompilationResult compilationResult = await speechRecognizer.CompileConstraintsAsync(); | |
if (compilationResult.Status != SpeechRecognitionResultStatus.Success) | |
throw new Exception(); | |
speechRecognizer.ContinuousRecognitionSession.Completed += ContinuousRecognitionSession_Completed; | |
speechRecognizer.ContinuousRecognitionSession.ResultGenerated += ContinuousRecognitionSession_ResultGenerated; | |
Debug.WriteLine("Starting to listen"); | |
await speechRecognizer.ContinuousRecognitionSession.StartAsync(); | |
isListening = true; | |
} | |
catch (Exception ex) | |
{ | |
isListening = false; | |
} | |
} | |
public static async void StopListening(object sender, EventArgs e) | |
{ | |
if (speechRecognizer != null) | |
{ | |
try { | |
if (isListening) | |
{ | |
Debug.WriteLine("Stopping to listen"); | |
speechRecognizer.ContinuousRecognitionSession.Completed -= ContinuousRecognitionSession_Completed; | |
speechRecognizer.ContinuousRecognitionSession.ResultGenerated -= ContinuousRecognitionSession_ResultGenerated; | |
await speechRecognizer.ContinuousRecognitionSession.StopAsync(); | |
isListening = false; | |
} | |
} | |
catch (Exception ex) | |
{ | |
speechRecognizer.Dispose(); | |
speechRecognizer = null; | |
isListening = false; | |
} | |
} | |
} | |
private static async Task Speak(string text) | |
{ | |
SpeechSynthesizer synth = new SpeechSynthesizer(); | |
SpeechSynthesisStream synthStream = | |
await synth.SynthesizeTextToStreamAsync(text); | |
Media.SetSource(synthStream, synthStream.ContentType); | |
} | |
private static async void VoiceResponse(string resp) | |
{ | |
if (isListening) | |
{ | |
await speechRecognizer.ContinuousRecognitionSession.StopAsync(); | |
isListening = false; | |
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, | |
() => | |
{ | |
Speak(resp); | |
}); | |
await speechRecognizer.ContinuousRecognitionSession.StartAsync(); | |
isListening = true; | |
} | |
} | |
private static async void ContinuousRecognitionSession_ResultGenerated(SpeechContinuousRecognitionSession sender, SpeechContinuousRecognitionResultGeneratedEventArgs args) | |
{ | |
Debug.WriteLine("Result Generated"); | |
int index = 0; | |
foreach(string q in questions) | |
{ | |
if (args.Result.Text == q) | |
{ | |
VoiceResponse(answers[index]); | |
/*add*/ | |
InvokeUnity(index); | |
/**/ | |
} | |
index++; | |
} | |
} | |
private static void ContinuousRecognitionSession_Completed(SpeechContinuousRecognitionSession sender, SpeechContinuousRecognitionCompletedEventArgs args) | |
{ | |
Debug.WriteLine("Completed"); | |
if (args.Status != SpeechRecognitionResultStatus.Success) | |
{ | |
if (args.Status == SpeechRecognitionResultStatus.TimeoutExceeded) | |
{ | |
} | |
} | |
} | |
/*add*/ | |
private static void InvokeUnity(int index) { | |
switch (index) { | |
case 0: | |
InvokeUnity_generateFlare(); | |
break; | |
case 1: | |
InvokeUnity_proceedFlare(); | |
break; | |
} | |
} | |
/**/ | |
/*add*/ | |
private static void InvokeUnity_generateFlare() { | |
if (UnityPlayer.AppCallbacks.Instance.IsInitialized()) { | |
UnityPlayer.AppCallbacks.Instance.InvokeOnAppThread(new UnityPlayer.AppCallbackItem(() => { | |
Communications.generateFlareFromXAML(); | |
} | |
), false); | |
} | |
} | |
private static void InvokeUnity_proceedFlare() { | |
if (UnityPlayer.AppCallbacks.Instance.IsInitialized()) { | |
UnityPlayer.AppCallbacks.Instance.InvokeOnAppThread(new UnityPlayer.AppCallbackItem(() => { | |
Communications.proceedFlareFromXAML(); | |
} | |
), false); | |
} | |
} | |
/**/ | |
/*add*/ | |
public delegate void UnityEvent(object arg); | |
public sealed class Communications { | |
public static void generateFlareFromXAML() { | |
UnityEngine.GameObject go = UnityEngine.GameObject.Find("CortanaController"); | |
go.GetComponent<InvokedByCortana>().generateFlare(); | |
} | |
public static void proceedFlareFromXAML() { | |
UnityEngine.GameObject go = UnityEngine.GameObject.Find("CortanaController"); | |
go.GetComponent<InvokedByCortana>().proceedFlare(); | |
} | |
public static void SetEvent(UnityEvent e) { | |
UnityEngine.GameObject go = UnityEngine.GameObject.Find("CortanaController"); | |
if (go != null) { | |
go.GetComponent<InvokedByCortana>().onEvent = new InvokedByCortana.OnEvent(e); | |
} else { | |
throw new Exception("Flare not found, have exported the correct scene?"); | |
} | |
} | |
} | |
/**/ | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This sample enabled us to use Cortana to Unity feature. See the blog(http://magicbullet.hatenablog.jp/entry/Unity_Cortana2)
Based on the blog. Thanks!
https://digitalerr0r.wordpress.com/2015/10/21/voice-activating-your-windows-10-games-using-speech-synthesis-voice-recognition-and-cortana/#comment-5466