aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/util/DictationManager.ts81
-rw-r--r--src/client/views/GlobalKeyHandler.ts3
-rw-r--r--src/client/views/MainView.tsx2
-rw-r--r--src/client/views/nodes/DocumentView.tsx3
-rw-r--r--src/new_fields/Doc.ts2
5 files changed, 59 insertions, 32 deletions
diff --git a/src/client/util/DictationManager.ts b/src/client/util/DictationManager.ts
index b02a5ecbe..89797f101 100644
--- a/src/client/util/DictationManager.ts
+++ b/src/client/util/DictationManager.ts
@@ -39,57 +39,82 @@ export namespace DictationManager {
const { webkitSpeechRecognition }: CORE.IWindow = window as CORE.IWindow;
let isListening = false;
- const recognizer = (() => {
- let initialized = new webkitSpeechRecognition();
- initialized.continuous = true;
- initialized.language = "en-US";
- return initialized;
- })();
+ let isManuallyStopped = false;
+ const recognizer: SpeechRecognition = new webkitSpeechRecognition();
export namespace Controls {
+ let newestResult: string;
export type InterimResultHandler = (results: any) => any;
+ export type ContinuityArgs = { indefinite: boolean } | false;
+ export interface ListeningOptions {
+ language: string;
+ continuous: ContinuityArgs;
+ interimHandler: InterimResultHandler;
+ delimiter: string;
+ }
- export const listen = (handler: Opt<InterimResultHandler> = undefined) => {
+ export const listen = (options?: Partial<ListeningOptions>) => {
if (isListening) {
return undefined;
}
isListening = true;
+ let handler = options ? options.interimHandler : undefined;
+ let continuous = options ? options.continuous : undefined;
+ let language = options ? options.language : undefined;
+ let delimiter = options ? options.delimiter : undefined;
+
recognizer.interimResults = handler !== undefined;
+ recognizer.continuous = continuous === undefined ? false : continuous !== false;
+ recognizer.lang = language === undefined ? "en-US" : language;
+
recognizer.start();
return new Promise<string>((resolve, reject) => {
+
recognizer.onerror = (e: any) => {
reject(e);
stop();
};
- if (handler) {
- let newestResult: string;
- recognizer.onresult = (e: any) => {
- newestResult = e.results[0][0].transcript;
- handler(newestResult);
- };
- recognizer.onend = (e: any) => {
+
+ recognizer.onresult = (e: SpeechRecognitionEvent) => {
+ newestResult = synthesize(e, delimiter);
+ handler && handler(newestResult);
+ };
+
+ recognizer.onend = (e: Event) => {
+ if (continuous && continuous.indefinite && !isManuallyStopped) {
+ recognizer.start();
+ } else {
resolve(newestResult);
- stop();
- };
- } else {
- recognizer.onresult = (e: any) => {
- let finalResult = e.results[0][0].transcript;
- resolve(finalResult);
- stop();
- };
- }
+ reset();
+ }
+ };
+
});
};
- export const stop = () => {
- recognizer.stop();
+ export const stop = (saveCumulative = true) => {
+ saveCumulative ? recognizer.stop() : recognizer.abort();
+ reset();
+ };
+
+ const reset = () => {
isListening = false;
- recognizer.onresult = undefined;
- recognizer.onend = undefined;
- recognizer.onerror = undefined;
+ isManuallyStopped = false;
+ recognizer.onresult = null;
+ recognizer.onend = null;
+ recognizer.onerror = null;
+ };
+
+ const synthesize = (e: SpeechRecognitionEvent, delimiter?: string) => {
+ let results = e.results;
+ let transcripts: string[] = [];
+ for (let i = 0; i < results.length; i++) {
+ transcripts.push(results.item(i).item(0).transcript.trim());
+ }
+ return transcripts.join(delimiter || "...");
};
}
diff --git a/src/client/views/GlobalKeyHandler.ts b/src/client/views/GlobalKeyHandler.ts
index 82289c249..98df43a1e 100644
--- a/src/client/views/GlobalKeyHandler.ts
+++ b/src/client/views/GlobalKeyHandler.ts
@@ -112,7 +112,8 @@ export default class KeyManager {
main.dictationOverlayVisible = true;
main.isListening = true;
- let command = await DictationManager.Controls.listen((results: any) => console.log(results));
+ // let printer = (results: any) => console.log(results);
+ let command = await DictationManager.Controls.listen();
main.isListening = false;
if (!command) {
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index 748e1e634..5cec34293 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -49,7 +49,7 @@ export class MainView extends React.Component {
@observable public pwidth: number = 0;
@observable public pheight: number = 0;
- @observable private dictationState = "Listening...";
+ @observable private dictationState = "";
@observable private dictationSuccessState: boolean | undefined = undefined;
@observable private dictationDisplayState = false;
@observable private dictationListeningState = false;
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index c5d526a5a..bd87bf21b 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -539,7 +539,8 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
}
listen = async () => {
- let transcript = await DictationManager.Controls.listen();
+ let options = { continuous: { indefinite: true }, delimiter: " " };
+ let transcript = await DictationManager.Controls.listen(options);
transcript && (Doc.GetProto(this.props.Document).transcript = transcript);
}
diff --git a/src/new_fields/Doc.ts b/src/new_fields/Doc.ts
index 84b8589dd..979574f16 100644
--- a/src/new_fields/Doc.ts
+++ b/src/new_fields/Doc.ts
@@ -531,7 +531,7 @@ export namespace Doc {
d.layout = detailLayout;
d.nativeWidth = d.nativeHeight = undefined;
if (detailLayout instanceof Doc) {
- let delegDetailLayout = Doc.MakeDelegate(detailLayout) as Doc;
+ let delegDetailLayout = Doc.MakeDelegate(detailLayout);
d.layout = delegDetailLayout;
let subDetailLayout1 = await PromiseValue(delegDetailLayout.detailedLayout);
let subDetailLayout = await PromiseValue(delegDetailLayout.detailedLayout);