We’re happy to announce that Tropo is sponsoring the first ever GameSave Exhibition in San Francisco on Friday, July 15th. GameSave was born out of a partnership between Geeks without Bounds and Gameranx in an effort to challenge developers to design games that help us better mitigate disasters and crises.
The initial 5-week long GameSave hackathon has been featured in numerous articles and posts including Jared Keller’s article in The Atlantic entitled “This Game Could Save Your Life“, Cory Doctorow’s GameSave post on Boing Boing and even a hat tip by FEMA director Craig Fugate on his twitter stream.
As the first phase of GameSave hacks come to a close, the organizers decided to throw a party to celebrate and exhibit the progress of the games being built. There will be drinks, live music and performances starting at 7pm in San Francisco at the Gray Area Foundation for the Arts. Tropo was happy to step in and sponsor the party to make it accessible for anyone who wants to attend! All you have to do is register at http://gamesave.eventbrite.com, choose the $30 ticket and enter the discount code ihearttropo
We are always excited to see developers using Tropo to extend GoogleVoice functionality and features by adding things like SIP and Call Forwarding and Call-In enhancements. Terry Swanson (@FunnyBoy243) is one of these cool developers who wrote 2 of these extensions and opensourced them for others to share and contribute:
His Call Forwarding Extender Tropo Script includes the following features that extend/add to the current Google Voice feature-set:
Easy forwarding to SIP Numbers (especially compared to IPKall)
Outbound call recoding
Allows forwarding to numbers that cannot be verified through Google Voice (such as numbers with extensions). You can append “postd=DIGITSp” and/or “pause=WAITTIMEms” in the CALL_DEST variable to allow the script to forward to your extension. For example, “+14155551212;postd=ppppp1234pp56″ would dial (415) 555-1212 wait 5 seconds (1 second for each p) dial 1 2 3 4, wait 2 seconds then dial 5 6. Look enter the Parameters section of the Tropo API for more information.
You can have this script call multiple SIP/Telephone numbers at the same time by using an array for the CALL_DEST variable. All numbers will ring and the first to answer the call will take the call.
For step by step instructions, check out Terry’s original post here.
His Google Voice Call In Extender Tropo Script includes the following features that extend/add to the current Google Voice feature-set:
SIP Address for your Google Voice number.
Skype number for your Google Voice number.
Phone Number Aliases for your Google Voice number – You can have multiple phone numbers from different areas forward to the same Google Voice number so they wont have to pay long distance fees to call your Google Voice number.
Here are some additional tips and tricks with this extension:
You can have this script call multiple Google Voice numbers at the same time by using an array for the GV_NUM variable. All numbers will ring and the first to answer the call will take the call. Example: $GV_NUM = array(“5103364032″, “5103364002″);
You can add International Phone numbers to allow people from other countries to call your Google Voice number without paying International rates.
You can use the Skype number to make free telephone calls using Google Voice.
For step by step instructions, check out Terry’s original post here.
Ham radio or amateur radio communications has been around since the early 1900s. Ham radio technology has kept pace with traditional communications and may even be the only technology that allows people to communicate in natural disasters. Ham radio operators can communicate over very far distances using HF (high frequencies) as well as through satellites via AMSAT and even using VoIP over the Internet using EchoLink, IRLP, or D-STAR!
There are nearly 750,000 FCC licensed ham radio operators in the United States and over 3M licensed operators worldwide. Each operator has federally issued callsign that is used to uniquely identify the station operating on the band.
Using Tropo and Callook (Josh Dick’s W1JDD Callsign API), Chris Matthieu (N7ICE) was able quickly develop a speech recognition and text-to-speech based telephony app that is accessible by any of the following channels:
Upon calling the application, you are asked to spell a callsign using military phonetics:
A – Alfa, B – Bravo, C – Charlie, D – Delta, E – Echo, F – Foxtrot, G – Golf, H – Hotel, I – India, J – Juliet, K – Kilo, L – Lima, M – Mike, N – November, O – Oscar, P – Papa, Q – Quebec, R – Romeo, S – Sierra, T – Tango, U – Uniform, V – Victor, W – Whiskey, X – X-Ray, Y – Yankee, Z – Zulu
In addition to these commands, you can say restart to start over or stop if your callsign is entered correctly. Upon saying stop, the Tropo application does a REST-based call to Callook to get a JSON response of the data related to the callsign inquired. In addition to the communication channels listed above, Chris Matthieu was able to use his handheld hamradio (like the one featured above) to communicate using VHF (very high frequencies) to connect to a repeater nearly 50 miles away on a mountaintop and connect to Tropo via an auto-patch phone line to perform a callsign lookup. Here is a screencast and source code for the application!
Here is the source code running on Tropo’s Scripting API:
require 'rest_client'
require 'json'
answer
sleep 2
say "welcome to the tropo ham radio call sign lookup application"
callsign = ""
callsigntext = ""
loop do
result = ask "spell the callsign phonetically. say stop when done or restart to start over", {
:choices => "alpha, bravo, charlie, delta, echo, foxtrot, golf, hotel, india, juliette, kilo, lima, mike, november, oscar, papa, quebec, romeo, sierra, tango, uniform, victor, whiskey, xray, yankee, zulu, one, two, three, four, five, six, seven, eight, nine, zero, stop, restart"}
if result.value == "stop"
break
elsif result.value == "restart"
callsign = ""
callsigntext = ""
else
callsigntext = callsigntext + " " + result.value
say "so far you entered #{callsigntext}"
letter = case result.value
when "alpha" then "a"
when "bravo" then "b"
when "charlie" then "c"
when "delta" then "d"
when "echo" then "e"
when "foxtrot" then "f"
when "golf" then "g"
when "hotel" then "h"
when "india" then "i"
when "juliette" then "j"
when "kilo" then "k"
when "lima" then "l"
when "mike" then "m"
when "november" then "n"
when "oscar" then "o"
when "papa" then "p"
when "quebec" then "q"
when "romeo" then "r"
when "sierra" then "s"
when "tango" then "t"
when "uniform" then "u"
when "victor" then "v"
when "whiskey" then "w"
when "xray" then "x"
when "yankee" then "y"
when "zulu" then "z"
when "one" then "1"
when "two" then "2"
when "three" then "3"
when "four" then "4"
when "five" then "5"
when "six" then "6"
when "seven" then "7"
when "eight" then "8"
when "nine" then "9"
when "zero" then "0"
end
if letter
callsign = callsign + letter
end
end
end
response = RestClient.get 'http://callook.info/' + callsign + '/json'
data = JSON.parse(response)
say callsigntext + "belongs to "
say data["name"]
say "in " + data["address"]["line2"]
say "and holds a " + data["current"]["operClass"] + " license"
Our tools and platforms make great building blocks for civic applications, and we’ve been ecstatic to be a part of open government events from coast-to-coast over the last few years.
The City of Philadelphia will soon join the growing fraternity of governments across the country and around the world that are opening up data sets for use by outside developers to build civic applications.
During Philly Tech Week in April, the city will make an announcement about the release of data sets in its inaugural Open Data Catalog. This announcement will mark the release of data sets covering things like public safety, transportation, education, parks & recreation and a variety of other categories.
At the end of Philly Tech Week, a major hackathon will take place at Temple University focusing on the use of these new data sets to build civic applications. Tropo is proud to be a sponsor of Philly Tech Week, and to be the organizer of the first hackathon using City of Philadelphia open data.
The 2011 BCNI Open Government Hackathon will take place on Saturday April 30, 2011, in Annenberg Hall on the campus of Temple University. Participants will spend the day building civic applications using Philadelphia open data, and will compete for a variety of prizes to be awarded at the end of the day.
Awards will be presented in three categories:
Best overall use of Philadelphia open government data.
Best data visualization.
Most innovative project.
The event promises to be an exciting one, and we’re looking forward to spending the day hacking with technologists, coders and journalists from around the region with data from the new Philly Open Data Catalog.
If Philadelphia’s experience with open data mirrors that of other cities that have taken similar steps to publish open data and engage developers, this is just the beginning of a process that will lead to an even greater availability of civic data and an increasing number of civic applications and visualizations for citizens and visitors to use.
We look forward to continuing to work with those involved in the Philadelphia open data initiative toward this goal, and we hope to see you at the upcoming hackathon.
Those interested in attending and participating can register here.
This past weekend over 400 developers, VCs and Android fans gathered for Android Dev Camp, a not-for-profit event for the Android platform sponsored by PayPalx, Tropo, Google and others, encouraging development using both the native Android SDK and web standards. Participants designed, developed and demoed applications and explored the Android ecosystem as it works with other networks and APIs.
Several of the teams used Tropo’s API for voice, SMS and instant messaging integration. Top prizes went to several Tropo-powered apps including:
Family Connect (a social network app for families to share content and info in one shared space)
Disaster Radio (provides information such as relief centers location, safe travel routes, visibility into areas affected by disaster)
Good Access (lets powerful people be charitable, letting people chat with influencers for donations).
There were so many great uses of the Tropo API, we’re already working with the event organizers to sponsor a similar event in May which focuses on the iPhone operating system. Keep an eye out on the Tropo blog for more details about future events like this one.
Looks like Ted hit the trifecta on this application using APIs from Tropo, Google Latitude, and Wikipedia! You can call the Moveable History demo at (857) 239-0152!
Moveable History will begin reading from the Wikipedia page of the closest historic location to our John Paul Jones avatar. Each time you press a key on you phone, you will hear about the next-closest location, in ever widening circles.
This is all driven by Google Latitude. John Paul Jones has signed up, and he’s currently located in downtown Portsmouth, NH.
If you would like to have Moveable History track your location, wherever you or your personal avatar roams in the continental United States, sign up here.
Moveable History uses state-of-the-art OAuth, with no passwords involved. You can revoke authorization at any time.
This Christmas, the open government data elves have been busy.
They’ve been building useful applications with data sets from municipal governments, open source software and multi-channel communication platforms like Tropo.
With all of the data that is being released by municipal governments, there are increasing opportunities to build useful and interesting applications that can help people and make their communities better.
Sometimes, however, the format of the data that is released doesn’t always lend itself to easy use.
For example, many governments release geographic data sets in shapefile format – this can be a bit of a hinderance for some developers to work with, particularly if they don’t use it often or don’t know much about this type of format.
Fortunately, there are a growing number of open source tool available that make working with geographic data in general, and shapefiles in particular, much easier.
The video below demonstrates how to quickly create a powerful communication application for citizens in New York City to find library locations near their homes.
This demo application uses data from the New York City Data Mine, GeoCouch, a fork of CouchDB that support geospatial queries of CouchDB documents, shp2geocouch, a Ruby gem developed by Max Ogden to convert ESRI shapefiles into CouchDB databases and the Tropo Scripting platform.
This project – completed in just a few hours – demonstrates the power of Tropo to quickly build sophisticated cloud-based communication applications that can be used on a number of different channels to deliver useful government information to citizens. (Note – this demo application can easily be adapted for use with one of a half dozen different IM networks, Twitter, SMS and even voice.)
Best of all, if you’re interested in working on a project like this yourself, all of the source code for the Tropo scripting application that powers this demonstration is available on GitHub.
As more and more government begin to release geographic data in shapefile format, the opportunities to build useful applications will continue to grow.
With powerful tools like CouchDB, shp2geocouch and Tropo, developers will be limited only by their imaginations in how the use this data to make their communities better.
Interactive applications require low-latency, just like phone calls, in order to make them real-time and natural. While REST drives much of the APIs on the web today, sometimes it just adds too much overhead and therefore introduces latency. In steps WebSockets, a part of the HTML5 standard. WebSockets provide a persistent bi-directional connection between your users and yours services. Now, with Tropo, you may write real-time applications that provide snappy interactions to drive games, interactive billboards and just about any other interactive application that requires a great user experience.
An example of just such an application was one built by Manou Andraos and Melissa Mongiat for the Mutek BlocJam festival in Montreal in June 2010. They projected a musical collaboration interface onto a seven story building in downtown Montreal. Then published a phone number that people on the street could dial with their mobile phones and interact together in a public space to make music in real-time.
This project was built using Adhearsion, a project sponsored by Voxeo Labs, which allows for real-time streaming of user input to an application using Asterisk.
Tropo also allows for real-time streaming of user input from the cloud. While Tropo may do REST just fine, the real power in our platform is Tropo Scripting. By hosting your app on our application servers, you may wire your apps to the web the way you want. So, building on Chris Matthieu’s recent post on using XMPP to speak to the web, and my previous post for using TCP Sockets, we will now walk you through using WebSockets to drive your applications from the Tropo cloud.
We created a prototype that provides an example of how to stream real-time DTMF (those sounds your phone makes when hitting the keys) input from a user to your application over a WebSocket.
In the diagram above you may see that we created a ‘WebSocket Relay’ that takes two inbound WebSocket requests and relays them via a unique session to each other. This allows for applications behind firewalls to establish outbound connections, rather than having to accept inbound requests. For the relay we used EventMachine and the em-websocket gem. And for the Tropo Ruby script we used the web-socket-ruby gem (originally created by Hiroshi Ichikawa) to establish the outbound WebSocket from Tropo to the relay. Here is this scenario in action:
(The source code for the WebSocket Relay, the Tropo Ruby script and the HTML5 web page are available on Github here.)
The Tropo portion of the script that powers this is quite straight forward (full script here):
# Create a connection to the WebSocket server
client = WebSocket.new("ws://sandite.orl.voxeo.net:8082")
loop do
result = ask "Press any digit, or press zero to end the session.", { :choices => "[1 DIGITS]" }
msg = { :type => 'publisher', :id => 'tropo-app1', :data => { :caller_id => '4155551212', :command => result.value } }.to_json
client.send msg
break if result.value == '0' || $currentCall.isActive == false
end
say 'Thank you for playing, goodbye.' if $currentCall.isActive
While the EventMachine WebSocket Relay portion is only 57 lines of code:
class SessionChannels
def initialize
@channels = {}
@mutex = Mutex.new
end
def publish(id, message)
create_channel id if @channels[id].nil?
@channels[id].push message
end
def subscribe(id, socket)
create_channel id if @channels[id].nil?
@channels[id].subscribe { |msg| socket.send msg.to_json }
end
private
def create_channel(id)
@mutex.synchronize { @channels[id] = EM::Channel.new }
end
end
@session_channels = SessionChannels.new
EM::WebSocket.start(APP_CONFIG['websocket']) do |socket|
socket.onopen {
ap "WebSocket connection open"
}
socket.onmessage { |msg|
msg = JSON.parse msg
case msg['type']
when 'subscriber'
@session_channels.subscribe(msg['id'], socket)
when 'publisher'
@session_channels.publish(msg['id'], msg['data'])
end
}
socket.onclose { ap "Connection closed" }
end
Now all that limits you for creating interactive applications is your imagination. If you would like any additional insight or assistance in exploring this approach or others, please do not hesitate to reach out to us on ‘support@tropo.com‘.
Note: Recently a security issue was disocovered in the WebSocket protocol which has caused Firefox to remove WebSockets from their latest beta. While you may still use WebSockets in certain scenarios, the standard now appears to be in flux again. WebSockets will be around, albeit most likely with changes. We will be following this post up with a more detailed overview of how to use XMPP and BOSH from our network, as Tropo natively supports XMPP, to achieve the same real-time capabilities.
The avatar you see on the map is for John Paul Jones, and it’s parked in front of the John Paul Jones House in Portsmouth, New Hampshire. If Admiral Jones were still alive, he could dial my Moveble History app, and let Wikipedia read to him about the house that bears his name . He could then press any key to hear about the next closest site, from the National Register of Historic Places (NRHP). But since he’s not, we’ll just let him stay parked there to offer a demo to any passing Internet visitor.
This mashup follows the “moveable” paradigm I first laid out with Moveable Weather, and followed with Moveable Tides. The basic components are Google Latitude, Voxeo Tropo, and a geotagged dataset, in this case a download of the NRHP, which we pump up by loading into a geohash.
The user interface for this mashup is extremely simple: If the user doesn’t change location between clicks, then each time he presses a key, the proximity search will cast a wider net, to find historic places that are further and further distant. However, if he does move, then the proximity searches will begin from the new location. Plunk your Google Latitude avatar down in Times Square, or Gettysburg, and starting learning about the history around you.
I invite you to explore my source code, with associated wiki, to learn more. I’d like to give a special shout out to some of my favorite programming tools, including
XSLT for wrestling XML into submission
the geomodel Python module, for performing proximity searches
the BeautifulSoup Python module, for wading into heavily marked-up HTML, to emerge with clean text for Tropo to pronounce
Finally, I leave you with a bit of Python code, which shows how you can get Voxeo to talk about distances in a kindler, gentler fashion, for your users:
def get_sayable_distance (self, distance):
miles = (distance/1000) * .62
num_miles = "%.0f" % miles
num_miles = int (num_miles)
fraction = miles - num_miles
if (num_miles == 1):
mile_sing_plur = "mile"
else:
mile_sing_plur = "miles"
if ((fraction < .15) and (num_miles < 1)):
feet = miles * 5280
feet = "%.0f" % feet
return "about %s feet" % feet
else:
if (fraction < .15):
fraction_part = ''
if (fraction > .15):
fraction_part = "a quarter"
if (fraction > .35):
fraction_part = "a half"
if (fraction > .65):
fraction_part = "three quarters"
if (fraction > .90):
fraction_part = ""
num_miles = num_miles + 1
if (num_miles):
if (fraction_part):
say_miles = "%s and %s %s" % (num_miles, fraction_part,
mile_sing_plur)
else:
say_miles = "%s %s" % (num_miles, mile_sing_plur)
else:
if (fraction_part == "a half"):
say_miles = "a half a mile"
elif (fraction_part == "a quarter"):
say_miles = "a quarter of a mile"
elif (fraction_part == "three quarters"):
say_miles = "three quarters of a mile"
say_miles = "about %s" % say_miles
return say_miles
Congratulations to Aniss Bouraba for his Text2Play application making Programmable Web’s Mashup of the Day! Text2Play is an example in how to use Comet to build a real time web application. With Text2Play you can control the YouTube player by Searching, Playing, or Pausing a video via SMS.
This application is simply amazing! You can send a text message (SMS) to +1-347-318-0167 with one of the following paramaters and control the YouTube video playing in your browser!
Play: Plays the currently video.
Pause: Pauses the currently playing video.
Query: Specifies a full-text query string.
If you want to load another video please send your query as message and it will be shown in real time. Here is an example of what it looks like using SMS.