|
|
|
@ -19,7 +19,6 @@
|
|
|
|
|
#include <errno.h> |
|
|
|
|
#include <signal.h> |
|
|
|
|
|
|
|
|
|
#define GOOGLE_KEY "AIzaSyBxwBNxj9qKoG_U9bH9eLouzfhRtr6AdWc" |
|
|
|
|
|
|
|
|
|
struct b_audio { |
|
|
|
|
char *bytes; |
|
|
|
@ -63,19 +62,9 @@ int copy_to_struct( struct b_audio *b_flac, char *str, size_t p );
|
|
|
|
|
char *http_content(CURL *curl, struct b_audio *b_flac); |
|
|
|
|
size_t response_curl(void *contents, size_t size, size_t nmemb, void *userp); |
|
|
|
|
|
|
|
|
|
/* `make time` para compilar esse trecho */ |
|
|
|
|
#ifdef TIME_SPEECH |
|
|
|
|
static void displayProcessTimes( const char *msg, int restart ); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
int main(){ |
|
|
|
|
|
|
|
|
|
#ifdef TIME_SPEECH |
|
|
|
|
AGI_NORESPONSE("VERBOSE \"CLOCKS_PER_SEC=%ld sysconf(_SC_CLK_TCK)=%ld\"\n", |
|
|
|
|
(long) CLOCKS_PER_SEC, sysconf(_SC_CLK_TCK)); |
|
|
|
|
|
|
|
|
|
displayProcessTimes("Início do programa: ", 0); |
|
|
|
|
#endif |
|
|
|
|
int main(){ |
|
|
|
|
|
|
|
|
|
s_agi_parameter *param_agi = NULL; |
|
|
|
|
s_agi_return *response = NULL; |
|
|
|
@ -86,10 +75,6 @@ int main(){
|
|
|
|
|
define_variable( "utterance", "-1"); |
|
|
|
|
define_variable( "confidence", "-1"); |
|
|
|
|
|
|
|
|
|
/* if(strlen(GOOGLE_KEY) < 2){
|
|
|
|
|
AGI_NORESPONSE("VERBOSE \"Chave do goole está faltando. Terminando AGI.\" \n"); |
|
|
|
|
exit(-1); |
|
|
|
|
}*/ |
|
|
|
|
|
|
|
|
|
if( bin_flac() == -1 ){ |
|
|
|
|
AGI_NORESPONSE("VERBOSE \"Não foi encontrado do binário flac. Terminando AGI.\" \n"); |
|
|
|
@ -108,23 +93,8 @@ int main(){
|
|
|
|
|
} |
|
|
|
|
agi_clear_response( response ); |
|
|
|
|
|
|
|
|
|
// if( create_temporary_file() == -1){
|
|
|
|
|
// AGI_NORESPONSE( "VERBOSE \"Não foi possível criar um arquivo temporário. Programa terminado\" \n" );
|
|
|
|
|
// exit( -1 );
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// struct timespec tm;
|
|
|
|
|
// if(-1 == clock_gettime( CLOCK_REALTIME_COARSE, &tm)){
|
|
|
|
|
// AGI_NORESPONSE( "VERBOSE \"Não foi possível obter o tempo clock_gettime\" \n" );
|
|
|
|
|
// exit(-1);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
snprintf( name_audio, SIZE_NAME_AUDIO, "/tmp/speech_%s", uniqueid); |
|
|
|
|
|
|
|
|
|
#ifdef TIME_SPEECH |
|
|
|
|
displayProcessTimes("Antes do record: ", 1); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
response = agi_command( "RECORD FILE \"%s\" sln \"%s\" \"%s\" %s \"%s\" \n",
|
|
|
|
|
name_audio,
|
|
|
|
|
intkey,
|
|
|
|
@ -139,19 +109,13 @@ int main(){
|
|
|
|
|
exit(-1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef TIME_SPEECH |
|
|
|
|
displayProcessTimes("Depois do record (recomeçar):", 0); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
int result_flac = covert_flac( ); |
|
|
|
|
if( result_flac == -1 ){ |
|
|
|
|
AGI_NORESPONSE( "VERBOSE \"Não foi possível converter o áudio. Programa terminando\"\n"); |
|
|
|
|
exit(-1); |
|
|
|
|
} |
|
|
|
|
struct b_audio *b_flac = get_audio_bytes( ); |
|
|
|
|
// b_flac->nmemb_encode = (size_t)Base64encode_len( (int)b_flac->nmemb );
|
|
|
|
|
// b_flac->bytes_encode = calloc( 1, b_flac->nmemb_encode + 1 );
|
|
|
|
|
// Base64encode( b_flac->bytes_encode, b_flac->bytes, b_flac->nmemb );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct response_google *p = send_network( param_agi, b_flac ); |
|
|
|
|
|
|
|
|
@ -234,13 +198,8 @@ int main(){
|
|
|
|
|
exit(-1); |
|
|
|
|
} |
|
|
|
|
define_variable("confidence", g); |
|
|
|
|
AGI_NORESPONSE( "VERBOSE \"TERMINOU speech\"\n" ); |
|
|
|
|
close(fd_tmpaudio); |
|
|
|
|
|
|
|
|
|
#ifdef TIME_SPEECH |
|
|
|
|
displayProcessTimes("Depois record até termino", 1); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -307,7 +266,6 @@ int verify_param_asterisk( s_agi_parameter *param ){
|
|
|
|
|
else{ |
|
|
|
|
strncpy( timeout, "s=3", sizeof timeout); |
|
|
|
|
} |
|
|
|
|
// AGI_NORESPONSE("VERBOSE \"timeout %s\" \n", timeout);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// agi_arg_2 - key
|
|
|
|
@ -318,7 +276,6 @@ int verify_param_asterisk( s_agi_parameter *param ){
|
|
|
|
|
else{ |
|
|
|
|
strncpy(intkey, "", sizeof intkey); |
|
|
|
|
} |
|
|
|
|
// AGI_NORESPONSE("VERBOSE \"intkey %s\" \n", intkey) ;
|
|
|
|
|
|
|
|
|
|
// agi_arg_3 NOBEEP
|
|
|
|
|
value = get_param_n( param, 3 ); |
|
|
|
@ -333,7 +290,6 @@ int verify_param_asterisk( s_agi_parameter *param ){
|
|
|
|
|
else{ |
|
|
|
|
strncpy( beep, "BEEP", 5); |
|
|
|
|
} |
|
|
|
|
// AGI_NORESPONSE( "VERBOSE \"beep %s\" \n", beep);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// agi_arg_4 = tempo absoluto em milisegundos
|
|
|
|
@ -353,26 +309,13 @@ int verify_param_asterisk( s_agi_parameter *param ){
|
|
|
|
|
else{ |
|
|
|
|
strncpy( abs_timeout, "5000", 5 );/* valor default */ |
|
|
|
|
} |
|
|
|
|
// AGI_NORESPONSE("VERBOSE \"abs_timeout %s\" \n", abs_timeout);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Criar arquivo temporário */ |
|
|
|
|
//int create_temporary_file(){
|
|
|
|
|
/* Esse arquivo será criado no \tmp, porém, se
|
|
|
|
|
* asterisk for compilado com systemd, será colocado no |
|
|
|
|
* /tmp/systemd-private-[...]-asterisk.service-[..] |
|
|
|
|
*/ |
|
|
|
|
/* strcpy(name_audio, "/tmp/ast_audio_XXXXXX");
|
|
|
|
|
fd_tmpaudio = mkstemp( name_audio ); |
|
|
|
|
if(fd_tmpaudio == -1){ |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
return 0; |
|
|
|
|
}*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Converter o audio sln -> flac */ |
|
|
|
|
int covert_flac( ){ |
|
|
|
@ -380,7 +323,6 @@ int covert_flac( ){
|
|
|
|
|
|
|
|
|
|
snprintf( str_convert, sizeof str_convert, "%s -8 --totally-silent --channels=1 --endian=little --sign=signed --bps=16 --force-raw-format --sample-rate=8000 %s.sln", flac, name_audio ); |
|
|
|
|
|
|
|
|
|
// AGI_NORESPONSE("VERBOSE \"-%s\"\n", str_convert);
|
|
|
|
|
return system( str_convert ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -433,42 +375,6 @@ struct b_audio * get_audio_bytes(){
|
|
|
|
|
} |
|
|
|
|
}while(1); |
|
|
|
|
|
|
|
|
|
// FILE *fd_ = fopen("/tmp/debug_send", "w+");
|
|
|
|
|
// if(fd_ == NULL){
|
|
|
|
|
// AGI_NORESPONSE( "VERBOSE \"erro debug%d\"\n", errno );
|
|
|
|
|
// exit(-1);
|
|
|
|
|
// }
|
|
|
|
|
// fwrite(b_flac->bytes_encode, 1, b_flac->nmemb, fd_);
|
|
|
|
|
/* char full_path_name_audio[4096];
|
|
|
|
|
snprintf( full_path_name_audio, 512, "%s.flac", name_audio); |
|
|
|
|
char bytes[MAX_BYTES]; |
|
|
|
|
FILE *fd_audio; |
|
|
|
|
fd_audio = fopen( full_path_name_audio, "r"); |
|
|
|
|
if(fd_audio == NULL){ |
|
|
|
|
AGI_NORESPONSE("VERBOSE \"Não pode abrir o arquivo %s.flac\"\n", name_audio); |
|
|
|
|
} |
|
|
|
|
struct b_audio *b_flac = calloc( 1, sizeof( struct b_audio ) ); |
|
|
|
|
b_flac->bytes = calloc(1, MAX_BYTES); |
|
|
|
|
if( b_flac->bytes == NULL ){ |
|
|
|
|
AGI_NORESPONSE("VERBOSE \"Calloc retornou NULL. Programa terminado\"\n"); |
|
|
|
|
exit(-1); |
|
|
|
|
} |
|
|
|
|
b_flac->nmemb = MAX_BYTES; |
|
|
|
|
size_t nmemb; |
|
|
|
|
while( !feof(fd_audio) || ferror(fd_audio) ){ |
|
|
|
|
nmemb = fread( bytes, sizeof( char ), MAX_BYTES, fd_audio); |
|
|
|
|
if( nmemb == 0 ){ |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
size_t point_bytes = b_flac->nmemb; |
|
|
|
|
b_flac->nmemb += nmemb; |
|
|
|
|
b_flac->bytes = realloc( b_flac->bytes, b_flac->nmemb ); |
|
|
|
|
if( b_flac->bytes == NULL ){ |
|
|
|
|
AGI_NORESPONSE("VERBOSE \"Calloc retornou NULL. Programa terminado\"\n"); |
|
|
|
|
exit(-1); |
|
|
|
|
} |
|
|
|
|
strcpy( &b_flac->bytes[point_bytes], bytes ); |
|
|
|
|
}*/ |
|
|
|
|
return b_flac; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -488,7 +394,6 @@ struct response_google *send_network( s_agi_parameter *param_agi, struct b_audi
|
|
|
|
|
char url[256]; |
|
|
|
|
|
|
|
|
|
snprintf(url, 256, "http://144.22.132.187/integracao/index.php?method=recognize&key=%s&login=user.api&senha=rmt46Pws@¶ms=%s", get_param_value(param_agi, "agi_uniqueid"), get_param_n(param_agi, 5)); |
|
|
|
|
AGI_NORESPONSE("VERBOSE \"%s\"\n",url); |
|
|
|
|
curl_easy_setopt(curl, CURLOPT_URL, url); |
|
|
|
|
|
|
|
|
|
char *content = NULL; |
|
|
|
@ -500,14 +405,11 @@ struct response_google *send_network( s_agi_parameter *param_agi, struct b_audi
|
|
|
|
|
curl_easy_setopt( curl, CURLOPT_POSTFIELDS, content ); |
|
|
|
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, response_curl); |
|
|
|
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)http_response); |
|
|
|
|
AGI_NORESPONSE("VERBOSE \"enviar api\"\n"); |
|
|
|
|
res = curl_easy_perform(curl); |
|
|
|
|
if(res == CURLE_OK){ |
|
|
|
|
AGI_NORESPONSE("VERBOSE \"curl == CURLE_OK \"\n"); |
|
|
|
|
|
|
|
|
|
return http_response; |
|
|
|
|
} |
|
|
|
|
AGI_NORESPONSE("VERBOSE \"curl != CURLE_OK \"\n"); |
|
|
|
|
exit(-1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -578,27 +480,3 @@ char *http_content(CURL *curl, struct b_audio *b_flac){
|
|
|
|
|
return content; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef TIME_SPEECH |
|
|
|
|
static void displayProcessTimes(const char *msg, int restart) |
|
|
|
|
{ |
|
|
|
|
struct tms t; |
|
|
|
|
clock_t clockTime; |
|
|
|
|
static long clockTicks; |
|
|
|
|
|
|
|
|
|
if (clockTicks == restart) { /* Fetch clock ticks on first call */ |
|
|
|
|
clockTicks = sysconf(_SC_CLK_TCK); |
|
|
|
|
if (clockTicks == -1) |
|
|
|
|
exit(-1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
clockTime = clock(); |
|
|
|
|
|
|
|
|
|
if (clockTime == -1) |
|
|
|
|
exit(-1); |
|
|
|
|
|
|
|
|
|
AGI_NORESPONSE("VERBOSE \"%s: return: %ld clocks-per-sec (%.6lf secs)\"\n", msg, |
|
|
|
|
(long) clockTime, (double) clockTime / CLOCKS_PER_SEC); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|