asterisk-voicekit-modules
asterisk-voicekit-modules copied to clipboard
не работает stt и не могу отдебажить
Чистый 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 приложил полный лог
./stt_streaming_recognize_interim_results.py с тем же ключом работает успешно.
Вот тут косяк в примере - исправим:
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]);
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
поставил 60 секунд и все равно Fail но уже понятно причина. есть способы решения её?
А пришлите новый лог пожалуйста - скорее всего, там уже приходят события с распознанным текстом.
У вас dialplan так написан так, что единственное условие выхода помимо ошибок - именно таймаут.
То есть WAITEVENTSTATUS == FAIL, WAITEVENTFAILREASON == TIMEOUT
- корректная ситуация: FAIL потому что WaitEvent()
не вернул событий, вышло указанноеп время ожидания. Это не разобрано в примерах, поэтому сбивает с толку - доработаем.
С POLL_ERROR
сложнее: возможно, какая-то системная ошибка, либо неправильно обработанный таймаут (если это так, поправим в коде модуля app_waitevent).
log_aster.txt вот лог, могу дать и доступн на машину напиши мне в телегу @agick
У вас dialplan так написан так, что единственное условие выхода помимо ошибок - именно таймаут.
по поводу dialplan я брал, ваш диалплан исключительно из примернов
-- 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
при такой именно схеме все работает, успешно и это получается вполне логично. неплохо было бы указать это в документации.
у меня получается была кривая инициализация модулей так выходит
при такой именно схеме все работает, успешно и это получается вполне логично. неплохо было бы указать это в документации.
Да. Я понял, что невнятная обработка ошибок сбивает с толку.
у меня получается была кривая инициализация модулей так выходит
В каком смысле? Вот этого не понял.
смотрите
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, если делаю код как показал, то все работает успешно и без нареканий.
НУ и не логично я сделал конфиг, сначала включив распознование в ожидании, а уже потом синтез речи.
спасибо за помощь, видите я хотел создать просто tutorial который, говорит берите готовый пример вставляете и работает, и не подумал как работает GRPCSTTBackground в какой момент он начинает "отправлять потоки на ваш сервер" . https://voicekit.tinkoff.ru/docs/stttutorial - впринципе все указанно и поясненно.
То есть моё мнение конфликт GRPCSTTBackground и PlayBackgroundInitGRPCTTS
Хм... Должно и так, и так работать. Похоже на баг(( Я, видимо, в понедельник смогу добраться. Было бы неплохо подебажить.
Хм... Должно и так, и так работать. Похоже на баг(( Я, видимо, в понедельник смогу добраться. Было бы неплохо подебажить.
машина тестовая, проблему я воиспрозивёл кучу раз. Могу предоставить доступ на машину если вам нужно это отловить. Так, что можете написать сюда или в телеграмм, и можем отдебажить если есть желание отловить эту проблему.
Получаю тот же результат "WAITEVENTSTATUS == FAIL; WAITEVENTFAILREASON == TIMEOUT"
- пробовал asterisk 13 и 16;
- пробовал как с синтезом речи так и без;
- пробовал разный порядок инициализации всего добра;
Получаю тот же результат "WAITEVENTSTATUS == FAIL; WAITEVENTFAILREASON == TIMEOUT"
- пробовал asterisk 13 и 16;
- пробовал как с синтезом речи так и без;
- пробовал разный порядок инициализации всего добра;
Картина проявилась:
поправил grpc_stt.cpp (строки 195, 224, 253)
изменил if (!warned) {
на if (!*warned) {
и стало понятно что дело кодеке