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

标签 python ios objective-c heroku twilio

我正在将支持 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/

相关文章:

python - 如何为多个 fastq 文件运行代码?

python - 如何在 Python 中构建列表中元素出现索引的字典?

python - 如何为时间序列数据帧添加行?

python - Trove 分类器定义

ios - 如何在 iOS 中将 UIImage 转换为白色

ios - View 在屏幕上,但 self.view.window 仍然为零

ios - 如何在 NSURLSessionDownloadTask 的 UIApplicationWillTerminateNotification 获取 resumeData

ios - UICollectionView 和 UICollectionViewLayout 的关系?

ios - UITableView 方法被 TableView 大小覆盖

ios - 如何找到我的 iOS Apple Developer 艺术家 ID?