Asterisk D-link DPH-150S

Я ВСЕ СЛЫШУ!!!

Для мониторинга, что творится в квартире, сначала использовал простую web-камеру и программку WebCamPro.
На рабочем сервере сделал в конфиге Asterisk следующее:

exten => 300,1,SIPAddHeader(Call-Info: answer-after=0)
exten => 300,n,Dial(SIP/300@home,,tT)

на домашнем, естетсвенно, стоит такая настройка:

exten => _3XX,1,Dial(SIP/${EXTEN},,tT)

Звоним …. и ничего. Поначалу расстроился, что данного функционала в Dlink DPH-150S просто нет. Но потом перенес строку SIPAddHeader(Call-Info: answer-after=0) на домашний сервер и все прекрасно заработало. Точнее сделал вызов на конкретный номер, чтобы не пугать всех и вся 🙂

exten => _3XX,1,Dial(SIP/${EXTEN},,tT)
exten => 333,1,SIPAddHeader(Call-Info: answer-after=0)
exten => 333,n,Dial(SIP/300,,tT)

Стоит на работе позвонить на 333 — попадаю домой и слышу что там творится.

НАС УТРО ВСТРЕЧАЕТ ПРОХЛАДОЙ.

В один прекрасный день забыл зарядку на работе. Все бы ничего — но сотовый разрядился ночью и … проспал КОНКРЕТНО на работу (мои как раз на даче были).

Что ж — есть «маленький» помощник в лице астера.

Ставим по cron-у генерацию call-файла примерно такого содержания:

Channel: Local/333@good_morning
MaxRetries: 0
RetryTime: 600
WaitTime: 60
Context: good_morning1
Extension: s
Priority: 1
Archive: yes

а далее в диалплане:

[good_morning]
exten => 333,1,SIPAddHeader(Call-Info: answer-after=0)
exten => 333,n,Dial(SIP/300,,tT)

[good_morning1]
exten => s,1,Answer
exten => s,n,Playback(pora_na_rabotu)

Все. Работает. Ну, еще, поковырявшись в Google, нашел примеры информатора погоды и будильник не просто проговаривал приветствие, но и прогноз на текущий день.

ЧЕГО ЕЩЕ ЖЕЛАЕТЕ?

Будильник будильником, но… ХОЧЕТСЯ БОЛЬШЕГО.

Вспомнил, что когда-то на форумах видел интересный скрипт для распознавания речи и даже куда-то его копировал на всякий случай.
Нашел, подкорректировал немного под свои нужды (надеюсь что приведу его здесь без ошибок):

#!/usr/bin/perl
########################################################################
#
# $Id: google-voice-search.pl,v 1.1 2011-04-13 06:06:39 gosha Exp $
#
# Copyright (c) 2011 Okunev Igor <igor[at]prv.mts-nn.ru>
#
########################################################################

require LWP::UserAgent;

#my ( $file ) = @ARGV;

my ( $url, $use_converter );

my $lang=»ru»;
my $file=»/tmp/record.wav»;

unless ( $file ) {
die «Usage: $0 file.flac lang\n\twhere lang is ru or en\n»;
}

if ( lc($lang) eq ‘ru’ ) {
$url = «https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU»;
} else {
$url = «https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=en-US»;
}

#
# to FLAC
#
unless ( $file =~ /\.flac$/i ) {
system «ffmpeg -y -i $file $file.flac 2> /dev/null»;
if ( $? ) {
die «Can’t convert file $file to $file.flac: $?\n»;
} else {
$file .= ‘.flac’;
$use_converter = 1;
}
}
                                        
my $file_info = `file $file`;
if ( $file_info =~ /FLAC audio.*\s(\d+)\s*kHz/ ) {
$file_info = $1.’000′;
} else {
unlink $file if $use_converter;
die «Incorrect FLAC file: $file_info\n»;
}

open( FILE, «<$file» ) || die «Can’t open input file[$file]: $!\n»;
undef $/; my $audio = <FILE>; $/ = «\n»;
close(FILE);

unlink $file if $use_converter;

my $ua = LWP::UserAgent->new( debug => 1 );

my $response = $ua->post($url, Content_Type => «audio/x-flac; rate=$file_info», Content => $audio);

if ( $response->is_success ) {
print $response->content;
my $result=$response->content;

my($res1,$res2,$res3,$res4,$res5)=split(«:»,$result);
$_=$res5;
s/\»confidence\»//;
s/\»//;
s/\»//;
s/,//;

open(OUTFILE,»>/tmp/record.txt»);

print OUTFILE $_;
close(OUTFILE);

} else {
use Data::Dumper;
delete $response->{‘_request’}->{‘_content’};
print STDERR Dumper($response);
}

Теперь модифицировал диалплан:

exten => s,n(cikl),Playback(chto_xotim)
exten => s,n,Record(/tmp/record.wav,,5,k)
exten => s,n,AGI(/var/www/cgi-bin/voice.pl)
exten => s,n,Set(TEST=${FILE(/tmp/record.txt)})
exten => s,n,NoOp(${TEST})
exten => s,n,GotoIf($[«${TEST}»=»нет»]?hang)
exten => s,n,Goto(cikl)
exten => s,n(hang),Hangup

К сожалению пришлось использовать обмен информацией через промежуточный файл, а не функцией CURL — скрипт отказывался нормально стартовать через http-запрос.

Ксати, обратите внимание на проверку на слово НЕТ — Asterisk прекрасно справился с задачей.

Вот так ручками сделал седе некий аналог Siri 🙂 Причем в сам perl-скрипт можно добавить собственные обработчики распознанного текста и возвращать в астер не текст, а МЕТКИ, которые используете в диалплане.