You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Twilio+Flask语音转文字系统控制台无转录输出问题求助

问题分析与修复方案

你的代码核心问题有两个:

  1. 错误获取录音内容:Twilio不会直接把音频文件通过request.files传递给你的服务,而是返回一个指向录音文件的URL字符串,这个值存在POST参数RecordingUrl里,所以audio_file永远是None,后续转录代码根本没执行。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:37:26