Customize Twilio's click-to-call, transcribe and collect statistics - twilio

I'm using Java but the question is language-agnostic, so I posted it under twilio-PHP tag too.
My application needs to connect two customers: A and B. I want to transcribe the conversation and find out whether one of the parties did not pick up and screened the other to voicemail.
I'm following the steps in the click-to-call-tutorial
However, it looks like the Rest API supports recording but not transcription. I successfully can do:
Map<String, String> params = new HashMap<String, String>();
params.put("From", myTwilioNumber);
params.put("To", customerAPhoneNumber);
params.put("Url", "http://MyHandler.jsp");
params.put("IfMachine", "Hangup");
params.put("Record", "true");
Call call = client.getAccount().getCallFactory().create(params);
which gets the entire conversation recorded, but not transcribed!
As a side note -
params.put("IfMachine", "Hangup");
indeed hangs up, when reaches voicemail, but not before leaving a voicemail with random noise. Looks like Twilio's "probing" the response, and by the time it understands it got to voicemail, background noises have been recorded. Which is terrible user experience. Any advice?
Additionally, my call handling servlet does:
TwiMLResponse twimlResponse = new TwiMLResponse();
Say sayMessage = new Say(
"Hi, customer A, stay on line to speak with customer B?");
twimlResponse.append(sayMessage);
Dial dial = new Dial(customerBPhoneNumber);
twimlResponse.append(dial);
But when I'm looking at the TwiML Verbs , there is no place where I can set params.put("IfMachine", "Continue") . So the field call.getAnsweredBy() is null for the second call. In other words, I cannot know whether conversation between customer A and B ever happened.
Additionally, [TwiML Verb Record] ( https://www.twilio.com/docs/api/twiml/record ) does allow transcription, but if I do
twimlResponse.append(new Record());
it stops the conversation and records one of the customers.
So I cannot direct the REST API to transcribe, and TwiML Verbs does not even record the conversation in a way I want.
Can anyone help?
Thanks.

Twilio developer evangelist here.
I'm afraid that when recording both legs of a call, using the REST API, then transcription is not available. Transcription is only available on single messages recorded by the <Record> verb when the recording is under 2 minutes long.
I'd recommend recording the call and downloading the file to be sent off to a third party transcription service in order to transcribe longer, 2 legged calls like that.
In terms of the answering machine detection, it is an experimental feature and requires Twilio to listen to the first few seconds of a call to work out whether it is a machine or not. A good alternative, which can work as part of your <Dial> verb as well, is to use call screening. This is a good article on the pros and cons of AMD, as well as a good description of using human detection by call screening.
Let me know if this helps at all.

Related

Twilio: Responding to user input with multiple distinct messages

I'm working on a twilio-programable-sms chatbot that needs to provide a good chunk of information to a user at the outset of the first conversation. Currently, what we've written is about 562 characters. For some of our users, this gets broken up into chunks of 160 characters that do not necessarily show up in their SMS app in the right order.
To account for this, we're trying to break our message down into 160 character or less distinct messages that each send one-after-the-other.
However, my teammates and I are currently unsure how to accomplish this. Our application is currently written to provide a twiml response for each message that is received from a user. I've been unable to find a way to create a twiml response that indicates a number of consecutive messages, and the theoretical solutions we've come up with feel hacky and flawed.
To demonstrate, currently our code looks like this. As you can see, when a new user sends in the keyword "start" we join 4 messages together in one long text response. However we'd like each message to be sent individually, one after the other, about a second or two apart.
case #body
when "start"
if !!#user
CreateMessage::SubscriptionMessage.triage_subscribable_type(!!#user)
else
[
CreateMessage::AlphaMessage.personalized_welcome(#conversation.from, true),
CreateMessage::SubscriptionMessage.introduce_bcd,
CreateMessage::SubscriptionMessage.for_example,
CreateMessage::SubscriptionMessage.intvite_to_start
].join("\n\n")
end
We'd like to avoid creating a background worker/cron job, if possible - but welcome any and all suggested solutions.
I think your question is more on how to design synchronous(webhook response) vs asynchronous responses/messages. I have not used twiml but the concepts are same.
If you don't want to use a background job, then send fir N-1 messages using API with time delay in between, and the last message as response.
If you are OK with using background jobs, then send 1st message as response and queue a job for sending the remaining messages using API.

Joining a Webex conference using Twilio api

I want to join Webex conference using Twilio api. I am using Call class like this:
Call call = Call.creator(toNum, fromNum, twiMLUrl).setSendDigits(dialCode).setStatusCallback(STATUS_CALLBACK_URL).setStatusCallbackEvent(callbackEvents).create();
Here fromNum is my Twilio number, toNum is the phone number provided by Webex and dialCode is the participant code
I am unable to join the conference. I feel it is because webex asks to enter "1" to confirm the participant code in the end while joining.
Is there a way in api to send that "1" to confirm?
Twilio developer evangelist here.
It's a little bit blunt, but you can send pauses as part of the sendDigits parameter. Every "w" you send as part of the string will pause for half a second.
It might take a bit of testing, but you should be able to make your dialCode out of the initial code, say "1234", a few pauses and then the final "1". Like 1234wwwwww1.
Let me know if that helps at all.

Can Twilio IVR record a single answer?

I'm looking to build an integration with Twilio and here's a brief outline of what I want to do:
1) Prompt the caller with a numeric (verbal FTW) menu of options
- "Press 1 for X, 2 for Y"
2) Prompt the caller to leave a recording
- e.g., "Leave a message and press # or hang up"
3) Access a recording (mp3) of JUST the answer for #2
Thanks
Twilio developer evangelist here.
You can absolutely do that! In order to do so, you'll need to provide a series of URLs that respond with TwiML to tell Twilio what to do with the call.
Firstly, you'll need to set up a Twilio number so that an incoming call is directed to your first webhook URL. You'll need to do this in your Twilio console.
Then, your first webhook URL needs to produce the menu of options. This is typically called an IVR and we have a couple of tutorials that show you how to build one in depth here: IVR: Screening and Recording and IVR Phone tree (I've linked to the Ruby/Rails versions of the tutorials here, but there are other languages available, just check the tutorials page).
Essentially though, you need to use the <Say> and <Gather> verbs from TwiML to read out the options and respond to the results. For example:
<Response>
<Gather numDigits="1" action="/gather_results">
<Say voice="alice">Dial 1 to leave a message, Dial 2 to hangup</Say>
</Gather>
</Response>
The action attribute on the <Gather> element points to where the caller should be directed once they enter a digit. At that point you need to write something dynamic that extracts the Digits parameter from the request. If the number responds to the recording action then you can use the <Record> verb to record just that answer.
I've written the below as if it were using Sinatra and Ruby, but hopefully it shows how this would be used in any language.
def gather_results
if params["Digits"] == "1"
"<Response finishOnKey='#'>
<Say voice="alice">Leave a message and press # or hang up</Say>
<Record action="/record_results"></Record>
</Response>"
else
# Do something else
end
end
Finally, you need something to get the recording once it is complete. This final URL lives at the endpoint described in the action attribute for the <Record> verb. This URL will receive extra parameters that refer to the recording, including the URL of the recording file itself. You can write any code you like here, either just saving the URL of the recording or downloading the file itself.
Hope this helps, let me know if there's anything that isn't clear.

Twilio: Making conference name dynamic with REST apis

I am working on making conference calls from twilio client using REST apis.
I am using java helper libraries to call each participants and as they accept they are put to the same conference room. I am successful up to this. The code which returns the xml for conference, I have put in python following the code of server.py present in android sdk.
Currently in server.py I have hard coded the conference name, i.e anyone who tries for a conference will end up in same conference room.
So I want to make it dynamic. I want to pass the conference name from my java code to the url where server.py and the conference xml is present.
I have tried the following.
I tried adding one extra parameter to the call parameters as
callParams.put("To", user); // Replace with a valid phone number
callParams.put("ConfName", "kevin");
callParams.put("From", my_twilio_num); // Replace with a valid phone number in your account
callParams.put("Url", "https://dyno-name-conference.herokuapp.com/conference");
final Call call = callFactory.create(callParams);
where ConfName is my intended conference name. and I tried to retrieve it in server.py like
ConfName = request.values.get('ConfName')
response.dial(callerId=caller_id).conference(ConfName)
But the ConfName is not getting retrieved.
Is there a better approach for this.
I thought of passing an extra parameter along with the url as I see from the answer here. But I am not successful in that too.
May I know if there any correction in above approaches or a different approach for this..
Thanks in advance.
I managed to get it work.
I used the url as
call__Params.put("Url", "https://dyno-name-conference.herokuapp.com/conference?conf_name=kevin");
and in server.py I accessed it as
conf_name = request.values.get('conf_name')

Twilio connection parameters missing "To" parameter

I'm developing a Rails Twilio-based application and want to show to my user the number that the caller is calling (because in my application, a user can be associated with multiple numbers).
Here's the code:
Twilio.Device.incoming (conn) ->
$("#log").text("Receiving call from:" + conn.parameters.From)
$("#log").text("Calling to:" + conn.parameters.To)
ringtone.play()
$('.answer').click ->
ringtone.pause()
# accept the incoming connection and start two-way audio
conn.accept()
However, the conn.parameters object does not have a To parameter as the documentation says.
For now, I can get the number being called only server side, with params["Called"], but that is not what I need.
Any ideas ?
Megan from Twilio here. I'd like to share some of what I learned after recently getting Twilio Client up and running.
The way I imagine your call flow is that a 'user' in your application represents an agent with multiple sales lines connected to Twilio numbers configured to a TwiML app. When a customer or the 'caller' finds one of those numbers and dials it, you want to display to the user-agent which of the Twilio numbers the customer is calling.
In the code above conn.parameters.To likely represents your default_client, if you specified one. But conn.parameters.From should actually display the number the caller is calling, which if I am understanding correctly is the desired behavior.
Hope this helps!

Resources