Mbed Clock application using an NTP connection to get internet time and a terminal interface to send commands

Dependencies:   4DGL-uLCD-SE EthernetInterface NTPClient mbed-rtos mbed SDFileSystem wavfile

Revision:
6:23c3adb0470d
Parent:
5:ba94b62d86c9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SpeechServerSource/SpeechServer.txt	Tue Dec 09 16:28:38 2014 +0000
@@ -0,0 +1,203 @@
+// THIS IS ACTUALLY A .cs FILE! Mbed only supports .c and .cpp files in repositories
+
+using System;
+using System.IO;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Speech.Recognition;
+using System.Speech.Recognition.SrgsGrammar;
+using System.Collections.Generic;
+using System.Timers;
+using System.Speech.Synthesis;
+using System.Speech.AudioFormat;
+
+namespace SpeechServer
+{
+    class Program
+    {
+        static Timer timeout;
+        static bool responseSent;
+        static TcpClient client;
+        static SpeechSynthesizer synth;
+
+        static void Main(string[] args)
+        {
+            timeout = new Timer(2000);
+            timeout.AutoReset = false;
+            timeout.Elapsed += OnSpeechRecognitionFailed;
+            responseSent = false;
+
+            Grammar g = new Grammar(new SrgsDocument("grammar.xml"));
+
+            // Recognizing Speech
+            SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine();
+            recognizer.LoadGrammarAsync(g);
+            recognizer.SpeechRecognized +=
+                new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
+            recognizer.SpeechRecognitionRejected +=
+                new EventHandler<SpeechRecognitionRejectedEventArgs>(recognizer_SpeechRecognitionRejected);
+            // Synthesizing Speech
+            synth = new SpeechSynthesizer();
+            synth.SpeakCompleted += new EventHandler<SpeakCompletedEventArgs>(synth_SpeakCompleted);
+            
+            TcpListener server = null;
+            try {
+                Int32 port = 13000;
+                //Console.WriteLine("What IP Address?");
+                //String ip = Console.ReadLine();
+                //IPAddress hostaddr = IPAddress.Parse(ip);
+                IPHostEntry host = Dns.GetHostEntry("laptop-pc");
+                IPAddress hostaddr = null;
+                foreach (IPAddress ipaddr in host.AddressList) {
+                    if (ipaddr.AddressFamily == AddressFamily.InterNetwork)
+                    {
+                        hostaddr = ipaddr;
+                    }
+                }
+                Console.WriteLine("Listening on Address: {0}", hostaddr.ToString());
+
+                server = new TcpListener(hostaddr, port);
+                server.Start();
+
+                Byte[] bytes = new Byte[1024];
+
+                while (true)
+                {
+                    Console.Write("Waiting for a connection...");
+                    client = server.AcceptTcpClient();
+                    Console.WriteLine("Connected!");
+                    recognizer.SetInputToNull();
+
+                    NetworkStream stream = client.GetStream();
+                    int i;
+
+                    using (FileStream fs = File.Open("test.wav", FileMode.Create, FileAccess.Write, FileShare.None))
+                    {
+                        int sum = 0;
+                        while (sum < 110296)
+                        {
+                            i = stream.Read(bytes, 0, bytes.Length);
+                            sum += i;
+                            fs.Write(bytes, 0, i);
+                        }
+                    }
+
+                    recognizer.SetInputToWaveFile("test.wav");
+                    recognizer.RecognizeAsync(RecognizeMode.Single);
+                    timeout.Start();
+
+                    while (!responseSent)
+                    {
+                        System.Threading.Thread.Sleep(100);
+                    }
+                    responseSent = false;
+                    System.Threading.Thread.Sleep(1000);
+                    client.Close();
+                }
+            }
+            catch (SocketException e)
+            {
+                Console.WriteLine("SocketException: {0}", e);
+            }
+            finally
+            {
+                server.Stop();
+            }
+            Console.WriteLine("\nHit enter to continue...");
+            Console.Read();
+        }
+
+        static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
+        {
+            timeout.Stop();
+            String toSend = e.Result.Semantics["command"].Value.ToString();
+            String minute = "0";
+            String hour = "0";
+            String period = "0";
+            String timezone = "0";
+
+            // The following code illustrates some of the information available
+            // in the recognition result.
+            Console.WriteLine("Recognition result summary:");
+            Console.WriteLine(
+              "  Recognized phrase: {0}\n" +
+              "  Confidence score {1}\n" +
+              "  Grammar used: {2}\n",
+              e.Result.Text, e.Result.Confidence, e.Result.Grammar.Name);
+
+            // Display the semantic values in the recognition result.
+            Console.WriteLine("  Semantic results:");
+            foreach (KeyValuePair<String, SemanticValue> child in e.Result.Semantics)
+            {
+                Console.WriteLine("    The {0} value is {1}",
+                  child.Key, child.Value.Value ?? "null");
+            }
+            if (e.Result.Semantics.ContainsKey("time"))
+            {
+                Console.WriteLine("  In Time:");
+                foreach (KeyValuePair<String, SemanticValue> child in e.Result.Semantics["time"])
+                {
+                    Console.WriteLine("    The {0} value is {1}",
+                      child.Key, child.Value.Value ?? "null");
+                }
+                hour = e.Result.Semantics["time"]["hour"].Value.ToString();
+                minute = e.Result.Semantics["time"]["minute"].Value.ToString();
+                period = e.Result.Semantics["time"]["period"].Value.ToString();
+            }
+            else if (e.Result.Semantics.ContainsKey("length"))
+            {
+                Console.WriteLine("  In Length:");
+                foreach (KeyValuePair<String, SemanticValue> child in e.Result.Semantics["length"])
+                {
+                    Console.WriteLine("    The {0} value is {1}",
+                      child.Key, child.Value.Value ?? "null");
+                }
+                hour = e.Result.Semantics["length"]["hour"].Value.ToString();
+                minute = e.Result.Semantics["length"]["minute"].Value.ToString();
+            }
+            else if (e.Result.Semantics.ContainsKey("zone"))
+            {
+                timezone = e.Result.Semantics["zone"].Value.ToString();
+            }
+            toSend += " " + hour + " " + minute + " " + period + " " + timezone;
+            Console.WriteLine("To Send: \"{0}\"", toSend);
+            Console.WriteLine();
+
+            byte[] msg = System.Text.Encoding.ASCII.GetBytes(toSend);
+
+            client.GetStream().Write(msg, 0, msg.Length);
+            responseSent = true;
+        }
+
+        static void recognizer_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e)
+        {
+            Console.WriteLine("Speech input was rejected.");
+            foreach (RecognizedPhrase phrase in e.Result.Alternates)
+            {
+                Console.WriteLine("  Rejected phrase: " + phrase.Text);
+                Console.WriteLine("  Confidence score: " + phrase.Confidence);
+            }
+        }
+
+        private static void OnSpeechRecognitionFailed(Object source, ElapsedEventArgs e)
+        {
+            Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
+
+            byte[] msg = System.Text.Encoding.ASCII.GetBytes("noCommand 0 0 0 0");
+
+            client.GetStream().Write(msg, 0, msg.Length);
+
+            responseSent = true;
+
+            //synth.SetOutputToWaveFile("response.wav", new SpeechAudioFormatInfo(11025, AudioBitsPerSample.Sixteen, AudioChannel.Mono));
+            //synth.SpeakAsync("testing this");
+        }
+
+        static void synth_SpeakCompleted(object sender, SpeakCompletedEventArgs e)
+        {
+            synth.SetOutputToNull();
+            Console.WriteLine("Speaking Complete");
+        }
+    }
+}