в бэкэнд (twilio_simple.py), я генерирую Twiml, который включает в себя глагол, чтобы отправить как вход, так и переходные дорожки для аудио WSS: //1dad7cb6fcf4.ngrok-free.app/api/v1/media-stream ).
реализовал обработчик WebSocket в media_stream.py для получения медиа-потока Twilio, извлеките вызовы из «Start», Decode Base64 Audio Puillys и Overchpart To Deepgrarm (с Actire 'Aceprabize Agirize Base Audio и пересылками на глубину (с помощью «Сказ-событие», основан на выгрузке, и пересылает их, на глубине «Входные» /«Источники».
Код: Выделить всё
ws://localhost:8001/api/v1/dashboard/ws< /code>) для получения сообщений о транскрипте в реальном времени, с результатом резервного опроса для загрузки разговоров, если WebSocket Falls.
Протестировано с помощью NGROK для публичного воздействия, и подтвердил работу основных вызовов без транскрипции.
отладки URL WebSocket (изначально имел дополнительные /медиа-потоки на пути, которые я исправил на основе веб-сайтов. «Media Stream Websocket подключен» в бэкэнд, а отладчик Twilio не показывает никаких очевидных ошибок для голосового веб -крюка, но, возможно, сбои для соединения WSS. Frontend показывает «отсоединенное» для панели панели Websocket, и не появляется транскриптов (даже при запасении опроса). Ключ DeepGram API установлен, но звук не достигает его.
`# ... (inside handle_voice_webhook)
if settings.DEEPGRAM_API_KEY and settings.TWILIO_WEBHOOK_URL:
try:
parsed_url = urlparse(settings.TWILIO_WEBHOOK_URL)
webhook_domain = parsed_url.netloc
stream_url = f"wss://{webhook_domain}/api/v1/media-stream" # Corrected path
stream = Stream(url=stream_url, track="both_tracks")
response.append(stream)
logger.info("✅ Media streaming enabled for call transcription")
except Exception as e:
logger.warning(f"❌ Failed to set up media streaming: {e}")
dial = response.dial(
action=f"{settings.TWILIO_WEBHOOK_URL}/api/v1/twilio/dial-status",
method='POST',
timeout=30,
caller_id=To,
record=True,
recording_status_callback=f"{settings.TWILIO_WEBHOOK_URL}/api/v1/twilio/recording-status",
recording_status_callback_event="completed"
)
dial.number(target_num, status_callback=..., status_callback_event=...)`
Код: Выделить всё
`@router.websocket("/media-stream")
async def media_stream_websocket(websocket: WebSocket):
# Handles connection, extracts CallSID from 'start' event, forwards audio to Deepgram
# ... (full handler code as in context)`
`// Initializes WebSocket to ws://localhost:8001/api/v1/dashboard/ws
// Handles onmessage for 'conversation_message' type, updates messages state
// Fallback polling to /api/v1/dashboard/active-calls and conversations`
< /code>
журналы /ошибки: < /strong> < /p>
Бэкэнд: «ℹ Стокол средств массовой информации отключен», если ключи отсутствуют, или «
Я полностью заблокирован-любое руководство или исправление кода! < /P>
Подробнее здесь: https://stackoverflow.com/questions/797 ... in-fastapi