如何使用Python获取Twilio外呼通话信息并传入Google Speech-to-Text
实现Twilio通话转Google Speech-to-Text的完整方案
核心实现逻辑可以直接基于你现有的<Gather>组件改造,无需复杂的流转发配置,即可实现「对方停止发言后自动识别语音」的需求,具体步骤如下:
步骤1:前置准备
- 开通Twilio语音服务、Google Cloud Speech-to-Text服务,分别拿到Twilio的Account SID、Auth Token,以及Google服务账号的密钥JSON文件
- 你的服务端需要暴露公网可访问的地址用来接收Twilio的回调请求,本地开发可以用ngrok做内网穿透
步骤2:配置通话入口路由
你给出的参考代码已经符合基础逻辑,<Gather>的speechTimeout参数就是用来检测用户停止发言的时长,达到阈值后会自动触发配置的action回调:
# Flask版本示例,Django仅需调整路由和请求写法即可 from twilio.twiml.voice_response import VoiceResponse, Gather @app.route("/call", methods=['GET', 'POST']) def call_entry(): resp = VoiceResponse() gather = Gather( input='speech', # 停止发言3秒后触发回调,可根据需求调整时长 speechTimeout=3, action='/process-speech', autoTrim='true' ) gather.say('请开始发言,结束后我们将自动处理您的语音内容') resp.append(gather) # 10秒未检测到语音则重新触发提示 resp.redirect('/call') return str(resp)
步骤3:实现语音识别回调接口
回调接口会在用户停止发言后被Twilio调用,我们在这个环节拿到通话录音,传给Google STT处理即可:
import os import time from google.cloud import speech_v1p1beta1 as speech from twilio.rest import Client from flask import request # 初始化Google STT客户端,提前将密钥路径写入环境变量 os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "你的Google服务账号密钥JSON文件路径" stt_client = speech.SpeechClient() # 初始化Twilio客户端 TWILIO_ACCOUNT_SID = "你的Twilio Account SID" TWILIO_AUTH_TOKEN = "你的Twilio Auth Token" twilio_client = Client(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN) @app.route("/process-speech", methods=['POST']) def process_speech(): call_sid = request.form.get('CallSid') # 生成当前通话的单声道wav格式录音 recording = twilio_client.recordings.create( call_sid=call_sid, recording_channels='mono', recording_format='wav' ) # 等待录音生成,避免资源不存在报错 time.sleep(1) # 拼接带鉴权的录音下载地址 recording_url = f"https://{TWILIO_ACCOUNT_SID}:{TWILIO_AUTH_TOKEN}@api.twilio.com/2010-04-01/Accounts/{TWILIO_ACCOUNT_SID}/Recordings/{recording.sid}.wav" # 调用Google STT识别内容 audio = speech.RecognitionAudio(uri=recording_url) config = speech.RecognitionConfig( encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16, sample_rate_hertz=8000, language_code="zh-CN", enable_automatic_punctuation=True ) stt_response = stt_client.recognize(config=config, audio=audio) transcript = stt_response.results[0].alternatives[0].transcript if stt_response.results else "未识别到有效语音" # 此处可自行添加识别结果的后续业务逻辑 # 返回通话后续处理的TwiML resp = VoiceResponse() resp.say(f"识别完成,您刚才说的内容是:{transcript}") resp.hangup() return str(resp)
步骤4:配置Twilio Webhook
进入Twilio控制台的号码管理页,找到你用来呼叫的号码,在「Voice & Fax」配置项中,将「A Call Comes In」的回调地址填为你的服务端/call接口的公网地址,请求方式选择POST,保存后即可测试。
注意事项
- 如果需要实时语音识别,可以使用Twilio的Media Stream功能,将通话RTP流推送到服务端后,喂给Google STT的流式识别接口即可
- 生产环境建议将Twilio的鉴权信息、Google密钥存入环境变量或者配置中心,避免硬编码泄露
内容的提问来源于stack exchange,提问作者tachycardiazxc
相关产品推荐
相关产品推荐

