我正在将支持 Twilio 的应用程序从旧的 SDK 升级到新的 Twilio Programmable Voice (beta 5),但遇到了几个问题。其中最主要的是拨出电话的音频质量差,只能描述为丢失数据包的声音。即使我运行 Quickstart demo app 也存在问题,让我得出结论,问题出在我的 Twiml 中。关于设置适当的功能、权利、配置文件和上传 voip 推送凭证,我已经按照“T”的说明进行操作,但是关于新 SDK 或服务器 Python 版本的文档很少,我只剩下挠我的头。
我对演示应用所做的唯一修改是在我的调用请求中包含“to”和“from”参数,如下所示:
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 错误:无法创建记录
。如您所见,我在请求中包含的 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 多秒的沉默,然后间歇性地听到对方的声音)。以这种方式使用拨号动词也是 Not Acceptable ,因为它效率低下,因为我现在每次都要为两次通话付费。
另一个我不确定是否已连接的主要问题是,我还无法接听任何来电,但我怀疑我可能需要单独询问该问题。
我怎样才能让这条线工作?我在看着你,@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 将转发到调用的第二段,即您拨叫的人。值得注意的是,您需要为通话的每一段付费,而不是两次通话(通话的长度可以不同,例如,您可以在拨叫接收者之前让原始调用者通过菜单系统)。
其次,关于通话质量差的问题,我无法在 Stack Overflow 上提供帮助。在这种情况下最好的办法是联系 Twilio support并为受影响的调用提供一些调用 SID。如果可以record an example call这也会有所帮助。
最后,我还没有看到您是否问过另一个关于来电的问题,但请问,我会尽力提供帮助。这可能是我们可以在 SO 上讨论的代码问题。
关于python - 使用 Twilio 可编程语音 SDK 的通话质量差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41645135/