Учим Majordomo говорить по телефону Asterisk

Модераторы: Bagir, Ivan, Vit, immortal, PAV

Ответить
PAV
Сообщения: 838
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 46 раз
Поблагодарили: 64 раза

Учим Majordomo говорить по телефону Asterisk

Сообщение PAV » Пн апр 09, 2018 10:36 am

У кого стоит сервер Asterisk, можно научить Алису проговаривать не только в колонки, но и звонить по нужным номерам и проговаривать все по телефону.

Смысл следующий:
Asterisk исполняет свои скрипты, которые находятся в папке /var/spool/asterisk/outgoing (т.е. звонит, согласно инструкции в файле).
Скрипт создает файл, который обрабатывает Asterisk.
Профит.

Создаем скрипт в МЖД

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

$calltmp = "/var/spool/asterisk/tmp/mjd";
$calldir = "/var/spool/asterisk/outgoing/mjd";
$callnumber = "SIP/200"; //Указываем внутренний на который звонить. Или внешний через донгл: Dongle/dongle0/holdother:0505555555
$dirmessage = "/var/www/cached/voice/";
$message = (md5("hello"); // тут, что нужно говорить или переменную - Алиса когда что-то говорит, преобразует текст в звуковой файл и обзывает его, как хеш md5, плюс добавляет _yandex  (если движок яндекса), сохраняет в /var/www/cached/voice/ и его можно оттуда достат
$message2 = ("_yandex"); // это, если движок яндекса, он вставляет после md5
$callfile = fopen ($calltmp, "w");
fwrite ($callfile,"Channel: $callnumber\n");
fwrite ($callfile,"Callerid: 299\n");
fwrite ($callfile,"MaxRetries: 2\n");
fwrite ($callfile,"RetryTime: 60\n");
fwrite ($callfile,"WaitTime: 60\n");
fwrite ($callfile,"Context: majordomo\n");
fwrite ($callfile,"Extension: s\n");
fwrite ($callfile,"Priority: 1\n");
fwrite ($callfile,"Set: playfile=$dirmessage$message$message2\n");
fwrite ($callfile,"Archive: Yes\n");
fclose($callfile);
copy ($calltmp,$calldir);
В Asterisk в extensions добавляем раздел

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

[majordomo]
exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n,Playback(${playfile})
exten => s,n,hangup
Теперь говорим Алисе сказать что-то (скажи hello) если шаблон настроен. Она должна сформировать звуковой файл в папке "/var/www/cached/voice/";
После этого выполняется скрипт, который создали ранее и Алиса звонит на указанный телефон и произносит, что нужно.
За это сообщение автора PAV поблагодарили (всего 2):
directman66 (Пн апр 09, 2018 10:50 am) • odinvolk (Пн апр 09, 2018 5:13 pm)
Рейтинг: 3.7%
Aven
Сообщения: 215
Зарегистрирован: Сб мар 12, 2016 6:33 pm
Откуда: Ухта, Россия
Благодарил (а): 0
Поблагодарили: 24 раза

Re: Учим Majordomo говорить по телефону Asterisk

Сообщение Aven » Пн апр 09, 2018 1:00 pm

Не нужно использовать call-файлы, это ортодоксальный метод, есть же AMI, он работает по сети.
PAV
Сообщения: 838
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 46 раз
Поблагодарили: 64 раза

Re: Учим Majordomo говорить по телефону Asterisk

Сообщение PAV » Пн апр 09, 2018 2:23 pm

Aven писал(а):
Пн апр 09, 2018 1:00 pm
Не нужно использовать call-файлы, это ортодоксальный метод, есть же AMI, он работает по сети.
Да какие проблемы, напиши по шагам как.
Aven
Сообщения: 215
Зарегистрирован: Сб мар 12, 2016 6:33 pm
Откуда: Ухта, Россия
Благодарил (а): 0
Поблагодарили: 24 раза

Re: Учим Majordomo говорить по телефону Asterisk

Сообщение Aven » Пн апр 09, 2018 6:37 pm

PAV писал(а):
Пн апр 09, 2018 2:23 pm
Aven писал(а):
Пн апр 09, 2018 1:00 pm
Не нужно использовать call-файлы, это ортодоксальный метод, есть же AMI, он работает по сети.
Да какие проблемы, напиши по шагам как.
Да какие проблемы, раз вас в гугле забанили:
https://habrahabr.ru/company/southbridge/blog/161521/
PAV
Сообщения: 838
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 46 раз
Поблагодарили: 64 раза

Re: Учим Majordomo говорить по телефону Asterisk

Сообщение PAV » Вт апр 10, 2018 12:21 am

Да не забанили. Просто объясняешь вам объясняешь, а все об стенку горох.
Нашли решение - поделитесь, желательно по шагам, подробно.
И избавляйтесь от глупой привычки посылать в гугл, авторитета вам это не придает, а раздражает безмерно.
Если такой знаток, создайте модуль и избавьте остальных от необходимости идти по вашим стопам и тратить свое время, все будут благодарны.
Открою вам секрет, тут в основном не программисты, а энтузиасты.
За это сообщение автора PAV поблагодарил:
Smart111 (Пт апр 13, 2018 7:13 pm)
Рейтинг: 1.85%
PAV
Сообщения: 838
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 46 раз
Поблагодарили: 64 раза

Re: Учим Majordomo говорить по телефону Asterisk

Сообщение PAV » Пт апр 13, 2018 1:13 pm

Ой, крутяк получился ;) Мне очень нравится. Алиса теперь всех по телефону задалбливает ;)
Выкладываю код для понимания. - Утреннее приветствие.
По сути, все что до этого Алиса говорила в колонку, теперь пофайлово объединяет в один звуковой файл alicesay.mp3 и проигрывает по телефону.
Я не программист, поэтому за код не пинайте. Если можно как-то упростить, сделать покрасивше - буду только рад.

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

$calltmp = "/var/spool/asterisk/tmp/alicesay";
$calldir = "/var/spool/asterisk/outgoing/alicesay";
$callnumber = "SIP/6"; //Указываем внутренний на который звонить. Или внешний через донгл: Dongle/dongle0/holdother:0505555555
$dirmessage = "/var/www/mjd/cached/voice/";
$message = ("alicesay");
$mesend = ("_yandex");
$message1=("");
$message2=("");
$message3=("");
$message4=("");
$message5=("");
$message6=("");
$message7=("");
$message8=("");
$message9=("");
$message10=("");


say("Доброе утро ",1);
$message1 = (md5("Доброе утро "). $mesend);

say("сегодня. ". gg("ThisComputer.Day")." .". gg("ThisComputer.DateDAlt")." .".gg("ThisComputer.MonthAlt"),1);
$message2 = (md5("сегодня. ". gg("ThisComputer.Day")." .". gg("ThisComputer.DateDAlt")." .".gg("ThisComputer.MonthAlt")). $mesend);

say("Московское время. ". (int)date('G',time()). ".часов". ".". chti((int)date('i',time()),'минута','минуты','минут'),1);
$message3 = (md5("Московское время. ". (int)date('G',time()). ".часов". ".". chti((int)date('i',time()),'минута','минуты','минут')). $mesend);


//---------------------------------------------------Погода------------------
    $status="";
    $status.="На улице ".gg("Moscow.Type").".";
    say($status,1);
	$message4 = (md5($status). $mesend);
  
$status="";

    $w=round(gg("sensorTemp63.temp"));

if ($w < 0){
 $tempw=($w*-1);
}else{
    $tempw=$w;
}
    if($tempw >= 11 and $tempw <= 14){
    $tempcels=" градусов ";
    }else{

    while ($tempw > 9){
    $tempw=$tempw-10;
	}
	if(($tempw == 0) or ($tempw >= 5 and $tempw <= 9)){
	$tempcels= градусов ; }
	if($tempw == 1){
	$tempcels= градус ; }
	if(($tempw >= 2) and ($tempw <= 4)){
	$tempcels= градуса ; }
	}

	    //$tNew = abs((float)getGlobal('Moscow.Temp'));
    $status.=' Температура '.getGlobal('sensorTemp63.temp')." ".$tempcels." цельсия";
    say($status,1);
	$message5 = (md5($status). $mesend);
    $tempw="";
    $tempcels="";
  
    $status="";
    $w=round(gg("Moscow.Temp"));
if ($w < 0){
 $tempw=($w*-1);
}else{
    $tempw=$w;
}
    if($tempw >= 11 and $tempw <= 14){
    $tempcels=" градусов ";
    }
    else{

    while ($tempw > 9){
    $tempw=$tempw-10;
	}
	
	if(($tempw == 0) or ($tempw >= 5 and $tempw <= 9)){
	$tempcels= градусов ; }
	if($tempw == 1){
	$tempcels= градус ; }
	if(($tempw >= 2) and ($tempw <= 4)){
	$tempcels= градуса ; }
	}
	    //$tNew = abs((float)getGlobal('Moscow.Temp'));
    $status.=' По прогнозу '.getGlobal('Moscow.Temp')." ".$tempcels." цельсия";
    say($status,1);
	$message6 = (md5($status). $mesend);
    $tempw="";
    $tempcels="";
    
    $status="";  
    $h=round(gg("Moscow.Humidity"));
    $tempw=$h;
    if($tempw >= 11 and $tempw <= 14){
    $tempcels=" процентов ";
    }
    else{

    while ($tempw > 9){
    $tempw=$tempw-10;
	}
	
	if(($tempw == 0) or (($tempw >= 5) and ($tempw <= 9))){
	$tempcels= процентов ; }
	if($tempw == 1){
	$tempcels= процент ; }
	if(($tempw >= 2) and ($tempw <= 4)){
	$tempcels= процента ; }
	}
    $status.="Относительная влажность ".gg("Moscow.Humidity")." ".$tempcels. ".";
    say($status,1);
	$message7 = (md5($status). $mesend);
    $tempw="";
    $tempcels="";
    
    $status="";
    $pressure=(float)gg("Moscow.Pressure");
    if ($pressure<746) {
     $status.=' Атмосферное давление пониженное';
    } elseif ($pressure>750) {
     $status.=' Атмосферное давление повышенное.';
    } else {
     $status.=' Атмосферное давление нормальное.';
    }
    say($status,1);
	$message8 = (md5($status). $mesend);
    
    $status="";
    // ветер
    $WindSpeed=(float)gg("Moscow.WindSpeed");
    if ($WindSpeed<1) {
     $status.=' Ветра нет.';
    } elseif ($WindSpeed<3) {
     $status.=' Ветер слабый.';
    } elseif ($WindSpeed<6) {
     $status.=' Ветер сильный.';
    } elseif ($WindSpeed<9) {
     $status.=' Ветер очень сильный.';
    } else {
     $status.=' Ветер очень! Очень сильный.';
    }
    $status.=' Направление '.getGlobal('Moscow.WindDir').'.';
    say($status,1);
	$message9 = (md5($status). $mesend);
    
    if (gg("Moscow.Rain") > 0){
    say("Внимание, обещают дождь, не забудьте зонтик");
	$message10 = (md5("Внимание, обещают дождь, не забудьте зонтик"). $mesend);
    }
      

//---------------------------------------------------------------------------





$asterisk=exec("sudo cat $dirmessage$message1.mp3 $dirmessage$message2.mp3 $dirmessage$message3.mp3 $dirmessage$message4.mp3 $dirmessage$message5.mp3> $dirmessage$message6.mp3 $dirmessage$message7.mp3 $dirmessage$message8.mp3 $dirmessage$message9.mp3 $dirmessage$message10.mp3 $dirmessage$message11.mp3 > $dirmessage$message.mp3");

$callfile = fopen ($calltmp, "w");
fwrite ($callfile,"Channel: $callnumber\n");
fwrite ($callfile,"Callerid: 299\n");
fwrite ($callfile,"MaxRetries: 2\n");
fwrite ($callfile,"RetryTime: 60\n");
fwrite ($callfile,"WaitTime: 60\n");
fwrite ($callfile,"Context: majordomo\n");
fwrite ($callfile,"Extension: s\n");
fwrite ($callfile,"Priority: 1\n");
fwrite ($callfile,"Set: playfile=$dirmessage$message\n");
fwrite ($callfile,"Archive: Yes\n");
fclose($callfile);
copy ($calltmp,$calldir);



function chti($string, $ch1, $ch2, $ch3){
$ff=Array('0','1','2','3','4','5','6','7','8','9');
if(substr($string,-2, 1)==1 AND strlen($string)>1) $ry=array("0 $ch3","1 $ch3","2 $ch3","3 $ch3" ,"4 $ch3","5 $ch3","6 $ch3","7 $ch3","8 $ch3","9 $ch3");
else $ry=array("0 $ch3","1 $ch1","2 $ch2","3 $ch2","4 $ch2","5 $ch3"," 6 $ch3","7 $ch3","8 $ch3"," 9 $ch3");
$string1=substr($string,0,-1).str_replace($ff, $ry, substr($string,-1,1));
return $string1;
}
Aven
Сообщения: 215
Зарегистрирован: Сб мар 12, 2016 6:33 pm
Откуда: Ухта, Россия
Благодарил (а): 0
Поблагодарили: 24 раза

Re: Учим Majordomo говорить по телефону Asterisk

Сообщение Aven » Пт апр 13, 2018 4:01 pm

будем пинать, использование call-файлов зло :)
PAV
Сообщения: 838
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 46 раз
Поблагодарили: 64 раза

Re: Учим Majordomo говорить по телефону Asterisk

Сообщение PAV » Вс апр 15, 2018 5:50 pm

Ты не мудри, ты пальцем покажи. Как сделать тоже самое, но правильно?
Ответить