| <!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> | |