Twilio+Flask语音转文字系统控制台无转录输出问题求助
问题分析与修复方案
你的代码核心问题有两个:
- 错误获取录音内容:Twilio不会直接把音频文件通过
request.files传递给你的服务,而是返回一个指向录音文件的URL字符串,这个值存在POST参数RecordingUrl里,所以audio_file永远是None,后续转录代码根本没执行。 - Gather与Record逻辑冲突:你同时使用了
gather(带语音输入)和record,两者功能重叠,会导致Twilio的回调逻辑混乱。
下面提供两种修复方案,按需选择:
方案一:使用Twilio内置语音转文字(推荐)
直接让Twilio完成语音转录,无需自己处理音频文件,更高效稳定:
import os from flask import Flask, request from twilio.twiml.voice_response import VoiceResponse app = Flask(__name__) app.config['DEBUG'] = True @app.route("/twilio", methods=['POST']) def twilio(): resp = VoiceResponse() # 配置gather获取语音转文字,指定电话场景模型提升准确率 gather = resp.gather(input='speech', timeout=5, action='/process-response', speechModel='phone_call') gather.say("Please say your prompt after the beep.") return str(resp) @app.route("/process-response", methods=['POST']) def process_response(): resp = VoiceResponse() # 直接从POST参数获取Twilio已转录好的文本 speech_result = request.form.get('SpeechResult') if speech_result: print(f"Transcription: {speech_result}") else: print("No speech detected or transcription failed") # 跳转回初始路由继续监听 resp.redirect('/twilio') return str(resp) if __name__ == '__main__': app.run(host="0.0.0.0")
方案二:自行下载录音并转录
如果需要自己处理音频文件,可以用以下代码,注意要添加Twilio的认证信息才能下载录音:
import os import requests from requests.auth import HTTPBasicAuth from flask import Flask, request from twilio.twiml.voice_response import VoiceResponse import speech_recognition as sr app = Flask(__name__) app.config['DEBUG'] = True # 从环境变量获取Twilio认证信息(建议不要硬编码) TWILIO_ACCOUNT_SID = os.environ.get('TWILIO_ACCOUNT_SID') TWILIO_AUTH_TOKEN = os.environ.get('TWILIO_AUTH_TOKEN') @app.route("/twilio", methods=['POST']) def twilio(): resp = VoiceResponse() resp.say("Please say your prompt after the beep.") # 录制音频,完成后跳转处理路由 resp.record(maxLength=5, action='/process-response', timeout=5) return str(resp) @app.route("/process-response", methods=['POST']) def process_response(): resp = VoiceResponse() recording_url = request.form.get('RecordingUrl') if recording_url: # 添加认证下载WAV格式的录音文件 auth = HTTPBasicAuth(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN) response = requests.get(f"{recording_url}.wav", auth=auth) audio_path = "audio.wav" with open(audio_path, 'wb') as f: f.write(response.content) # 本地语音转文字处理 recognizer = sr.Recognizer() with sr.AudioFile(audio_path) as source: audio = recognizer.record(source) try: prompt = recognizer.recognize_google(audio) print(f"Transcription: {prompt}") except sr.UnknownValueError: print("Speech recognition could not understand audio") except sr.RequestError as e: print(f"Could not request results from Google Speech Recognition service: {e}") else: print("No recording URL received") resp.redirect('/twilio') return str(resp) if __name__ == '__main__': app.run(host="0.0.0.0")
额外说明
- 移除了不必要的
contextvars,Flask每个请求是独立上下文,跨请求存储数据建议用数据库或缓存。 - 方案二中,必须确保你的服务能访问Twilio的录音URL,且认证信息正确,否则会下载失败。
内容的提问来源于stack exchange,提问作者Siyam Fahad
相关产品推荐
相关产品推荐

