Browse Source

opção de compilar para mostrar tempo de execução

master
Rodgger 2 years ago
parent
commit
5f51c4ef3d
  1. 20
      Makefile
  2. 108
      speech.c

20
Makefile

@ -4,7 +4,7 @@
###############################
CC=gcc
CFLAGS=-Wall -W
CFLAGS=-Werror
LIBS=-lcurl -ljansson
OBJ=\
@ -12,15 +12,23 @@ speech.o\
agi.o\
base64.o
speech-recog.agi_c: $(OBJ)
@$(CC) -o $@ $^ $(LIBS)
@echo "make -> compila\nmake clean -> limpa objetos\n\nPrograma gerado: speech-recog.agi_c"
$(CC) -o $@ $^ $(LIBS)
@echo -e "\nmake time-> mostra tempo verbose\nmake clean -> limpa objetos\nmake -> compilação default\n\n\033[1;32mPrograma gerado: speech-recog.agi_c\033[0m"
%.o: %.c clean
ifndef TIME_SPEECH
$(CC) -c -Werror -o $@ $< $(CFLAGS)
else
$(CC) -c -D TIME_SPEECH=1 -Werror -o $@ $< $(CFLAGS)
endif
$(DIR_OBJ)%.o: $(DIR_SRC)%.c
@$(CC) -c -Werror -o $@ $< $(CFLAGS)
.PHONY: time
time:
@make TIME_SPEECH=1
.PHONY: clean
clean:
@rm -f *.o
@echo "objetos apagados"

108
speech.c

@ -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@&params=%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

Loading…
Cancel
Save