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

/*
* 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;
}