157 lines
5.5 KiB
HTML
157 lines
5.5 KiB
HTML
<!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>
|
|
|