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