Основная проблема, с которой я сталкиваюсь, — это восстановление правильной истории разговора, в частности того, что на самом деле слышал звонящий, когда происходят прерывания (вмешательство).
Проблема:
При вызове в реальном времени речевая служба непрерывно выдает:
- Фрагменты вывода звука
- Дельты расшифровки для этого аудио
Когда вызывающий абонент прерываний, я обнаруживаю это с помощью сигнала начала речи (например, input_audio_buffer.speech_started) и немедленно:
- Обрезаю текущий воспроизводимый вывод
- Очищаю аудиопоток Twilio
- Возобновляю прослушивание вызывающего абонента
В результате история расшифровки становится неверной и больше не отражает то, что на самом деле испытал звонящий.
Пример
Поток разговора:
Система: Да, я могу помочь вам разместить заказ. Что бы вы хотели?
Клиент: Я хочу бублики и газировку.
Система: Это будет 9,05 доллара. Наличные или кредит?
(Здесь клиент прерывает)
(Клиент не слышит остальную часть предложения)
Клиент: Извините, что перебиваю — у вас тоже есть кофе?
Система: Конечно. Что бы вы хотели заказать?
Что на самом деле генерируется внутри компании (нежелательно)
Система: это будет 9,05 доллара США. Наличные или кредит? У нас также есть скидка в магазине, которую вы можете применить прямо сейчас.
Последнее предложение генерируется и транскрибируется, но никогда не воспроизводится для вызывающего абонента, поскольку поток был очищен.
Что я на самом деле хочу получить:
Я не пытаюсь собрать все сгенерированные различия в расшифровке.
Мне конкретно нужно реконструировать: только текст, соответствующий аудио, который фактически воспроизводился вызывающему абоненту с помощью Twilio.
/>Это включает обработку случаев, когда:
- Вывод воспроизводится частично
- Вывод обрезается на середине предложения
- Вызывающий абонент прерывает воспроизведение звука
Когда вызывающий абонент начинает говорить (вмешательство)
Аудиовыход отправляется в Twilio следующим образом:
Код: Выделить всё
---------------------------------------------
AGENT AUDIO → TWILIO
---------------------------------------------
if rtype in (“response.output_audio.delta”, “response.audio.delta”):
agent_cutoff = False
delta = response.get("delta")
if not delta or not stream_sid:
continue
await websocket.send_json({
"event": "media",
"streamSid": stream_sid,
"media": {"payload": delta},
})
last_audio_ts = time.monotonic()
if response_start_timestamp_twilio is None:
response_start_timestamp_twilio = latest_media_timestamp
item_id = response.get("item_id")
if item_id:
last_assistant_item = item_id
await send_mark(websocket, stream_sid)
continue
Обработка прерываний
Когда вызывающий абонент начинает говорить, я обнаруживаю это и немедленно обрезаю вывод и очищаю воспроизведение Twilio:
Код: Выделить всё
await openai_ws.send(json.dumps({
“type”: “conversation.item.truncate”,
“item_id”: last_assistant_item,
“content_index”: 0,
“audio_end_ms”: elapsed_ms,
}))
await websocket.send_json({
“event”: “clear”,
“streamSid”: stream_sid,
})
Код: Выделить всё
elapsed_msОбработка расшифровки
Дельты расшифровки поступают непрерывно, даже если звук позже обрезается или очищается.
Чтобы избежать регистрации текста, который никогда не воспроизводился, в настоящее время я прикрепляю дельты расшифровки к самой последней неподтвержденной отметке:
Код: Выделить всё
---------------------------------------------
OUTPUT TRANSCRIPT DELTA
---------------------------------------------
if rtype == “response.output_audio_transcript.delta”:
if agent_cutoff or not mark_queue:
continue
delta = response.get("delta")
if not delta:
continue
active_mark_id = mark_queue[-1]
pending_agent_transcripts.setdefault(active_mark_id, []).append(delta)
continue
Каков правильный или рекомендуемый способ восстановить достоверную расшифровку разговора в этом сценарии? Как я могу надежно определить, какие сегменты расшифровки соответствуют фактически воспроизводимому звуку?
Я следую официальному примеру Twilio, в котором используются маркеры воспроизведения и обнаружение прерываний, но проблема в этом PR сохраняется: первоначальное добавление искусственного прерывания/усечения разговора. ИИ говорит первым. от pkamp3 · Запрос на извлечение № 13 · twilio-samples/speech-assistant-openai-realtime-api-python · GitHub
Подробнее здесь: https://stackoverflow.com/questions/798 ... n-transcri
Мобильная версия