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

Files at this revision

API Documentation at this revision

Comitter:
dudanian
Date:
Tue Dec 09 15:52:59 2014 +0000
Parent:
3:b711df1f40cb
Child:
5:ba94b62d86c9
Commit message:
Added SpeechServer Source code

Changed in this revision

SpeechServerSource/SpeechServer.c Show annotated file Show diff for this revision Revisions of this file
SpeechServerSource/grammar.xml Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SpeechServerSource/SpeechServer.c	Tue Dec 09 15:52:59 2014 +0000
@@ -0,0 +1,204 @@
+// 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 ServerTest
+{
+    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");
+        }
+    }
+}
+*/
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SpeechServerSource/grammar.xml	Tue Dec 09 15:52:59 2014 +0000
@@ -0,0 +1,244 @@
+<grammar version="1.0" xml:lang="en-US" root="commands"
+ xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">
+
+  <rule id="commands">
+    <one-of>
+      <item> <ruleref uri="#setTime" /> <tag> out = rules.setTime; </tag> </item>
+      <item> <ruleref uri="#setTimezone" /> <tag> out = rules.setTimezone; </tag> </item>
+      <item> <ruleref uri="#setAlarm" /> <tag> out = rules.setAlarm; </tag> </item>
+      <item> <ruleref uri="#setTimer" /> <tag> out = rules.setTimer; </tag> </item>
+      <item> <ruleref uri="#deleteAlarm" /> <tag> out = rules.deleteAlarm; </tag> </item>
+      <item> <ruleref uri="#syncNow" /> <tag> out = rules.syncNow; </tag> </item>
+    </one-of>
+  </rule>
+
+  <rule id="setTime">
+    <item> set </item>
+    <item repeat="0-1"> the </item>
+    <item> time </item>
+    <item repeat="0-1"> to </item>
+    <ruleref uri="#time" />
+    <tag> out.command = "setTime"; </tag>
+    <tag> out.time = rules.time; </tag>
+  </rule>
+
+  <rule id="setTimezone">
+    <item> set </item>
+    <item repeat="0-1"> the </item>
+    <item> timezone </item>
+    <item repeat="0-1"> to </item>
+    <ruleref uri="#zone" />
+    <tag> out.command = "setTimezone"; </tag>
+    <tag> out.zone = rules.zone; </tag>
+  </rule>
+
+  <rule id="setAlarm">
+    <item> set </item>
+    <item repeat="0-1"> an </item>
+    <item> alarm </item>
+    <item repeat="0-1"> for </item>
+    <ruleref uri="#time" />
+    <tag> out.command = "setAlarm"; </tag>
+    <tag> out.time = rules.time; </tag>
+  </rule>
+
+  <rule id="setTimer">
+    <item> set </item>
+    <item repeat="0-1"> an </item>
+    <item> alarm </item>
+    <item repeat="0-1"> for </item>
+    <ruleref uri="#hoursminutes" />
+    <tag> out.command = "setTimer"; </tag>
+    <tag> out.length = rules.hoursminutes; </tag>
+  </rule>
+
+  <rule id="deleteAlarm">
+    <item> delete </item>
+    <item repeat="0-1"> the </item>
+    <item> alarm </item>
+    <tag> out.command = "deleteAlarm"; </tag>
+  </rule>
+
+  <rule id="syncNow">
+    <item> sync </item>
+    <item repeat="0-1"> the </item>
+    <item repeat="0-1"> time </item>
+    <item> now </item>
+    <tag> out.command = "syncNow"; </tag>
+  </rule>
+
+  <rule id="time">
+    <ruleref uri="#hour" />
+    <ruleref uri="#minuteTime" />
+    <ruleref uri="#period" />
+    <tag> out.hour = rules.hour; </tag>
+    <tag> out.minute = rules.minuteTime; </tag>
+    <tag> out.period = rules.period; </tag>
+  </rule>
+
+  <rule id="hoursminutes">
+    <one-of>
+      <item> <ruleref uri="#hours" /> <tag> out.hour = rules.hours; out.minute = 0; </tag> </item>
+      <item> <ruleref uri="#minutes" /> <tag> out.hour = 0; out.minute = rules.minutes </tag> </item>
+      <item>
+        <ruleref uri="#hours" />
+        <item repeat="0-1"> and </item>
+        <ruleref uri="#minutes" />
+        <tag> out.hour = rules.hours; </tag>
+        <tag> out.minute = rules.minutes; </tag>
+      </item>
+    </one-of>
+  </rule>
+
+  <rule id="hours">
+    <ruleref uri="#hour" />
+    <one-of>
+      <item> hour </item>
+      <item> hours </item>
+    </one-of>
+    <tag> out = rules.hour; </tag>
+  </rule>
+
+  <rule id="minutes">
+    <ruleref uri="#minuteLength" />
+    <one-of>
+      <item> minute </item>
+      <item> minutes </item>
+    </one-of>
+    <tag> out = rules.minuteLength; </tag>
+  </rule>
+
+  <rule id="hour">
+    <one-of>
+      <item> one    <tag> out = 1; </tag> </item>
+      <item> two    <tag> out = 2; </tag> </item>
+      <item> three  <tag> out = 3; </tag> </item>
+      <item> four   <tag> out = 4; </tag> </item>
+      <item> five   <tag> out = 5; </tag> </item>
+      <item> six    <tag> out = 6; </tag> </item>
+      <item> seven  <tag> out = 7; </tag> </item>
+      <item> eight  <tag> out = 8; </tag> </item>
+      <item> nine   <tag> out = 9; </tag> </item>
+      <item> ten    <tag> out = 10; </tag> </item>
+      <item> eleven <tag> out = 11; </tag> </item>
+      <item> twelve <tag> out = 12; </tag> </item>
+    </one-of>
+  </rule>
+
+  <rule id="minuteTime">
+    <one-of>
+      <item> <ruleref uri="#minute2" /> <tag> out = rules.minute2; </tag> </item>
+      <item> <ruleref uri="#minute3" /> <tag> out = rules.minute3; </tag> </item>
+    </one-of>
+  </rule>
+
+  <rule id="minuteLength">
+    <one-of>
+      <item> <ruleref uri="#minute1" /> <tag> out = rules.minute1; </tag> </item>
+      <item> <ruleref uri="#minute3" /> <tag> out = rules.minute3; </tag> </item>
+    </one-of>
+  </rule>
+
+  <rule id="minute1">
+    <one-of>
+      <item> zero         <tag> out = 0; </tag> </item>
+      <item> one          <tag> out = 1; </tag> </item>
+      <item> two          <tag> out = 2; </tag> </item>
+      <item> three        <tag> out = 3; </tag> </item>
+      <item> four         <tag> out = 4; </tag> </item>
+      <item> five         <tag> out = 5; </tag> </item>
+      <item> six          <tag> out = 6; </tag> </item>
+      <item> seven        <tag> out = 7; </tag> </item>
+      <item> eight        <tag> out = 8; </tag> </item>
+      <item> nine         <tag> out = 9; </tag> </item>
+      <item> sixty        <tag> out = 60; </tag> </item>
+    </one-of>
+  </rule>
+
+  <rule id="minute2">
+    <one-of>
+      <item> o'clock      <tag> out = 0; </tag> </item>
+      <item> o'one        <tag> out = 1; </tag> </item>
+      <item> o'two        <tag> out = 2; </tag> </item>
+      <item> o'three      <tag> out = 3; </tag> </item>
+      <item> o'four       <tag> out = 4; </tag> </item>
+      <item> o'five       <tag> out = 5; </tag> </item>
+      <item> o'six        <tag> out = 6; </tag> </item>
+      <item> o'seven      <tag> out = 7; </tag> </item>
+      <item> o'eight      <tag> out = 8; </tag> </item>
+      <item> o'nine       <tag> out = 9; </tag> </item>
+    </one-of>
+  </rule>
+
+  <rule id="minute3">
+    <one-of>
+      <item> ten          <tag> out = 10; </tag> </item>
+      <item> eleven       <tag> out = 11; </tag> </item>
+      <item> twelve       <tag> out = 12; </tag> </item>
+      <item> thirteen     <tag> out = 13; </tag> </item>
+      <item> fourteen     <tag> out = 14; </tag> </item>
+      <item> fifteen      <tag> out = 15; </tag> </item>
+      <item> sixteen      <tag> out = 16; </tag> </item>
+      <item> seventeen    <tag> out = 17; </tag> </item>
+      <item> eighteen     <tag> out = 18; </tag> </item>
+      <item> nineteen     <tag> out = 19; </tag> </item>
+      <item> twenty       <tag> out = 20; </tag> </item>
+      <item> twentyone    <tag> out = 21; </tag> </item>
+      <item> twentytwo    <tag> out = 22; </tag> </item>
+      <item> twentythree  <tag> out = 23; </tag> </item>
+      <item> twentyfour   <tag> out = 24; </tag> </item>
+      <item> twentyfive   <tag> out = 25; </tag> </item>
+      <item> twentysix    <tag> out = 26; </tag> </item>
+      <item> twentyseven  <tag> out = 27; </tag> </item>
+      <item> twentyeight  <tag> out = 28; </tag> </item>
+      <item> twentynine   <tag> out = 29; </tag> </item>
+      <item> thirty       <tag> out = 30; </tag> </item>
+      <item> thirtyone    <tag> out = 31; </tag> </item>
+      <item> thirtytwo    <tag> out = 32; </tag> </item>
+      <item> thirtythree  <tag> out = 33; </tag> </item>
+      <item> thirtyfour   <tag> out = 34; </tag> </item>
+      <item> thirtyfive   <tag> out = 35; </tag> </item>
+      <item> thirtysix    <tag> out = 36; </tag> </item>
+      <item> thirtyseven  <tag> out = 37; </tag> </item>
+      <item> thirtyeight  <tag> out = 38; </tag> </item>
+      <item> thirtynine   <tag> out = 39; </tag> </item>
+      <item> fourty       <tag> out = 40; </tag> </item>
+      <item> fourtyone    <tag> out = 41; </tag> </item>
+      <item> fourtytwo    <tag> out = 42; </tag> </item>
+      <item> fourtythree  <tag> out = 43; </tag> </item>
+      <item> fourtyfour   <tag> out = 44; </tag> </item>
+      <item> fourtyfive   <tag> out = 45; </tag> </item>
+      <item> fourtysix    <tag> out = 46; </tag> </item>
+      <item> fourtyseven  <tag> out = 47; </tag> </item>
+      <item> fourtyeight  <tag> out = 48; </tag> </item>
+      <item> fourtynine   <tag> out = 49; </tag> </item>
+      <item> fifty        <tag> out = 50; </tag> </item>
+      <item> fiftyone     <tag> out = 51; </tag> </item>
+      <item> fiftytwo     <tag> out = 52; </tag> </item>
+      <item> fiftythree   <tag> out = 53; </tag> </item>
+      <item> fiftyfour    <tag> out = 54; </tag> </item>
+      <item> fiftyfive    <tag> out = 55; </tag> </item>
+      <item> fiftysix     <tag> out = 56; </tag> </item>
+      <item> fiftyseven   <tag> out = 57; </tag> </item>
+      <item> fiftyeight   <tag> out = 58; </tag> </item>
+      <item> fiftynine    <tag> out = 59; </tag> </item>
+    </one-of>
+  </rule>
+
+  <rule id="period">
+    <one-of>
+      <item> AM <tag> out = 0; </tag> </item>
+      <item> PM <tag> out = 1; </tag> </item>
+    </one-of>
+  </rule>
+
+  <rule id="zone">
+    <one-of>
+      <item> UTC <tag> out = 0; </tag> </item>
+      <item> EST <tag> out = -5; </tag> </item>
+      <item> MST <tag> out = -6; </tag> </item>
+      <item> CST <tag> out = -7; </tag> </item>
+      <item> PST <tag> out = -8; </tag> </item>
+    </one-of>
+  </rule>
+</grammar>
\ No newline at end of file