Страница 1 из 1

Не выполняется python-скрипт - File does not exist

Добавлено: 07 авг 2023, 17:08
epigraphe
Доброго дня.
Пытаюсь запустить озвучку текста.

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

[hello]
exten = s,1,Answer()
same = n,Wait(1)
same = n,Set(RHV_FILE=${CALLERID(num)}_${EPOCH})
same = n,Set(RHV_TEXT=Компания приветствует Вас, ${CALLERID(Name)})
same = n,AGI(/home/asterisk/speech/Robovoice.py ${RHV_FILE} ${RHV_TEXT})
same = n,Playback(/var/lib/asterisk/sounds/ru/rhv_playback/${RHV_FILE}&silence/1)
same = n,System(rm -f /var/lib/asterisk/sounds/ru/rhv_playback/${RHV_FILE}.wav)
same = n,System(rm -f /var/lib/asterisk/sounds/ru/rhv_playback/${RHV_FILE}_t.wav)
exten = s,n,Return
Пытаюсь поставить AGI или EAGI - получаю ошибку:

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

Executing [dest-2@customdests:1] NoOp("SIP/9999-00000012", "Entering Custom Destination Greetings by Name") in new stack
    -- Executing [dest-2@customdests:2] Gosub("SIP/9999-00000012", "hello,s,1()") in new stack
    -- Executing [s@civility-hi:1] Answer("SIP/9999-00000012", "") in new stack
    -- Executing [s@civility-hi:2] Wait("SIP/9999-00000012", "1") in new stack
    -- Executing [s@civility-hi:3] Set("SIP/9999-00000012", "RHV_FILE=9999_1691415275") in new stack
    -- Executing [s@civility-hi:4] Set("SIP/1514-00000014", "RHV_TEXT="Компания приветствует Вас, Иван Иванов"") in new stack
    -- Executing [s@civility-hi:5] AGI("SIP/1514-00000014", "/home/asterisk/speech/Robovoice.py 9999_1691415533 "Компания приветствует Вас, Иван Иванов"") in new stack
[2023-08-07 16:38:53] WARNING[23382][C-00000015]: res_agi.c:2218 launch_script: Failed to execute '/home/asterisk/speech/Robovoice.py 9999_1691415533 Компания приветствует Вас, Иван Иванов': File does not exist.
    -- Executing [s@civility-hi:6] Playback("SIP/1514-00000014", "/var/lib/asterisk/sounds/ru/rhv_playback/1514_1691415533&silence/1") in new stack
[2023-08-07 16:34:35] WARNING[22369][C-00000013]: file.c:824 ast_openstream_full: File /var/lib/asterisk/sounds/ru/rhv_playback/9999_1691415275 does not exist in any format
[2023-08-07 16:34:35] WARNING[22369][C-00000013]: file.c:1303 ast_streamfile: Unable to open /var/lib/asterisk/sounds/ru/rhv_playback/9999_1691415275 (format (ulaw)): No such file or directory
[2023-08-07 16:34:35] WARNING[22369][C-00000013]: app_playback.c:512 playback_exec: Playback failed on SIP/1514-00000012 for /var/lib/asterisk/sounds/ru/rhv_playback/9999_1691415275&silence/1
То есть он не может создать файл и соответственно, проиграть его.
Если я просто в командной строке выполняю /home/asterisk/speech/Robovoice.py 9999_1691415533 Компания приветствует Вас, Иван Иванов - скрипт срабатывает, но берет только слово компания
То есть, чтобы записать всю фразу, запрос должен выглядеть так: /home/asterisk/speech/Robovoice.py 9999_1691415533 "Компания приветствует Вас, Иван Иванов"

Сам скрипт в каталоге есть:
[root@freepbx speech]# ls -la
total 8
drwxr-xr-x 2 755 asterisk 26 Aug 7 15:57 .
drwxr-xr-x. 16 asterisk asterisk 4096 Aug 7 15:56 ..
-rwxrwxr-x 1 asterisk asterisk 591 Aug 7 15:54 Robovoice.py

Если запускаю его руками - все отрабатывает.

Если запускаю, как пишется в логе ('/home/asterisk/speech/Robovoice.py 1514_1691416909 Компания приветствует Вас, Иван Иванов':), с апострофами, ожидаемо получаю No such file or directory

Подскажите, пожалуйста, как решить этот вопрос?

Re: Не выполняется python-скрипт - File does not exist

Добавлено: 07 авг 2023, 18:32
ded
Не надо ложить скрипты где вам вздумалось.
Или, не надо ложить на содержимое файла /etc/asterisk/asterisk.conf
с пробором, или без.

Re: Не выполняется python-скрипт - File does not exist

Добавлено: 07 авг 2023, 19:55
epigraphe
Если Вы имеете в виду agi-bin, то с ним ситуация абсолютно аналогичная и результат такой же.
Я наткнулся на просторах на историю одного товарища, у него была проблема как раз с этой папкой, там права как-то сами назначались.
Изначально все скрипты были там, этот я попробовал вытащить только для теста, подумал - может глюк какой.
Я пробовал и из agi-bin, и из-под su -asterisk просто этот скрипт запускать - все работает, если просто запускать.
И ни в какую не хочет из астериска. Я грешу на апострофы и кавычки, но не знаю как должно быть в оригинале и не знаю как их правильно в астериск передать.
Я пробовал закрывать слэшами \", пробовал выносить переменную в general и писать вида ${WELCOME}${CallerID(Name)} - результат все время одинаковый.
Поэтому и пишу сюда, потому что уже не знаю что еще можно проверить(

У меня есть и другие скрипты, например такой:

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

System(/var/lib/asterisk/agi-bin/AD_Reset_Password.py ${CALLERID(num)})
Он работает, лежит рядом с robovoice, но в нем нет кавычек и передается в него только номер, цельным значением. А затык у меня с тем, где есть текст.

Re: Не выполняется python-скрипт - File does not exist

Добавлено: 07 авг 2023, 20:39
epigraphe
Я понимаю, что второй скрипт запускается как System, но первый из-под System отрабатывает, и никакого результата. Поэтому и пытаюсь перевести на AGI

Re: Не выполняется python-скрипт - File does not exist

Добавлено: 08 авг 2023, 01:01
ded
Не стоит из под System запускать.
http://asterisk.ru/knowledgebase/Asterisk+AGI
В дежурной директории /var/lib/asterisk/agi-bin лежит куча скриптов, большей частью, конечно на РНР, но есть и Perl.
Озвучка текста - попробуйте Festival, установите базовые библиотеки для вашей ОС и используйте встроенную функцию в Астериск.

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

exten => *2911,1,Festival(Привет, чудики!)
exten => *2911,n,Festival(Что за наваждение?)
exten => *2911,n,Set(SUMM=${FILE(/tmp/test.txt,4)})
exten => *2911,n,NoOp(test.txt is not ${SUMM})
exten => *2911,n,SayNumber(${SUMM})
exten => *2911,n,Festival(Change to English)
exten => *2911,n,Festival(I present you )
exten => *2911,n,Festival(text to speech machine)
Ну или такой AGI-скрипт - tts.agi

exten => same,n,EAGI(tts.agi)

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

#!/usr/bin/perl

use Asterisk::AGI;
use File::Basename;
require Data::UUID;

$AGI = new Asterisk::AGI;
my $ug = new Data::UUID;
my $timestamp = gmtime; 
my %input = $AGI->ReadParse();
my ($text)=@ARGV;
my $hash = $ug->create_str;
my $sounddir = "/var/lib/asterisk/sounds/tts";
my $wavefile = "$sounddir/"."tts-$hash.wav";
my $t2wp= "/usr/bin/";
  
unless (-f $wavefile) {
        open(fileOUT, ">$sounddir"."/say-text-$hash.txt");
        print fileOUT "$text";
        close(fileOUT);
        my $execf=$t2wp."flite $sounddir/say-text-$hash.txt -F 8000 -o $wavefile";
        system($execf);
        unlink($sounddir."/say-text-$hash.txt");
}

$AGI->stream_file('tts/'.basename($wavefile,".wav")); 
Осваивайте команды AGI
*CLI> agi show commands topic
... (много интересного)....
Например так -
*CLI> agi exec answer
Usage: agi exec <channel name> <app and arguments> [id]
Add AGI command to the execute queue of the specified channel in Async AGI
Чтобы понять, почему он не вызывается - включите
*CLI> agi set debug on