Код: Выделить всё
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)
- Речь пользователя передается в потоковом режиме на сервер Python.
- Сервер выполняет преобразование речи в текст (STT).
- Транскрибированный текст отправляется в агентскую систему для генерации ответа.
- Текст ответа отправляется во внешнюю службу TTS.
- Аудио фрагменты TTS передаются обратно через AudioSocket и воспроизводятся вызывающему абоненту через Asterisk.
- После завершения воспроизведения система снова начинает прослушивать ввод пользователя.
Текущая проблема
Текущая реализация ведет себя как рация или полудуплексная система.
Пока бот говорит (во время воспроизведения TTS), микрофон/обработка ввода отключена, чтобы избежать:
- Фонового шума
- Эхо от звука бота
- Аудио TTS обрабатывается как речь пользователя
Если пользователь прерывает ответ на середине ответа — например, чтобы уточнить что-то или вмешаться — его речь игнорируется полностью.
Попытка решения
Для поддержки полнодуплексных разговоров и вмешательства в разговор я попробовал:
- эхоподавление на основе WebRTC (AEC)
- обнаружение голосовой активности (VAD)
- Непрерывная обработка звука во время воспроизведения TTS
Проблемы с текущей попыткой полнодуплексного режима
Даже после значительной настройки мы сталкиваемся с двумя основными проблемами:
- Пропущенные Вмешательство
- Системе часто не удается обнаружить, когда пользователь говорит через звук бота.
- Ложное вмешательство
- Система часто инициирует вторжение сразу же после начала воспроизведения TTS, даже если пользователь молчит.
Что мы хотим понять
Мы изучаем, существует ли лучший подход со стороны самого Asterisk.
В частности:
- Можно ли реализовать полнодуплексную обработку/вмешательство более эффективно использовать функции диалплана Asterisk?
- Предоставляет ли Asterisk какую-либо встроенную поддержку прерываемого воспроизведения или дуплексной обработки звука с помощью AudioSocket?
- Существуют ли рекомендуемые архитектурные шаблоны для реализации надежного вмешательства с помощью Asterisk + AudioSocket + внешних систем STT/TTS?
- Были бы некоторые перемещения логика из Python в Asterisk помогает повысить стабильность обнаружения?
Мобильная версия