请求Twilio录音时出现Twilio 500错误(11200 & 12200)
我正在制作一个简单的语音转录程序,它可以录制你的声音,然后把录音发送到另一个地方,那个地方会下载音频文件,然后进行转录并读出结果。
为了更清楚,我想把从接听电话的地方调用的功能,移动到处理音频的地方,因为我希望它能处理并读出响应。
现在,它有两个地方可以接收请求,一个是“incoming-call”(接听电话)的地方,代码如下:
@app.route('/incoming_call', methods=['POST'])
def handle_call():
response = VoiceResponse()
response.play("./static/audio/intro.mp3")
response.record(action="/handle_audio", recording_status_callback_event="completed",
recording_format='mp3', timeout=3, play_beep=False)
return Response(str(response), 200, mimetype='application/xml')
还有一个是“handle-audio”(处理音频)的地方,代码如下:
@app.route('/handle_audio', methods=['POST'])
def transcribe_audio():
audio_url = request.values.get('RecordingUrl')
credentials = f"{accSID}:{accAUTH}"
encoded_credentials = base64.b64encode(credentials.encode('utf-8')).decode('utf-8')
headers = {
'Authorization': f'Basic {encoded_credentials}'
}
print(audio_url)
# Make a GET request to download the audio file
audio_response = requests.get(audio_url+".mp3", headers=headers, stream=True)
audio_response.raise_for_status() # Raise an error for bad responses (e.g., 4xx or 5xx)
当我在“/incoming-call”这个地方使用“action="/handle_audio”这个参数时,我的程序给我报了一个错误:“requests.exceptions.HTTPError: 404 Client Error: Not Found for url: (Twilio Audio Recording Url)”。但是,当我使用“recording_status_callback="handle_audio”时,它就能正常请求文件。这可能是什么原因呢?我该怎么解决这个问题?
在Twilio的控制台日志中,它给我抛出了一个11200的错误(链接在这里),还有一个12200的错误(链接在这里),但我还是搞不清楚为什么使用record_status_callback时可以工作,而使用action参数时却不行。
我非常感谢任何帮助!
1 个回答
我最终搞明白了!
首先,记录的接口有两个方法,一个是“action”,另一个是“recording_status_callback”;这两个看起来很相似。但是,action 方法是在录音结束后立即调用你提供的接口,而 recording_status_callback 方法则是在录音上传到 Twilio 服务器并被标记为“完成”后才会调用,这个“完成”是你在“recording_status_callback_event”中指定的。因此,如果你(使用 action 方法)立刻尝试下载文件,Twilio 会给你一个 11200 错误,提示资源不可用。这是因为录音还没有上传完成,所以还不能访问。为了避免这个问题,我在我创建的一个叫“download_audio”的函数中使用了 time.sleep() 方法,具体实现如下:
def download_audio(recording_url):
time.sleep(2)
credentials = f"{accSID}:{accAUTH}"
encoded_credentials = base64.b64encode(credentials.encode('utf-8')).decode('utf-8')
headers = {
'Authorization': f'Basic {encoded_credentials}',
}
audio_response = requests.get(headers=headers, url=recording_url)
audio_response.raise_for_status()
return audio_response
希望这对你有帮助!