-
Notifications
You must be signed in to change notification settings - Fork 16
/
speech.service.ts
52 lines (44 loc) · 1.37 KB
/
speech.service.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import { Injectable, Inject } from '@angular/core';
import { Observable } from 'rxjs/Observable';
// TODO: get this injected properly
const SpeechRecognition = window && (
(<any>window).SpeechRecognition || (<any>window).webkitSpeechRecognition ||
(<any>window).mozSpeechRecognition || (<any>window).msSpeechRecogntion
);
@Injectable()
export class SpeechService {
constructor() {
}
listen(): Observable<string[]> {
return new Observable<string[]>(observer => {
const speech = new SpeechRecognition();
const resultHandler = (e: any) => {
console.log(e);
const results: string[] = this.cleanSpeechResults(e.results);
observer.next(results);
observer.complete();
};
const errorHandler = (err) => {
observer.error(err);
};
speech.addEventListener('result', resultHandler);
speech.addEventListener('error', errorHandler);
speech.start();
return () => {
speech.removeEventListener('result', resultHandler);
speech.removeEventListener('error', errorHandler);
speech.abort();
};
});
}
private cleanSpeechResults(results: any): string[] {
return <string[]>(
Array.from(results)
.reduce(
(final: string[], result: any) =>
final.concat(Array.from(result, (x: any) => x.transcript)),
[]
)
);
}
}