tropo ecomm 2009 tutorial

33
Introducing Tropo Powered by Voxeo RJ Auburn CTO

Upload: voxeo-corp

Post on 05-Dec-2014

3.232 views

Category:

Technology


2 download

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

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!