Включение вторжения с помощью соединения audiosocket между asterisk и сервером PythonPython

Программы на Python
Ответить
Anonymous
 Включение вторжения с помощью соединения audiosocket между asterisk и сервером Python

Сообщение Anonymous »

У нас есть аудиосервер на базе Python, подключенный к нашей системе Asterisk IVR с помощью AudioSocket. Поток вызовов работает следующим образом:

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

same => n,Wait(2)
same => n,Read(EXTID,${VOICE_DIR}/pls-enter-phone-ext,6,3,300)
same => n,Wait(1)
same => n,Playback(${VOICE_DIR}/you-have-entered)
same => n,SayDigits(${EXTID})
same => n,Wait(1)

same => n,Set(CIVR_HOST=ipconfig)
same => n,Log(NOTICE, Starting AudioSocket connection to ${CIVR_HOST}:3000)

same => n,Set(CALL_UUID=${UUID()})

same => n,Log(NOTICE, Notifying Python app - CallerId: ${CALLERID(num)}, UUID: ${CALL_UUID}, DNID: ${CALLERID(DNID)}, EXTID: ${EXTID})

same => n,System(curl -s "http://${CIVR_HOST}:1650/api/call-start?callerId=${CALLERID(num)}&uuid=${CALL_UUID}&dnid=${CALLERID(DNID)}&lext=${EXTID}" >/dev/null 2>&1 || wget -q -O - "http://${CIVR_HOST}:1650/api/call-start?callerId=${CALLERID(num)}&uuid=${CALL_UUID}&dnid=${CALLERID(DNID)}&lext=${EXTID}" >/dev/null 2>&1)

same => n,AudioSocket(${CALL_UUID},${CIVR_HOST}:3000)

same => n,Log(NOTICE, AudioSocket connection ended)

После установки соединения AudioSocket:
  • Речь пользователя передается в потоковом режиме на сервер Python.
  • Сервер выполняет преобразование речи в текст (STT).
  • Транскрибированный текст отправляется в агентскую систему для генерации ответа.
  • Текст ответа отправляется во внешнюю службу TTS.
  • Аудио фрагменты TTS передаются обратно через AudioSocket и воспроизводятся вызывающему абоненту через Asterisk.
  • После завершения воспроизведения система снова начинает прослушивать ввод пользователя.
Это цикл продолжается на протяжении всего разговора.

Текущая проблема
Текущая реализация ведет себя как рация или полудуплексная система.
Пока бот говорит (во время воспроизведения TTS), микрофон/обработка ввода отключена, чтобы избежать:
  • Фонового шума
  • Эхо от звука бота
  • Аудио TTS обрабатывается как речь пользователя
Из-за этого система не слышит звонящего, пока говорит бот.
Если пользователь прерывает ответ на середине ответа — например, чтобы уточнить что-то или вмешаться — его речь игнорируется полностью.

Попытка решения
Для поддержки полнодуплексных разговоров и вмешательства в разговор я попробовал:
  • эхоподавление на основе WebRTC (AEC)
  • обнаружение голосовой активности (VAD)
  • Непрерывная обработка звука во время воспроизведения TTS
Все эти изменения были реализованы на стороне сервера Python.

Проблемы с текущей попыткой полнодуплексного режима
Даже после значительной настройки мы сталкиваемся с двумя основными проблемами:
  • Пропущенные Вмешательство
    • Системе часто не удается обнаружить, когда пользователь говорит через звук бота.
  • Ложное вмешательство
    • Система часто инициирует вторжение сразу же после начала воспроизведения TTS, даже если пользователь молчит.
Это делает работу нестабильной и ненадежной.

Что мы хотим понять
Мы изучаем, существует ли лучший подход со стороны самого Asterisk.
В частности:
  • Можно ли реализовать полнодуплексную обработку/вмешательство более эффективно использовать функции диалплана Asterisk?
  • Предоставляет ли Asterisk какую-либо встроенную поддержку прерываемого воспроизведения или дуплексной обработки звука с помощью AudioSocket?
  • Существуют ли рекомендуемые архитектурные шаблоны для реализации надежного вмешательства с помощью Asterisk + AudioSocket + внешних систем STT/TTS?
  • Были бы некоторые перемещения логика из Python в Asterisk помогает повысить стабильность обнаружения?
Ответить

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

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

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

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

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