You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
3.5 KiB
167 lines
3.5 KiB
/* |
|
* Copyright (c) 2022 Simples Ip, All rights reserved. |
|
* Author: Ródgger Bruno <rodgger.silva@simplesip.com.br> |
|
*/ |
|
|
|
#define _POSIX_C_SOURCE 200112L |
|
#include <jansson.h> |
|
#include <curl/curl.h> |
|
|
|
#include "agi_c.h" |
|
#include "speech.h" |
|
#include "audio.h" |
|
#include <errno.h> |
|
#include <signal.h> |
|
|
|
//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; |
|
} |
|
|
|
|