Tinkoff / asterisk-voicekit-modules

Non-blocking Asterisk modules for accessing VoiceKit services for speech recognition and speech synthesis.
35 stars 16 forks source link

не работает stt и не могу отдебажить #6

Open agicblack opened 3 years ago

agicblack commented 3 years ago

Чистый asterisk 18, для примера взял ваш конфиг

extensions.ael

WaitEventInit(); // Initialize event queue GRPCSTTBackground(); // Initialize background recognition PlayBackgroundInitGRPCTTS(); PlayBackground(say,,{"text":"глаголь кожанный мешок, я буду понимать что ты говоришь "}); Set(CALL_END_TIME=$[${GET_TIME_NSEC(MONOTONIC)} + 10]); // Set end time to a minute after now Set(SLEEP_TIME=$[${CALL_END_TIME} - ${GET_TIME_NSEC(MONOTONIC)}]); // Calculate maximum wait time while (${SLEEP_TIME} > 0) { // While not timed out yet WaitEvent(${SLEEP_TIME}); // Wait until next event or timeout if (${WAITEVENTSTATUS} == SUCCESS) { Set(CurrentUTCTime=${GET_TIME_NSEC(UTC)}); Set(CurrentUTCTimeString=${STRFTIME(${CurrentUTCTime},GMT,%FT%T)}.${CurrentUTCTime:-9:}); switch (${WAITEVENTNAME}) { case GRPCSTT_X_REQUEST_ID: Log(NOTICE,[${CurrentUTCTimeString}] x-request-id = ${WAITEVENTBODY}); break; case GRPCSTT_UTF8: Log(NOTICE,[${CurrentUTCTimeString}] Phrase(UTF-8 encoded) = ${WAITEVENTBODY}); break; default: } } else { Log(NOTICE,WaitEvent() WAITEVENTSTATUS == ${WAITEVENTSTATUS}; ${WAITEVENTBODY}); } Set(SLEEP_TIME=$[${CALL_END_TIME} - ${GET_TIME_NSEC(MONOTONIC)}]); // Update maximum wait time } Hangup();

tts - успешно работает никакоих нарекаий нет, но при stt

Executing [sw_3_GRPCSTT_X_REQUEST_ID@office:10] Log("PJSIP/7705-00000022", "NOTICE,[2021-02-04T15:05:20.028031482] x-request-id = e86becab-a380-4345-9a5b-9089d9196a9b") in new stack Executing [sw_3_GRPCSTT_X_REQUEST_ID@office:10] Log("PJSIP/7705-00000022", "NOTICE,[2021-02-04T15:05:20.028031482] x-request-id = e86becab-a380-4345-9a5b-9089d9196a9b") in new stack

-- Executing [44459@office:18] Log("PJSIP/7705-00000022", "NOTICE,WaitEvent() WAITEVENTSTATUS == FAIL; ") in new stack [Feb 4 18:05:29] NOTICE[20723][C-00000023]: Ext. 44459:18 @ office: WaitEvent() WAITEVENTSTATUS == FAIL; log_aster.txt приложил полный лог

agicblack commented 3 years ago

./stt_streaming_recognize_interim_results.py с тем же ключом работает успешно.

g-e-okopnik commented 3 years ago

Вот тут косяк в примере - исправим: Log(NOTICE,WaitEvent() WAITEVENTSTATUS == ${WAITEVENTSTATUS}; ${WAITEVENTBODY}); Должно быть так: Log(NOTICE,WaitEvent() WAITEVENTSTATUS == ${WAITEVENTSTATUS}; ${WAITEVENTFAILREASON});

Но, вероятно, там причина статуса FAIL - таймаут, т. к. ограничение по времени задано в 10 секунд: Set(CALL_END_TIME=$[${GET_TIME_NSEC(MONOTONIC)} + 10]); Поставьте пожалуйста 60 секунд для наглядности Set(CALL_END_TIME=$[${GET_TIME_NSEC(MONOTONIC)} + 60]);

agicblack commented 3 years ago

Answer(); Playback(you-entered); WaitEventInit(); // Initialize event queue GRPCSTTBackground(); // Initialize background recognition PlayBackgroundInitGRPCTTS(); PlayBackground(say,,{"text":"глаголь кожанный мешок, я буду понимать что ты говоришь "}); Set(CALL_END_TIME=$[${GET_TIME_NSEC(MONOTONIC)} + 60]); // Set end time to a minute after now Set(SLEEP_TIME=$[${CALL_END_TIME} - ${GET_TIME_NSEC(MONOTONIC)}]); // Calculate maximum wait time while (${SLEEP_TIME} > 0) { // While not timed out yet WaitEvent(${SLEEP_TIME}); // Wait until next event or timeout if (${WAITEVENTSTATUS} == SUCCESS) { Set(CurrentUTCTime=${GET_TIME_NSEC(UTC)}); Set(CurrentUTCTimeString=${STRFTIME(${CurrentUTCTime},GMT,%FT%T)}.${CurrentUTCTime:-9:}); switch (${WAITEVENTNAME}) { case GRPCSTT_X_REQUEST_ID: Log(NOTICE,[${CurrentUTCTimeString}] x-request-id = ${WAITEVENTBODY}); break; case GRPCSTT_UTF8: Log(NOTICE,[${CurrentUTCTimeString}] Phrase(UTF-8 encoded) = ${WAITEVENTBODY}); break; default: } } else { //Log(NOTICE,WaitEvent() WAITEVENTSTATUS == ${WAITEVENTSTATUS}; ${WAITEVENTBODY}); Log(NOTICE,WaitEvent() WAITEVENTSTATUS == ${WAITEVENTSTATUS}; ${WAITEVENTFAILREASON}); } Set(SLEEP_TIME=$[${CALL_END_TIME} - ${GET_TIME_NSEC(MONOTONIC)}]); // Update maximum wait time } Hangup(); }

-- Executing [44459@office:18] Log("PJSIP/7705-00000028", "NOTICE,WaitEvent() WAITEVENTSTATUS == FAIL; TIMEOUT") in new stack

or -- Executing [44459@office:18] Log("PJSIP/7705-00000026", "NOTICE,WaitEvent() WAITEVENTSTATUS == FAIL; POLL_ERROR") in new stack

agicblack commented 3 years ago

поставил 60 секунд и все равно Fail но уже понятно причина. есть способы решения её?

g-e-okopnik commented 3 years ago

А пришлите новый лог пожалуйста - скорее всего, там уже приходят события с распознанным текстом. У вас dialplan так написан так, что единственное условие выхода помимо ошибок - именно таймаут. То есть WAITEVENTSTATUS == FAIL, WAITEVENTFAILREASON == TIMEOUT - корректная ситуация: FAIL потому что WaitEvent() не вернул событий, вышло указанноеп время ожидания. Это не разобрано в примерах, поэтому сбивает с толку - доработаем. С POLL_ERROR сложнее: возможно, какая-то системная ошибка, либо неправильно обработанный таймаут (если это так, поправим в коде модуля app_waitevent).

agicblack commented 3 years ago

log_aster.txt вот лог, могу дать и доступн на машину напиши мне в телегу @agick

agicblack commented 3 years ago

У вас dialplan так написан так, что единственное условие выхода помимо ошибок - именно таймаут.

по поводу dialplan я брал, ваш диалплан исключительно из примернов

agicblack commented 3 years ago
-- Executing [sw_3_GRPCSTT_UTF8@office:10] Log("PJSIP/7705-0000002e", "NOTICE,[2021-02-05T11:08:42.932871210] Phrase(UTF-8 encoded) = {"alternatives":[{"transcript":"двадцать","confidence":-5.4963388442993164}],"is_final":true,"stability":0.0,"start_time":{"seconds":22.0,"nanos":890000000.0},"end_time":{"seconds":23.0,"nanos":550000000.0}}") in new stack

[Feb 5 14:08:42] NOTICE[24266][C-0000002f]: Ext. sw_3_GRPCSTT_UTF8:10 @ office: [2021-02-05T11:08:42.932871210] Phrase(UTF-8 encoded) = {"alternatives":[{"transcript":"двадцать","confidence":-5.4963388442993164}],"is_final":true,"stability":0.0,"start_time":{"seconds":22.0,"nanos":890000000.0},"end_time":{"seconds":23.0,"nanos":550000000.0}}

заработало с текущим дипланом, но есть одно но

PlayBackgroundInitGRPCTTS(); PlayBackground(say,,{"text":"глаголь кожанный мешок, я буду понимать что ты говоришь "}); GRPCSTTBackground(); // Initialize background recognition WaitEventInit(); // Initialize event queue

при такой именно схеме все работает, успешно и это получается вполне логично. неплохо было бы указать это в документации.

agicblack commented 3 years ago

у меня получается была кривая инициализация модулей так выходит

g-e-okopnik commented 3 years ago

при такой именно схеме все работает, успешно и это получается вполне логично. неплохо было бы указать это в документации.

Да. Я понял, что невнятная обработка ошибок сбивает с толку.

у меня получается была кривая инициализация модулей так выходит

В каком смысле? Вот этого не понял.

agicblack commented 3 years ago

смотрите

Answer();
Playback(you-entered);
WaitEventInit(); // Initialize event queue
GRPCSTTBackground(); // Initialize background recognition
PlayBackgroundInitGRPCTTS();
PlayBackground(say,,{"text":"глаголь кожанный мешок, я буду понимать что ты говоришь "});

при таком конфиге не работало.

сделал так:

Answer();

Playback(you-entered);
WaitEventInit(); // Initialize event queue
PlayBackgroundInitGRPCTTS();
PlayBackground(say,,{"text":"глаголь кожанный мешок, я буду понимать что ты говоришь "});

GRPCSTTBackground(); // Initialize background recognition

сделал так заработало.

Но важный момент, смотрите при 1 версии конфига, если я говорить начинаю в трубку сразу как начинается синтез, распознование идет, если после фразы синтеза падает с POLL_ERROR, если делаю код как показал, то все работает успешно и без нареканий.

НУ и не логично я сделал конфиг, сначала включив распознование в ожидании, а уже потом синтез речи.

agicblack commented 3 years ago

спасибо за помощь, видите я хотел создать просто tutorial который, говорит берите готовый пример вставляете и работает, и не подумал как работает GRPCSTTBackground в какой момент он начинает "отправлять потоки на ваш сервер" . https://voicekit.tinkoff.ru/docs/stttutorial - впринципе все указанно и поясненно.

То есть моё мнение конфликт GRPCSTTBackground и PlayBackgroundInitGRPCTTS

g-e-okopnik commented 3 years ago

Хм... Должно и так, и так работать. Похоже на баг(( Я, видимо, в понедельник смогу добраться. Было бы неплохо подебажить.

agicblack commented 3 years ago

Хм... Должно и так, и так работать. Похоже на баг(( Я, видимо, в понедельник смогу добраться. Было бы неплохо подебажить.

машина тестовая, проблему я воиспрозивёл кучу раз. Могу предоставить доступ на машину если вам нужно это отловить. Так, что можете написать сюда или в телеграмм, и можем отдебажить если есть желание отловить эту проблему.

oobrun commented 3 years ago

Получаю тот же результат "WAITEVENTSTATUS == FAIL; WAITEVENTFAILREASON == TIMEOUT"

log

oobrun commented 3 years ago

Получаю тот же результат "WAITEVENTSTATUS == FAIL; WAITEVENTFAILREASON == TIMEOUT"

  • пробовал asterisk 13 и 16;
  • пробовал как с синтезом речи так и без;
  • пробовал разный порядок инициализации всего добра;

log

Картина проявилась: поправил grpc_stt.cpp (строки 195, 224, 253) изменил if (!warned) { на if (!*warned) { и стало понятно что дело кодеке