LINUX.ORG.RU

RHvoice


0

2

Пишу скрипт на Perl для озвучки с помощью RHvoice, смысл в том что на определенный адрес и порт приходит номер и фраза, скрипт разбивает на отдельные переменные номер и фразу, фразу он пересылает в RHvoice. Скрипт работает корректно, если ему передать параметры напрямую, через консоль, если передавать телнетом - выдает ошибку «segfault at 0 ip 00007fde77f76321 sp 00007fff4800be58 error 4 in libc-2.15.so». Фраза передается на порт 9988 через xinetd, запуск от рута.

#!/usr/bin/perl -CSDA
use strict;
use Sys::Syslog;
use Socket;
use Time::localtime;
use encoding 'utf8';
my $Message;


while (<STDIN>)
{
        $Message =$_;
#       $Message = utf8::encode($Message);
#       chomp ($Message);
        syslog('info', "$Message");
        my @str = split(';', $Message);
#       chomp($str[1]);
#       chomp($str[0]);
        $str[0] =~ s/[\r\n\a]*$//;
        $str[1]=~ s/[\r\n]*$//;
        print "$str[0]\n";
        print "$str[1]\n";
        my $pid = ` ps -ef | fgrep festival_ami.pl`;

        if(length($str[0]) && length($str[1]) > 0) {

        syslog('info', "tel:$str[0] - Message:$str[1] $pid ") ;
        } else {
        syslog('info', "error string is empty");
        }


#       ` cat  /usr/share/asterisk/agi-bin/text.txt  | RHVoice -o /usr/share/asterisk/agi-bin/'$str[0]'.wav`;
        system ("echo '$str[1]' | RHVoice > '$str[0]'.wav");
202.wav");
         `sox /usr/share/asterisk/agi-bin/$str[0].wav -r 8000 -c 1 /usr/share/asterisk/agi-bin/$str[0].gsm`;
         `rm $str[0].wav`;

У вас там выводится куча отладочных сообщний через syslog, по ним развер нельзя понять, где именно возникает ошибка или вобще ничего в syslog не выводится?

mky ★★★★★
()
Ответ на: комментарий от mky

ошибку определил «segfault at 0 ip 00007fde77f76321 sp 00007fff4800be58 error 4 in libc-2.15.so», RHvoice не создает wav файл, такое же поведение, RHvoice , было у меня когда я запускал скрипт, от свого юзера, если запустить от рута или sudo - все ок. Еще я понял, то что , если передать параметры через телнет , скрипт запускается не от рута, хотя права на нем рутовые

B_U_G
() автор топика
Ответ на: комментарий от B_U_G

Если считаете, что проблема с uid, дак сделайте, чтобы скрипт писал в лог от какого пользователя работает. Или сделайте в скрипте паузу и посмотрите его атрибуты через ″ps″.

скрипт запускается не от рута, хотя права на нем рутовые

Права на скрипт? То, от какого пользователя запускается процесс из-под xinetd определяется в файле конфигурации, директива ″user″.

mky ★★★★★
()
Ответ на: комментарий от mky

Не правильно выразился ,директива ″user″ = root, ps - root, но как мне кажется сам скрипт запускает программу RHvoice, не из root

B_U_G
() автор топика
Ответ на: комментарий от mike666

уже как пару дней пытался зайти к ним на сайт (есть только кеш), но он лежит, видно проект умер

B_U_G
() автор топика
Ответ на: комментарий от B_U_G

репы updates подключены? старый libc же
давно уже 17 есть)))

ubuntuawp ★★
()
Ответ на: комментарий от B_U_G

Mail list живой. на гитхабе ( https://github.com/Olga-Yakovleva/RHVoice ) (в rewrite ветку), что-то падает потихоньку.

А сайта у них вроде и не было никогда (только если NVDA ?)

А умирать ему никак нельзя, лучший русскоязычный свободный (а может и вообще) синтезатор речи

mike666
()
Ответ на: комментарий от B_U_G

А в каком рабочем каталоге ваш скрипт пытается создавать файлы, когда запускается изпод xinetd? Или у вас там первый аргумент содержит не номер, а полный путь к файлу?

mky ★★★★★
()
Ответ на: комментарий от mike666

Совсем не по теме, но разработчик RHVoice — слепая девушка.

ValdikSS ★★★★★
()
Ответ на: комментарий от mky

пробовал в /home/user/ и в /usr/share/... , так же пробовал завести на ubuntu 13.10 с libc-2.17.so, та же ошибка, правда в лог apport.log пишет

ERROR: apport (pid 14060) Mon Oct 28 14:05:07 2013: called for pid 14059, signal 11, core limit 0
ERROR: apport (pid 14060) Mon Oct 28 14:05:07 2013: executable: /usr/local/bin/RHVoice (command line "/usr/local/bin/RHVoice")
ERROR: apport (pid 14060) Mon Oct 28 14:05:07 2013: executable does not belong to a package, ignoring 

B_U_G
() автор топика
Ответ на: комментарий от B_U_G

Сообщения, что пишет apport, это уже последствия падения, а не причина. Логично, что от версии libc ошибка не зависит, если скрипт работал из консоли, то должен и из xinetd, если бы в libc был бы такой баг, различающий запуск из консоли и xinetd, его давно бы вычислили. Больше похоже на баг в RHVoice.

Упростите скрипт до однострочника, чтобы он просто вызывал RHVoice с заданной в скрипте тестовой строкой и с выводом в файл с полным путём (/tmp/test.wav). И пробуйте запустить этот скрипт через xinetd. Ещё попобробуйте запускать RHVoice в скрипте с перенаправлением stderr в /dev/null. Если не поможет, запускайте через strace c выводом в файл и сравнивайте эти файлы трассировки.

mky ★★★★★
()
Последнее исправление: mky (всего исправлений: 1)
Ответ на: комментарий от mky

Упростил скрипт , как вы и говорили , также в скрипте, пробовал запустить совместно с strace, strace отрабатывает , если запускать из консоли, если с помощью xinetd, в лог файл ничего не пишет, возможно подскажите еще какие-нибудь средство для дебага? Так же пробовал скрипт на баше - эффект тот же.

B_U_G
() автор топика
Ответ на: комментарий от B_U_G

Как именно упростили скрипт?

В принципе, можно запустить strace на уже работающий xinetd (опция -p), с трассировкой fork-процессов (-f) и записью каждого трейса в отдельный файл (опции -ff -o имя_файла), потом найти среди этих файлов трейс RHVoice. Только перед запуском strace -ff создать пустой каталог и перейти в него, чтобы все трейс-файлы были в одной куче.

mky ★★★★★
()
Ответ на: комментарий от mky

упростил до такого вида

#!/usr/bin/perl -CSDA
use strict;
use Sys::Syslog;
use Socket;
use Time::localtime;
use encoding 'utf8';

system ("echo 'тест тест' | /usr/local/bin/RHVoice > test.wav"); 
также пробовал создать пустую вавку через функцию system и таким образом
 `/usr/local/bin/RHVoice > test.wav`;
спасибо , попробую через xinetd

B_U_G
() автор топика
Ответ на: комментарий от B_U_G

Скрип должен быть примерно таким:

system ("echo 'тест тест' | strace -f -o /tmp/trace-RHVoice /usr/local/bin/RHVoice > /tmp/test.wav");

сначала запускаете его из консоли, проверяете, что файлы в /tmp создались, и что wave-файл правильный, что trace-файл содержит кучу текста. Переименовывает эти файлы, вызываете скрипт через xinetd, сравниваете новые файлы и переименованные (полученные ранее при запуске скрипта из консоли).

mky ★★★★★
()
Ответ на: комментарий от B_U_G

пробовал сравнить diff - так и не разобрался где именно падает RHVoice

B_U_G
() автор топика
Ответ на: комментарий от B_U_G

strace ясность не внёс :-( Причём, я не совсем понял, он и при запуске из консоли ничего в wav не записал, что-ли? Я не вижу сисколов чтения stdin и записи в stdout.

Ну попробуйте запустить RHVoice из под xinetd с теми же переменными среды, что и в консоли. Сначала в консоли сделайте:

export > /tmp/test-env-vars

А из perl-скрипта делайте:

system (". /tmp/test-env-vars; echo 'тест тест' | /usr/local/bin/RHVoice > test.wav");

P.S. Какая версия RHVoice или откуда взяли?

mky ★★★★★
()
Ответ на: комментарий от mky

strace через xinetd strace через консоль

первый раз не верную информацию скинул, начудил немного с озвучкой, в этот раз wav файлик создался с озвучкой, версию брал с гитхаба 0.3 , так же пробовал ставить 0.4 альфа, но она еще не рабочая

B_U_G
() автор топика
Ответ на: комментарий от B_U_G
15:32:10.481436   getenv("HOME")                 = NULL <0.000016>
15:32:10.481478   _ZNSs6assignEPKc(0x607be8, 0, 4, 72, 0x7fff01f60238 <unfinished ...>
15:32:10.481562 --- SIGSEGV (Segmentation fault) ---
15:32:10.481873 +++ killed by SIGSEGV +++


В main.cpp из RHVoice

     daemon_dir = getenv("HOME");
     if (daemon_dir[daemon_dir.length()-1] != '/')
       daemon_dir += '/';
     daemon_dir += ".rhvoice/";

установи нужное значение HOME через атрибут 'env' в xinetd.conf.

ABW ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.