[Freeswitch-svn] [commit] r12795 - freeswitch/trunk/scripts/contrib/jtregunna

FreeSWITCH SVN jtregunna at freeswitch.org
Thu Mar 26 12:12:45 PDT 2009


Author: jtregunna
Date: Thu Mar 26 14:12:45 2009
New Revision: 12795

Log:
Added a simple TTS weather reporting agent. Primitive at the moment, no searching capabilities, location is fixed to Waterloo, Ontario, Canada. 

TODO: Create an ASR, and have it search major city centers in North America, maybe the world if I can find an easy way of doing that.


Added:
   freeswitch/trunk/scripts/contrib/jtregunna/weather.js

Added: freeswitch/trunk/scripts/contrib/jtregunna/weather.js
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/jtregunna/weather.js	Thu Mar 26 14:12:45 2009
@@ -0,0 +1,123 @@
+/*
+ * Weather application
+ * Copyright (c) 2009, Jeremy Tregunna, All Rights Reserved.
+ * Redistributable under any terms you like!
+ *
+ * Uses the Yahoo! Weather forecasting engine. http://weather.yahoo.com/
+ *
+ * Makes use of mod_flite, should be easy to adapt to any other TTS engine.
+ */
+var yweather = new Namespace("http://xml.weather.yahoo.com/ns/rss/1.0");
+
+var rssFile = "/usr/local/freeswitch/rss/weather.rss";
+var currentConditions = "Unknown";
+var highTemperature = lowTemperature = currentTemperature = "0";
+var doc = null;
+
+// XXX: Big and nasty, but the values Yahoo! Weather's RSS feed gives out for "text" attributes on yweather:condition
+// really don't fit in well with any method of saying things. That is, "You can expect <foo> conditions" works for
+// most cases, but falls down or reads weird, when things like "tornado conditions" are inserted into <foo>. If you
+// don't mind that awkwardness, you can get rid of the conditions object, and just change the code in sayWeather()
+// replacing occurences of @code with @text, of course, first removing the conditions[...] that surround fc. at code.
+var conditions = new Object();
+conditions[0]  = "a tornado";
+conditions[1]  = "tropical storm conditions";
+conditions[2]  = "hurricane conditions";
+conditions[3]  = "severe thunderstorms";
+conditions[4]  = "thunderstorms";
+conditions[5]  = "mixture of rain and snow";
+conditions[6]  = "mixture of rain and sleet";
+conditions[7]  = "mixture of snow and sleet";
+conditions[8]  = "freezing drizzle";
+conditions[9]  = "some drizzle";
+conditions[10] = "freezing rain";
+conditions[11] = "rain showers";
+conditions[12] = "light rain showers";
+conditions[13] = "snow flurries";
+conditions[14] = "light snow";
+conditions[15] = "blowing snow";
+conditions[16] = "snow";
+conditions[17] = "periods of hail";
+conditions[18] = "sleet";
+conditions[19] = "dusty conditions";
+conditions[20] = "foggy conditions";
+conditions[21] = "hazy conditions";
+conditions[22] = "smokey conditions";
+conditions[23] = "high winds";
+conditions[24] = "windy";
+conditions[25] = "cold conditions";
+conditions[26] = "overcast conditions";
+conditions[27] = "mostly cloudy conditions"; // Night time
+conditions[28] = "mostly cloudy conditions"; // Day time
+conditions[29] = "partly cloudy conditions"; // Night time
+conditions[30] = "partly cloudy conditions"; // Day time
+conditions[31] = "clear conditions"; // Night time
+conditions[32] = "sunny conditions"; // Day time
+conditions[33] = "fair conditions"; // Night time
+conditions[34] = "fair conditions"; // Day time
+conditions[35] = "periods of mixed rain and hail";
+conditions[36] = "hot conditions";
+conditions[37] = "isolated thunderstorms";
+conditions[38] = "scattered thunderstorms";
+conditions[39] = "scattered thunderstorms";
+conditions[40] = "scattered showers";
+conditions[41] = "heavy snow";
+conditions[42] = "scattered snow flurries";
+conditions[43] = "heavy snow";
+conditions[44] = "partly cloudy conditions";
+conditions[45] = "thundershowers";
+conditions[46] = "snow flurries";
+conditions[47] = "isolated thunderstorms";
+conditions[3200] = "conditions are not available at this time";
+
+/********** Say something **********/
+say = function(something) {
+	session.speak("flite", "rms", something);
+}
+
+/********** Load the XML **********/
+loadXML = function(url) {
+	fetchURLFile(url, rssFile);
+	var fd = new FileIO(rssFile, "r");
+	fd.read(3072);
+	// Need to strip out the <?xml ...?> tag otherwise we get a syntax error, silly E4X
+	doc = new XML(fd.data().replace(/^<\?xml\s+version\s*=\s*(["'])[^\1]+\1[^?]*\?>/, ""));
+}
+
+/********** Say the weather **********/
+sayWeather = function() {
+	var currentCondition = doc.channel.item.yweather::condition. at text;
+	var currentTemperature = doc.channel.item.yweather::condition. at temp;
+	var firstLoop = true;
+	var forecast = "The current conditions are: ";
+	forecast += conditions[doc.channel.item.yweather::condition. at code];
+	forecast += " and it is " + currentTemperature + " degree" + ((currentTemperature != 1) ? "s" : "") + " out.\n";
+	for each(var fc in doc.channel.item.yweather::forecast) {
+		// XXX: Figure out why day.replace("Sun", "Sunday") et. al., doesn't actually replace the date when used here
+		//      but when using the "js" spidermonkey executable, it does.
+		var day = fc. at day;
+		if (day == "Sun")
+			day = "Sunday";
+		else if (day == "Mon")
+			day = "Monday";
+		else if (day == "Tue")
+			day = "Tuesday";
+		else if (day == "Wed")
+			day = "Wednesday";
+		else if (day == "Thu")
+			day = "Thursday";
+		else if (day == "Fri")
+			day = "Friday";
+		else if (day == "Sat")
+			day = "Saturday";
+		forecast += day + "'s forecast calls for " + conditions[fc. at code] + ", with a daytime high of ";
+		forecast += fc. at high + " degree" + ((fc. at high != 1) ? "s" : "") + " and a low of " + fc. at low + " degree" + ((fc. at low != 1) ? "s" : "") + ".\n";
+	}
+	say(forecast);
+}
+
+if (session.ready()) {
+	session.answer();
+	loadXML("http://weather.yahooapis.com/forecastrss?p=CAXX0531&u=c");
+	sayWeather();
+} 



More information about the Freeswitch-svn mailing list