diff --git a/webspeechapi/webspeechapi-tests.ts b/webspeechapi/webspeechapi-tests.ts new file mode 100644 index 000000000..91e623b0f --- /dev/null +++ b/webspeechapi/webspeechapi-tests.ts @@ -0,0 +1,153 @@ +/// + +/* +Examples from the spec: +https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#examples-recognition +*/ + +// 6.1 Speech Recognition Examples + +// Example 1 +declare var q: HTMLInputElement; +() => { + var recognition = new SpeechRecognition(); + recognition.onresult = function (event) { + if (event.results.length > 0) { + q.value = event.results[0][0].transcript; + q.form.submit(); + } + } +} + +// Example 2 +declare var select: HTMLSelectElement; +() => { + var recognition = new SpeechRecognition(); + recognition.maxAlternatives = 10; + recognition.onresult = function (event) { + if (event.results.length > 0) { + var result = event.results[0]; + for (var i = 0; i < result.length; ++i) { + var text = result[i].transcript; + select.options[i] = new Option(text, text); + } + } + } + + function start() { + select.options.length = 0; + recognition.start(); + } +} + +// Example 3 +/* +This example has some changes from the one in spec. +`var i = resultIndex` -> `var i = event.resultIndex` (Recorded as Errata 16) +`event.results.final` -> `event.results[i].isFinal` (Recorded as Errata 02) +*/ +declare var textarea: HTMLTextAreaElement; +declare var button: HTMLButtonElement; +() => { + var recognizing: boolean; + var recognition = new SpeechRecognition(); + recognition.continuous = true; + reset(); + recognition.onend = reset; + + recognition.onresult = function (event) { + for (var i = event.resultIndex; i < event.results.length; ++i) { + if (event.results[i].isFinal) { + textarea.value += event.results[i][0].transcript; + } + } + } + + function reset() { + recognizing = false; + button.innerHTML = "Click to Speak"; + } + + function toggleStartStop() { + if (recognizing) { + recognition.stop(); + reset(); + } else { + recognition.start(); + recognizing = true; + button.innerHTML = "Click to Stop"; + } + } +} + +// Example 4 +/* +This example has a change from the one in spec. +`recognition.interim = true;` -> `recognition.interimResults = true;` (Recorded as Errata 01) +`event.results[i].final` -> `event.results[i].isFinal` (Recorded as Errata 02) +*/ +declare var button: HTMLButtonElement; +declare var final_span: HTMLSpanElement; +declare var interim_span: HTMLSpanElement; +() => { + var recognizing: boolean; + var recognition = new SpeechRecognition(); + recognition.continuous = true; + recognition.interimResults = true; + reset(); + recognition.onend = reset; + + recognition.onresult = function (event) { + var final = ""; + var interim = ""; + for (var i = 0; i < event.results.length; ++i) { + if (event.results[i].isFinal) { + final += event.results[i][0].transcript; + } else { + interim += event.results[i][0].transcript; + } + } + final_span.innerHTML = final; + interim_span.innerHTML = interim; + } + + function reset() { + recognizing = false; + button.innerHTML = "Click to Speak"; + } + + function toggleStartStop() { + if (recognizing) { + recognition.stop(); + reset(); + } else { + recognition.start(); + recognizing = true; + button.innerHTML = "Click to Stop"; + final_span.innerHTML = ""; + interim_span.innerHTML = ""; + } + } +} + + +// 6.2 Speech Synthesis Examples + +// Example 1 +/* +This example has a change from the one in spec. +`SpeechSynthesisUtterance('Hello World')` -> `new SpeechSynthesisUtterance('Hello World')` (Recorded as Errata 09) +*/ +() => { + speechSynthesis.speak(new SpeechSynthesisUtterance('Hello World')); +} + +//Example 2 +() => { + var u = new SpeechSynthesisUtterance(); + u.text = 'Hello World'; + u.lang = 'en-US'; + u.rate = 1.2; + u.onend = function (event) { alert('Finished in ' + event.elapsedTime + ' seconds.'); } + speechSynthesis.speak(u); +} \ No newline at end of file diff --git a/webspeechapi/webspeechapi.d.ts b/webspeechapi/webspeechapi.d.ts new file mode 100644 index 000000000..1b554af6a --- /dev/null +++ b/webspeechapi/webspeechapi.d.ts @@ -0,0 +1,164 @@ +// Type definitions for Web Speech API +// Project: https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html +// Definitions by: SaschaNaz +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +// Spec version: 19 October 2012 +// Errata version: 6 June 2014 +// Corrected unofficial spec version: 6 June 2014 + +interface SpeechRecognition extends EventTarget { + grammars: SpeechGrammarList; + lang: string; + continuous: boolean; + interimResults: boolean; + maxAlternatives: number; + serviceURI: string; + + start(): void; + stop(): void; + abort(): void; + + onaudiostart: (ev: Event) => any; + onsoundstart: (ev: Event) => any; + onspeechstart: (ev: Event) => any; + onspeechend: (ev: Event) => any; + onsoundend: (ev: Event) => any; + onresult: (ev: SpeechRecognitionEvent) => any; + onnomatch: (ev: SpeechRecognitionEvent) => any; + onerror: (ev: SpeechRecognitionError) => any; + onstart: (ev: Event) => any; + onend: (ev: Event) => any; +} +interface SpeechRecognitionStatic { + prototype: SpeechRecognition; + new (): SpeechRecognition; +} +declare var SpeechRecognition: SpeechRecognitionStatic; +declare var webkitSpeechRecognition: SpeechRecognitionStatic; + +interface SpeechRecognitionError extends Event { + error: string; + message: string; +} + +interface SpeechRecognitionAlternative { + transcript: string; + confidence: number; +} + +interface SpeechRecognitionResult { + length: number; + item(index: number): SpeechRecognitionAlternative; + [index: number]: SpeechRecognitionAlternative; + /* Errata 02 */ + isFinal: boolean; +} + +interface SpeechRecognitionResultList { + length: number; + item(index: number): SpeechRecognitionResult; + [index: number]: SpeechRecognitionResult; +} + +interface SpeechRecognitionEvent extends Event { + resultIndex: number; + results: SpeechRecognitionResultList; + interpretation: any; + emma: Document; +} + +interface SpeechGrammar { + src: string; + weight: number; +} +interface SpeechGrammarStatic { + prototype: SpeechGrammar; + new (): SpeechGrammar; +} +declare var SpeechGrammar: SpeechGrammarStatic; +declare var webkitSpeechGrammar: SpeechGrammarStatic; + +interface SpeechGrammarList { + length: number; + item(index: number): SpeechGrammar; + [index: number]: SpeechGrammar; + addFromURI(src: string, weight: number): void; + addFromString(string: string, weight: number): void; +} +interface SpeechGrammarListStatic { + prototype: SpeechGrammarList; + new (): SpeechGrammarList; +} +declare var SpeechGrammarList: SpeechGrammarListStatic; +declare var webkitSpeechGrammarList: SpeechGrammarListStatic; + +/* Errata 08 */ +interface SpeechSynthesis extends EventTarget { + pending: boolean; + speaking: boolean; + paused: boolean; + + /* Errata 11 */ + onvoiceschanged: (ev: Event) => any; + + speak(utterance: SpeechSynthesisUtterance): void; + cancel(): void; + pause(): void; + resume(): void; + /* Errata 05 */ + getVoices(): SpeechSynthesisVoice[]; +} + +interface SpeechSynthesisGetter { + speechSynthesis: SpeechSynthesis; +} +interface Window extends SpeechSynthesisGetter { +} +declare var speechSynthesis: SpeechSynthesis; + +interface SpeechSynthesisUtterance extends EventTarget { + text: string; + lang: string; + /* Errata 07 */ + voice: SpeechSynthesisVoice; + volume: number; + rate: number; + pitch: number; + + onstart: (ev: SpeechSynthesisEvent) => any; + onend: (ev: SpeechSynthesisEvent) => any; + /* Errata 12 */ + onerror: (ev: SpeechSynthesisErrorEvent) => any; + onpause: (ev: SpeechSynthesisEvent) => any; + onresume: (ev: SpeechSynthesisEvent) => any; + onmark: (ev: SpeechSynthesisEvent) => any; + onboundary: (ev: SpeechSynthesisEvent) => any; +} +interface SpeechSynthesisUtteranceStatic { + prototype: SpeechSynthesisUtterance; + new (): SpeechSynthesisUtterance; + new (text: string): SpeechSynthesisUtterance; +} +declare var SpeechSynthesisUtterance: SpeechSynthesisUtteranceStatic; + +interface SpeechSynthesisEvent extends Event { + /* Errata 08 */ + utterance: SpeechSynthesisUtterance; + charIndex: number; + elapsedTime: number; + name: string; +} + +/* Errata 12 */ +interface SpeechSynthesisErrorEvent extends SpeechSynthesisEvent { + error: string; +} + +interface SpeechSynthesisVoice { + voiceURI: string; + name: string; + lang: string; + localService: boolean; + default: boolean; +} \ No newline at end of file