使用Twilio可编程语音SDK的通话质量很差

问题描述:

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

的唯一修改演示应用程序,我已经取得了对包括“到”和“从”我的呼叫请求参数,就像这样:

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可能会有问题,因为它只是进入了根目录,但是没有办法将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) 

对不起,我花了一段时间才回到你的问题。

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

其次,关于通话质量差,这不是我可以帮助堆栈溢出的东西。在这种情况下最好的做法是与Twilio support联系并为受影响的呼叫提供一些呼叫SID。如果你能record an example call那也会有帮助。

最后,我还没有看到你是否问过关于来电的另一个问题,但请做,我会尽我所能在那里帮助。这可能是我们可以在SO上覆盖的代码问题。

+0

谢谢菲尔!我已经与Twilio开了一张票,包括一个Call和Recording SID。 –