|
|
|
@ -4,7 +4,8 @@
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#define _POSIX_C_SOURCE 199309 |
|
|
|
|
//#include <time.h>
|
|
|
|
|
#include <time.h> |
|
|
|
|
#include <sys/times.h> |
|
|
|
|
#include "agi_c.h" |
|
|
|
|
#include <stdio.h> |
|
|
|
|
#include <stdlib.h> |
|
|
|
@ -18,7 +19,6 @@
|
|
|
|
|
#include <errno.h> |
|
|
|
|
#include <signal.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define GOOGLE_KEY "AIzaSyBxwBNxj9qKoG_U9bH9eLouzfhRtr6AdWc" |
|
|
|
|
|
|
|
|
|
struct b_audio { |
|
|
|
@ -36,14 +36,16 @@ struct response_google {
|
|
|
|
|
#define MAX_BYTES 4096 |
|
|
|
|
#define READ_BYTES 1000 |
|
|
|
|
|
|
|
|
|
#define SIZE_FLAC 128 |
|
|
|
|
#define SIZE_NAME_AUDIO 100 |
|
|
|
|
#define SIZE_NAME_VARIABLE 100 |
|
|
|
|
|
|
|
|
|
char *language = "pt-BR"; |
|
|
|
|
char timeout[ 20 ]; // tempo silêncio
|
|
|
|
|
char abs_timeout[ 10]; // milisegundos
|
|
|
|
|
char intkey[ 32 ]; // digitos para gravação
|
|
|
|
|
char beep[10]; |
|
|
|
|
char uniqueid[30]; |
|
|
|
|
char samplerate[ 32 ]; // samplerate do audio
|
|
|
|
|
char pro_filter[ 10 ]; // esconder os palavrões no texto, exemplo: f*****
|
|
|
|
|
char flac[128]; |
|
|
|
|
char name_audio[100]; |
|
|
|
|
int fd_tmpaudio; |
|
|
|
@ -60,10 +62,21 @@ struct response_google *send_network( s_agi_parameter *param_agi, struct b_audi
|
|
|
|
|
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); |
|
|
|
|
static void sigHandler(int sig); |
|
|
|
|
|
|
|
|
|
/* `make time` para compilar esse trecho */ |
|
|
|
|
#ifdef TIME_SPEECH |
|
|
|
|
static void displayProcessTimes( const char *msg, int restart ); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
int main(){ |
|
|
|
|
|
|
|
|
|
#ifdef TIME_SPEECH |
|
|
|
|
printf("CLOCKS_PER_SEC=%ld sysconf(_SC_CLK_TCK)=%ld\n\n", |
|
|
|
|
(long) CLOCKS_PER_SEC, sysconf(_SC_CLK_TCK)); |
|
|
|
|
|
|
|
|
|
displayProcessTimes("Início do programa:\n", 0); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
s_agi_parameter *param_agi = NULL; |
|
|
|
|
s_agi_return *response = NULL; |
|
|
|
|
|
|
|
|
@ -106,7 +119,14 @@ int main(){
|
|
|
|
|
// exit(-1);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
snprintf( name_audio, 100, "/tmp/speech_%s", uniqueid); |
|
|
|
|
snprintf( name_audio, SIZE_NAME_AUDIO, "/tmp/speech_%s", uniqueid); |
|
|
|
|
|
|
|
|
|
#ifdef TIME_SPEECH |
|
|
|
|
printf("CLOCKS_PER_SEC=%ld sysconf(_SC_CLK_TCK)=%ld\n\n", |
|
|
|
|
(long) CLOCKS_PER_SEC, sysconf(_SC_CLK_TCK)); |
|
|
|
|
|
|
|
|
|
displayProcessTimes("\nAntes do record\n", 1); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
response = agi_command( "RECORD FILE \"%s\" sln \"%s\" \"%s\" %s \"%s\" \n",
|
|
|
|
|
name_audio,
|
|
|
|
@ -122,6 +142,12 @@ int main(){
|
|
|
|
|
exit(-1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef TIME_SPEECH |
|
|
|
|
printf("CLOCKS_PER_SEC=%ld sysconf(_SC_CLK_TCK)=%ld\n\n", |
|
|
|
|
(long) CLOCKS_PER_SEC, sysconf(_SC_CLK_TCK)); |
|
|
|
|
|
|
|
|
|
displayProcessTimes("\nDepois do record (recomeçar):\n", 0); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
int result_flac = covert_flac( ); |
|
|
|
|
if( result_flac == -1 ){ |
|
|
|
@ -136,12 +162,12 @@ int main(){
|
|
|
|
|
struct response_google *p = send_network( param_agi, b_flac ); |
|
|
|
|
|
|
|
|
|
// Deletar os arquivos criado neste programa
|
|
|
|
|
char delete_audio[50]; |
|
|
|
|
snprintf( delete_audio, 60, "%s.flac", name_audio ); |
|
|
|
|
char delete_audio[SIZE_NAME_AUDIO + 16]; |
|
|
|
|
snprintf( delete_audio, sizeof delete_audio, "%s.flac", name_audio ); |
|
|
|
|
unlink(delete_audio); |
|
|
|
|
snprintf( delete_audio, 60, "%s.base64", name_audio ); |
|
|
|
|
snprintf( delete_audio, sizeof delete_audio, "%s.base64", name_audio ); |
|
|
|
|
unlink(delete_audio); |
|
|
|
|
snprintf( delete_audio, 60, "%s.sln", name_audio ); |
|
|
|
|
snprintf( delete_audio, sizeof delete_audio, "%s.sln", name_audio ); |
|
|
|
|
unlink(delete_audio); |
|
|
|
|
|
|
|
|
|
if(!p){ |
|
|
|
@ -217,13 +243,22 @@ int main(){
|
|
|
|
|
define_variable("confidence", g); |
|
|
|
|
AGI_NORESPONSE( "VERBOSE \"TERMINOU speech\"\n" ); |
|
|
|
|
close(fd_tmpaudio); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef TIME_SPEECH |
|
|
|
|
printf("CLOCKS_PER_SEC=%ld sysconf(_SC_CLK_TCK)=%ld\n\n", |
|
|
|
|
(long) CLOCKS_PER_SEC, sysconf(_SC_CLK_TCK)); |
|
|
|
|
|
|
|
|
|
displayProcessTimes("\nDepois record até termino\n", 1); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Inserir variáveis no dialplan asterisk */ |
|
|
|
|
int define_variable( char *variable, char *value ){ |
|
|
|
|
char v[100]; |
|
|
|
|
snprintf(v, 100, "SET VARIABLE \"%s\" \"%s\" \n", variable, value); |
|
|
|
|
char v[SIZE_NAME_VARIABLE]; |
|
|
|
|
snprintf(v, SIZE_NAME_VARIABLE, "SET VARIABLE \"%s\" \"%s\" \n", variable, value); |
|
|
|
|
s_agi_return *response = NULL; |
|
|
|
|
response = agi_command(v); |
|
|
|
|
if(response){ |
|
|
|
@ -352,13 +387,9 @@ int verify_param_asterisk( s_agi_parameter *param ){
|
|
|
|
|
|
|
|
|
|
/* Converter o audio sln -> flac */ |
|
|
|
|
int covert_flac( ){ |
|
|
|
|
char str_convert[4500]; |
|
|
|
|
/* line perl
|
|
|
|
|
* system($flac, $comp_level, "--totally-silent", "--channels=1", "--endian=$endian", |
|
|
|
|
* "--sign=signed", "--bps=16", "--force-raw-format", "--sample-rate=$samplerate", |
|
|
|
|
* "$tmpname.$format") == 0 or die "$name $flac failed: $?\n"; |
|
|
|
|
*/ |
|
|
|
|
snprintf( str_convert, 4500, "%s -8 --totally-silent --channels=1 --endian=little \
|
|
|
|
|
char str_convert[SIZE_FLAC + SIZE_NAME_AUDIO + 256]; |
|
|
|
|
|
|
|
|
|
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 ); |
|
|
|
|
return system( str_convert ); |
|
|
|
@ -367,9 +398,9 @@ int covert_flac( ){
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct b_audio * get_audio_bytes(){ |
|
|
|
|
char command_base64[256]; |
|
|
|
|
char command_base64[ (2 * SIZE_NAME_AUDIO) + 64 ]; |
|
|
|
|
/* converter flac em base64 */ |
|
|
|
|
snprintf(command_base64, 256, "base64 %s.flac -w 0 > %s.base64", name_audio, name_audio); |
|
|
|
|
snprintf(command_base64, sizeof(command_base64), "base64 %s.flac -w 0 > %s.base64", name_audio, name_audio); |
|
|
|
|
|
|
|
|
|
/* verfica se tem erros na conversão */ |
|
|
|
|
if(system( command_base64 ) != 0){ |
|
|
|
@ -378,7 +409,7 @@ struct b_audio * get_audio_bytes(){
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FILE *fd_base64; |
|
|
|
|
char full_path_name_base64[ 256 ]; |
|
|
|
|
char full_path_name_base64[ SIZE_NAME_AUDIO + 16 ]; |
|
|
|
|
snprintf(full_path_name_base64, 256, "%s.base64", name_audio); |
|
|
|
|
fd_base64 = fopen( full_path_name_base64, "r"); |
|
|
|
|
if(fd_base64 == NULL){ |
|
|
|
@ -467,7 +498,6 @@ struct response_google *send_network( s_agi_parameter *param_agi, struct b_audi
|
|
|
|
|
http_response->size = 0; |
|
|
|
|
char url[256]; |
|
|
|
|
|
|
|
|
|
// snprintf(url, 512, "https://speech.googleapis.com/v1/speech:recognize?key=%s", GOOGLE_KEY);
|
|
|
|
|
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 \"url %s\"\n",url); |
|
|
|
|
curl_easy_setopt(curl, CURLOPT_URL, url); |
|
|
|
@ -555,8 +585,38 @@ char *http_content(CURL *curl, struct b_audio *b_flac){
|
|
|
|
|
size_t nmemb = 200 + strlen( b_flac->bytes_encode ) + 1; |
|
|
|
|
char *content = malloc( nmemb ); |
|
|
|
|
snprintf( content, nmemb, "content=%s", curl_easy_escape(curl, b_flac->bytes_encode, strlen(b_flac->bytes_encode)) ); |
|
|
|
|
// snprintf( content, nmemb, "{'config':{'languageCode':'pt-br','encoding':'FLAC','sampleRateHertz': 8000,'profanityFilter':'false', 'maxAlternatives': 1},'audio':{'content':'%s'}}", b_flac->bytes_encode );
|
|
|
|
|
|
|
|
|
|
return content; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef TIME_SPEECH |
|
|
|
|
static void displayProcessTimes(const char *msg, int restart) |
|
|
|
|
{ |
|
|
|
|
struct tms t; |
|
|
|
|
clock_t clockTime; |
|
|
|
|
static long clockTicks; |
|
|
|
|
if (msg != NULL) |
|
|
|
|
printf("%s", msg); |
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
printf(" clock() returns: %ld clocks-per-sec (%.2f secs)\n", |
|
|
|
|
(long) clockTime, (double) clockTime / CLOCKS_PER_SEC); |
|
|
|
|
|
|
|
|
|
if (times(&t) == -1) |
|
|
|
|
exit(-1); |
|
|
|
|
|
|
|
|
|
printf(" times() yields: user CPU=%.2f; system CPU: %.2f\n", |
|
|
|
|
(double) t.tms_utime / clockTicks, |
|
|
|
|
(double) t.tms_stime / clockTicks); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|