SpeechRecognition-onresult-manual.https.html (5652B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="timeout" content="long"> 6 <title>SpeechRecognition.onresult</title> 7 <script src="/resources/testharness.js"></script> 8 <script src="/resources/testharnessreport.js"></script> 9 <script> 10 var TIMEOUT_OVERRIDE = 60000; // In milliseconds. 11 </script> 12 <script src="webspeech.js"></script> 13 </head> 14 <body> 15 <b>Instructions:</b> 16 <p>Reload and re-run this test at least 4 times to cover all 4 combinations 17 of these checkboxes: 18 <input type="checkbox" id="continuous">continuous 19 <input type="checkbox" id="interim">interimResults 20 <button id="button" onclick="startButton()">Click and Speak</button> 21 <br> 22 You may also wish to test with various combinations of these: 23 maxAlternatives: 24 <input type="text" value="3" size="2" id="maxAlternatives">, 25 language: 26 <input type="text" value="en-us" size="7" id="language"> 27 </p> 28 <div id="results"></div> 29 <div id="log"></div> 30 <div id="notes"></div> 31 <script> 32 var audioTest = new CycleTest('onaudio'); 33 reco.onaudiostart = audioTest.startEvent(); 34 reco.onaudioend = audioTest.endEvent(); 35 36 var soundTest = new CycleTest('onsound'); 37 reco.onsoundstart = soundTest.startEvent(); 38 reco.onsoundend = soundTest.endEvent(); 39 40 var speechTest = new CycleTest('onspeech'); 41 reco.onspeechstart = speechTest.startEvent(); 42 reco.onspeechend = speechTest.endEvent(); 43 44 reco.onerror = neverFireEvent('onerror'); 45 reco.onnomatch = neverFireEvent('onnomatch'); 46 47 var lastIsFinal = -1; // Highest results index that has been marked isFinal. 48 var lastInterimCount = 0; // Number of results that are not marked isFinal. 49 var resultTest = new CountTest('onresult', 1, 9999); 50 51 resultTest.whenDone = function() { 52 assert_equals(lastInterimCount, 0, 'Number of interim results pending'); 53 }; 54 55 function appendAlternatives(array, results) { 56 for (var i = 0; i < reco.maxAlternatives; i++) { 57 if (i < results.length) { 58 array[i] += results[i].transcript; 59 } else { 60 array[i] += '<no alternative>'; 61 assert_true(i > 0, 'Must return at least one alternative.'); 62 } 63 } 64 } 65 66 reco.onresult = resultTest.test().step_func(function(event) { 67 resultTest.count(1); 68 var final = new Array(); 69 var interim = new Array(); 70 for (var i = 0; i < reco.maxAlternatives; i++) { 71 final[i] = ''; 72 interim[i] = ''; 73 } 74 assert_true(event.resultIndex > lastIsFinal, 'resultIndex must not ' + 75 'indicate a change in a result that was previously marked isFinal.'); 76 assert_true(event.resultIndex <= event.results.length, 77 'resultIndex must not be greater than results.length.'); 78 for (var i = 0; i < event.results.length; ++i) { 79 assert_true(event.results[i].length <= reco.maxAlternatives, 80 'Number of alternatives must not exceed maxAlternatives.'); 81 if (event.results[i].isFinal) { 82 appendAlternatives(final, event.results[i]); 83 assert_true(reco.continuous || i < 1, 84 'When SpeechRecognition.continuous is false, no more than one ' + 85 'SpeechRecognitionResult.isFinal true should be returned.'); 86 if (i > lastIsFinal) { 87 lastIsFinal = i; 88 } 89 } else { 90 appendAlternatives(interim, event.results[i]); 91 assert_true(i > lastIsFinal, 'A SpeechRecognitionResult was previously ' + 92 'marked isFinal, but now is not marked isFinal.'); 93 } 94 lastInterimCount = event.results.length - lastIsFinal - 1; 95 assert_true(reco.interimResults || lastInterimCount == 0, 96 'Should not return interim results when reco.interimResults is false.'); 97 } 98 for (var i = 0; i < reco.maxAlternatives; i++) { 99 document.getElementById('final_span_' + i).innerHTML = final[i]; 100 document.getElementById('interim_span_' + i).innerHTML = interim[i]; 101 } 102 }); 103 104 function configureRecognition() { 105 var continuousBox = document.getElementById('continuous'); 106 var interimBox = document.getElementById('interim'); 107 var maxAlternativesInput = document.getElementById('maxAlternatives'); 108 var langInput = document.getElementById('language'); 109 reco.continuous = continuousBox.checked; 110 reco.interimResults = interimBox.checked; 111 reco.maxAlternatives = maxAlternativesInput.value; 112 reco.lang = langInput.value; 113 continuousBox.disabled = true; 114 interimBox.disabled = true; 115 maxAlternativesInput.disabled = true; 116 langInput.disabled = true; 117 test(function() { 118 assert_equals(reco.continuous, continuousBox.checked, 119 'SpeechRecognition.continuous'); 120 assert_equals(reco.interimResults, interim.checked, 121 'SpeechRecognition.interimResults'); 122 assert_equals(reco.maxAlternatives, parseInt(maxAlternativesInput.value), 123 'SpeechRecognition.maxAlternatives'); 124 assert_equals(reco.lang, langInput.value, 125 'SpeechRecognition.lang'); 126 }, 'SpeechRecognition settings'); 127 } 128 129 var clicks = 0; 130 function startButton() { 131 var button = document.getElementById('button'); 132 if (++clicks == 1) { 133 configureRecognition(); 134 if (reco.continuous) { 135 button.innerHTML = 'Click when done speaking'; 136 } else { 137 button.hidden = true; 138 } 139 var results_html = ''; 140 for (var i = 0; i < reco.maxAlternatives; i++) { 141 results_html += '<div style="border:1px dotted gray; padding:10px; ' + 142 'font-weight:bold">' + 143 '<span id="final_span_' + i + '"></span>' + 144 '<span id="interim_span_' + i + '" style="color:blue"></span>' + 145 '</div>'; 146 } 147 results.innerHTML = results_html; 148 reco.start(); 149 } else { 150 button.hidden = true; 151 reco.stop(); 152 } 153 } 154 </script> 155 </body> 156 </html>