简介
短信和音频记录可以是一个很好的方式来延续沟通,而不需要意外地拿起电话。Twilio通过语音API使用Twilio的标记语言(TwiML)来简化这一过程,并对来电进行相应处理。
TwiML 提供了 [<Record>](https://www.twilio.com/docs/voice/twiml/record)
动词,它可以记录来电者的声音,并可以自动生成文本转录,直接发送到你的手机上。对于那些总是在路上或者懒得查看语音信箱的人来说,你再也不会错过任何信息了。在本教程中,你将学习如何利用Twilio的语音API和可编程短信,将语音电话转录成文本信息。
前提条件
- Node.js
- 一个免费的Twilio账户(使用此链接免费注册,当你升级账户时可获得10美元的积分
- 一个Twilio电话号码
- 一部智能手机来测试你的应用程序
- Twilio CLI
项目设置
在本节中,你将设置一个新的Node.js应用程序。为了使事情井井有条,创建一个名为_voice-to-sms_的文件夹来存储所有的应用程序文件。在你的终端或命令提示符中,导航到你喜欢的目录并输入。
mkdir voice-to-text
cd voice-to-text
npm init -y
复制代码
这个命令将创建你的项目文件,并通过创建_package.json_文件来构建你的Node项目,该文件将包含你项目的元数据和包的依赖性。
安装依赖项
你的下一步是安装你的项目所需的所有依赖项。你将需要。
- 用于路由和处理传入请求的Express
- Twilio的Node Helper Library,与Twilio的API交互,以接收呼叫和发送短信
- Dotenv来存储和访问环境变量
要安装这些依赖项,请回到你的终端,输入以下命令。
npm install express twilio dotenv
复制代码
现在你已经安装了你的依赖项,你将需要导入并初始化它们。在这之前,用以下命令在你的当前目录下创建一个名为_index.js_的新文件。
touch index.js
复制代码
现在用你喜欢的IDE打开_index.js_文件,并在该文件中放置以下代码。
require('dotenv').config();
const VoiceResponse = require('twilio').twiml.VoiceResponse;
const express = require('express');
const app = express();
app.use(express.urlencoded({ extended: true }));
复制代码
这段代码将导入并初始化你之前安装的包。app.use(express.urlencoded({ extended: true }));
是一个中间件,用于处理和解析传入的请求对象,作为字符串传给你的应用程序。
环境变量和Twilio账户凭证
dotenv
是用来访问环境变量的,你将在这里存储与API互动所需的Twilio凭证。回到你的终端,用以下命令创建_.env_ 文件。
touch .env
复制代码
要连接到Twilio的API,你将需要你的账户SID、Auth Token和你的Twilio电话号码。这些值可以安全地存储在.env文件中。打开你的.env文件,将以下内容粘贴到该文件中。
TWILIO_ACCOUNT_SID=XXXXXXX
TWILIO_AUTH_TOKEN=XXXXXXX
TWILIO_NUMBER=XXXXXXX
复制代码
复制后,用你的实际账户凭证替换XXXXXX
,这些凭证可以在Twilio控制台找到。当输入你的Twilio电话号码时,确保它是E.164格式。
现在你已经设置好了环境变量,你可以用已经加载到_.env_文件中的账户凭证导入并初始化Twilio的Node库。回到_index.js_,把下面的代码放在你初始化其他包的地方。
const twilio = require('twilio')(
process.env.TWILIO_ACCOUNT_SID,
process.env.TWILIO_AUTH_TOKEN
);
复制代码
下一步就是开始为你的应用程序编码了
创建Express路线
你将需要创建一种方法来处理和响应传入的调用。Express将允许你创建路由来处理这些请求。
你的应用程序的设置方式是,一旦你的Twilio号码收到呼叫,它将首先路由到 _/transcribe_
端点。这个端点将处理并转录该电话,然后将转录内容的回调发送至 _/sms_
端点,然后将转录内容发送到你的个人电话号码上。
在你的 index.js 文件中放置以下脚手架代码。
app.post('/transcribe', (req, res) => {
});
app.post('/sms', (req, res) => {
});
app.listen(3000, () => {
console.log('Express server listening on port 3000');
});
复制代码
_/transcribe_route
该 _/transcribe_
每当你的服务器上有一个POST
的请求,就会调用这个路由。每当你的Twilio号码接到一个电话,这段代码将试图转录用户留下的语音信息。将下面突出显示的代码插入你的 _/transcribe_
路线中。
app.post('/transcribe, (req, res) => {
const twiml = new VoiceResponse();
twiml.say('Hello. Please leave a message after the beep.');
twiml.record({
transcribeCallback: '/sms'
});
twiml.hangup();
res.type('text/xml');
res.send(twiml.toString());
});
复制代码
上面这段代码用TwiML的语音响应对象创建了一个名为twiml
的变量。TwiML告诉Twilio如何处理传入的电话或短信。创建这个变量后,TwiML会对来电者作出回应,说:”你好。请在哔声后留言”。
然后,TwiML将使用<Record>
动词来创建来电者回应的音频记录,并在来电者挂断电话或录音达到120秒时结束。TwiML的动词也可以用各种属性进行修改。
在这段代码中,transcribeCallback
属性被使用,它将告诉<Record>
动词转录音频记录,并执行文本转录的回调(通过POST
请求)到_/sms_ 路径。如果缺少或没有录音,TwiML将不会向给定的transcribeCallback
URL发出POST
请求。
一旦录音结束,代码将告诉TwiML挂断电话,一旦文本转录生成, _/sms_路由应该收到回调。
在我们继续之前,重要的是要提到,录制电话或语音信息有各种法律考虑,你必须确保在录制任何东西时遵守当地、州和联邦法律。
_/sms_路线
如果并且一旦录音被转录,它就会被发送到_/sms_端点,它将把文本转录作为短信发送到你的个人电话号码。将下面突出显示的代码插入到你的 _/sms_
路线中。
app.post('/sms', (req, res) => {
const from = req.body.From;
const transcription = req.body.TranscriptionText;
twilio.messages
.create({
body: `Message from: ${from} - ${transcription}`,
from: process.env.TWILIO_NUMBER,
to: '<YOUR_PHONE_NUMBER>'
})
.then(message => console.log(message.sid));
});
复制代码
用你的个人电话号码替换<YOUR_PHONE_NUMBER>
,并确保它是E.164格式。
在上面的代码中,转录的录音和收到的电话号码都是从POST
请求体中解析出来的。然后,代码使用先前初始化的twilio
对象来创建并向你的个人号码发送一条短信。该消息包含文本转录和从其接收的电话号码。
现在你的应用程序已经完成,保存并关闭你的_index.js_文件。
测试你的应用程序
最后,是时候测试一下你的应用程序了!打开你的终端,导航到你的项目目录,并运行以下命令。
node index.js
复制代码
你应该在终端看到一个日志语句,上面写着Express server listening on port 3000
。
现在你的应用已经在你的本地服务器_(localhost:3000_)上运行了,你需要告诉Twilio在哪里发送来自Twilio号码的POST
请求。
用ngrok配置webhook
由于你的本地服务器只在你的电脑里运行,Twilio无法连接到它,因为它不能访问互联网。为了解决这个问题,你需要创建一个ngrok隧道,它将启动一个连接互联网和_localhost:3000_ 的转发URL_。_ 打开第二个终端窗口,登录到Twilio CLI。
twilio login
复制代码
这个命令会提示你输入你的Twilio账户SID和你的Auth Token。登录后,使用下面的命令创建一个webhook,注意用你实际的Twilio电话号码替换占位符。
twilio phone-numbers:update "+TWILIO_NUMBER" --voice-url="http://localhost:3000/transcribe"
复制代码
这个命令将启动一个隧道,允许你从互联网上接收请求并将其发送到你的服务器。通常,在一个生产应用中,你会在一个在线托管的专用服务器上设置一个webhook,但为了测试,你将使用一个本地服务器。你可能会收到一个警告,说你的电脑将暴露在互联网上,如果是这样,请继续。你应该收到一个看起来像这样的回应。
复制语音URL,并导航到Twilio控制台的Twilio电话号码部分。点击你在这个项目中一直使用的Twilio号码,向下滚动到语音和传真部分。在A CALL COMES IN部分,你可能会看到你生成的转发URL,如果没有,粘贴你刚刚复制的URL,并确保HTTP POST在右边的下拉菜单中被选中。你的语音和传真部分应该是这样的,但有你的转发网址。
做完修改后,点击 “保存“按钮。
向你的Twilio号码发送一条语音信息
现在,你的应用程序已经启动并运行,终于可以进行测试了!拨打你的Twilio号码,留下信息,然后挂断电话。等待几秒钟,让你的语音信息被转录,然后你会收到一条短信,内容是转录的信息以及谁发来的信息!这条短信应该是这样的:”您好,请问您是谁?
它看起来应该是这样的。
语音到短信转录的下一步是什么?
当语音电话无法接通或你更喜欢文本时,Twilio语音API可以确保你保持联系。现在在你的Twilio工具箱里有了这个教程,你可以把来电的转录直接发送到你的短信里。为了保持这个程序的功能,你可以从你的个人号码设置呼叫转移到你的Twilio号码。你甚至可以使用Twilio功能来设置你的无服务器应用程序,而不需要运行Express服务器。
祝你建设愉快!