PageSourceSearch

https://servicosonline.cm-penafiel.pt/penafiel-atendimentonet/scripts/speechRecognizer.js

js cm-penafiel.pt collected 2026-10-02 12:13:06 UTC 10,155 bytes, 365 lines download raw bytes

1var final_transcript = '';
2var recognizing = false;
3var ignore_onend;
4var recognition;
5var dataStruct;
6var arrayFinal = [];
7var delimiters = [];
8
9var globalStruct= [['dynamicMenuForm:tasks', 'ordem do dia', 'button'],
10                  ['dynamicMenuForm:inbox', 'email', 'button'],
11                  ['dynamicMenuForm:register', 'registos', 'button'],
12                  ['dynamicMenuForm:documents', 'documentos', 'button'],
13                  ['dynamicMenuForm:home', 'inicio', 'button'],
14                  ['dynamicMenuForm:management', 'gestão', 'button'],
15                  ['dynamicMenuForm:configurations', 'configurações', 'button'],
16                  ['messagesLink', 'mensagens', 'button'],
17                  ['searchForm:searchInput##document.getElementById(\'searchForm:navBarSearchBtn\').click();', 'pesquisar', 'input+action']];
18
19//['var msg = new SpeechSynthesisUtterance(\'?\');window.speechSynthesis.speak(msg);', 'repetir', 'select']
20          
21function speechHandler(){
22    if (!('webkitSpeechRecognition' in window)) {
23    console.log('Reconhecimento não é suportado por este browser, pf fazer o upgrade (chrome +25).');
24    } else {
25        console.log('teste...');
26        recognition = new webkitSpeechRecognition();
27        recognition.continuous = true;
28        recognition.interimResults = false;
29
30        recognition.onstart = function () {
31            recognizing = true;
32            var div = document.getElementById('speechResult');
33            div.innerHTML = '<b>'+'Por favor seja claro.'+'</b>';
34
35            console.log('Pode começar a falar...');
36        };
37
38        recognition.onerror = function (event) {
39            var div = document.getElementById('speechResult');
40
41            if (event.error === 'no-speech') {
42                div.innerHTML = '<b>'+'Não foi detetada qualquer fala.'+'</b>';
43                ignore_onend = true;
44            }
45            if (event.error === 'audio-capture') {
46                div.innerHTML = '<b>'+'Não foi detetado micro.'+'</b>';
47                ignore_onend = true;
48            }
49            if (event.error === 'not-allowed') {
50                div.innerHTML = '<b>'+'Verifique a ligação do micro...'+'</b>';
51                ignore_onend = true;
52            }
53
54            enableRepeat();
55        };
56
57        recognition.onend = function () {
58            recognizing = false;
59            var div = document.getElementById('speechResult');
60            div.innerHTML = '<b>'+'O processo terminou.'+'</b>';
61
62            enableRepeat();
63
64            if (ignore_onend) {
65                return;
66            }
67            if (!final_transcript) {
68                console.log('terminou...');
69                return;
70            }
71            console.log('');
72            if (window.getSelection) {
73                //window.getSelection().removeAllRanges();
74                //var range = document.createRange();
75                //range.selectNode(document.getElementById('final_span'));
76                //window.getSelection().addRange(range);
77            }
78        };
79
80        recognition.onresult = function (event) {
81
82            console.log('Obteve resultado.');
83            final_transcript = '';
84            arrayFinal = [];
85
86            var interim_transcript = '';
87            for (var i = event.resultIndex; i < event.results.length; ++i) {
88                if (event.results[i].isFinal) {
89                    final_transcript += event.results[i][0].transcript;
90                } else {
91                    interim_transcript += event.results[i][0].transcript;
92                }
93            }
94
95            var div = document.getElementById('speechResult');
96            div.innerHTML = '<b>
96'+final_transcript+'</b>';
97
98            console.log('Valor final:' + final_transcript);
99            console.log('Valor temporário' + interim_transcript);
100
101            //if (final_transcript) {
102                run(final_transcript);
103
104                //Limpar elementos
105                final_transcript = '';
106                arrayFinal = [];
107            //}
108        };
109    }
110}
111
112
113function enableRepeat(){
114    document.getElementById('compositeSpeech:pausa').style.display='none';
115    document.getElementById('compositeSpeech:repetir').style.display='inline';
116    document.getElementById('divImage2').style.display='block';
117    document.getElementById('divImage1').style.display='none';
118}
119
120function cleanInputFocus() {
121    var elemInFocus = findFocusId();
122    dataStruct[elemInFocus][0] = '';
123    document.activeElement.value = '';
124}
125
126function findFocusId() {
127    for (var count = 0; count < globalStruct.length; count++) {
128        if (document.activeElement.id === globalStruct[count][0])
129            return count;
130    }
131    return -1;
132}
133
134function startButton(struct) {
135    
136    console.log("Valor:"+recognition);
137    
138    if(recognition===null || recognition === undefined)
139        speechHandler();
140    
141    
142    if (recognizing) {
143        recognition.stop();
144        return;
145    }
146    
147    final_transcript = '';
148
149    globalStruct=globalStruct.concat(struct);
150    //initDataStruct(globalStruct.length);
151
152    for (var count = 0; count < globalStruct.length; count++) {
153        delimiters.push(globalStruct[count][1]);
154    }
155
156    final_transcript = '';
157    recognition.lang = 'pt-PT';
158    recognition.start();
159    ignore_onend = false;
160}
161
162function endButton(){
163    
164    recognition.stop();
165    enableRepeat();
166    
167}
168
169
170function nextDelimiter(value) {
171
172    if (value === null || value === undefined || value === '')
173        return null;
174
175    var res = new Array();
176    var min = 1000;
177    var delimiterName;
178
179    for (var i = 0; i < delimiters.length; i++) {
180        var delimiter = value.search(delimiters[i]);
181        if (delimiter >= 0) {
182            newMin = Math.min(min, delimiter);
183            if (min > newMin) {
184                min = newMin;
185                delimiterName = delimiters[i];
186            }
187        }
188    }
189
190    if (min < 1000) {
191        res.push(delimiterName);
192        res.push(min);
193        return res;
194    }
195    else
196        return null;
197}
198
199function nextValue(value) {
200    var res = nextDelimiter(value);
201    if (res !== null)
202        return value.substring(res[1], value.length);
203    else
204        return null;
205}
206
207function splitByMultipleDelimiters(value) {
208
209    var delimiter = nextDelimiter(value);
210
211    if (delimiter === null) {
212        if (value === null)
213            return 0;
214        else
215            return value.length;
216    }
217    else {
218        var initial = delimiter[1] + delimiter[0].length + 1;
219        var newValue = value.substring(initial, value.length);
220
221        arrayFinal.push([delimiter[0], value.substring(initial, initial + splitByMultipleDelimiters(newValue))]);
222
223        return delimiter[1];
224    }
225}
226
227function getDataByToken(token) {
228
229    for (var count = 0; count < globalStruct.length; count++) {
230        if (globalStruct[count][1] === token)
231            return globalStruct[count];
232    }
233
234    return null;
235}
236
237function run(value) {
238
239    var initial = splitByMultipleDelimiters(value);
240
241    if (initial >= 0)
242        document.activeElement.value = document.activeElement.value + value.substring(0, initial);
243
244    arrayFinal.reverse();
245
246    for (var count = 0; count < arrayFinal.length; count++) {
247        var data = getDataByToken(arrayFinal[count][0]);
248
249        switch (data[2]) {
250            case 'button':
251                button(data[0]);
252                break;
253            case 'action':
254                action(data[0]);
255                break;
256            case 'input':
257                input(data[0],arrayFinal[count][1]);
258                break;
259            case 'select':
260                select(arrayFinal[count][1],data[0]);
261                break;
262            case 'input+action':
263                var tuple=data[0].split('##');
264                if(tuple.length===2){
265                    input(tuple[0],arrayFinal[count][1]);
266                    action(tuple[1]);
267                }
268                break;
269            case 'action+select+action':
270                var tuple=data[0].split('##');
271                
272                if(tuple.length===3){
273                    action(tuple[0]);
274                    select(arrayFinal[count][1],tuple[1]);
275                    action(tuple[2]);
276                }
277                break;
278            case 'select+action':
279                var tuple=data[0].split('##');
280                
281                if(tuple.length===2){
282                    select(arrayFinal[count][1],tuple[0]);
283                    action(tuple[1]);
284                }
285                break;
286        }
287    }
288}
289
290function select(initialValue,value){
291    var num=decode(initialValue);
292                
293    if(num!==null){
294        var finalValue = replace(value, num);
295        eval(finalValue);
296    }
297}
298
299function button(value){
300    document.getElementById(value).click();
301}
302
303function input(id, value){
304    document.getElementById(id).focus();
305    //document.activeElement.value +
306    document.activeElement.value =  value;
307}
308
309function action(value){
310    eval(value);
311}
312
313function decode(value){
314    
315    if(/^\d+$/.test(value))
316        return value - 1;
317    
318    switch (value) {
319        case 'primeira':
320        case 'primeiro':
321        case 'um':
322            return 0;
323        case 'um dia':
324        case 'segunda':
325        case 'segundo':    
326        case 'dois':
327            return 1;
328        case 'dois dias':
329        case 'terceiro':
330        case 'terceira':    
331        case 'três':
332            return 2;
333        case 'três dias':
334        case 'quarto':
335        case 'quarta':    
336        case 'quatro':
337            return 3;
338        case 'quatro dias':
339        case 'quinto':
340        case 'quinta':    
341        case 'cinco':
342            return 4;
343        case 'cinco dias':
344        case 'sexto':
345        case 'sexta':    
346        case 'seis':
347            return 5;
348        case 'seis dias':
349        case 'sétima':
350        case 'sétimo':    
351        case 'sete':
352            return 6;
353        case 'sete dias':
354        case 'oitavo':
355        case 'oitava':    
356        case 'oito':
357            return 7;
358    }
359    
360    return value;
361}
362
363function replace(content, newValue){
364    return content.replace('?',newValue);
365}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.