将录制的 Twilio 音频发送到 Lex

2023-12-29

目前我可以录制用户输入,将录制 URL 传递给所需的函数,并在本地下载音频文件。我试图对音频文件执行的操作是获取音频文件的缓冲区以发送到 Lex,或者将其转换为 Lex 需要的格式。

根据 AWS 文档,输入流参数值接受以下值:

var params = {
  botAlias: 'STRING_VALUE', /* required */
  botName: 'STRING_VALUE', /* required */
  contentType: 'STRING_VALUE', /* required */
  inputStream: new Buffer('...') || 'STRING_VALUE' || streamObject, /*required */
  userId: 'STRING_VALUE', /* required */
  accept: 'STRING_VALUE',
  requestAttributes: any /* This value will be JSON encoded on your behalf with JSON.stringify() */,
  sessionAttributes: any /* This value will be JSON encoded on your behalf with JSON.stringify() */
};
lexruntime.postContent(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

根据 twilio 文档,音频文件看起来非常灵活......

默认情况下,对 RecordingUrl 的请求将返回二进制 WAV 音频格式的录音。要请求 MP3 格式的录制,请将“.mp3”附加到 RecordingUrl。

我需要做什么才能以适合 Lex 的正确格式获取 twilio 录制的音频?这只是构建正确的 Lex 参数集的问题还是我需要事先进行一些音频转换?如果有帮助的话,我正在用 Node js 编写这个应用程序,如果有帮助的话,我可以添加更多代码。


我通过从 Twilio 下载文件作为 PCM 并稍微更改我的参数来解决这个问题。另外,由于 Twilio 处理记录动词的方式,我需要在等待记录状态回调 POST 时将呼叫转移到保持状态。我还向呼叫者发送一条短信,其中包含 Lex 的最终状态。

我用来下载文件的代码:

app.post('/processRecording', (request, response) => {   
    var https = require('https');
    var fs = require('fs');

    let callSID = request.body.CallSid;
    let url = request.body.RecordingUrl;

    var saveFile = new Promise(function(resolve, reject) {
       let fileName = callSID+ ".pcm";
       var file = fs.createWriteStream(fileName);
       var request = https.get(url, function(response) {
       response.pipe(file);
       resolve();
      });
    });

});

const accountSid = 'YOUR ACCOUNT SID';
const authToken = 'YOUR AUTH TOKEN';
const client = require('twilio')(accountSid, authToken);
//Once the file is downloaded, I then fetch the call from the hold state using this code:
saveFile.then(function(){
client.calls(callSID)
    .update({method: 'POST', url: '/updateCall'})
    .then(call => console.log(call.to))
    .done();
  });

我的 updateCall 端点如下所示:

app.post('/updateCall', (request, response) => {
    let lexruntime = new AWS.LexRuntime();
    let recordedFileName = request.body.CallSid + '.pcm';
    let toNumber = request.body.To;
    let fromNumber = request.body.From;
    let twiml = new Twilio.twiml.VoiceResponse();
    let lexFileStream = fs.createReadStream(recordedFileName);
    let sid = request.body.CallSid;
    var params = {
        botAlias: 'prod', /* required */
        botName: 'OrderFlowers', /* required */
        contentType: 'audio/lpcm; sample-rate=8000; sample-size-bits=16; channel-count=1; is-big-endian=false',
        accept: 'text/plain; charset=utf-8',
        userId: sid /* required */

    };

params.inputStream = lexFileStream;

lexruntime.postContent(params, function(err, data) {
    if (err) console.log(err, err.stack); // an error occurred
    else     console.log(data);           // successful response



    if (data.dialogState == "ElicitSlot" || data.dialogState == "ConfirmIntent" || data.dialogState == "ElicitIntent" ){
        twiml.say(data.message);
        twiml.redirect({
                        method: 'POST'
                        }, '/recordVoice');

            response.type('text/xml');
            response.send(twiml.toString());

    }
    else if (data.dialogState == "Fulfilled" ){
      twiml.say(data.message);
      response.type('text/xml');
      response.send(twiml.toString());
        client.messages.create({
           to: toNumber,
           from: fromNumber,
           body: data.message
        }).then(msg => {
        }).catch(err => console.log(err));
     }
    else{
        twiml.say(data.message);
        response.type('text/xml');
        response.send(twiml.toString());
    }

    });
});

recordVoice 端点实际上是一个 Twilio Serverless 函数,但我认为这就是它作为快速端点的样子:

 app.post('/recordVoice', (request, response) => {
    let twiml = new Twilio.twiml.VoiceResponse();
    twiml.record({
        action: '/deadAir',
        recordingStatusCallback: '/processRecording',
        trim: true,
        maxLength: 10,
        finishOnKey: '*'
    });
    twiml.say('I did not receive a recording');
    response.type('text/xml');
    response.send(twiml.toString());
});

/deadAir 端点也是一个 Twilio Serverless Function,但它看起来像这样:

app.post('/deadAir', (request, response) => {
    let twiml = new Twilio.twiml.VoiceResponse();
    twiml.pause({
        length: 60
    });
    response.type('text/xml');
    response.send(twiml.toString());
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将录制的 Twilio 音频发送到 Lex 的相关文章

  • 添加 TwilioController 基类继承后,Microsoft Azure MVC 3 Web 角色未启动

    Azure Web 角色 MVC 3 项目 不会以 Twilio 控制器类启动 我有一个托管在 MS Azure 上的 MVC 3 应用程序 它发布到 Azure Web 角色 没有问题 我添加了 Nuget Twilio 和 Twilio
  • 在whatsapp api上回复特定的whatsapp消息

    我正在尝试发送对特定 Whatsapp 消息的回复 这是通过将消息滑动到右侧来完成的 但在我收到的 POST 通过 Twilio 发送 中 我没有找到任何可以表示引用消息的内容 请问我该怎么做 这是我收到的帖子 From whatsapp
  • 您可以将 SIP 电话与 Twilio Endpoint 连接吗?如果是这样,怎么办?

    我有一个基于 Linksys Cisco SPA942 电话的 SIP 电话系统 我想将现有的 PBX 排除在外 并使用 Twilio 为我们编写一个自定义 PBX 我熟悉 Twilio 并且过去编写过许多应用程序 但 Twilio 的 S
  • 呼叫 IVR 时动词记录超时的问题

    我们正在尝试使用 Twilio 为这些 IVR 创建自动化测试框架 我们从 Twilio 向 IVR 发出出站呼叫 使用动词 Say Play 与 IVR 进行交互 并使用 Record 来捕获 IVR 所说的内容 然后我们将其转录并做出断
  • 可以在 Twilio 中保存短信并安排发送吗?如果没有,我该如何完成这件事?

    我刚刚注册了 Twilio 试用帐户 我没有看到任何功能说明如何创建和保存多条短信供以后使用以及安排何时将它们发送到群组 这可能吗 或者有没有更好的软件可以做到这一点 Twilio 传道者在这里 查看您的个人资料 您的首选语言似乎是 PHP
  • 使用 Twilio 接收短信并将其存储在数据库中

    我正在使用 Twilio API 发送和接收来自客户的短信 每次我向客户发送短信时 我都会存储以下字段to body到我的数据库中 我已经实现了用于发送消息的 API 该 API 运行良好 并且只需将字段保存到我的数据库中即可 我的问题 当
  • Twilio - 响铃 2 次后转接呼叫

    是否可以使用 Twilio 将来电转移到电话号码 A 假设 416 555 1234 并且如果电话号码 A 占线或在响铃 2 或 3 次后无人接听 则转移到电话号码 B XML 现在看起来像这样
  • 在 ios 上通过 Twilio 发送短信?

    我怎么能够通过 twilio 发送短信 https www twilio com docs api rest 我已经尝试过并正在执行以下操作 IBAction sendButtonPressed id sender NSLog Sendin
  • 使用 Twilio,是否可以在电话会议期间接收用户输入?

    The Twilio 文档 https www twilio com docs api twiml gather提到您可以在用户收听消息时收集用户键盘输入 您可以在 Gather 中嵌套以下动词 Say Play Pause 但是您不能将
  • 有没有办法以编程方式创建 Twiml Bin?

    我想要制作一个应用程序 用户可以在其中输入电话号码和消息 然后我可以让 Twilio 向该电话号码发送一条带有合成文本的消息 一个TwiML 代码示例 https www twilio com docs api twiml say我正在使用
  • TwiML 应用程序:如果呼叫者在应用程序过程中挂断,Twilio 是否会通知应用程序挂断?

    我正在尝试找出一种方法来捕获调用者是否在 TwiML 指令中间挂断 如果呼叫者挂断 放弃呼叫 twilio 是否会通知应用程序 我看到状态回调 url 设置 但我只得到 已完成 状态 我想知道如果呼叫者正在聚会并挂断电话 twilio 会知
  • 如何生成哈希签名?

    我正在使用 twilio sdk 将短信验证与我的 Android 应用程序集成 twilio 要求我注册我的应用程序的哈希签名 但生成哈希签名的方法不起作用 总是说它是无效的哈希签名 这是 twilio 想要哈希签名的路径 用户在 and
  • 为 Twilio-Whatsapp 电话号码上的传入消息设置 Webhook

    我们有一个支持 Whatsapp 的 Twilio 电话号码 当尝试以编程方式设置传入消息的 Webhook 时 Webhook 设置正确 但消息未通过 Whatsapp 电话号码的 Webhook 似乎位于与普通电话号码不同的位置 要手动
  • Twilio 将短信转发到电子邮件 - 找不到模块“得到”

    我是 Twilio 的新手 我正在尝试使用本教程将短信转发到电子邮件地址 https www twilio com blog 2017 07 forward incoming sms messages to email with node
  • 更改收件人短信的“发件人”字段

    我希望短信的收件人看到我的公司名称 而不是电话号码 这怎么可能 我目前正在使用 Twilio 但我愿意接受涉及其他服务的建议 对于那些看过 philnash 的答案但仍然遇到问题的人 请阅读本文 我正在使用 twilio ruby gem
  • 列的数据被截断?

    更改 MySql 列的数据类型以存储后Twilio 通话 https www twilio com docs api rest call ids 34 个字符字符串 我尝试使用以下命令手动更改该列中的数据 update calls set
  • Twilio Studio HTTP Post 请求标头

    我正在尝试使用 Http 请求小部件 内容类型 application json 我没有看到添加请求标头以提供令牌的选项 此 Net 代码获得成功响应 string str Hello Webservice string url https
  • 无法从 Twilio Studio 创建任务

    在 Twilio Studio 上 我可以收到短信 回复预设回复 但当我尝试在 Flex 中传递 创建任务时 出现错误 REST API 流触发器不支持 SendToFlexWidget 即使我使用的是收入消息触发器 即使使用默认消息流 我
  • Twilio:此电话号码无法发送消息

    我现在有一个 Twilio 测试帐户 我获得了一个比利时电话号码 并验证了我自己的手机号码 我正在尝试从分配的 Twilio 号码向我的手机号码发送简单的 SMS 消息 但这不起作用 仪表板显示 此电话号码无法发送消息 但在消息常见问题解答
  • 如何在 Twilio 可编程聊天中的单个通道上侦听消息

    Using twilio chat js https www npmjs com package twilio chat如何在单个频道上收听消息 我发现这个问题 https stackoverflow com questions 54687

随机推荐

  • 刺尾没有优雅地退出

    我正在使用以下任一命令通过 Maven 运行 Thorntail 2 2 1 Final 微服务 mvn thorntail start mvn thorntail run 它运行良好 但是当我击中时Ctrl C它不会退出应用程序 即控制台
  • 循环遍历 xml 元素

    我有以下内容 aMyArray null xml userfile Get Content C AppSense Scripts AmPolicyConversion AM dev xml i 0 FOREACH j in userfile
  • numpy.ndarray 与 pandas.DataFrame

    我需要对程序中保存统计数据帧的数据结构基础的选择做出战略决策 我在一张大表中存储了数十万条记录 每个字段都有不同的类型 包括短字符串 我会对需要快速实时完成的数据进行多重回归分析和操作 我还需要使用一些相对流行且支持良好的东西 我知道以下参
  • 如何从通过 API 返回的 Task 获取值以进行单元测试

    我使用 ASP NET MVC Core v2 1 创建了一个 API 我的一个HttpGet方法设置如下 public async Task
  • MySQL按出现次数排序

    我正在两个名为的文本字段中进行搜索Subject and Text对于特定的关键字 为此 我使用LIKE陈述 我在尝试按出现次数对结果进行排序时遇到了问题 我的搜索查询如下所示 SELECT FROM Table WHERE Text LI
  • 在 Gnuplot 中,如何在第三列等于 0 时使点为一种颜色,否则为另一种颜色?

    我需要根据一列中的颜色改变一行值的点颜色 数据 x y z 1 3 0 1 5 6 3 5 2 4 5 0 如果该列为零 则颜色应为一个值 如果第三列中的值非零 则颜色应为不同的颜色 所以 我假设 plot file dat u 1 2 3
  • 在 Linux 中删除文件名中的空格[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我在不同的文件夹中有数百个 jpg 文件 如下所示 304775 105 01 jpg 304775 105 03 jpg 304775 105 05
  • DUAL 的魔力

    正常情况下 不使用SYS或者也许使用它 SQL gt select from dual D X 在不太正常的条件下 连接为SYS SQL gt alter database close Statement processed SQL gt
  • WPF 树视图蓝调。我想选择一个项目

    我正在尝试选择一个 TreeViewItem 现在 我可以访问包含的 TreeViewItem 并告诉它展开 以便我可以选择它的孩子 如果它已经展开 一切都很好 如果没有 那么我运行以下代码 EventHandler selector ne
  • MYSQL LEFT JOIN 与 CASE 优化

    我花了一些时间尝试使用 CASE 来处理这个 SELECT 但我失败了 感谢我现在正在使用 COLASCE 如何使用 CASE IF 语句优化此 SELECT 这是从字段选择的不同表中查询的快速方法吗 SELECT a folderid a
  • 将 Eclipse 从 Indigo 升级到 Juno 时我可以保留我的设置吗?

    如何将 Eclipse 从 Indigo 升级到 Juno 而不会丢失所有自定义设置 我尝试了两种不同的方法 但都不起作用 从 Indigo 导出首选项并导入 Juno 在 Indigo 工作区的副本上运行 Juno 每次升级都得从头开始真
  • .Net:如何创建独立于供应商的数据集、表适配器、绑定(数据库在运行时决定)

    我有一个 C Windows 窗体应用程序 其原型是在 SQL Server 强类型数据集 上创建的 在其最终版本中 应用程序必须能够在 SQL Server MySQL 或 Oracle 上运行 现在我想知道原型中的哪些部分 如果有 可以
  • MongoDB 5.0+ 需要支持 AVX 的 CPU。容器启动失败

    我正在尝试使用 docker compose 文件在 docker 容器中运行 mongo 6 但它总是退出并出现警告 Docker 版本 23 0 4 内部版本 f480fb1 Docker compose版本 v2 17 2 docke
  • 预渲染不会保留用于捕获第二遍的变量值

    我查看了有关如何预渲染 Blazor 服务器应用程序然后分两次渲染的各种文章 我已经审查了生命周期 并且非常清楚这是预期的行为 主要是为了提供良好的性能 我不想关闭预渲染 所以在加载数据结构和类似的东西时我必须考虑它 我需要能够运行与数据库
  • PHP 中的优先运算符“OR”和“=”

    a 1 a OR a somthing echo a 1 Why If 比 OR 优先得多 那么为什么 OR 先执行呢 当您在两个语句之间放置 OR 时 如果第一个语句返回 true 则第二个语句永远不会被执行 在这种情况下 第一个语句 a
  • 使用 Nashorn JavaScript 引擎访问 ScriptContext 变量 (Java 8)

    我使用了以下代码RhinoJava 中的 JavaScript 引擎 Test public void testRhino throws ScriptException final ScriptEngineManager factory n
  • 仅使用 HTML/CSS 创建粗箭头

    有没有办法仅使用 html 和 css 创建 4 个指向上 下 左 右的粗箭头 使用 s 和边框创建箭头的主干非常容易 这是箭头头的对角线 我不知道该怎么做 我需要它在 IE7 和所有现代浏览器中工作 我使用 jQuery 并且很高兴依赖它
  • 包含关键字的 Linq 不同记录

    我需要根据汽车关键字搜索返回不同的记录列表 例如 Alfa 147 问题是 由于我有 3 辆 Alfa 汽车 它返回 1 3 条记录 似乎 1 表示 Alfa 和 147 结果 3 表示 Alfa 结果 EDIT SQL Server 查询
  • gitolite 后接收挂钩未触发

    In my gitolite rc我有的文件 LOCAL CODE gt ENV HOME gitolite local 然后在ENABLE我已启用的同一文件的部分repo specific hooks ENABLE gt COMMANDS
  • 将录制的 Twilio 音频发送到 Lex

    目前我可以录制用户输入 将录制 URL 传递给所需的函数 并在本地下载音频文件 我试图对音频文件执行的操作是获取音频文件的缓冲区以发送到 Lex 或者将其转换为 Lex 需要的格式 根据 AWS 文档 输入流参数值接受以下值 var par