使用Twilio可编程语音SDK实现糟糕的通话质量

时间:2017-01-13 23:41:21

标签: python ios objective-c heroku twilio

我正在将启用Twilio的应用程序从旧SDK升级到新的Twilio可编程语音(beta 5),但遇到了几个问题。其中最主要的是传出呼叫的音频质量差,在什么只能被描述为丢失数据包必须听起来像。即使我运行Quickstart demo app时问题仍然存在,导致我得出结论问题出现在我的Twiml中。我已经按照说明去了" T"关于设置适当的功能,权利,供应配置文件和上传voip推送凭证,但是关于新SDK或服务器的Python版本的文档很少,我还是抓狂了。

我对演示应用程序的唯一修改是包含"到" "来自"我的通话请求中的参数如下:

NSDictionary *params = @{@"To" : self.phoneTextField.text, @"From": @"+16462332222",};
[[VoiceClient sharedInstance] configureAudioSession];
self.outgoingCall = [[VoiceClient sharedInstance] call:[self fetchAccessToken] params:params delegate:self];

调用在适当的端点发送到我的Twiml服务器(Heroku上的python部署),如下所示:

import os
from flask import Flask, request
from twilio.jwt.access_token import AccessToken, VoiceGrant
from twilio.rest import Client
import twilio.twiml

ACCOUNT_SID = 'ACblahblahblahblahblahblah'
API_KEY = 'SKblahblahblahblahblahblah'
API_KEY_SECRET = 'blahblahblahblahblahblah'
PUSH_CREDENTIAL_SID = 'CRblahblahblahblahblahblah'
APP_SID = 'APblahblahblahblahblahblah'

IDENTITY = 'My_App'
CALLER_ID = '+15551111' # my actual number

app = Flask(__name__)
@app.route('/makeTheDamnCall', methods=['GET', 'POST'])
def makeTheDamnCall():
    account_sid = os.environ.get("ACCOUNT_SID", ACCOUNT_SID)
    api_key = os.environ.get("API_KEY", API_KEY)
    api_key_secret = os.environ.get("API_KEY_SECRET", API_KEY_SECRET)
    CALLER_ID = request.values.get('From')
    IDENTITY = request.values.get('To')
    client = Client(api_key, api_key_secret, account_sid)
    call = client.calls.create(url=request.url_root, to='client:' + IDENTITY, from_='client:' + CALLER_ID)

    return str(call.sid)

控制台输出outgoingCall:didFailWithError: Twilio Services Error,呼叫日志显示已完成的客户呼叫。对调试器的检查显示TwilioRestException: HTTP 400 error: Unable to create record。正如您所看到的,我在请求中包含的url可能会有问题,因为它只是转到root,但是没有办法将url留空(我已找到)。我最终会将其更改为url=request.url_root + 'handleRecording'以进行通话记录,但我现在只是一步一步。

到目前为止,我的解决方案是放弃call = client.calls.create支持dial动词,如下所示:

    resp = twilio.twiml.Response()
    resp.dial(number = IDENTITY, callerId = CALLER_ID)
    return str(resp)

这会打电话,但质量太差,无法使它变得无用。 (10秒以上的沉默,然后间歇性地听到另一方的声音)。以这种方式使用拨号动词也是不可接受的,因为它效率低下,因为我现在每次都要拨两次电话。

另一个我不确定是否已关联的主要问题是,我还没有接到任何来电,但我怀疑我可能需要问这个问题分别。

我怎样才能使这条线路起作用?我看着你,@ philnash。帮助我再次使我的应用程序变得更好:)

call = client.calls.create(url=request.url_root, to='client:' + IDENTITY, from_='client:' + CALLER_ID)

1 个答案:

答案 0 :(得分:1)

抱歉,我花了一段时间回到你的问题。

首先,使用TwiML <Dial>从可编程语音SDK调用进行持续连接的正确方法。您是creating a call using the REST API,但是您已经在SDK中创建了呼叫的第一站,并且TwiML转发到呼叫的第二站,即您拨打的人。值得注意的是,您需要为通话的每一段付费,而不是两次通话(双腿可以有不同的长度,例如,您可以在拨打收件人之前将原始呼叫者通过菜单系统)。

其次,关于糟糕的通话质量,这不是我可以在Stack Overflow上提供的帮助。在这种情况下,最好的办法是与Twilio support取得联系,并为受影响的呼叫提供一些呼叫SID。如果你能record an example call那也有帮助。

最后,我还没有看到你是否已经提出了另一个关于来电的问题,但是请你做,我会尽力帮助那里。这可能是我们可以在SO上讨论的代码问题。