OpenAI и Twilio в реальном времени: как восстановить правильную расшифровку разговора, когда вывод речи прерывается [дубPython

Программы на Python
Ответить
Anonymous
 OpenAI и Twilio в реальном времени: как восстановить правильную расшифровку разговора, когда вывод речи прерывается [дуб

Сообщение Anonymous »

Я интегрирую Twilio Media Streams со службой генерации и транскрипции речи в реальном времени для обработки входящих телефонных звонков (например, систему заказа выпечки).
Основная проблема, с которой я сталкиваюсь, — это восстановление правильной истории разговора, в частности того, что на самом деле слышал звонящий, когда происходят прерывания (вмешательство).
Проблема:
При вызове в реальном времени речевая служба непрерывно выдает:
  • Фрагменты вывода звука
  • Дельты расшифровки для этого аудио
Однако дельта расшифровки генерируется, даже если звук никогда не воспроизводится полностью или если воспроизведение прерывается и очищается на стороне Twilio.
Когда вызывающий абонент прерываний, я обнаруживаю это с помощью сигнала начала речи (например, 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, сопровождается меткой, чтобы воспроизведение можно было подтвердить позже.
Обработка прерываний
Когда вызывающий абонент начинает говорить, я обнаруживаю это и немедленно обрезаю вывод и очищаю воспроизведение 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
вычисляется с использованием временных меток мультимедиа Twilio.
Обработка расшифровки
Дельты расшифровки поступают непрерывно, даже если звук позже обрезается или очищается.

Чтобы избежать регистрации текста, который никогда не воспроизводился, в настоящее время я прикрепляю дельты расшифровки к самой последней неподтвержденной отметке:

Код: Выделить всё

---------------------------------------------

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»