| <!DOCTYPE html> |
| <html lang="en"> |
| <title>SpeechRecognition RecognitionContext</title> |
| |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| |
| <script> |
| async function getAudioTrackFromFile(filePath) { |
| const audioContext = new AudioContext(); |
| const response = await fetch(filePath); |
| const arrayBuffer = await response.arrayBuffer(); |
| const audioBuffer = await audioContext.decodeAudioData(arrayBuffer); |
| const source = audioContext.createBufferSource(); |
| source.buffer = audioBuffer; |
| |
| const destination = audioContext.createMediaStreamDestination(); |
| source.connect(destination); |
| source.start(); |
| |
| return destination.stream.getAudioTracks()[0]; |
| } |
| |
| promise_test(async (t) => { |
| // Verify the audio track for recognition context exists. |
| const audioTrack = await getAudioTrackFromFile("/media/recognition_context.mp3"); |
| assert_true( |
| audioTrack instanceof MediaStreamTrack, |
| "Audio track should be a valid MediaStreamTrack" |
| ); |
| |
| // Create the recognition context. |
| var list = new SpeechRecognitionPhraseList(); |
| list.addItem(new SpeechRecognitionPhrase("ASIC", 1.0)); |
| list.addItem(new SpeechRecognitionPhrase("FPGA", 1.0)); |
| var context = new SpeechRecognitionContext(list); |
| |
| // Create the first speech recognition with a mode that does not support |
| // recognition context. Note that this may vary between browsers in the future. |
| window.SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; |
| const recognition1 = new SpeechRecognition(); |
| recognition1.mode = "cloud-only"; |
| recognition1.lang = "en-US"; |
| recognition1.context = context; |
| |
| recognition1.onerror = function(event) { |
| assert_equals( |
| event.error, |
| "recognition-context-not-supported", |
| "First speech recognition should throw a recognition-context-not-supported error" |
| ); |
| }; |
| |
| recognition1.start(audioTrack); |
| |
| // Create the second speech recognition with a mode that supports recognition context. |
| const recognition2 = new SpeechRecognition(); |
| recognition2.mode = "ondevice-only"; |
| recognition2.lang = "en-US"; |
| recognition2.context = context; |
| |
| recognition2.onerror = function(event) { |
| // Currently WPT may not be able to detect that SODA is available and |
| // will throw a "language-not-supported" error here. |
| assert_unreached(); |
| }; |
| |
| const recognitionPromise = new Promise((resolve) => { |
| recognition2.onresult = (event) => { |
| const transcript = event.results[0][0].transcript; |
| resolve(transcript); |
| }; |
| }); |
| recognition2.start(audioTrack); |
| |
| const transcript = await recognitionPromise; |
| assert_equals( |
| transcript.toLowerCase(), |
| "the report confirmed that the asic's throughput and " + |
| "the fpga's latency were both below expectations", |
| "Second speech recognition should correctly recognize the phrases" |
| ); |
| }, "SpeechRecognition should recognize speech with the given recognition context."); |
| </script> |
| </html> |