#!/usr/bin/perl ######################################################################## use strict; use CGI qw(:standard); use LWP::UserAgent; use JSON::XS; my $lang = param('lang'); my $file = param('file'); my $var_name = param('var') || 'ASR_RESULT'; print "Content-type: text/plain; charset=utf-8\n\n"; my $url; if ( lc($lang) eq 'ru' ) { $url = "http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU"; } else { $url = "http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=en-US"; } my $new_file = "/tmp/google-asr-$$.wav"; open(TMP,">$new_file"); my $buffer; while ( !eof($file) ) { read( $file, $buffer, 16384 ); print TMP $buffer; } system "ffmpeg -y -i $new_file $new_file.flac 2>/dev/null"; if ( $? ) { print "$var_name=\n"; die "Can't convert file $new_file to $new_file.flac: $?\n"; } else { $new_file .= '.flac'; } my $file_info = `file $new_file`; if ( $file_info =~ /FLAC audio.*\s([\d.]+)\s*kHz/ ) { $file_info = $1 * 1000; } else { unlink $new_file; print "$var_name=\n"; die "Incorrect FLAC file: $file_info\n"; } unless ( open( FILE, "<$new_file" ) ) { print "$var_name=\n"; die "Can't open input file[$file]: $!\n"; } undef $/; my $audio = <FILE>; $/ = "\n"; close(FILE); unlink $new_file; 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 ) { my $h_ref; eval { my $json = JSON::XS->new(); $h_ref = $json->decode($response->content()); }; if ( ref $h_ref eq 'HASH' and exists $h_ref->{'hypotheses'} ) { my $data = $h_ref->{'hypotheses'}->[0]->{'utterance'}; my $map = { 'o' => 0, 'o' => 1, 'a' => 2, '' => 3, '' => 4, '' => 5, '' => 6, '' => 7, 'o' => 8, '' => 9, '' => 10, '' => '', '' => '', '' => '', '' => '', '' => '', '' => '', '' => '', '' => '', '' => '', '' => '', '' => '', '' => '', }; my $result = ''; foreach my $ch ( split(/\s+/,$data) ) { $result .= length($map->{$ch}) ? $map->{$ch} : $ch; } print "$var_name=$result\n"; exit; } } print "$var_name=\n";
<opt> <IVR name="0" EXT_NUMBER="0" NAME="." GREET_REPEAT_CNT="1" GREETING=" ." GREET_REPEAT_DELAY="0.00" NEXTEXTENSION="V5_2*0" TYPE="1" WAITEXTENSION="0"> </IVR> <IVR name="error" EXT_NUMBER="error" NAME="WEB " GREETING=" . ." GREET_REPEAT_CNT="1" GREET_REPEAT_DELAY="0.00" NEXTEXTENSION="hangup" TYPE="1" WAITEXTENSION="0"> </IVR> <IVR name="V5_2*0" EXT_NUMBER="V5_2*0" NAME=" - --------------" GREET_REPEAT_CNT="0" GREET_REPEAT_DELAY="0.00" NEXTEXTENSION="V5_2*1" TYPE="1" WAITEXTENSION="0"> </IVR> <IVR name="V5_2*1" EXT_NUMBER="V5_2*1" NAME=" - / " GOTO_IF_FAIL="error" GREETING=" " GREET_REPEAT_DELAY="0.00" GREET_REPEAT_CNT="1" MAX_MSG_DURATION="10" MAX_SILENCE="2" NEED_VOICE="1" NEXTEXTENSION="V5_2*2" TYPE="20" WAITEXTENSION="0" WEBVAR_URL="http://localhost/cgi-bin/gv.pl?lang=ru&file=% VAR:FILE_DATA %&var=ASR_RESULTV5_2"> </IVR> <IVR name="V5_2*2" EXT_NUMBER="V5_2*2" NAME=" - / " GREET_REPEAT_CNT="0" GREET_REPEAT_DELAY="0.00" NEXTEXTENSION="V5_2*3" TYPE="21" WAITEXTENSION="0"> <_VB_DATA COND="==" FUNC="strlen" PRIORITY="5" REDIRECT_TO="V5_2*2*1" VAR_NAME="ASR_RESULTV5_2" VAR_VALUE="0"/> </IVR> <IVR name="V5_2*2*1" EXT_NUMBER="V5_2*2*1" NAME=" - / " GREETING=" , ." GREET_REPEAT_CNT="1" GREET_REPEAT_DELAY="0.00" NEXTEXTENSION="V5_2*1" TYPE="1" WAITEXTENSION="0"> </IVR> <IVR name="V5_2*3" EXT_NUMBER="V5_2*3" NAME=" - / " GREETING=" " GREET_REPEAT_CNT="1" GREET_REPEAT_DELAY="0.00" NEXTEXTENSION="V5_2*4" SAY_PATTERN="char" SAY_PATTERN_ID="0" TEXT_STR="% VAR:ASR_RESULTV5_2 %" TYPE="25" WAITEXTENSION="0"> </IVR> <IVR name="V5_2*4" EXT_NUMBER="V5_2*4" NAME=" - / " GOTO_IF_FAIL="error" GREETING=", ." GREET_REPEAT_DELAY="0.00" GREET_REPEAT_CNT="1" MAX_MSG_DURATION="3" MAX_SILENCE="2" NEED_PARAMS="0" NEED_VOICE="1" NEXTEXTENSION="V5_2*4*1" TYPE="20" WAITEXTENSION="0" WEBVAR_URL="http://localhost/cgi-bin/gv.pl?lang=ru&file=% VAR:FILE_DATA %"> </IVR> <IVR name="V5_2*4*1" EXT_NUMBER="V5_2*4*1" NAME=" - / " GREET_REPEAT_CNT="0" GREET_REPEAT_DELAY="0.00" NEXTEXTENSION="V5_2*3" TYPE="21" WAITEXTENSION="0"> <_VB_DATA COND="==" FUNC="value" PRIORITY="5" REDIRECT_TO="V5_2*0" VAR_NAME="ASR_RESULT" VAR_VALUE=""/> <_VB_DATA COND="==" FUNC="value" PRIORITY="5" REDIRECT_TO="V5_2*1" VAR_NAME="ASR_RESULT" VAR_VALUE=""/> </IVR> <IVR name="V5_3*9" EXT_NUMBER="V5_3*9" NAME=" - / " GREET_REPEAT_CNT="0" GREET_REPEAT_DELAY="0.00" NEXTEXTENSION="V5_3*9*1" TYPE="6" WAITEXTENSION="0" QUIET_MODE="1" GOTO_IF_FAIL="error" TTS_URL="http://127.0.0.1/cgi-bin/commit.pl?level=V5_3&account=% VAR:ASR_RESULTV1 %&value1=% VAR:ASR_RESULTV5_1 %&value2=% VAR:ASR_RESULTV5_2 %&value3=% VAR:ASR_RESULTV5_3 %"> </IVR> <IVR name="V5_3*9*1" EXT_NUMBER="V5_3*9*1" NAME="-----------------------" GREET_REPEAT_CNT="1" GREETING=" . . ." GREET_REPEAT_DELAY="0.00" NEXTEXTENSION="0" TYPE="1" WAITEXTENSION="0"> </IVR> </opt>
Source: https://habr.com/ru/post/188382/
All Articles