tradutorPortGlosa.cpp
3.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/**
* edit:
* @author Erickson Silva
* @date 14/10/2013
*
*/
/**
* Essa classe converte portugues para Glosa
*
* @author Derzu Omaia
* @date 21/10/2009
*
*/
#include "tradutorPortGlosa.h"
using namespace std;
namespace Tradutor {
TradutorPortGlosa::TradutorPortGlosa() {
ouvintes = new list<OuvinteTradutor*>();
pyTradutor = new PyTradutor();
// Inicia o mutex
mutex = (pthread_mutex_t *) malloc( sizeof(pthread_mutex_t) );
pthread_mutex_init(mutex, NULL);
DPRINTF("Done!\n")
}
TradutorPortGlosa::~TradutorPortGlosa() {
delete ouvintes;
delete pyTradutor;
if (mutex) {
int ret = pthread_mutex_destroy(mutex);
if (ret)
DDDPRINTF("Erro, destruindo mutex.\n");
free(mutex);
}
DDDPRINTF("Translator finalized!\n")
}
void TradutorPortGlosa::registraOuvinte(OuvinteTradutor * ouvinte) {
ouvintes->push_back(ouvinte);
}
void TradutorPortGlosa::removeOuvinte(OuvinteTradutor * ouvinte) {
ouvintes->remove(ouvinte);
}
void TradutorPortGlosa::notificaOuvintes(vector<string> * traducao) {
for (list<OuvinteTradutor*>::iterator i=ouvintes->begin() ; i!= ouvintes->end() ; i++){
(*i)->codifica(traducao);
}
}
// Implemento o metodo da classe que estou ouvindo, classe ExtratorCC
void TradutorPortGlosa::notificaCC(unsigned char * cc, int64_t pts) {
// Mutex para evitar bug multiplas chamadas dos notificadores
pthread_mutex_lock(mutex);
traduz(cc);
pthread_mutex_unlock(mutex);
}
// Implemento o metodo da classe que estou ouvindo, classe ExtratorCC
void TradutorPortGlosa::chegouInput(unsigned char * texto) {
// Mutex para evitar bug multiplas chamadas dos notificadores
pthread_mutex_lock(mutex);
traduz(texto);
pthread_mutex_unlock(mutex);
}
void TradutorPortGlosa::traduz(unsigned char * texto) {
vector<string> * vGlosa = portuguesToGlosaVector((const char *)texto);
if (vGlosa->size() > 0)
notificaOuvintes(vGlosa);
free(vGlosa);
}
/**
* Traduz um texto (char * input) para um vetor de tokens<string> contendo a
* traducao para glosa
*
* @param input texto de entrada
* @return vetor de string contendo os tokens em glosa traduzidos.
**/
vector<string> * TradutorPortGlosa::portuguesToGlosaVector(const char * input) {
char * sGlosa;
vector<string> * vGlosa;
// Faz a tradução de portugues para glosa
sGlosa = pyTradutor->convertStringToGlosa(input);
// Cria vetor de string contendo os tokens da glosa já traduzidos
vGlosa = portuguesToGlosaVectorSplit(sGlosa);
return vGlosa;
}
/**
* Faz split de uma string (char * sGlosa) para um vector<string> contendo os
* tokens da glosa
*
* @param sGlosa string de glosa
* @return vetor de string contendo os tokens em glosa.
**/
vector<string> * TradutorPortGlosa::portuguesToGlosaVectorSplit(char * sGlosa) {
//printf("[INFO] Glosa: %s\n", sGlosa);
vector<string> * vGlosa = new vector<string>();
string str(reinterpret_cast<char*>(sGlosa));
int cutAt;
while((cutAt = str.find_first_of(" ")) != str.npos){
if(cutAt > 0) {
vGlosa->push_back(str.substr(0,cutAt));
}
str = str.substr(cutAt+1);
}
if(str.length() > 0) {
vGlosa->push_back(str);
}
return vGlosa;
}
}