Tropo eComm 2009 Tutorial

33
Introducing Tropo Powered by Voxeo RJ Auburn CTO

description

Slides from RJ Auburn's eComm tutorial session on Tropo - a new service from Voxeo that allows people to create phone applications using common web programing languages. Developers can create applications using ruby, javascript, groovy, php or python.

Transcript of Tropo eComm 2009 Tutorial

Page 1: Tropo eComm 2009 Tutorial

Introducing TropoPowered by Voxeo

RJ Auburn CTO

Page 2: Tropo eComm 2009 Tutorial

Tropo

Once upon a time…

Page 3: Tropo eComm 2009 Tutorial

Tropo

Now XML is in the enterprise…

Page 4: Tropo eComm 2009 Tutorial

Tropo

Write apps directly in leading languages

Tropo.com

Ruby

Page 5: Tropo eComm 2009 Tutorial

Tropo

Simple to Learn

• answer• redirect• reject

• call• transfer• hangup

• ask• say• record

• log• wait• default

Page 6: Tropo eComm 2009 Tutorial

Tropo

Simple to Deploy

• Hosted offering • Accessible via

– PSTN numbers

– SIP URI

– Direct Skype

– iNum – Gizmo5, etc

• Inbound calling• Outbound calling• 70,000 port capacity

Page 7: Tropo eComm 2009 Tutorial

Tropo

Simple Business Model

• No contracts• No setup costs• No commitment• Costs as low as 3 cents per minute• Credit card or PayPal charge in $50 blocks• Five minutes from sign-up to live deployment

+ = GO

Page 8: Tropo eComm 2009 Tutorial

Tropo

Powerful Capabilities

• Robust call control• Play audio, record audio• Touch-tone entry• High quality speech recognition (ASR)• High quality speech synthesis (TTS)• Mashups with web services• Access to most language libraries• Soon: Conferencing, call recording,

web services, remote API

Page 9: Tropo eComm 2009 Tutorial

Tropo

Developing with Voxeo

XML-based Telephony

Voxeo CallXMLThe easiest telephony markup ever devised

Tool-based Telephony

Voxeo DesignerEasy web-based, Visio- like rapid app dev tool

VoiceObjects

Sophisticated service creation environment, personalization, analytics

VoiceXMLThe only 100% compliant browser

CCXMLThe world’s most proven CCXML engine

A Voxeo Company

API-based Telephony

TropoMash-up style APIin multiple language

Java Media ControlJSR 309

Java SIP ServletsJSR 116/289

A Voxeo Company

Sim

pler

app

s,al

l ski

ll le

vels

Sop

hist

icat

ed a

pps

Page 10: Tropo eComm 2009 Tutorial

Tropo

So lets get to the code already…

Page 11: Tropo eComm 2009 Tutorial

Tropo

T.1: Hello World

JavaScript and PHP

answer();say("Hello, world!");hangup();

Ruby

answersay "Hello, world!”hangup

Groovy

answer()say 'Hello, world!'hangup()

Python

answer()say("Hello, world !")hangup()

Page 12: Tropo eComm 2009 Tutorial

Tropo

T.2: Asking for Input - JavaScript// -----------// asking for input// -----------

answer();

result=ask( "Hi. For sales, press 1. For support, press 2.", {choices:"1, 2"} );

if (result.name=='choice'){

if (result.value=="1") { say( "sales is not available right now.") }if (result.value=="2") { say( "support is currently on the other line." ) }

}

hangup();

Page 13: Tropo eComm 2009 Tutorial

Tropo

T.3: Repeating the Question - Ruby# -----------# repeating the question# -----------

answer

options = { :choices => '1, 2', :repeat => 3 } result = ask 'For sales, press 1. For support, press 2.', options

if result.name == 'choice' case result.value when '1' say 'sales is not available right now.' when '2' say 'support is currently on the other line.' endend

hangup

Page 14: Tropo eComm 2009 Tutorial

Tropo

T.4: Changing Timeouts - Groovy// -----------// changing the default timeout// -----------

answer();

result=ask( "For sales, press 1. For support, press 2.", [choices:"1, 2",repeat:3, timeout:10] );

if (result.name=='choice'){

if (result.value=="1") { say( "sales is not available right now.") }if (result.value=="2") { say( "support is currently on the other line." ) }

}

hangup();

Page 15: Tropo eComm 2009 Tutorial

Tropo

T.5: Speech - Python# Using speech input instead of touch-tone

answer()

result = ask("Hi. For sales, say sales. For support, say support",{'choices':"sales, support", 'repeat':3})

if (result.name == 'choice'): if (result.value == "sales"): say("Sales is not available right now") if (result.value == "support"): say("Support is currently on the other line.")

hangup()

Page 16: Tropo eComm 2009 Tutorial

Tropo

T.6: Speech & DTMF - PHP<?php// -----------// using both speech and touch-tone input// -----------

answer();

$result = ask( "For sales, just say sales or press 1. For support, say support or press 2.", array( "choices" => "sales( 1, sales), support( 2, support)", "repeat" => 3 ) );

if ($result->name=="choice"){ if ($result->value=="sales") say( "sales is not available right now." ) ; if ($result->value=="support") say( "support is currently on the other line." ) ; }

hangup();

?>

Page 17: Tropo eComm 2009 Tutorial

Tropo

T.7: Transfer Time - Ruby# -----------# connecting the call to another number ()# -----------

answer

options = { :choices => 'sales( 1, sales), support( 2, support)', :repeat => 3 } result = ask 'For sales, say sales or press 1. For support, say support or press 2.', options

if result.name == 'choice' case result.value when 'sales' say 'Ok, let me transfer you to sales.'

transfer '14075551212' when 'support' say 'Sure, let me get support. Please hold.'

transfer '14085551212' endend

hangup

Page 18: Tropo eComm 2009 Tutorial

Tropo

T.8: Wrong Choices - Groovyanswer();

result=ask( "For sales, say sales or press 1. For support, say support or press 2.", [choices:"sales( 1, sales), support( 2, support)", repeat:3] );

if (result.name=='choice'){

if (result.value=="sales") {

say( "Ok, let me transfer you to sales.");transfer( "14075551212");

}if (result.value=="support") {

say( "Sure, let me get support. Please hold." );transfer( "14085551212");

}}

if( result.name=='badChoice'){

say( "I'm not sure what you wanted. Goodbye.")}

Page 19: Tropo eComm 2009 Tutorial

Tropo

T.9: Event Handlers - JavaScriptanswer();

result=ask( "For sales, just say sales or press 1. For support, say support or press 2.", { choices:"sales( 1, sales), support( 2, support)", repeat:3, onBadChoice: function() { say("I'm sorry, I didn't understand what you said.") } } );

if (result.name=='choice'){

if (result.value=="sales") {

say( "Ok, let me transfer you to sales." );transfer( "14075551111");

}if (result.value=="support") {

say( "Sure, let me get support. Please hold." );transfer( "14085552222");

}}

Page 20: Tropo eComm 2009 Tutorial

Tropo

T.10: Bad Choices - Rubyanswer

options = { :choices => 'sales( 1, sales), support( 2, support)', :repeat => 3, :onBadChoice => lambda { say ‘I did not understand what you said.' }, :onTimeout => lambda { say 'Hm. I did not hear anything.' } }

result = ask 'For sales, just say sales or press 1. For support, say support or press 2.', options

if result.name == 'choice' case result.value when 'sales' say 'Ok, let me transfer you to sales.' transfer '14075551212' when 'support' say 'Sure, let me get support. Please hold.' transfer '14085551212' endend

hangup

Page 21: Tropo eComm 2009 Tutorial

Tropo

T.11: Right choices - Groovy// -----------// handling good choices with event handlers too// -----------

answer();

ask( "Hi. For sales, just say sales or press 1. For support, say support or press 2.", [ choices:"sales( 1, sales), support( 2, support)", repeat:3, onBadChoice: { say("I'm sorry, I didn't understand what you said.") }, onTimeout: { say("Hm. I didn't hear anything.") }, onChoice: {event-> if (event.value=='sales') { say( "Ok, let me transfer you to sales." ); transfer( "14075551212"); } if (event.value=='support') { say( "Sure, let me get support. Please hold." ); transfer( "14085551212"); } } ] );

Page 22: Tropo eComm 2009 Tutorial

Tropo

T.12: onEvent - JavaScriptanswer();

ask( "Hi. For sales, just say sales or press 1. For support, say support or press 2.", { choices:"sales( 1, sales), support( 2, support)", repeat:3, onEvent: function( event ) { if (event.name=='badChoice') { say( ”I didn't understand what you said.") } if (event.name=='timeout') { say( "Hm. I didn't hear anything.") } if (event.name=='choice') { if (event.value=='sales') { say( "Ok, let me transfer you to sales." ); transfer( "14075551111"); } if (event.value=='support') { say( "Sure, let me get support. Please hold." ); transfer( "14085551111"); } } transfer( "14075552222"); } } );

Page 23: Tropo eComm 2009 Tutorial

Tropo

T.13: conditional accept - Ruby# -----------# reject based on callerid# -----------

answer

log "*"*100 + currentCall.inspect

if currentCall.callerID == ’4078675309'answersay 'Hello there and goodbye'hangup

else rejectend

Page 24: Tropo eComm 2009 Tutorial

Tropo

T.14: Bounce the Call - JavaScript// -----------// redirect// -----------

answer();

if (currentCall.callerID == '4075551111') answer() else redirect( "14075552222");

Page 25: Tropo eComm 2009 Tutorial

Tropo

T.15: Branching - Groovy// -----------// Changing behavior based on number called// -----------

answer();

if (currentCall.calledID == '4075551111') say( "Hello Andrew.");if (currentCall.calledID == '4075552222') say( "Hello Brian. ");

hangup();

Page 26: Tropo eComm 2009 Tutorial

Tropo

T.16 Recording - JavaScript

answer();

event=record("Leave your message at the beep. Thanks!", { beep:true, silenceTimeout: 5, maxTime:60, timeout:10, onRecord:function(event ) { say("you said " + event.recordURI ) } } );

log( "event.recordURI = " + event.recordURI );

hangup();

Page 27: Tropo eComm 2009 Tutorial

Tropo

Using Language Libraries• Tropo programs can use language libraries• Most libraries supported – Except…

– No local file access– No threads. – No exec()– Etc…

from random import *

number = randint(1,1000)

answer()say("Hello. Your magic number today is %s. Goodbye." % number)hangup()

Page 28: Tropo eComm 2009 Tutorial

Tropo

Mashing Up With Web Services

# python app to retrieve and say a text fileimport urllibnumber= urllib.urlopen("http://blog-files.voxeo.com/media/test.txt").read()

answer()say("Welcome to Tropo. Your magic number is %s. Goodbye." % number)hangup()

// Groovy app to retrieve and say top ten hits from Yahoo musicdef musicbase = "http://us.music.yahooapis.com/track/v1"def appid = "KgtDvNrV34Eavq_dUF81vBlVLKAOq7o1tj7Tzvu_kYbKsCtBW190VmrvVHK_0w--”

say( ", Top 10 Chart Toppers!" )def toptracksxml = new XmlSlurper().parseText( "${musicbase}/list/published/popular?count=10&appid=${appid}".toURL().text )toptracksxml.Track.each { track ->  say( ", Number " + track.ItemInfo.ChartPosition["@this"] + ", " + track["@title"] + ", by " + track.Artist[0]["@name"] )}say( ", Goodbye!" )hangup()

Page 29: Tropo eComm 2009 Tutorial

Tropo

Getting Started with Tropo

• www.tropo.com• Login with your Voxeo Evolution ID• Or - Create a new Account for Free

• Account -> Your Applications• Create New Application• Option to create a hosted file (or use a URL)

• Account -> Your Hosted Files to edit files

Page 30: Tropo eComm 2009 Tutorial

Tropo

So How about some Cash?

Page 31: Tropo eComm 2009 Tutorial

Tropo

Write a mashup with Tropo

Get $100

Page 32: Tropo eComm 2009 Tutorial

Tropo

Examples• Existing examples are posted at

http://tropo.com/examples and also hosted at http://github.com/tropo

• Examples so far include: – Auto Attendant– RPG – RSS reader– Yahoo traffic via phone– Sports scores – Monty Python quote generator – Location Data– Phone Simon – Etc…

Page 33: Tropo eComm 2009 Tutorial

Tropo

So start writing some code!