Mashing up Voice and the Web Through Open Source and XML Dan York - - PowerPoint PPT Presentation

mashing up voice and the web through open source and xml
SMART_READER_LITE
LIVE PREVIEW

Mashing up Voice and the Web Through Open Source and XML Dan York - - PowerPoint PPT Presentation

July 23, 2008 OSCON 2008 Mashing up Voice and the Web Through Open Source and XML Dan York Dir. of Emerging Comm Tech dyork@voxeo.com Why Voice? The Problem Telephony Sucks Complex Photo: http://www.flickr.com/photos/28481088@N00/ Arcane


slide-1
SLIDE 1

July 23, 2008

OSCON 2008

Dan York

  • Dir. of Emerging Comm Tech

dyork@voxeo.com

Mashing up Voice and the Web Through Open Source and XML

slide-2
SLIDE 2

Why Voice?

slide-3
SLIDE 3
slide-4
SLIDE 4
slide-5
SLIDE 5

The Problem

slide-6
SLIDE 6

Telephony Sucks

slide-7
SLIDE 7

Complex

Photo: http://www.flickr.com/photos/28481088@N00/

slide-8
SLIDE 8

Arcane

slide-9
SLIDE 9

Proprietary

slide-10
SLIDE 10

Simple

slide-11
SLIDE 11

Ubiquitous

slide-12
SLIDE 12

Open

slide-13
SLIDE 13

The Solution?

slide-14
SLIDE 14

Web Developers

Phone Developers Web Developers

slide-15
SLIDE 15

They Understand XML

slide-16
SLIDE 16

Let's build an API...

slide-17
SLIDE 17

Proprietary = Lock-In

slide-18
SLIDE 18

Open

slide-19
SLIDE 19

Standards Matter

slide-20
SLIDE 20

Lock-In

slide-21
SLIDE 21

Open

slide-22
SLIDE 22
slide-23
SLIDE 23

The Building Blocks

slide-24
SLIDE 24

Building Blocks

VoiceXML SIP CCXML

slide-25
SLIDE 25

Application Platform Network XML+HTTP SIP

slide-26
SLIDE 26

Application Platform Network XML+HTTP SIP

slide-27
SLIDE 27

Session Initiation Protocol

  • Session Initiation Protocol (SIP)

defines how to establish a communication session between two endpoints

  • Primarily used for voice, but can for IM or virtually

any other protocol

  • Almost always used in client/server configuration

with "SIP proxies" in control of "SIP endpoints"

  • Work going on in P2PSIP - see www.p2psip.org
  • Text-based protocol, originally modeled on HTTP
slide-28
SLIDE 28

SIP Communication

Alice Bob

RTP (voice) INVITE 180 RINGING 200 OK ACK BYE 200 OK

slide-29
SLIDE 29

Alice Bob

Proxy A Proxy B SIP S I P RTP SIP

slide-30
SLIDE 30

SIP Resources

  • Internet Engineering Task Force (IETF)
  • RFC 3261
  • Hitchhiker’s Guide to SIP
  • Open Source Info
  • VoIP Info Wiki: www.voip-info.org
  • Industry Sites
  • SIP Forum: www.sipforum.org
  • SIP Foundry: www.sipfoundry.org
  • OpenSBC: www.opensourcesip.org
slide-31
SLIDE 31

Open Source SIP Software

  • Systems
  • Asterisk: www.asterisk.org
  • sipXecs: www.sipfoundry.org
  • FreeSWITCH: www.freeswitch.org
  • OpenSER: www.openser.org
  • SIP Stacks
  • reSIProcate: www.resiprocate.org
  • Phones:
  • Gizmo: www.gizmoproject.org
  • MANY, many more: www.voip-info.org
slide-32
SLIDE 32

Application Platform Network XML+HTTP SIP

slide-33
SLIDE 33

So how does this work?

slide-34
SLIDE 34

Web Browser Diagram

Web Browser

Web Svr

HTTP HTML

App Svr ?

PHP perl python Java ??? ruby XML XML servlets

slide-35
SLIDE 35

Web Browser Diagram - Thin Client

Web Browser (on svr)

Web Svr

HTTP HTML

App Svr ?

PHP perl python Java ??? ruby XML XML servlets

Thin Client Protocol

slide-36
SLIDE 36

Voice Browser Diagram

Voice Browser (on svr)

Web Svr

HTTP XML

App Svr ?

PHP perl python Java ??? ruby XML XML servlets

Phone Audio

slide-37
SLIDE 37

VoiceXML

  • W3C standard to define speech

dialogs

  • Defines prompts and grammars

that together create a phone application

  • Thousands of developers
  • 30+ Open source projects
  • Can include JavaScript
  • http://www.w3.org/TR/voicexml21/
slide-38
SLIDE 38

VoiceXML Hello World

<?xml version="1.0" encoding="UTF-8"?> <vxml version = "2.1" > <form> <block> <prompt> Hello World. This is my first telephone application. </prompt> </block> </form> </vxml>

slide-39
SLIDE 39

VoiceXML Elements

assign audio block break catch choice clear data disconnect else elseif emphasis enumerate error example exit field filled foreach form goto grammar help if initial item link log mark menu meta noinput nomatch

  • ne-of
  • ption

paragraph param phoneme prompt property record reprompt return rule ruleref say-as script send sentence sub subdialog submit tag throw token transfer value var

slide-40
SLIDE 40

CCXML

  • Call Control XML (CCXML) is the

W3C standard for call control using XML

  • Sister standard to VoiceXML
  • Integrates with VoiceXML for dialog control
  • Provides a framework for issuing call control

commands and handling call control events

  • http://www.w3.org/TR/ccxml/
slide-41
SLIDE 41
slide-42
SLIDE 42

CCXML and State

Connected Disconnected Alerting (Ringing)

Events trigger transitions between states.

slide-43
SLIDE 43
slide-44
SLIDE 44

CCXML Hello World

<?xml version="1.0" encoding="UTF-8"?> <ccxml version="1.0"> <eventprocessor> <transition event="connection.alerting"> <log expr="'***** CONNECTION ALERTING *****'"/> <if cond="event$.connection.remote == '8315551234'"> <reject/> <else/> <accept/> </if> </transition> <transition event="connection.connected"> <log expr="'***** CALL WAS ANSWERED *****'"/> </transition> <transition event=”connection.disconnected”> <log expr=”‘*** Call was disconnected ***’”/> <exit/> </transition> <transition event="error.*"> <log expr="'an error has occured (' + event$.reason + ')'"/> <exit/> </transition> </eventprocessor> </ccxml>

slide-45
SLIDE 45

CCXML Elements

accept assign authenticate cancel createcall createccxml createconference destroyconference dialogprepare dialogstart dialogterminate disconnect else elseif eventprocessor exit fetch foreach goto if join log meta metadata move redirect reject script send transition unjoin var

slide-46
SLIDE 46

ENOUGH ALREADY... SHOW ME THE CODE!

slide-47
SLIDE 47

Application Platform Network XML+HTTP SIP For this demo, I'm using evolution.voxeo.com but it could be any VXML platform

slide-48
SLIDE 48

Demo #1 Seeking to solve the universal question...

slide-49
SLIDE 49

IS DOWN?

slide-50
SLIDE 50

Demo #1 - Is Twitter Down?

  • VoiceXML & JavaScript
  • Connects to www.istwitterdown.com
  • Uses JavaScript to parse the result
  • Relays result to caller using Text-To-Speech
  • Demo:
  • 1-206-701-7091
  • sip:9996078017@sip.voxeo.net
slide-51
SLIDE 51

Demo #1: VoiceXML & JavaScript

<?xml version="1.0" encoding="UTF-8"?> <vxml version = "2.1"> <var name="MyData"/> <form id="F1"> <script> <![CDATA[ function GetData(d,t,n) { return (d.getElementsByTagName(t).item(n).firstChild.data); } ]]> </script> <block> <data name="MyData" src="http://www.istwitterdown.com/"/> <assign name="document.MyData" expr="MyData.documentElement"/> <assign name="status" expr="GetData(MyData,'a',0)"/> <if cond="status=='No'"> <prompt>Twitter is currently up. Yea!</prompt> <else/> <prompt>Twitter is currently down. </prompt> </if> </block> </form> </vxml>

slide-52
SLIDE 52

Demo #2 Listen to identi.ca

slide-53
SLIDE 53

Demo #2 - Listen to identi.ca

  • VoiceXML
  • Reads out latest identi.ca notices
  • Caller says:
  • "friends"
  • "replies"
  • "public"
  • Caveat
  • hardcoded to single identi.ca user
  • Demo
  • 1-617-401-7088
  • sip:9992002598@sip.voxeo.net
slide-54
SLIDE 54

Demo #2: VoiceXML

<?xml version="1.0" encoding="UTF-8"?> <vxml version = "2.1"> <var name="MyData"/> <form id="F1"> <script> <![CDATA[ function GetData(d,t,n) { return (d.getElementsByTagName(t).item(n).firstChild.data);} ]]> </script> <field name="Choice"> <audio src="../audio/identicachoice.wav"/> <grammar xmlns="http://www.w3.org/2001/06/grammar" xml:lang="en-US" root="MYRULE"> <rule id="MYRULE"> <one-of> <item>friends</item> <item>replies</item> <item>public</item> </one-of> </rule> </grammar> <noinput>I did not hear anything. Please try again. <reprompt/> </noinput> <nomatch> I did not recognize that word. Please try again. <reprompt/> </nomatch> </field> <filled namelist="Choice"> <if cond="Choice == 'friends'"> <data name="MyData" src="http://identi.ca/danyork/all/rss?limit=1"/> <assign name="document.MyData" expr="MyData.documentElement"/> <prompt>Your last notice is from <value expr="GetData(MyData,'dc:creator',0)"/>. The notice is: <value expr="GetData(MyData,'title',2)"/>. </prompt> <elseif cond="Choice == 'replies'"/ <data name="MyData" src="http://identi.ca/danyork/replies/rss?limit=1"/> <assign name="document.MyData" expr="MyData.documentElement"/> <prompt>Your last reply is from <value expr="GetData(MyData,'dc:creator',0)"/>. The reply is: <value expr="GetData(MyData,'title',2)"/>.</prompt> <elseif cond="Choice == 'public'"/> <data name="MyData" src="http://identi.ca/rss?limit=1"/> <assign name="document.MyData" expr="MyData.documentElement"/> <prompt>The last public notice is from <value expr="GetData(MyData,'dc:creator',0)"/>. The notice is: <value expr="GetData(MyData,'title',1)"/>. </prompt> </if> <prompt> That is all. Thank you for calling in. </prompt> </filled> </form> </vxml>

slide-55
SLIDE 55

Demo #2: VoiceXML

<?xml version="1.0" encoding="UTF-8"?> <vxml version = "2.1"> <var name="MyData"/> <form id="F1"> <script> <![CDATA[ function GetData(d,t,n) { return (d.getElementsByTagName(t).item(n).firstChild.data);} ]]> </script> <field name="Choice"> <audio src="../audio/identicachoice.wav"/> <grammar xmlns="http://www.w3.org/2001/06/grammar" xml:lang="en-US" root="MYRULE"> <rule id="MYRULE"> <one-of> <item>friends</item> <item>replies</item> <item>public</item> </one-of> </rule> </grammar> <noinput>I did not hear anything. Please try again. <reprompt/> </noinput> <nomatch> I did not recognize that word. Please try again. <reprompt/> </nomatch> </field> <filled namelist="Choice"> <if cond="Choice == 'friends'"> <data name="MyData" src="http://identi.ca/danyork/all/rss?limit=1"/> <assign name="document.MyData" expr="MyData.documentElement"/> <prompt>Your last notice is from <value expr="GetData(MyData,'dc:creator',0)"/>. The notice is: <value expr="GetData(MyData,'title',2)"/>. </prompt> <elseif cond="Choice == 'replies'"/ <data name="MyData" src="http://identi.ca/danyork/replies/rss?limit=1"/> <assign name="document.MyData" expr="MyData.documentElement"/> <prompt>Your last reply is from <value expr="GetData(MyData,'dc:creator',0)"/>. The reply is: <value expr="GetData(MyData,'title',2)"/>.</prompt> <elseif cond="Choice == 'public'"/> <data name="MyData" src="http://identi.ca/rss?limit=1"/> <assign name="document.MyData" expr="MyData.documentElement"/> <prompt>The last public notice is from <value expr="GetData(MyData,'dc:creator',0)"/>. The notice is: <value expr="GetData(MyData,'title',1)"/>. </prompt> </if> <prompt> That is all. Thank you for calling in. </prompt> </filled> </form> </vxml>

if cond="Choice == 'friends'"> <data name="MyData" src="http://identi.ca/danyork/all/rss?limit=1"/> <assign name="document.MyData" expr="MyData.documentElement"/> <prompt>Your last notice is from <value expr="GetData(MyData,'dc:creator',0)"/>. The notice is: <value expr="GetData(MyData,'title',2)"/>. </prompt>

slide-56
SLIDE 56

Demo #3 - Telephony Presence & identi.ca

slide-57
SLIDE 57

Demo #3 - Phone Presence & identi.ca

  • CCXML
  • Sends phone presence (on phone, off phone) to

identi.ca

  • Caller dials in to the application
  • Caller is connected to the other number
  • Results of the call status are posted to identi.ca

via their implementation of the Twitter API

  • Demo:
  • 1-857-362-8469
  • sip:9996075436@sip.voxeo.net
slide-58
SLIDE 58

<?xml version="1.0" encoding="UTF-8"?> <ccxml xmlns="http://www.w3.org/2002/09/ccxml" version="1.0"> <var name="state" expr="'init'"/> <var name="incomingcall"/> <var name="tURL" expr="'http://danyork:password@identi.ca/apis/statuses/update.xml'"/> <eventprocessor statevariable="state"> <transition event="connection.alerting" state="init"> <accept/> </transition> <transition event="connection.connected" state="init"> <assign name="state" expr="'calling'"/> <assign name="incomingcall" expr="event$.connectionid"/> <createcall dest="'tel:+14079678424'"/> </transition> <transition event="connection.connected" state="calling"> <assign name="state" expr="'connected'"/> <join id1="event$.connectionid" id2="incomingcall"/> <var name="status" expr="'Dan is on the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.failed" state="calling"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is not answering his phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.disconnected" state="connected"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is off the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="send.successful" state="done"> <exit/> </transition> </eventprocessor> </ccxml>

Telephony Presence & identi.ca

slide-59
SLIDE 59

<?xml version="1.0" encoding="UTF-8"?> <ccxml xmlns="http://www.w3.org/2002/09/ccxml" version="1.0"> <var name="state" expr="'init'"/> <var name="incomingcall"/> <var name="tURL" expr="'http://danyork:password@identi.ca/apis/statuses/update.xml'"/> <eventprocessor statevariable="state"> <transition event="connection.alerting" state="init"> <accept/> </transition> <transition event="connection.connected" state="init"> <assign name="state" expr="'calling'"/> <assign name="incomingcall" expr="event$.connectionid"/> <createcall dest="'tel:+14079678424'"/> </transition> <transition event="connection.connected" state="calling"> <assign name="state" expr="'connected'"/> <join id1="event$.connectionid" id2="incomingcall"/> <var name="status" expr="'Dan is on the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.failed" state="calling"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is not answering his phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.disconnected" state="connected"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is off the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="send.successful" state="done"> <exit/> </transition> </eventprocessor> </ccxml>

Telephony Presence & identi.ca

<?xml version="1.0" encoding="UTF-8"?> <ccxml version="1.0" xmlns="http://www.w3.org/2002/09/ccxml"> </ccxml>

slide-60
SLIDE 60

<?xml version="1.0" encoding="UTF-8"?> <ccxml xmlns="http://www.w3.org/2002/09/ccxml" version="1.0"> <var name="state" expr="'init'"/> <var name="incomingcall"/> <var name="tURL" expr="'http://danyork:password@identi.ca/apis/statuses/update.xml'"/> <eventprocessor statevariable="state"> <transition event="connection.alerting" state="init"> <accept/> </transition> <transition event="connection.connected" state="init"> <assign name="state" expr="'calling'"/> <assign name="incomingcall" expr="event$.connectionid"/> <createcall dest="'tel:+14079678424'"/> </transition> <transition event="connection.connected" state="calling"> <assign name="state" expr="'connected'"/> <join id1="event$.connectionid" id2="incomingcall"/> <var name="status" expr="'Dan is on the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.failed" state="calling"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is not answering his phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.disconnected" state="connected"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is off the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="send.successful" state="done"> <exit/> </transition> </eventprocessor> </ccxml>

Telephony Presence & identi.ca

<var name="state" expr="'init'"/> <var name="incomingcall"/> <var name="tURL" expr="'http://danyork:password@identi.ca/apis/statuses/ update.xml'"/> <eventprocessor statevariable="state"> </eventprocessor>

slide-61
SLIDE 61

<?xml version="1.0" encoding="UTF-8"?> <ccxml xmlns="http://www.w3.org/2002/09/ccxml" version="1.0"> <var name="state" expr="'init'"/> <var name="incomingcall"/> <var name="tURL" expr="'http://danyork:password@identi.ca/apis/statuses/update.xml'"/> <eventprocessor statevariable="state"> <transition event="connection.alerting" state="init"> <accept/> </transition> <transition event="connection.connected" state="init"> <assign name="state" expr="'calling'"/> <assign name="incomingcall" expr="event$.connectionid"/> <createcall dest="'tel:+14079678424'"/> </transition> <transition event="connection.connected" state="calling"> <assign name="state" expr="'connected'"/> <join id1="event$.connectionid" id2="incomingcall"/> <var name="status" expr="'Dan is on the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.failed" state="calling"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is not answering his phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.disconnected" state="connected"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is off the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="send.successful" state="done"> <exit/> </transition> </eventprocessor> </ccxml>

Telephony Presence & identi.ca

<transition event="connection.alerting" state="init"> <accept/> </transition>

slide-62
SLIDE 62

<?xml version="1.0" encoding="UTF-8"?> <ccxml xmlns="http://www.w3.org/2002/09/ccxml" version="1.0"> <var name="state" expr="'init'"/> <var name="incomingcall"/> <var name="tURL" expr="'http://danyork:password@identi.ca/apis/statuses/update.xml'"/> <eventprocessor statevariable="state"> <transition event="connection.alerting" state="init"> <accept/> </transition> <transition event="connection.connected" state="init"> <assign name="state" expr="'calling'"/> <assign name="incomingcall" expr="event$.connectionid"/> <createcall dest="'tel:+14079678424'"/> </transition> <transition event="connection.connected" state="calling"> <assign name="state" expr="'connected'"/> <join id1="event$.connectionid" id2="incomingcall"/> <var name="status" expr="'Dan is on the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.failed" state="calling"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is not answering his phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.disconnected" state="connected"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is off the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="send.successful" state="done"> <exit/> </transition> </eventprocessor> </ccxml>

Telephony Presence & identi.ca

<transition event="connection.connected" state="init"> <assign name="state" expr="'calling'"/> <assign name="incomingcall" expr="event$.connectionid"/> <createcall dest="'tel:+4079678424'"/> </transition>

slide-63
SLIDE 63

<?xml version="1.0" encoding="UTF-8"?> <ccxml xmlns="http://www.w3.org/2002/09/ccxml" version="1.0"> <var name="state" expr="'init'"/> <var name="incomingcall"/> <var name="tURL" expr="'http://danyork:password@identi.ca/apis/statuses/update.xml'"/> <eventprocessor statevariable="state"> <transition event="connection.alerting" state="init"> <accept/> </transition> <transition event="connection.connected" state="init"> <assign name="state" expr="'calling'"/> <assign name="incomingcall" expr="event$.connectionid"/> <createcall dest="'tel:+14079678424'"/> </transition> <transition event="connection.connected" state="calling"> <assign name="state" expr="'connected'"/> <join id1="event$.connectionid" id2="incomingcall"/> <var name="status" expr="'Dan is on the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.failed" state="calling"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is not answering his phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.disconnected" state="connected"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is off the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="send.successful" state="done"> <exit/> </transition> </eventprocessor> </ccxml>

Telephony Presence & identi.ca

<transition event="connection.connected" state="calling"> <assign name="state" expr="'connected'"/> <join id1="event$.connectionid" id2="incomingcall"/> <var name="status" expr="'Dan is on the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition>

slide-64
SLIDE 64

<?xml version="1.0" encoding="UTF-8"?> <ccxml xmlns="http://www.w3.org/2002/09/ccxml" version="1.0"> <var name="state" expr="'init'"/> <var name="incomingcall"/> <var name="tURL" expr="'http://danyork:password@identi.ca/apis/statuses/update.xml'"/> <eventprocessor statevariable="state"> <transition event="connection.alerting" state="init"> <accept/> </transition> <transition event="connection.connected" state="init"> <assign name="state" expr="'calling'"/> <assign name="incomingcall" expr="event$.connectionid"/> <createcall dest="'tel:+14079678424'"/> </transition> <transition event="connection.connected" state="calling"> <assign name="state" expr="'connected'"/> <join id1="event$.connectionid" id2="incomingcall"/> <var name="status" expr="'Dan is on the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.failed" state="calling"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is not answering his phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.disconnected" state="connected"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is off the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="send.successful" state="done"> <exit/> </transition> </eventprocessor> </ccxml>

Telephony Presence & identi.ca

<transition event="connection.failed" state="calling"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is not answering his phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition>

slide-65
SLIDE 65

<?xml version="1.0" encoding="UTF-8"?> <ccxml xmlns="http://www.w3.org/2002/09/ccxml" version="1.0"> <var name="state" expr="'init'"/> <var name="incomingcall"/> <var name="tURL" expr="'http://danyork:password@identi.ca/apis/statuses/update.xml'"/> <eventprocessor statevariable="state"> <transition event="connection.alerting" state="init"> <accept/> </transition> <transition event="connection.connected" state="init"> <assign name="state" expr="'calling'"/> <assign name="incomingcall" expr="event$.connectionid"/> <createcall dest="'tel:+14079678424'"/> </transition> <transition event="connection.connected" state="calling"> <assign name="state" expr="'connected'"/> <join id1="event$.connectionid" id2="incomingcall"/> <var name="status" expr="'Dan is on the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.failed" state="calling"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is not answering his phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.disconnected" state="connected"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is off the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="send.successful" state="done"> <exit/> </transition> </eventprocessor> </ccxml>

Telephony Presence & identi.ca

<transition event="connection.disconnected" state="connected"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is off the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition>

slide-66
SLIDE 66

<?xml version="1.0" encoding="UTF-8"?> <ccxml xmlns="http://www.w3.org/2002/09/ccxml" version="1.0"> <var name="state" expr="'init'"/> <var name="incomingcall"/> <var name="tURL" expr="'http://danyork:password@identi.ca/apis/statuses/update.xml'"/> <eventprocessor statevariable="state"> <transition event="connection.alerting" state="init"> <accept/> </transition> <transition event="connection.connected" state="init"> <assign name="state" expr="'calling'"/> <assign name="incomingcall" expr="event$.connectionid"/> <createcall dest="'tel:+14079678424'"/> </transition> <transition event="connection.connected" state="calling"> <assign name="state" expr="'connected'"/> <join id1="event$.connectionid" id2="incomingcall"/> <var name="status" expr="'Dan is on the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.failed" state="calling"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is not answering his phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.disconnected" state="connected"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is off the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="send.successful" state="done"> <exit/> </transition> </eventprocessor> </ccxml>

Telephony Presence & identi.ca

<transition event="send.successful" state="done"> <exit/> </transition>

slide-67
SLIDE 67

<?xml version="1.0" encoding="UTF-8"?> <ccxml xmlns="http://www.w3.org/2002/09/ccxml" version="1.0"> <var name="state" expr="'init'"/> <var name="incomingcall"/> <var name="tURL" expr="'http://danyork:password@identi.ca/apis/statuses/update.xml'"/> <eventprocessor statevariable="state"> <transition event="connection.alerting" state="init"> <accept/> </transition> <transition event="connection.connected" state="init"> <assign name="state" expr="'calling'"/> <assign name="incomingcall" expr="event$.connectionid"/> <createcall dest="'tel:+14079678424'"/> </transition> <transition event="connection.connected" state="calling"> <assign name="state" expr="'connected'"/> <join id1="event$.connectionid" id2="incomingcall"/> <var name="status" expr="'Dan is on the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.failed" state="calling"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is not answering his phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="connection.disconnected" state="connected"> <assign name="state" expr="'done'"/> <var name="status" expr="'Dan is off the phone'"/> <send targettype="'basichttp'" name="'update'" target="tURL" namelist="status"/> </transition> <transition event="send.successful" state="done"> <exit/> </transition> </eventprocessor> </ccxml>

Telephony Presence & identi.ca

slide-68
SLIDE 68

Demo #4 Audio posts to identi.ca

slide-69
SLIDE 69

Demo #4: Audio posts to identi.ca

  • Application flow:
  • User calls in and leaves message
  • Message is uploaded to Amazon S3
  • Resulting URL posted to user's identi.ca account
  • Caveats:
  • Single user
  • Message overwritten each time
  • No security for S3
  • Kludgey way of dealing with S3 response
  • Demo:
  • 1-857-233-9444
  • sip:9996077938@sip.voxeo.net
slide-70
SLIDE 70

Demo #4: VoiceXML code

<?xml version="1.0" encoding="UTF-8"?> <vxml version = "2.1"> <var name="status"/> <var name="response"/> <var name="S1"/> <var name="key"/> <var name="acl" expr="'public-read'"/> <form> <record name="file" beep="true" dtmfterm="true" type="audio/wav"> <prompt bargein="false"> Please leave your identica audio post after the tone. When you are done, you may press any key. </prompt> </record> <catch event="error.badfetch"> <assign name="status" expr="'New audio post at http://oscon.s3.amazonaws.com/message.wav'"/> <data name="response" namelist="status" method="post" fetchtimeout="3s" src="http://dandemo:password@identi.ca/api/statuses/update.xml"/> <prompt>Thank you. Goodbye.</prompt> </catch> <block> <assign name="key" expr="'message.wav'"/> <data name="S1" namelist="key acl file" enctype="multipart/form-data" src="http://oscon.s3.amazonaws.com/" method="post" fetchtimeout="5s"/> </block> </form> </vxml>

slide-71
SLIDE 71

<?xml version="1.0" encoding="UTF-8"?> <vxml version = "2.1"> <var name="status"/> <var name="response"/> <var name="S1"/> <var name="key"/> <var name="acl" expr="'public-read'"/> <form> <record name="file" beep="true" dtmfterm="true" type="audio/wav"> <prompt bargein="false"> Please leave your identica audio post after the tone. When you are done, you may press any key. </prompt> </record> <catch event="error.badfetch"> <assign name="status" expr="'New audio post at http://oscon.s3.amazonaws.com/ message.wav'"/> <data name="response" namelist="status" method="post" fetchtimeout="3s" src="http://dandemo:password@identi.ca/api/statuses/update.xml"/> <prompt>Thank you. Goodbye.</prompt> </catch> <block> <assign name="key" expr="'message.wav'"/> <data name="S1" namelist="key acl file" enctype="multipart/form-data" src="http://oscon.s3.amazonaws.com/" method="post" fetchtimeout="5s"/> </block> </form> </vxml>

Demo #4: VoiceXML code

<record name="file" beep="true" dtmfterm="true" type="audio/wav"> <prompt bargein="false"> Please leave your identica audio post after the tone. When you are done, you may press any key. </prompt> </record>

slide-72
SLIDE 72

<?xml version="1.0" encoding="UTF-8"?> <vxml version = "2.1"> <var name="status"/> <var name="response"/> <var name="S1"/> <var name="key"/> <var name="acl" expr="'public-read'"/> <form> <record name="file" beep="true" dtmfterm="true" type="audio/wav"> <prompt bargein="false"> Please leave your identica audio post after the tone. When you are done, you may press any key. </prompt> </record> <catch event="error.badfetch"> <assign name="status" expr="'New audio post at http://oscon.s3.amazonaws.com/ message.wav'"/> <data name="response" namelist="status" method="post" fetchtimeout="3s" src="http://dandemo:password@identi.ca/api/statuses/update.xml"/> <prompt>Thank you. Goodbye.</prompt> </catch> <block> <assign name="key" expr="'message.wav'"/> <data name="S1" namelist="key acl file" enctype="multipart/form-data" src="http://oscon.s3.amazonaws.com/" method="post" fetchtimeout="5s"/> </block> </form> </vxml>

Demo #4: VoiceXML code

<block> <assign name="key" expr="'message.wav'"/> <data name="S1" namelist="key acl file" enctype="multipart/form-data" src="http://oscon.s3.amazonaws.com/" method="post" fetchtimeout="5s"/> </block>

slide-73
SLIDE 73

<?xml version="1.0" encoding="UTF-8"?> <vxml version = "2.1"> <var name="status"/> <var name="response"/> <var name="S1"/> <var name="key"/> <var name="acl" expr="'public-read'"/> <form> <record name="file" beep="true" dtmfterm="true" type="audio/wav"> <prompt bargein="false"> Please leave your identica audio post after the tone. When you are done, you may press any key. </prompt> </record> <catch event="error.badfetch"> <assign name="status" expr="'New audio post at http://oscon.s3.amazonaws.com/ message.wav'"/> <data name="response" namelist="status" method="post" fetchtimeout="3s" src="http://dandemo:password@identi.ca/api/statuses/update.xml"/> <prompt>Thank you. Goodbye.</prompt> </catch> <block> <assign name="key" expr="'message.wav'"/> <data name="S1" namelist="key acl file" enctype="multipart/form-data" src="http://oscon.s3.amazonaws.com/" method="post" fetchtimeout="5s"/> </block> </form> </vxml>

Demo #4: VoiceXML code

<catch event="error.badfetch"> <assign name="status" expr="'New audio post at http://

  • scon.s3.amazonaws.com/message.wav'"/>

<data name="response" namelist="status" method="post" fetchtimeout="3s" src="http://dandemo:passw@identi.ca/api/statuses/update.xml"/> <prompt>Thank you. Goodbye.</prompt> </catch>

slide-74
SLIDE 74

Demo #4: VoiceXML code

<?xml version="1.0" encoding="UTF-8"?> <vxml version = "2.1"> <var name="status"/> <var name="response"/> <var name="S1"/> <var name="key"/> <var name="acl" expr="'public-read'"/> <form> <record name="file" beep="true" dtmfterm="true" type="audio/wav"> <prompt bargein="false"> Please leave your identica audio post after the tone. When you are done, you may press any key. </prompt> </record> <catch event="error.badfetch"> <assign name="status" expr="'New audio post at http://oscon.s3.amazonaws.com/ message.wav'"/> <data name="response" namelist="status" method="post" fetchtimeout="3s" src="http://dandemo:password@identi.ca/api/statuses/update.xml"/> <prompt>Thank you. Goodbye.</prompt> </catch> <block> <assign name="key" expr="'message.wav'"/> <data name="S1" namelist="key acl file" enctype="multipart/form-data" src="http://oscon.s3.amazonaws.com/" method="post" fetchtimeout="5s"/> </block> </form> </vxml>

slide-75
SLIDE 75

More Ideas...

slide-76
SLIDE 76

Click-to-call

slide-77
SLIDE 77

Project Green Phone

  • By Mark Headd
  • http://www.voiceingov.org/blog/?p=135
  • VoiceXML, JavaScript, CCXML, PHP
  • Application:
  • Caller dials in to app
  • App uses ANI/Caller ID and makes web service

query to a database to determine location

  • Makes another web service query to find location of

nearest E85/Biodiesel stations

  • Relays information to caller
  • Sends caller a SMS text msg with info
slide-78
SLIDE 78

Rocketsource.org

  • www.rocketsource.org
  • Vox-Attendant
  • A VoiceXML-based, speech-driven auto attendant that can connect callers

with any person or group with an enterprise, via their desk, cellular, or VoIP phones.

  • Vox-Mail
  • A VoiceXML-based, speech-driven voicemail application that can store

messages locally or integrate with any IMAP email server to provide basic unified messaging.

  • Voice Conference Manager
  • A VoiceXML and CCXML-based, speech-driven conference manager that

features both phone and web-based conference call creation, access, and management.

  • VoiceXML, CCXML, grXML, JavaScript, Java, and Python
slide-79
SLIDE 79

VoiceXML/CCXML Resources

  • Open Source
  • VoiceXML Platforms
  • VoiceGlue: www.voiceglue.org
  • Applications
  • RocketSource: www.rocketsource.org
  • Festival (TTS): www.cstr.ed.ac.uk/projects/festival/
  • Sphinx (speech rec): sourceforge.net/projects/cmusphinx/
  • Commercial
  • VoiceXML Platforms
  • Voxeo: evolution.voxeo.com
  • Information
  • VoiceXML Forum: www.voicexml.org
  • W3C: www.w3c.org
slide-80
SLIDE 80

Inspiration

Photo: http://www.flickr.com/photos/carbonnyc/

slide-81
SLIDE 81

Open

slide-82
SLIDE 82
slide-83
SLIDE 83

Thank you!

slide-84
SLIDE 84

Dan York dyork@voxeo.com

blogs.voxeo.com www.voxeo.com/free evolution.voxeo.com identi.ca/danyork