/* * Copyright (c) 2022 Simples Ip, All rights reserved. * Author: Ródgger Bruno */ #define _POSIX_C_SOURCE 200112L #include #include #include "agi_c.h" #include "speech.h" #include "audio.h" #include #include //prototype json_t *get_field_transcript(struct response_google *p); int main(){ signal(SIGINT, SIG_IGN); signal(SIGHUP, SIG_IGN); signal(SIGHUP, SIG_IGN); s_agi_parameter *param_agi = NULL; s_agi_return *response = NULL; param_agi = ast_agi(); /* define variáveis do dialplan asterisk */ define_variable( "utterance", "-1"); define_variable( "confidence", "-1"); char *flac = NULL; if( bin_flac( &flac ) == -1 ){ AGI_NORESPONSE("VERBOSE \"Não foi encontrado do binário flac. Terminando AGI.\" \n"); exit(-1); } response = agi_command( "CHANNEL STATUS \n" ); if( response->result == 4 && response->code == 200 ){ agi_clear_response( response ); response = agi_command( "ANSWER \n" ); if( response->result != 0 ){ AGI_NORESPONSE( "VERBOSE \"Falha resposta do canal. Terminado AGI\" \n" ); exit(-1); } } agi_clear_response( response ); char *name_audio = init_record( param_agi ); int result_flac = covert_flac( flac, name_audio ); struct b_audio *b_flac = get_audio_bytes( name_audio ); struct response_google *p = send_network( param_agi, b_flac ); delete_files(name_audio); json_t *json = get_field_transcript( p ); json_t *b = json_object_get(json, "transcript"); if(!b){ define_variable("utterance", ""); define_variable("confidence", "0"); exit(-1); } if(b){ if(json_is_string(b) == 0){ AGI_NORESPONSE( "VERBOSE \"Não existe objeto utterance em json\"\n" ); exit(-1); } const char *s = json_string_value(b ); define_variable("utterance", (char *)s); } b = json_object_get(json, "confidence"); if(!b){ AGI_NORESPONSE( "VERBOSE \"Não existe objeto confidence em json\"\n" ); exit(-1); } char g[30]; if(json_is_real( b ) == 1){ double d = json_real_value(b); snprintf(g, 30, "%.4lf", d); } else if(json_is_integer( b ) == 1){ int d = json_integer_value(b); snprintf(g, 30, "%d", d); } else{ AGI_NORESPONSE( "VERBOSE \"confidence sem números\"\n" ); exit(-1); } define_variable("confidence", g); return 0; } json_t *get_field_transcript(struct response_google *p){ if(!p){ AGI_NORESPONSE( "VERBOSE \"erro libcurl\"\n" ); exit(-1); } json_t *j = json_loads(p->response, 0, NULL); if(!j){ AGI_NORESPONSE( "VERBOSE \"erro json_loads\"\n" ); exit(-1); } json_t *o = json_object_get(j, "results"); if(!o){ AGI_NORESPONSE( "VERBOSE \"erro json_object_get results\"\n" ); exit(-1); } json_t *t = json_array_get(o, 0); if(!t){ AGI_NORESPONSE( "VERBOSE \"erro json_object_get results array 0\"\n" ); exit(-1); } json_t *e = json_object_get(t, "alternatives"); if(!e){ AGI_NORESPONSE( "VERBOSE \"erro json_object_get alternatives\"\n" ); exit(-1); } json_t *result = json_array_get(e, 0); if(!result){ AGI_NORESPONSE( "VERBOSE \"erro json_object_get alternatives arary 0\"\n" ); exit(-1); } return result; } int delete_files( char *name_audio ){ // Deletar os arquivos criado neste programa char delete_audio[SIZE_NAME_AUDIO + 16]; snprintf( delete_audio, sizeof delete_audio, "%s.flac", name_audio ); unlink(delete_audio); snprintf( delete_audio, sizeof delete_audio, "%s.base64", name_audio ); unlink(delete_audio); snprintf( delete_audio, sizeof delete_audio, "%s.sln", name_audio ); unlink(delete_audio); return 0; }