From 0740b810ebc822472dfa85187e82d3b82e405927 Mon Sep 17 00:00:00 2001 From: SaschaNaz Date: Sun, 1 Feb 2015 18:13:15 +0900 Subject: [PATCH 1/3] webspeechapi --- webspeechapi/webspeechapi.d.ts | 146 +++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 webspeechapi/webspeechapi.d.ts diff --git a/webspeechapi/webspeechapi.d.ts b/webspeechapi/webspeechapi.d.ts new file mode 100644 index 0000000000..a0c088bab5 --- /dev/null +++ b/webspeechapi/webspeechapi.d.ts @@ -0,0 +1,146 @@ +// 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 + +interface SpeechRecognition extends EventTarget { + grammars: SpeechGrammarList; + lang: string; + continuous: boolean; + interimResults: boolean; + maxAlternatives: number; + serviceURI: string; + + start(): void; + stop(): void; + abort(): void; + + onaudiostart: (ev: SpeechRecognitionEvent) => any; + onsoundstart: (ev: SpeechRecognitionEvent) => any; + onspeechstart: (ev: SpeechRecognitionEvent) => any; + onspeechend: (ev: SpeechRecognitionEvent) => any; + onsoundend: (ev: SpeechRecognitionEvent) => any; + onresult: (ev: SpeechRecognitionEvent) => any; + onnomatch: (ev: SpeechRecognitionEvent) => any; + onerror: (ev: SpeechRecognitionError) => any; + onstart: (ev: SpeechRecognitionEvent) => any; + onend: (ev: SpeechRecognitionEvent) => 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; + final: boolean; +} + +interface SpeechRecognitionResultList { + length: number; + item(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; + 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; + +interface SpeechSynthesis { + pending: boolean; + speaking: boolean; + paused: boolean; + + speak(utterance: SpeechSynthesisUtterance): void; + cancel(): void; + pause(): void; + resume(): void; + getVoices(): SpeechSynthesisVoiceList; +} + +interface SpeechSynthesisGetter { + speechSynthesis: SpeechSynthesis; +} +interface Window extends SpeechSynthesisGetter { +} + +interface SpeechSynthesisUtterance extends EventTarget { + text: string; + lang: string; + voiceURI: string; + volume: number; + rate: number; + pitch: number; + + onstart: (ev: SpeechSynthesisEvent) => any; + onend: (ev: SpeechSynthesisEvent) => any; + onerror: (ev: ErrorEvent) => 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 { + charIndex: number; + elapsedTime: number; + name: string; +} + +interface SpeechSynthesisVoice { + voiceURI: string; + name: string; + lang: string; + localService: boolean; + default: boolean; +} + +interface SpeechSynthesisVoiceList { + length: number; + item(index: number): SpeechSynthesisVoice; +} \ No newline at end of file From 0fa2e9c38a40ff9a78251afb79b3bee615ad5336 Mon Sep 17 00:00:00 2001 From: SaschaNaz Date: Tue, 3 Feb 2015 16:55:32 +0900 Subject: [PATCH 2/3] indices + tests --- webspeechapi/webspeechapi-tests.ts | 152 +++++++++++++++++++++++++++++ webspeechapi/webspeechapi.d.ts | 5 + 2 files changed, 157 insertions(+) create mode 100644 webspeechapi/webspeechapi-tests.ts diff --git a/webspeechapi/webspeechapi-tests.ts b/webspeechapi/webspeechapi-tests.ts new file mode 100644 index 0000000000..3479f897db --- /dev/null +++ b/webspeechapi/webspeechapi-tests.ts @@ -0,0 +1,152 @@ +/// + +/* +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].final` +*/ +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].final) { + 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 1) +*/ +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].final) { + 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')` +*/ +() => { + 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 index a0c088bab5..47e7ce5615 100644 --- a/webspeechapi/webspeechapi.d.ts +++ b/webspeechapi/webspeechapi.d.ts @@ -46,12 +46,14 @@ interface SpeechRecognitionAlternative { interface SpeechRecognitionResult { length: number; item(index: number): SpeechRecognitionAlternative; + [index: number]: SpeechRecognitionAlternative; final: boolean; } interface SpeechRecognitionResultList { length: number; item(index: number): SpeechRecognitionResult; + [index: number]: SpeechRecognitionResult; } interface SpeechRecognitionEvent extends Event { @@ -75,6 +77,7 @@ 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; } @@ -102,6 +105,7 @@ interface SpeechSynthesisGetter { } interface Window extends SpeechSynthesisGetter { } +declare var speechSynthesis: SpeechSynthesis; interface SpeechSynthesisUtterance extends EventTarget { text: string; @@ -143,4 +147,5 @@ interface SpeechSynthesisVoice { interface SpeechSynthesisVoiceList { length: number; item(index: number): SpeechSynthesisVoice; + [index: number]: SpeechSynthesisVoice; } \ No newline at end of file From ec8cccc29b5f37df43a7dd56777dc09670a5e671 Mon Sep 17 00:00:00 2001 From: SaschaNaz Date: Tue, 3 Feb 2015 18:14:22 +0900 Subject: [PATCH 3/3] event fix + corrections from errata --- webspeechapi/webspeechapi-tests.ts | 11 ++++--- webspeechapi/webspeechapi.d.ts | 49 +++++++++++++++++++----------- 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/webspeechapi/webspeechapi-tests.ts b/webspeechapi/webspeechapi-tests.ts index 3479f897db..91e623b0ff 100644 --- a/webspeechapi/webspeechapi-tests.ts +++ b/webspeechapi/webspeechapi-tests.ts @@ -44,7 +44,7 @@ declare var select: HTMLSelectElement; /* 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].final` +`event.results.final` -> `event.results[i].isFinal` (Recorded as Errata 02) */ declare var textarea: HTMLTextAreaElement; declare var button: HTMLButtonElement; @@ -57,7 +57,7 @@ declare var button: HTMLButtonElement; recognition.onresult = function (event) { for (var i = event.resultIndex; i < event.results.length; ++i) { - if (event.results[i].final) { + if (event.results[i].isFinal) { textarea.value += event.results[i][0].transcript; } } @@ -83,7 +83,8 @@ declare var button: HTMLButtonElement; // Example 4 /* This example has a change from the one in spec. -`recognition.interim = true;` -> `recognition.interimResults = true;` (Recorded as Errata 1) +`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; @@ -100,7 +101,7 @@ declare var interim_span: HTMLSpanElement; var final = ""; var interim = ""; for (var i = 0; i < event.results.length; ++i) { - if (event.results[i].final) { + if (event.results[i].isFinal) { final += event.results[i][0].transcript; } else { interim += event.results[i][0].transcript; @@ -135,7 +136,7 @@ declare var interim_span: HTMLSpanElement; // Example 1 /* This example has a change from the one in spec. -`SpeechSynthesisUtterance('Hello World')` -> `new SpeechSynthesisUtterance('Hello World')` +`SpeechSynthesisUtterance('Hello World')` -> `new SpeechSynthesisUtterance('Hello World')` (Recorded as Errata 09) */ () => { speechSynthesis.speak(new SpeechSynthesisUtterance('Hello World')); diff --git a/webspeechapi/webspeechapi.d.ts b/webspeechapi/webspeechapi.d.ts index 47e7ce5615..1b554af6a0 100644 --- a/webspeechapi/webspeechapi.d.ts +++ b/webspeechapi/webspeechapi.d.ts @@ -3,6 +3,10 @@ // 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; @@ -15,16 +19,16 @@ interface SpeechRecognition extends EventTarget { stop(): void; abort(): void; - onaudiostart: (ev: SpeechRecognitionEvent) => any; - onsoundstart: (ev: SpeechRecognitionEvent) => any; - onspeechstart: (ev: SpeechRecognitionEvent) => any; - onspeechend: (ev: SpeechRecognitionEvent) => any; - onsoundend: (ev: SpeechRecognitionEvent) => any; + 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: SpeechRecognitionEvent) => any; - onend: (ev: SpeechRecognitionEvent) => any; + onstart: (ev: Event) => any; + onend: (ev: Event) => any; } interface SpeechRecognitionStatic { prototype: SpeechRecognition; @@ -47,7 +51,8 @@ interface SpeechRecognitionResult { length: number; item(index: number): SpeechRecognitionAlternative; [index: number]: SpeechRecognitionAlternative; - final: boolean; + /* Errata 02 */ + isFinal: boolean; } interface SpeechRecognitionResultList { @@ -88,16 +93,21 @@ interface SpeechGrammarListStatic { declare var SpeechGrammarList: SpeechGrammarListStatic; declare var webkitSpeechGrammarList: SpeechGrammarListStatic; -interface SpeechSynthesis { +/* 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; - getVoices(): SpeechSynthesisVoiceList; + /* Errata 05 */ + getVoices(): SpeechSynthesisVoice[]; } interface SpeechSynthesisGetter { @@ -110,14 +120,16 @@ declare var speechSynthesis: SpeechSynthesis; interface SpeechSynthesisUtterance extends EventTarget { text: string; lang: string; - voiceURI: string; + /* Errata 07 */ + voice: SpeechSynthesisVoice; volume: number; rate: number; pitch: number; onstart: (ev: SpeechSynthesisEvent) => any; onend: (ev: SpeechSynthesisEvent) => any; - onerror: (ev: ErrorEvent) => any; + /* Errata 12 */ + onerror: (ev: SpeechSynthesisErrorEvent) => any; onpause: (ev: SpeechSynthesisEvent) => any; onresume: (ev: SpeechSynthesisEvent) => any; onmark: (ev: SpeechSynthesisEvent) => any; @@ -131,21 +143,22 @@ interface SpeechSynthesisUtteranceStatic { 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; -} - -interface SpeechSynthesisVoiceList { - length: number; - item(index: number): SpeechSynthesisVoice; - [index: number]: SpeechSynthesisVoice; } \ No newline at end of file