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 4:c4dfbf6b7f9f, committed 2014-12-09
- 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
--- /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