Commit 5195b02a2662263d0f8787453017aac450cb4c2e

Authored by Erickson Silva
1 parent b886dc37
Exists in master and in 1 other branch devel

Adiciona reconhecimento de voz pelo Google [DEFAULT]

Makefile
... ... @@ -4,17 +4,18 @@ REVISION=`svn info |grep Rev | sed 2d | cut -d" " -f2`
4 4 CC=g++
5 5 FLAGS=-g
6 6  
7   -#LIBS= -L libs/jthread/lib -L libs/jcommon/lib -L libs/jsocket/lib -ljthread -lpthread -ljcommon -ljsocket
8   -
9 7 LIBS= \
10   - `pkg-config --cflags jlibcpp` \
11 8 `pkg-config --libs jlibcpp` \
12   - `pkg-config --cflags jsoncpp` \
13 9 `pkg-config --libs jsoncpp` \
14   - -lpython2.7 -llavid_base -llavid_io -llavid_net
  10 + -lpython2.7 -llavid_base -llavid_io -llavid_net \
  11 + -ljulius -ldl -lsent
15 12  
16 13 INCLUDES= \
  14 + `pkg-config --cflags jlibcpp` \
  15 + `pkg-config --cflags jsoncpp` \
17 16 -I /usr/include/python2.7 \
  17 + -I /usr/include/julius \
  18 + -I /usr/include/sent \
18 19 -I util/src/include \
19 20 -I tradutor/src/include \
20 21 -I extrator/src/include \
... ... @@ -23,8 +24,7 @@ INCLUDES= \
23 24 -I synchronizer/src/include \
24 25 -I renderer/src/include \
25 26 -I mixer/src/include \
26   - -I recognize/src/include
27   -#-I libs/jthread/include -I libs/jcommon/include -I libs/jsocket/include -Wall
  27 + -I recognize/src/include
28 28  
29 29 utilObjs= \
30 30 logger.o
... ... @@ -58,7 +58,10 @@ mixerObjs= \
58 58  
59 59 recognizeObjs = \
60 60 recognize.o \
61   - recognizeException.o
  61 + recognizeException.o \
  62 + wavcut.o \
  63 + audiofile.o \
  64 + recognizer.o
62 65  
63 66 utilObjsPre = $(addprefix util/src/,$(utilObjs) )
64 67 tradutorObjsPre = $(addprefix tradutor/src/,$(tradutorObjs) )
... ... @@ -79,6 +82,7 @@ OBJECTS = \
79 82 $(rendererObjsPre) \
80 83 $(mixerObjsPre) \
81 84 $(recognizeObjsPre) \
  85 + $(wavcutObjsPre) $(grecognizerObjsPre) \
82 86 main.o
83 87  
84 88 all: user_config libras
... ... @@ -91,7 +95,7 @@ user_config:
91 95 fi
92 96  
93 97 libras: $(OBJECTS)
94   - $(CC) -o vlibras $(OBJECTS) $(LIBS) $(INCLUDES) $(FLAGS)
  98 + $(CC) $(INCLUDES) -o vlibras $(OBJECTS) $(LIBS) $(FLAGS)
95 99  
96 100  
97 101 .c.o: $<
... ...
recognize/src/audiofile.cpp 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +#include "audiofile.h"
  2 +
  3 +Audiofile::Audiofile(char *_file_path,float _start_seg,float _end_seg){
  4 +
  5 + file_path = _file_path;
  6 + start_seg = _start_seg;
  7 + end_seg = _end_seg;
  8 +}
  9 +
  10 +Audiofile::~Audiofile(){
  11 +
  12 +
  13 +}
0 14 \ No newline at end of file
... ...
recognize/src/include/audiofile.h 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +#ifndef AUDIOFILE_H
  2 +#define AUDIOFILE_H
  3 +
  4 +class Audiofile
  5 +{
  6 +
  7 +public:
  8 +
  9 + Audiofile(char *_file_path,float _start_seg,float _end_seg);
  10 + ~Audiofile();
  11 +
  12 + char* file_path;
  13 + float start_seg;
  14 + float end_seg;
  15 +
  16 +
  17 +
  18 +
  19 +};
  20 +
  21 +#endif // AUDIOFILE_H
0 22 \ No newline at end of file
... ...
recognize/src/include/recognize.h
  1 +#ifndef RECOGNIZE_H
  2 +#define RECOGNIZE_H
  3 +
  4 +
1 5 #include "jthread.h"
2 6 #include <iostream>
3 7 #include <stdlib.h>
... ... @@ -17,13 +21,18 @@
17 21 #include "recognizeListener.h"
18 22 #include "recognizeException.h"
19 23  
  24 +#include "wavcut.h"
  25 +#include "recognizer.h"
  26 +
20 27 #define FREQUENCY_PATTERN 22050
21 28 #define INPUT_PATTERN 1 /* 1 = Raw file, 2 = Mic */
22 29 #define BLOCS_PATTERN 10
23 30 #define SIZE_BUFFER 256
24 31 #define CONFIDENCE_RATE 0.10
25 32  
  33 +#define RECOGNIZER_MODE 1 // 0 = Julius, 1 = Google
26 34 #define PATH_JCONFIG "vlibras_user/vlibras-core/recognize/src/julius.jconf"
  35 +#define PATH_WCONFIG "vlibras_user/vlibras-core/recognize/src/wavcut.jconf"
27 36 #define PATH_AUDIO_ORIGIN "/audio/origin/audio_origin.wav"
28 37 #define PATH_AUDIO_PARTS "/audio/parts/"
29 38 #define FILENAME_RECOGNIZED_OUT "/audio/recognized.out"
... ... @@ -110,4 +119,9 @@ private:
110 119 int64_t calcula_pts(double msec);
111 120 int64_t convert_pts(string pts);
112 121  
  122 + void executeGoogleEngine();
  123 + Jconf* load_config();
  124 +
113 125 };
  126 +
  127 +#endif // RECOGNIZE_H
114 128 \ No newline at end of file
... ...
recognize/src/include/recognizer.h 0 → 100644
... ... @@ -0,0 +1,37 @@
  1 +#ifndef RECOGNIZER_H
  2 +#define RECOGNIZER_H
  3 +
  4 +#include <julius/juliuslib.h>
  5 +#include <iostream>
  6 +#include <sstream>
  7 +#include <sys/stat.h>
  8 +#include <fstream>
  9 +#include <iostream>
  10 +#include <string.h>
  11 +#include <stdio.h>
  12 +#include <stdlib.h>
  13 +#include <string>
  14 +#include <list>
  15 +#include <stdint.h>
  16 +
  17 +using namespace std;
  18 +
  19 +class Recognizer
  20 +{
  21 +
  22 +public:
  23 + Recognizer();
  24 + ~Recognizer();
  25 + int recognize(string file_in);
  26 + string getsentence();
  27 + float getconfidence();
  28 +
  29 +
  30 +private:
  31 +
  32 + Jconf *jconf;
  33 + Recog *recog;
  34 +
  35 +};
  36 +
  37 +#endif // RECOGNIZER_H
... ...
recognize/src/include/wavcut.h 0 → 100644
... ... @@ -0,0 +1,30 @@
  1 +#ifndef WAVCUT_H
  2 +#define WAVCUT_H
  3 +
  4 +#include <julius/juliuslib.h>
  5 +#include <string>
  6 +#include <algorithm>
  7 +#undef min
  8 +#undef max
  9 +#include <vector>
  10 +#include "audiofile.h"
  11 +
  12 +
  13 +
  14 +using namespace std;
  15 +class Wavcut{
  16 +
  17 +public:
  18 +
  19 + Wavcut(char* _pathAudio, char* _outputPath, char* _id);
  20 + ~Wavcut();
  21 +
  22 + int initialize(Jconf *jconf);
  23 + vector<Audiofile> list_audio_files();
  24 + int count_lines;
  25 +
  26 +private:
  27 + static int adin_callback_file(SP16 *now, int len, Recog *recog);
  28 +};
  29 +
  30 +#endif // WAVCUT_H
0 31 \ No newline at end of file
... ...
recognize/src/recognize.cpp
... ... @@ -68,14 +68,17 @@ void Recognize::Run(){
68 68 finish = false;
69 69 createDir();
70 70 extractAudioFromVideo();
71   - breakVideoParts(getTimeMediaSec());
72   - executeJuliusEngine();
73   - generateConfidence();
74   - //filterOutputJulius();
75   - //cleanFiles();
76   -
  71 + if (RECOGNIZER_MODE == 0){
  72 + breakVideoParts(getTimeMediaSec());
  73 + executeJuliusEngine();
  74 + generateConfidence();
  75 + } else {
  76 + executeGoogleEngine();
  77 + }
  78 +
77 79 finish = true;
78   - //notifyEndExtraction(count_lines);
  80 + notifyEndExtraction(count_lines);
  81 + cleanFiles();
79 82 }
80 83  
81 84 void Recognize::setFrequency(int freq) {
... ... @@ -209,7 +212,7 @@ void Recognize::breakVideoParts(int timeTotal) {
209 212 void Recognize::executeJuliusEngine() {
210 213  
211 214 string type, freqStr;
212   - string command = "julius -C ";
  215 + string command = "julius -quiet -C ";
213 216 char cfreq[10];
214 217  
215 218 char* jPath;
... ... @@ -292,14 +295,12 @@ void Recognize::generateConfidence() {
292 295 scores.push_back(avgScores/sizeAvgScores);
293 296  
294 297 }else if(pass==0){
295   - notifyListeners((char*) "SENTENCA COM BAIXA QUALIDADE", 0);
296   - notifyEndExtraction(count_lines);
  298 + notifyListeners((char*) "SENTENCA_COM_BAIXA_QUALIDADE", 0);
297 299 return;
298 300 }
299 301 } while (!in.eof());
300 302 in.close();
301 303 filterOutputJulius();
302   - notifyEndExtraction(count_lines);
303 304 }
304 305 }
305 306  
... ... @@ -420,3 +421,100 @@ void Recognize::createDir(){
420 421 .append(" && mkdir -p ").append(path_contents).append("/").append(id).append("/audio/origin");
421 422 system(command.c_str());
422 423 }
  424 +
  425 +void Recognize::executeGoogleEngine() {
  426 + jlog_set_output(NULL);
  427 +
  428 + Wavcut* wavcut;
  429 + Recognizer* recog;
  430 +
  431 + vector<Audiofile> audioList;
  432 + string file_in = "";
  433 + file_in.append(path_contents).append("/").append(id).append(PATH_AUDIO_ORIGIN);
  434 + string path_out= "";
  435 + path_out.append(path_contents).append("/").append(id).append("/");
  436 + char* pathAudio = new char[file_in.size()+1];
  437 + char* outputPath = new char[path_out.size()+1];
  438 + char* _id = new char[id.size()+1];
  439 + strcpy(pathAudio, file_in.c_str());
  440 + strcpy(outputPath, path_out.c_str());
  441 + strcpy(_id, id.c_str());
  442 +
  443 +
  444 + wavcut = new Wavcut(pathAudio,outputPath,_id);
  445 + Jconf *jconf;
  446 + jconf = j_config_load_file_new(PATH_WCONFIG);
  447 +
  448 + if(wavcut->initialize(jconf)<2){
  449 +
  450 + wavcut->initialize(load_config());
  451 + }
  452 +
  453 + audioList = wavcut->list_audio_files();
  454 +
  455 +
  456 + delete wavcut;
  457 + recog = new Recognizer();
  458 +
  459 + int ii;
  460 + count_lines = 0;
  461 + for(ii=0; ii < audioList.size(); ii++)
  462 + {
  463 +
  464 + /*chama o reconhecedor passando cada arquivo de audio*/
  465 + recog->recognize(audioList[ii].file_path);
  466 +
  467 + /*remove o audio ja reconhecido*/
  468 + remove(audioList[ii].file_path);
  469 +
  470 + /*segundos do inicio do audio reconhecido*/
  471 + //cout<< calcula_pts(audioList[ii].start_seg) << endl;
  472 +
  473 + /* texto do audio reconhecido*/
  474 + //cout<< recog->getsentence() << endl;
  475 +
  476 + /* porcentagem de confiança do reconhecimento (de 0 a 1) */
  477 + //cout<< recog->getconfidence() << endl;
  478 +
  479 + if(recog->getconfidence() >= confidenceRate)
  480 + notifyListeners((char*)recog->getsentence().c_str(), (int64_t)(audioList[ii].start_seg*1000));
  481 + else
  482 + notifyListeners((char*) "SENTENCA_COM_BAIXA_QUALIDADE", (int64_t)(audioList[ii].start_seg*1000));
  483 + if(recog->getconfidence()> 0)
  484 + count_lines++;
  485 + }
  486 + delete recog;
  487 +
  488 +}
  489 +
  490 +Jconf* Recognize::load_config(){
  491 +
  492 + Jconf* jconf;
  493 + jconf = j_jconf_new();
  494 +
  495 + char *parametros[12];
  496 +
  497 + parametros[1]="-lv";
  498 + parametros[2]="3000";
  499 + parametros[3]="-zc";
  500 + parametros[4]="150";
  501 + parametros[5]="-headmargin";
  502 + parametros[6]="200";
  503 + parametros[7]="-tailmargin";
  504 + parametros[8]="150";
  505 + parametros[9]="-rejectshort";
  506 + parametros[10]="1500";
  507 + //cout << "load_config" << endl;
  508 + /* read arguments and set parameters */
  509 + if (j_config_load_args(jconf, 11, parametros) == -1) {
  510 + fprintf(stderr, "Error reading arguments\n");
  511 +
  512 + }
  513 +
  514 + jconf->input.type = INPUT_WAVEFORM;
  515 + jconf->input.speech_input = SP_RAWFILE;
  516 + jconf->detect.silence_cut = 1;
  517 +
  518 +
  519 +return jconf;
  520 +}
... ...
recognize/src/recognizer.cpp 0 → 100644
... ... @@ -0,0 +1,101 @@
  1 +
  2 +
  3 +
  4 +#include "recognizer.h"
  5 +#include <json/json.h>
  6 +
  7 +
  8 +static boolean reconhecendo ;
  9 +static string sentence;
  10 +static float confidence;
  11 +string lenguage = "pt-BR";
  12 +
  13 +using namespace std;
  14 +
  15 +
  16 +void resultado(Recog *recog, void *dummy);
  17 +
  18 +
  19 +
  20 +Recognizer::Recognizer(){
  21 +
  22 +}
  23 +
  24 +
  25 +Recognizer::~Recognizer(){
  26 +
  27 +}
  28 +
  29 +
  30 +
  31 +int Recognizer::recognize(string file_in)
  32 +{
  33 + FILE *file;
  34 + string cmFinal;
  35 + char message[100];
  36 + message[0] = '\0';
  37 + string jsonResult ="";
  38 + string vozReconhecida = "";
  39 + int indexLineSrt =0;
  40 + stringstream comand;
  41 + stringstream index;
  42 +
  43 +
  44 + string fileName = file_in;
  45 +
  46 + // inicio preparação requisição
  47 +
  48 + comand << " curl -ss -X POST --data-binary @";
  49 + comand << fileName;
  50 +
  51 + //requisição para o google speech
  52 + comand<< " --user-agent 'Mozilla/5.0' --header 'Content-Type: audio/l16; rate=22050;' 'https://www.google.com/speech-api/v2/recognize?client=chromium&lang="<<lenguage<<"&maxresults=1&key=AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw'";
  53 + //AIzaSyBeeYW4l2OuCwiUfzBaUXXeWAO6Uy-u0F8'";
  54 + //public key Ezequiel project 1
  55 + //AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw'";
  56 + //fim
  57 + cmFinal = comand.str();
  58 + file = popen(cmFinal.c_str(),"r");
  59 + if(file == NULL)
  60 + printf("ERROR\n");
  61 + int vez =0;
  62 + while (fgets(message, sizeof (message), file))
  63 + {
  64 + vez++;
  65 +
  66 + if(vez>1){
  67 + jsonResult+= message;
  68 +
  69 + }
  70 + }
  71 + //cout<< jsonResult <<endl<<endl;
  72 + Json::Value root;
  73 + Json::Reader reader;
  74 + bool parsingSuccessful = reader.parse(jsonResult, root);
  75 + // cout << root["result"]<<endl;
  76 + confidence = 0.0;
  77 + sentence = "";
  78 + if (parsingSuccessful)
  79 + {
  80 + sentence = root["result"][0]["alternative"][0]["transcript"].asString();
  81 + confidence = root["result"][0]["alternative"][0]["confidence"].asFloat();
  82 + }
  83 +
  84 +
  85 + fclose(file);
  86 +
  87 + jsonResult = "";
  88 + comand.str("");
  89 +
  90 + return 1;
  91 +}
  92 +
  93 +
  94 +float Recognizer::getconfidence(){
  95 + return confidence;
  96 +}
  97 +string Recognizer::getsentence(){
  98 + // printf("palavra %s\n",sentence.c_str() );
  99 + return sentence;
  100 +}
  101 +
... ...
recognize/src/wavcut.cpp 0 → 100644
... ... @@ -0,0 +1,187 @@
  1 +#include "wavcut.h"
  2 +
  3 +#include <vector>
  4 +// #include <iostream>
  5 +
  6 +
  7 +int sfreq = 22050; ///< Temporal storage of sample rate
  8 +int speechlen; ///< samples of one recorded segments
  9 +FILE *fp = NULL; ///< File pointer for WAV output
  10 +int sid = 0; ///< current file ID (for SPOUT_FILE)
  11 +char *outpath = NULL; ///< work space for output file name formatting
  12 +boolean writing_file = FALSE; ///< TRUE if writing to a file
  13 +int trigger_sample;
  14 +char *pathAudio;
  15 +char* outputPath;
  16 +char* id_file;
  17 +static vector<Audiofile> audioList;
  18 +
  19 +
  20 +Wavcut::Wavcut(char* _pathAudio, char* _outputPath, char* _id){
  21 +
  22 + pathAudio = _pathAudio;
  23 + outputPath = _outputPath;
  24 + id_file = _id;
  25 + //printf("%s\n","Entrou aquiiiii" )
  26 +}
  27 +
  28 +Wavcut::~Wavcut(){
  29 + //printf("%s\n","Wavcut finalizado" );
  30 +}
  31 +
  32 +
  33 +int Wavcut::adin_callback_file(SP16 *now, int len, Recog *recog)
  34 + {
  35 + /* cria novo arquivo wav para salvar o audio sem silencio*/
  36 + if (speechlen == 0) {
  37 +
  38 + sprintf(outpath, "%s%d.wav",outputPath, sid);
  39 +
  40 + if (access(outpath, F_OK) == 0) {
  41 + if (access(outpath, W_OK) != 0) {
  42 + return(-1);
  43 + }
  44 +
  45 + }
  46 +
  47 + if ((fp = wrwav_open(outpath, sfreq)) != NULL) {
  48 + //fprintf(stderr, "novo arquivo\n");
  49 + }else{
  50 + return -1;
  51 + }
  52 + writing_file = TRUE;
  53 + }
  54 +
  55 + /* write recorded sample to file */
  56 + if (wrwav_data(fp, &(now[0]), len) == FALSE) {
  57 + return -1;
  58 + }
  59 +
  60 + /* accumulate sample num of this segment */
  61 +speechlen += len;
  62 +
  63 +return(0);
  64 +}
  65 +
  66 +//acumula o tempo de cada segmento
  67 +void registra_tempo(Recog *recog, void *data)
  68 +{
  69 + trigger_sample = recog->adin->last_trigger_sample;
  70 +}
  71 +
  72 +boolean close_files()
  73 +{
  74 + if (writing_file) {
  75 +
  76 + if (wrwav_close(fp) == FALSE) {
  77 + fprintf(stderr, "adinrec: failed to close file\n");
  78 + return FALSE;
  79 + }
  80 + char* fileout=(char *)mymalloc(100);;
  81 + // sprintf(fileout,*outpath);
  82 + sprintf(fileout, outpath);
  83 + audioList.push_back(Audiofile(fileout,(float)trigger_sample / (float)sfreq,
  84 + (float)(trigger_sample + speechlen) / (float)sfreq));
  85 +
  86 + writing_file = FALSE;
  87 +}
  88 +
  89 +return TRUE;
  90 +}
  91 +
  92 +
  93 + int Wavcut::initialize(Jconf *jconf) {
  94 +
  95 + sid = 0;
  96 + audioList.clear();
  97 + //Jconf *jconf;
  98 + Recog *recog;
  99 +
  100 + int ret;
  101 + boolean is_continues;
  102 +
  103 + /* cria instancia do reconhecedor */
  104 + recog = j_recog_new();
  105 + /* carrega as configurações contidas no jconfig */
  106 + // jconf = j_config_load_file_new("/home/ezequiel/speech-recognizer/wavcut.jconf");
  107 +
  108 + jconf->input.sfreq = sfreq;
  109 + /*adciona a configuração ao reconhecedor*/
  110 + recog->jconf = jconf;
  111 +
  112 + outpath = (char *)mymalloc(256);
  113 +
  114 +/*registra calback do contador de tempo*/
  115 + callback_add(recog, CALLBACK_EVENT_SPEECH_START, registra_tempo, NULL);
  116 +
  117 + /*Inicializa o reconhecedor*/
  118 + if (j_adin_init(recog) == FALSE) {
  119 + fprintf(stderr, "Error in initializing adin device\n");
  120 + return 0;
  121 + }
  122 +
  123 + /*Abre o quivo de áudio para ser cortado*/
  124 + if(j_open_stream(recog,pathAudio) == -2)
  125 + return sid;
  126 +
  127 + /* loop de detecção de voz*/
  128 +
  129 + do {
  130 +
  131 + speechlen = 0;
  132 +
  133 + ret = adin_go(adin_callback_file, NULL, recog);
  134 +
  135 +
  136 + switch(ret) {
  137 + case -1: /* device read error or callback error */
  138 + //fprintf(stderr, "[error]\n");
  139 + break;
  140 + case 0: /* reached to end of input */
  141 + //fprintf(stderr, "[eof]\n");
  142 + return sid;
  143 + break;
  144 + default:
  145 + break;
  146 + }
  147 +
  148 + if (ret == -1) {
  149 + /* error in input device or callback function, so terminate program here */
  150 + return sid;
  151 + }
  152 + /* um intervalo de silencio detectado */
  153 +
  154 + if (close_files() == FALSE)
  155 + return sid;
  156 +
  157 + /* incremento do contador de partes cortadas */
  158 +
  159 +
  160 + sid++;
  161 +
  162 + is_continues = FALSE;
  163 + if (ret > 0 || ret == -2) {
  164 + is_continues = TRUE;
  165 + }
  166 +
  167 + } while (is_continues);
  168 +
  169 + /*Quando termina de ler todo áudio finaliza*/
  170 + adin_end(recog->adin);
  171 +
  172 + return sid;
  173 +
  174 +}
  175 +
  176 +vector<Audiofile> Wavcut::list_audio_files(){
  177 +
  178 +
  179 + return audioList;
  180 +}
  181 +
  182 +
  183 +
  184 +
  185 +
  186 +
  187 +
... ...
recognize/src/wavcut.jconf 0 → 100644
... ... @@ -0,0 +1,24 @@
  1 +-smpFreq 22050
  2 +-lv 1000
  3 +-zc 60
  4 +-headmargin 200
  5 +-tailmargin 150
  6 +-rejectshort 1500
  7 +-input rawfile
  8 +-cutsilence
  9 +
  10 +
  11 +
  12 +#-smpFreq 22050
  13 +#-lv 3000
  14 +#-zc 150
  15 +#-headmargin 200
  16 +#-tailmargin 150
  17 +#-rejectshort 1500
  18 +#-input rawfile
  19 +#-cutsilence
  20 +
  21 +
  22 +
  23 +
  24 +
... ...
servico/src/include/serviceWindowGeneration.h
... ... @@ -15,7 +15,7 @@
15 15 #include "listenerTradutor.h"
16 16 #include "tradutorPortGlosa.h"
17 17 #include "serviceException.h"
18   -#include <json/json.h>
  18 +#include <json/json.h>
19 19 #include <lavidlib/base/RuntimeException.h>
20 20  
21 21 #define DEVELOPER "devel"
... ... @@ -26,7 +26,6 @@
26 26 #define PATH_CONF_FILE "vlibras_user/.vlibras-config/params.json"
27 27 #define MAX_SIZE_PATH 256
28 28  
29   -using namespace Json;
30 29 using namespace Tradutor;
31 30 using namespace jthread;
32 31 using namespace std;
... ... @@ -39,8 +38,8 @@ protected:
39 38 Renderer* renderer;
40 39 Mixer* mixer;
41 40  
42   - Value root;
43   - Reader reader;
  41 + Json::Value root;
  42 + Json::Reader reader;
44 43 vector<int64_t>* vetor_pts;
45 44  
46 45 bool finish;
... ...