How I replaced Skype with Twilio to make phone calls from my computer.
Working remotely, I have become used to the comfort of making calls
from my computer on Slack or Discord. Using a quality headset gives
a warm sound and a feeling of proximity, and leaves the hands clear
for typing on the keyboard and looking up information during the call.
I have been a longtime subscriber of Skype premium service to get a
similar experience when calling regular phones instead of other computers.
Sadly, as the Skype service stagnated for many years before changing for
the worse in 2017–2018, I had to find a better alternative
and I started to look into VOIP services with support
for calls to the PSTN in 2018–2019.
This is the story of how I successfully configured Twilio to get a
mobile phone number which can make and receive calls from my computer.
I have described all the steps that I followed in details,
including the understanding that I gained through trial and error,
in separate issues:
If you are interested only in how to reproduce my current setup,
you can read the short story below. It features links to more
details in the long story, if you need them.
- if you do not have a Twilio account, sign up
- or if you already have a Twilio account, sign in
- create a TwiML script which describes how phone calls
made from the computer are forwarded to regular phones:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Making Calls from SIP to Regular Phones -->
<Response>
<Dial callerId="{{#e164}}{{SipDomain}}{{/e164}}">
{{#e164}}{{To}}{{/e164}}
</Dial>
</Response>
-
copy the URL of the TwiML bin,
found in its details after saving the script. -
go to the settings of the SIP domain,
and under Voice Configuration,
paste the URL from the clipboard into the Request URL field -
save the settings of the SIP domain
-
launch Linphone on your computer
-
test the setup: call a regular phone number from Linphone
-
you can then save this phone number as a contact
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<!-- Receiving Calls from Regular Phones to SIP -->
<Dial>
<Sip>sip:me@1-202-555-0162.sip.us1.twilio.com;transport=tls;secure=true</Sip>
</Dial>
</Response>
In the above script, replace the user name and domain in the <Sip>
element with the identifier of the SIP user that you created,
followed with @
and the SIP domain that you created, ending
with .sip.us1.twilio.com;transport=tls;secure=true
:
<Sip>sip:[SIP User]@[SIP Domain].sip.us1.twilio.com;transport=tls;secure=true</Sip>
-
go to the configuration of your phone number on Twilio
-
next to “A call comes in”, select TwiML and the script
that you just created to manage incoming phone calls -
delete the URL next to “A message comes in”,
which answers all texts with a canned response -
save the settings
-
try to call your Twilio number from a regular phone
You can extend the TwiML script which handles incoming calls
to forward the caller to voicemail when you fail to answer:
- record a voicemail greeting using Audacity
- export the greeting as a WAV file (in mono with 8bit/s at 8kHz)
- upload the WAV as an asset on Twilio
- copy the URL of the asset
- go to the Voicemail Twimlet
- [create a custom Voicemail URL][] using the generator form
at the bottom of the page:- Email: the email address where you want to receive voicemail notifications
- Message: the URL of your greeting, pasted from the clipboard
- Transcribe: false
- copy the generated URL
- go to the Forward Twimlet
- create a custom Forward Twimlet URL:
paste your custom Voicemail URL next to FailUrl
in the form at the bottom of the page,
then change its protocol fromhttp
tohttps
- leave all the other fields empty
- copy the generated URL
- go back to your Twilio dashboard
- in the TwiML bin which handles incoming calls,
add anaction
attribute to the<Dial>
element - paste your custom Forward URL as its value
- change the protocol of the URL from
http
tohttps
- then add
&Dial=true
at the end of the URL
You now have a script of the form:
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<!-- Receiving Calls from Regular Phones to SIP (with Voicemail) -->
<Dial action="https://twimlets.com/forward?FailUrl=https%3A%2F%2Ftwimlets.com%2Fvoicemail%3FEmail%3Dyou%2540example.org%26Message%3Dhttps%253A%252F%252Fyour-runtime-domain.twil.io%252Fassets%252Fgreeting.wav%26Transcribe%3Dfalse&Dial=true">
<Sip>sip:your-sip-user@your-sip-domain.sip.us1.twilio.com;transport=tls;secure=true</Sip>
</Dial>
</Response>
where:
- you can now close your computer and call your Twilio number
from a regular phone to test the voicemail
- create your Pipedream account]
- a new workflow is created automatically, rename it to Send SMS by Email
- select the Email action for the trigger step of the workflow
- send a test email to the inbound email address of the workflow
When sending an SMS by email, you will need to include the phone number
of the recipient, in international format, in the subject, e.g.
New SMS to +## ###-###-#####.
- the test event is received by your Pipedream workflow
- continue and add the Twilio: Send SMS action as a second step
- create a Twilio API key and connect Pipedream to Twilio API
- select your Twilio phone number as From
- configure the following template as To:
{{steps.trigger.event.headers.subject.replace(/^.++/,'+').replace(/[^+0-9]/g,'')}}
- configure the following template as Message Body:
{{steps.trigger.event.body.text}}
- test and deploy the configured workflow
- create a new workflow
- name it Receive SMS by Email
- select HTTP / Webhook Requests as trigger step of the workflow
- configure a static response for the webhook, with status code
200
,
headerContent-Type:application/xml
and the static response below:
<?xml version="1.0" encoding="UTF-8" ?>
<Response/>
- configure the trigger URL as webhook for incoming SMS in Twilio dashboard
- send a test SMS to your Twilio phone number
- the test event is received by your Pipedream workflow
- continue and add the Send Email action as second step of the workflow
- configure the template below as Subject:
New SMS from {{steps.trigger.event.body.From}}
- configure the template below as Text:
{{steps.trigger.event.body.Body}}
- test and deploy your second workflow
The current setup does not fulfill all of my expectations yet: