Simple Get Input
Note
This sample is no longer supported in Version 1 REST API. A new implementation of this sample in Version 2 of the REST API.
A simple application to use the get input action to obtain speech or keypresses from an answered inbound or outbound call.
The application prompts the caller to say a four digit number. It then waits for 20 seconds for the caller to say four digits or to enter four digits on the telephone keypad. Once four digits have been recognised (either speech or keypresses) they are sent to a page that reads them back to the caller.
{
"actions" :
[
{
"get_input":
{
"prompt" :
{
"play" :
{
"play_list" :
[
{
"text_to_say" : "Please say a four digit number.
Press star to listen to this message again."
}
]
}
},
"speech_recognition_grammar" : "//FourDigits",
"seconds_speech_recognition_timeout" : 20,
"digit_input_options" :
{
"digit_count" : 4
},
"next_page" :
{
"url" : "ReadInput.aspx"
}
}
}
],
"token" : "my get input instance id"
}
{
"actions" :
[
{
"play" :
{
"play_list" :
[
{
"text_to_say" : "You said four two six nine."
]
}
}
]
}
{
"actions" :
[
{
"play" :
{
"play_list" :
[
{
"text_to_say" : "You are now out of the conference. Goodbye."
}
]
}
}
],
"token" : "my connect to conference instance id"
}
{
[
],
"token" : "Error for Action: xxxx ActionIndex: xxxx Result: xxxx"
}
{
}
Implemented as ASP.Net Web Forms:
using System;
using System.Collections.Generic;
using RestAPIWrapper;
public partial class SimpleGetInput : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(Request);
if (!ourRequest.IsValid)
{
return;
}
// Setup the actions
List<TelephonyAction> actions = new List<TelephonyAction>();
// Create the get input action
Play prompt = Play.SayText("Please say a four digit number. " +
"Press star to listen to this message again.");
// Use a predefined grammar that expects 4 digits, 0-9.
// Allow 20 seconds for the input.
GetInput getInputAction = new GetInput(prompt, SpeechRecognitionGrammar.FourDigits, 20);
getInputAction.NextPage = new WebPageRequest("ReadInput.aspx");
getInputAction.DigitInputOptions = new DigitInputOptions(4);
actions.Add(getInputAction);
// Respond
TelephonyResponse ourResponse = new TelephonyResponse(actions, "my get number instance id");
ourResponse.ToHttpResponse(Response);
}
}
using System;
using System.Collections.Generic;
using RestAPIWrapper;
public partial class ReadInput : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(Request);
if (!ourRequest.IsValid)
{
return;
}
String token = ourRequest.InstanceInfo.Token;
// Get the result of the get input action
GetInputResult result = (GetInputResult)ourRequest.InstanceInfo.ActionResult;
List<String> input = result.Input;
// Setup the actions
List<TelephonyAction> actions = new List<TelephonyAction>();
// Create the play action
Play playInput;
if (result.InputType.Equals("speech"))
{
playInput = Play.SayText(String.Format(
"You said {0}.", input));
}
else
{
playInput = Play.SayText(String.Format(
"You entered the digits <say-as interpret-as='characters'>{0}</say-as>.", input));
}
actions.Add(playInput);
// Respond
TelephonyResponse ourResponse = new TelephonyResponse(actions, token);
ourResponse.ToHttpResponse(Response);
}
}
using System;
using System.Collections.Generic;
using RestAPIWrapper;
public partial class ErrorPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(Request);
if (!ourRequest.IsValid)
{
return;
}
ErrorResult result = ourRequest.InstanceInfo.ErrorResult;
String token = String.Format("Action: {0}\nActionIndex: {1}\nResult: {2}",
result.Action, result.ActionIndex, result.Result);
// Respond
TelephonyResponse ourResponse = new TelephonyResponse(null, token);
ourResponse.ToHttpResponse(Response);
}
}
using System;
using System.Collections.Generic;
using RestAPIWrapper;
public partial class FinalPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(Request);
if (!ourRequest.IsValid)
{
return;
}
}
}
Implemented as ASP.Net Web Forms:
Imports System
Imports System.Collections.Generic
Imports RestAPIWrapper
Partial Class SimpleGetInput
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' Unpack the request
Dim ourRequest As TelephonyRequest = New TelephonyRequest(Request)
If Not ourRequest.IsValid Then
Return
End If
' Setup the actions
Dim actions As List(Of TelephonyAction) = New List(Of TelephonyAction)
' Create the get input action
Dim prompt As Play = Play.SayText("Please say a four digit number. " + _
"Press star to listen to this message again.")
' Use a predefined grammar that expects 4 digits, 0-9.
' Allow 20 seconds for the input.
Dim getInputAction As GetInput = New GetInput(prompt, SpeechRecognitionGrammar.FourDigits, 20)
getInputAction.NextPage = New WebPageRequest("ReadInput.aspx")
getInputAction.DigitInputOptions = New DigitInputOptions(4)
actions.Add(getInputAction)
' Respond
Dim ourResponse As TelephonyResponse = New TelephonyResponse(actions, "my get input instance id")
ourResponse.ToHttpResponse(Response)
End Sub
End Class
Imports System
Imports System.Collections.Generic
Imports RestAPIWrapper
Partial Class ReadInput
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' Unpack the request
Dim ourRequest As TelephonyRequest = New TelephonyRequest(Request)
If Not ourRequest.IsValid Then
Return
End If
Dim token As String = ourRequest.InstanceInfo.Token
' Get the result of the get_input action
Dim result As GetInputResult = ourRequest.InstanceInfo.ActionResult
Dim input As List(Of String) = result.Input
' Setup the actions
Dim actions As List(Of TelephonyAction) = New List(Of TelephonyAction)
' Create the play action
Dim playInput As Play
If result.InputType.Equals("speech") Then
playInput = Play.SayText(String.Format(
"You said {0}.", input))
Else
playInput = Play.SayText(String.Format(
"You entered the digits <say-as interpret-as='characters'>{0}</say-as>.", input))
End If
actions.Add(playInput)
' Respond
Dim ourResponse As TelephonyResponse = New TelephonyResponse(actions, token)
ourResponse.ToHttpResponse(Response)
End Sub
End Class
Imports System
Imports System.Collections.Generic
Imports RestAPIWrapper
Partial Class ErrorPage
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' Unpack the request
Dim ourRequest As TelephonyRequest = New TelephonyRequest(Request)
If Not ourRequest.IsValid Then
Return
End If
Dim result As ErrorResult = ourRequest.InstanceInfo.ErrorResult
Dim token As String = String.Format("Action: {0}\nActionIndex: {1}\nResult: {2}", _
result.Action, result.ActionIndex, result.Result)
' Respond
Dim ourResponse As TelephonyResponse = New TelephonyResponse(token)
ourResponse.ToHttpResponse(Response)
End Sub
End Class
Imports System
Imports System.Collections.Generic
Imports RestAPIWrapper
Partial Class FinalPage
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' Unpack the request
Dim ourRequest As TelephonyRequest = New TelephonyRequest(Request)
If Not ourRequest.IsValid Then
Return
End If
End Sub
End Class
Implemented as Java Servlets:
package com.aculab.telephonyrestapi.samples;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import java.io.IOException;
import com.aculab.telephonyrestapi.*;
public class SimpleGetInput extends HttpServlet
{
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException
{
handleRequest(request, response);
}
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException
{
handleRequest(request, response);
}
private void handleRequest(HttpServletRequest request,
HttpServletResponse response) throws IOException
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(request);
if (!ourRequest.isValid())
{
return;
}
// Set up the actions
List<TelephonyAction> actions = new ArrayList<TelephonyAction>();
// Create the get input action
Play prompt = Play.sayText("Please say a four digit number. " +
"Press star to listen to this message again.");
// Use a predefined grammar that expects 4 digits, 0-9.
// Allow 20 seconds for the input.
GetInput getInputAction = new GetInput(prompt, SpeechRecognitionGrammar.FourDigits, 20);
getInputAction.setNextPage(new WebPageRequest("ReadInput"));
getInputAction.setDigitInputOptions(new DigitInputOptions(4));
actions.add(getInputAction);
// Respond
TelephonyResponse ourResponse = new TelephonyResponse(actions, "my get input instance id");
ourResponse.setHttpServletResponse(response);
}
}
package com.aculab.telephonyrestapi.samples;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import java.io.IOException;
import com.aculab.telephonyrestapi.*;
public class ReadInput extends HttpServlet
{
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException
{
handleRequest(request, response);
}
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException
{
handleRequest(request, response);
}
private void handleRequest(HttpServletRequest request,
HttpServletResponse response) throws IOException
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(request);
if (!ourRequest.isValid())
{
return;
}
String token = ourRequest.getInstanceInfo().getToken();
// Get the result of the get input action
GetInputResult result = (GetInputResult)ourRequest.getInstanceInfo().getActionResult();
List<String> input = result.getInput();
// Set up the actions
List<TelephonyAction> actions = new ArrayList<TelephonyAction>();
// Create the play action
Play playInput;
if (result.getInputType().equals("speech"))
{
playInput = Play.sayText(String.format(
"You said %s.", input));
}
else
{
playInput = Play.sayText(String.format(
"You entered the digits <say-as interpret-as='characters'>%s</say-as>.", input));
}
actions.Add(playInput);
// Respond
TelephonyResponse ourResponse = new TelephonyResponse(actions, token);
ourResponse.setHttpServletResponse(response);
}
}
package com.aculab.telephonyrestapi.samples;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.aculab.telephonyrestapi.*;
public class ErrorPage extends HttpServlet
{
private static final long serialVersionUID = -4842873371047361437L;
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
handleRequest(request, response);
}
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
handleRequest(request, response);
}
private void handleRequest(HttpServletRequest request,
HttpServletResponse response) throws IOException
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(request);
if (!ourRequest.isValid())
{
return;
}
ErrorResult result = ourRequest.getInstanceInfo().getErrorResult();
String token = String.format("Action: %s\nActionIndex: %d\nResult: %s", result.getAction(), result.getActionIndex(), result.getResult());
// Respond
List<TelephonyAction> actions = new ArrayList<TelephonyAction>();
TelephonyResponse ourResponse = new TelephonyResponse(actions, token);
ourResponse.setHttpServletResponse(response);
}
}
package com.aculab.telephonyrestapi.samples;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import java.io.IOException;
import com.aculab.telephonyrestapi.*;
public class FinalPage extends HttpServlet
{
private static final long serialVersionUID = 5940620014313056844L;
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
handleRequest(request, response);
}
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
handleRequest(request, response);
}
private void handleRequest(HttpServletRequest request,
HttpServletResponse response) throws IOException
{
// Unpack the request
TelephonyRequest ourRequest = new TelephonyRequest(request);
if (!ourRequest.isValid())
{
return;
}
}
}
Implemented using a wrapper for Python's wsgiref.simple_server.
For the purposes of this sample, the first page is first_page, the final page is final_page and the error page is error_page.
The application base class.
from aculab.telephony_rest_api import Play
class ApplicationBase:
def __init__(self, exit=None):
self.exit = exit or [self.exit]
def exit(self):
pass
def error_page(self, my_actions, query_info):
try:
error_result = query_info.ErrorResult
action = error_result.get('action', 'none')
print("\nError {0} : {1}\n".format(action, error_result['result']))
my_actions.add(Play(text_to_say='I encountered an error.'))
except Exception as exc:
print("Error page exception: {0}".format(exc))
return True
def final_page(self, my_actions, query_info):
try:
tcall = query_info.ThisCall
if tcall:
print("This call ID : {0}".format(tcall.get('call_id')))
print("This call duration : {0}".format(tcall.get('seconds_call_duration')))
self.exit[0]()
except Exception as exc:
print("Final page exception: {0}".format(exc))
return True
def unknown_page(self, my_actions, query_info):
try:
my_actions.add(Play(text_to_say='I find myself on an unknown page.'))
except Exception as exc:
print("Unknown page exception: {0}".format(exc))
return True
The application code.
import sys, os
sys.path.append(os.path.abspath('../..'))
# import the wrappers for the REST API, these are used to create and send tasks
from aculab.telephony_rest_api import *
from aculab.simple_server import *
from aculab.base_application import ApplicationBase
class Application(ApplicationBase):
def __init__(self):
ApplicationBase.__init__(self)
def responder(self, query, start_response):
query_info = RESTQuery(query)
page = query_info.Page
my_actions = Actions(token='get number sample')
# on your inbound service, set the first page entry to point to this page
# e.g., http://<ip address>:<port>/first_page
if 'first_page' == page:
# configure tasks
my_number = GetInput()
digit_options = DigitInputOptions()
digit_options.set_digit_count(4)
my_number.set_grammar(GetInput.Grammars.FourDigits)
my_number.set_digit_input_options(digit_options)
play_action = Play(text_to_say=('Please say your four digit number, '
'or enter it on your keypad. '
'Press star to listen to this message again.'),
tts_voice='English US Male Polly Joey')
my_number.on_prompt_play(play_action)
my_number.set_next_page(next_page=WebPage(url='read_entered_digits'))
my_actions.add(my_number)
elif 'read_entered_digits' == page:
action_result = query_info.ActionResult
digits = action_result['result']['input']
print("Digits entered: {0}".format(digits))
if action_result['result']['input_type'] == "digits":
my_actions.add(Play(text_to_say="You entered, <say-as interpret-as="characters">{0}".format(digits)))
else:
my_actions.add(Play(text_to_say="You entered, {0}".format(digits)))
elif 'final_page' == page:
if self.final_page(my_actions, query_info) is False:
return None
elif 'error_page' == page:
if self.error_page(my_actions, query_info) is False:
return None
else:
if self.unknown_page(my_actions, query_info) is False:
return None
response_body = my_actions.get_json()
response_headers = [('Content-Type', 'application/json; charset=utf-8'), ('Content-Length', str(len(response_body)))]
start_response('200 OK', response_headers)
return [response_body]
if __name__ == "__main__":
application = Application()
# Set the host and port you want to use in the rest_simple_server.py file.
# To use SSL also set the key and certificate file.
ss = SimpleServer(application, simple_server_host, simple_server_port, simple_server_keyfile, simple_server_certfile)
ss.start()
print("Hit ctl-break to quit.")
declare(encoding='UTF-8');
spl_autoload_register();
header("Content-Type: application/json; charset=UTF-8");
use \Aculab\TelephonyRestAPI\Actions;
use \Aculab\TelephonyRestAPI\Play;
use \Aculab\TelephonyRestAPI\GetInput;
$response = new Actions();
$response->setToken('my get input instance id');
// Create the get input action
$prompt = Play::sayText("Please say a four digit number. " .
"Press star to listen to this message again."
);
$getInputAction = new GetInput($prompt, GetInput::FOURDIGITS);
$getInputAction->setSpeechRecognitionTimeout(20);
$getInputAction->setDigitInputOptions(4);
$getInputAction->setNextPage("ReadInput.php");
$response->add($getInputAction);
print $response;
declare(encoding='UTF-8');
spl_autoload_register();
header("Content-Type: application/json; charset=UTF-8");
use \Aculab\TelephonyRestAPI\InstanceInfo;
use \Aculab\TelephonyRestAPI\Actions;
use \Aculab\TelephonyRestAPI\Play;
$info = InstanceInfo::getInstanceInfo();
$response = new Actions();
$response->setToken($info->getToken());
// Get the result of the get_input action
$result = $info->getActionResult();
$inputType = $result->getInputType();
$input = $result->getInput();
// Create the play action
if ($inputType === 'speech') {
$playInput = Play::sayText("You said, " . $input);
} else {
$playInput = Play::sayText("You entered the digits <say-as interpret-as='characters'>" . $input . "</say-as>.");
}
$response->add($playInput);
print $response;
declare(encoding='UTF-8');
spl_autoload_register();
header("Content-Type: application/json; charset=UTF-8");
$info = \Aculab\TelephonyRestAPI\InstanceInfo::getInstanceInfo();
$error = $info->getErrorResult();
$action = $error->getAction();
$desc = $error->getResult();
if (!is_null($action)) {
error_log("Error from action \"$action\" with result:\n$desc\n");
} else {
error_log("Error result:\n$desc\n");
}
$response = new \Aculab\TelephonyRestAPI\Actions();
$response->setToken('Error');
$play = new \Aculab\TelephonyRestAPI\Play();
$play->addText('An error has occurred.');
$response->add($play);
print $response;
declare(encoding='UTF-8');
spl_autoload_register();
header("Content-Type: application/json; charset=UTF-8");
$info = \Aculab\TelephonyRestAPI\InstanceInfo::getInstanceInfo();
$call = $info->getThisCallInfo();
$callid = $call->getCallId();
$duration = $call->getSecondsCallDuration();
error_log("This all id: $callid\nThis call duration: $duration\n");
print '';