|  | <!DOCTYPE html> | 
|  | <html> | 
|  | <head> | 
|  | <meta charset="utf-8"> | 
|  | <meta name="timeout" content="long"> | 
|  | <title>SpeechRecognition.onresult</title> | 
|  | <script src="/resources/testharness.js"></script> | 
|  | <script src="/resources/testharnessreport.js"></script> | 
|  | <script> | 
|  | var TIMEOUT_OVERRIDE = 60000;  // In milliseconds. | 
|  | </script> | 
|  | <script src="webspeech.js"></script> | 
|  | </head> | 
|  | <body> | 
|  | <b>Instructions:</b> | 
|  | <p>Reload and re-run this test at least 4 times to cover all 4 combinations | 
|  | of these checkboxes: | 
|  | <input type="checkbox" id="continuous">continuous | 
|  | <input type="checkbox" id="interim">interimResults | 
|  | <button id="button" onclick="startButton()">Click and Speak</button> | 
|  | <br> | 
|  | You may also wish to test with various combinations of these: | 
|  | maxAlternatives: | 
|  | <input type="text" value="3" size="2" id="maxAlternatives">, | 
|  | language: | 
|  | <input type="text" value="en-us" size="7" id="language"> | 
|  | </p> | 
|  | <div id="results"></div> | 
|  | <div id="log"></div> | 
|  | <div id="notes"></div> | 
|  | <script> | 
|  | var audioTest = new CycleTest('onaudio'); | 
|  | reco.onaudiostart = audioTest.startEvent(); | 
|  | reco.onaudioend = audioTest.endEvent(); | 
|  |  | 
|  | var soundTest = new CycleTest('onsound'); | 
|  | reco.onsoundstart = soundTest.startEvent(); | 
|  | reco.onsoundend = soundTest.endEvent(); | 
|  |  | 
|  | var speechTest = new CycleTest('onspeech'); | 
|  | reco.onspeechstart = speechTest.startEvent(); | 
|  | reco.onspeechend = speechTest.endEvent(); | 
|  |  | 
|  | reco.onerror = neverFireEvent('onerror'); | 
|  | reco.onnomatch = neverFireEvent('onnomatch'); | 
|  |  | 
|  | var lastIsFinal = -1;  // Highest results index that has been marked isFinal. | 
|  | var lastInterimCount = 0;  // Number of results that are not marked isFinal. | 
|  | var resultTest = new CountTest('onresult', 1, 9999); | 
|  |  | 
|  | resultTest.whenDone = function() { | 
|  | assert_equals(lastInterimCount, 0, 'Number of interim results pending'); | 
|  | }; | 
|  |  | 
|  | function appendAlternatives(array, results) { | 
|  | for (var i = 0; i < reco.maxAlternatives; i++) { | 
|  | if (i < results.length) { | 
|  | array[i] += results[i].transcript; | 
|  | } else { | 
|  | array[i] += '<no alternative>'; | 
|  | assert_true(i > 0, 'Must return at least one alternative.'); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | reco.onresult = resultTest.test().step_func(function(event) { | 
|  | resultTest.count(1); | 
|  | var final = new Array(); | 
|  | var interim = new Array(); | 
|  | for (var i = 0; i < reco.maxAlternatives; i++) { | 
|  | final[i] = ''; | 
|  | interim[i] = ''; | 
|  | } | 
|  | assert_true(event.resultIndex > lastIsFinal, 'resultIndex must not ' + | 
|  | 'indicate a change in a result that was previously marked isFinal.'); | 
|  | assert_true(event.resultIndex <= event.results.length, | 
|  | 'resultIndex must not be greater than results.length.'); | 
|  | for (var i = 0; i < event.results.length; ++i) { | 
|  | assert_true(event.results[i].length <= reco.maxAlternatives, | 
|  | 'Number of alternatives must not exceed maxAlternatives.'); | 
|  | if (event.results[i].isFinal) { | 
|  | appendAlternatives(final, event.results[i]); | 
|  | assert_true(reco.continuous || i < 1, | 
|  | 'When SpeechRecognition.continuous is false, no more than one ' + | 
|  | 'SpeechRecognitionResult.isFinal true should be returned.'); | 
|  | if (i > lastIsFinal) { | 
|  | lastIsFinal = i; | 
|  | } | 
|  | } else { | 
|  | appendAlternatives(interim, event.results[i]); | 
|  | assert_true(i > lastIsFinal, 'A SpeechRecognitionResult was previously ' + | 
|  | 'marked isFinal, but now is not marked isFinal.'); | 
|  | } | 
|  | lastInterimCount = event.results.length - lastIsFinal - 1; | 
|  | assert_true(reco.interimResults || lastInterimCount == 0, | 
|  | 'Should not return interim results when reco.interimResults is false.'); | 
|  | } | 
|  | for (var i = 0; i < reco.maxAlternatives; i++) { | 
|  | document.getElementById('final_span_' + i).innerHTML = final[i]; | 
|  | document.getElementById('interim_span_' + i).innerHTML = interim[i]; | 
|  | } | 
|  | }); | 
|  |  | 
|  | function configureRecognition() { | 
|  | var continuousBox = document.getElementById('continuous'); | 
|  | var interimBox = document.getElementById('interim'); | 
|  | var maxAlternativesInput = document.getElementById('maxAlternatives'); | 
|  | var langInput = document.getElementById('language'); | 
|  | reco.continuous = continuousBox.checked; | 
|  | reco.interimResults = interimBox.checked; | 
|  | reco.maxAlternatives = maxAlternativesInput.value; | 
|  | reco.lang = langInput.value; | 
|  | continuousBox.disabled = true; | 
|  | interimBox.disabled = true; | 
|  | maxAlternativesInput.disabled = true; | 
|  | langInput.disabled = true; | 
|  | test(function() { | 
|  | assert_equals(reco.continuous, continuousBox.checked, | 
|  | 'SpeechRecognition.continuous'); | 
|  | assert_equals(reco.interimResults, interim.checked, | 
|  | 'SpeechRecognition.interimResults'); | 
|  | assert_equals(reco.maxAlternatives, parseInt(maxAlternativesInput.value), | 
|  | 'SpeechRecognition.maxAlternatives'); | 
|  | assert_equals(reco.lang, langInput.value, | 
|  | 'SpeechRecognition.lang'); | 
|  | }, 'SpeechRecognition settings'); | 
|  | } | 
|  |  | 
|  | var clicks = 0; | 
|  | function startButton() { | 
|  | var button = document.getElementById('button'); | 
|  | if (++clicks == 1) { | 
|  | configureRecognition(); | 
|  | if (reco.continuous) { | 
|  | button.innerHTML = 'Click when done speaking'; | 
|  | } else { | 
|  | button.hidden = true; | 
|  | } | 
|  | var results_html = ''; | 
|  | for (var i = 0; i < reco.maxAlternatives; i++) { | 
|  | results_html += '<div style="border:1px dotted gray; padding:10px; ' + | 
|  | 'font-weight:bold">' + | 
|  | '<span id="final_span_' + i + '"></span>' + | 
|  | '<span id="interim_span_' + i + '" style="color:blue"></span>' + | 
|  | '</div>'; | 
|  | } | 
|  | results.innerHTML = results_html; | 
|  | reco.start(); | 
|  | } else { | 
|  | button.hidden = true; | 
|  | reco.stop(); | 
|  | } | 
|  | } | 
|  | </script> | 
|  | </body> | 
|  | </html> | 
|  |  |