Skip to content

Commit fab3a70

Browse files
authored
Merge pull request #26 from codeforequity-at/bugfix/BOT-3625-voice-stt-throttling---error-ha
Bugfix/bot 3625 voice stt throttling error ha
2 parents b4d8068 + 44e33a8 commit fab3a70

File tree

7 files changed

+109
-31
lines changed

7 files changed

+109
-31
lines changed

docker-compose-frontend.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
version: '3'
2+
services:
3+
frontend:
4+
image: botium/botium-speech-frontend:develop
5+
restart: always
6+
user: 1000:1000
7+
ports:
8+
- 80:56000
9+
environment:
10+
BOTIUM_API_TOKENS:
11+
BOTIUM_SPEECH_PROVIDER_TTS: marytts
12+
BOTIUM_SPEECH_PROVIDER_STT: kaldi
13+
BOTIUM_SPEECH_GOOGLE_CLIENT_EMAIL:
14+
BOTIUM_SPEECH_GOOGLE_PRIVATE_KEY:
15+
volumes:
16+
- "./frontend/resources:/app/resources"
17+
volumes:
18+
logs:

frontend/src/routes.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -885,7 +885,8 @@ const wssUpgrade = (req, socket, head) => {
885885

886886
const wss1 = new WebSocketServer({ noServer: true })
887887
wss1.on('connection', async (ws) => {
888-
stream.events.on('data', (data) => {
888+
stream.events.on('data', async (data) => {
889+
if (data.err) debug(data)
889890
data.streamDuration = ((new Date() - stream.dateTimeStart) / 1000).toFixed(3)
890891
ws.send(JSON.stringify(data))
891892
})
@@ -903,6 +904,7 @@ const wssUpgrade = (req, socket, head) => {
903904
stream.close()
904905
wss1.close()
905906
})
907+
stream.triggerHistoryEmit()
906908
})
907909
wss1.handleUpgrade(req, socket, head, (ws) => {
908910
wss1.emit('connection', ws, req)

frontend/src/stt/awstranscribe.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class AwsTranscribeSTT {
7878
applyIfExists(request, req, 'req.body.awstranscribe.config.streaming')
7979

8080
const events = new EventEmitter()
81+
let eventHistory = []
8182
try {
8283
const cmdResponse = await transcribeClient.send(new StartStreamTranscriptionCommand(request))
8384
setTimeout(async () => {
@@ -88,21 +89,26 @@ class AwsTranscribeSTT {
8889
if (results && results.length > 0) {
8990
for (const result of results) {
9091
const event = {
92+
status: 'ok',
9193
text: result.Alternatives[0].Transcript,
9294
final: !result.IsPartial,
9395
start: result.StartTime,
9496
end: result.EndTime,
9597
debug: result
9698
}
9799
events.emit('data', event)
100+
eventHistory.push(event)
98101
}
99102
}
100103
}
101104
} catch (err) {
102105
debug(`TranscriptResultStream failure: ${err.Message || err.message || err}`)
103-
events.emit('data', {
104-
err: `${err.message || err}`
105-
})
106+
const event = {
107+
status: 'error',
108+
err: `AWS Transcribe STT failed: ${err.message || err}`
109+
}
110+
events.emit('data', event)
111+
eventHistory.push(event)
106112
}
107113
events.emit('close')
108114
debug('Ready listening to TranscriptResultStream ')
@@ -126,6 +132,12 @@ class AwsTranscribeSTT {
126132
audioInputStream.destroy()
127133
}
128134
audioInputStream = null
135+
eventHistory = null
136+
},
137+
triggerHistoryEmit: () => {
138+
for (const eh of eventHistory) {
139+
events.emit('data', eh)
140+
}
129141
}
130142
}
131143
}

frontend/src/stt/azure.js

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -52,46 +52,56 @@ class AzureSTT {
5252
const recognizer = new SpeechRecognizer(speechConfig, audioConfig)
5353

5454
const events = new EventEmitter()
55+
let eventHistory = []
5556

5657
const recognizedHandler = (s, e) => {
5758
if (e.result.reason === ResultReason.RecognizedSpeech || e.result.reason === ResultReason.RecognizingSpeech) {
5859
const event = {
60+
status: 'ok',
5961
text: e.result.text,
6062
final: e.result.reason === ResultReason.RecognizedSpeech,
6163
debug: e.result
6264
}
6365
event.start = _.round(e.result.offset / 10000000, 3)
6466
event.end = _.round((e.result.offset + e.result.duration) / 10000000, 3)
6567
events.emit('data', event)
68+
eventHistory.push(event)
6669
}
6770
}
6871
recognizer.recognizing = recognizedHandler
6972
recognizer.recognized = recognizedHandler
7073
recognizer.sessionStopped = (s, e) => {
7174
recognizer.stopContinuousRecognitionAsync()
72-
events.emit('close')
75+
}
76+
recognizer.canceled = (s, e) => {
77+
const event = {
78+
status: 'error',
79+
err: `Azure STT failed: ${getAzureErrorDetails(e)}`
80+
}
81+
events.emit('data', event)
82+
eventHistory.push(event)
7383
}
7484
recognizer.startContinuousRecognitionAsync()
7585

7686
return new Promise((resolve, reject) => {
77-
recognizer.canceled = (s, e) => {
78-
recognizer.stopContinuousRecognitionAsync()
79-
reject(new Error(`Azure STT failed: ${getAzureErrorDetails(e)}`))
80-
}
81-
recognizer.sessionStarted = (s, e) => {
82-
resolve({
83-
events,
84-
write: (buffer) => {
85-
pushStream.write(buffer)
86-
},
87-
end: () => {
88-
},
89-
close: () => {
90-
recognizer.stopContinuousRecognitionAsync()
91-
pushStream.close()
87+
resolve({
88+
events,
89+
write: (buffer) => {
90+
pushStream.write(buffer)
91+
},
92+
end: () => {
93+
},
94+
close: () => {
95+
recognizer.stopContinuousRecognitionAsync()
96+
pushStream.close()
97+
eventHistory = null
98+
},
99+
triggerHistoryEmit: () => {
100+
for (const eh of eventHistory) {
101+
events.emit('data', eh)
92102
}
93-
})
94-
}
103+
}
104+
})
95105
})
96106
}
97107

frontend/src/stt/google.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,13 @@ class GoogleSTT {
7373
const bufferStream = new PassThrough()
7474
bufferStream.pipe(recognizeStream)
7575
const events = new EventEmitter()
76+
let eventHistory = []
7677

7778
recognizeStream.on('data', (data) => {
7879
const alternative = data.results[0] && data.results[0].alternatives[0]
7980
if (alternative && alternative.transcript) {
8081
const event = {
82+
status: 'ok',
8183
text: alternative.transcript,
8284
final: !!data.results[0].isFinal,
8385
debug: data
@@ -87,12 +89,16 @@ class GoogleSTT {
8789
event.end = _.round(_.toNumber(alternative.words[alternative.words.length - 1].endTime.seconds) + _.toNumber(alternative.words[alternative.words.length - 1].endTime.nanos) / 1000000000, 3)
8890
}
8991
events.emit('data', event)
92+
eventHistory.push(event)
9093
}
9194
})
9295
recognizeStream.on('error', (err) => {
93-
events.emit('data', {
94-
err: `${err.message}`
95-
})
96+
const event = {
97+
status: 'error',
98+
err: `Google STT failed: ${err.message}`
99+
}
100+
events.emit('data', event)
101+
eventHistory.push(event)
96102
})
97103
recognizeStream.on('close', () => {
98104
events.emit('close')
@@ -112,7 +118,13 @@ class GoogleSTT {
112118
if (recognizeStream) {
113119
recognizeStream.destroy()
114120
}
121+
eventHistory = null
115122
recognizeStream = null
123+
},
124+
triggerHistoryEmit: () => {
125+
for (const eh of eventHistory) {
126+
events.emit('data', eh)
127+
}
116128
}
117129
}
118130
}

frontend/src/stt/ibm.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,14 @@ class IbmSTT {
4242
const bufferStream = new PassThrough()
4343
bufferStream.pipe(recognizeStream)
4444
const events = new EventEmitter()
45+
let eventHistory = []
4546

4647
recognizeStream.on('data', (data) => {
4748
for (const result of data.results || []) {
4849
const transcription = result.alternatives[0] ? result.alternatives[0].transcript : null
4950
if (transcription) {
5051
const event = {
52+
status: 'ok',
5153
text: transcription,
5254
final: !!result.final,
5355
debug: result
@@ -57,13 +59,17 @@ class IbmSTT {
5759
event.end = _.round(result.alternatives[result.alternatives.length - 1].timestamps[0][2], 3)
5860
}
5961
events.emit('data', event)
62+
eventHistory.push(event)
6063
}
6164
}
6265
})
6366
recognizeStream.on('error', (err) => {
64-
events.emit('data', {
65-
err: `${err.message}`
66-
})
67+
const event = {
68+
status: 'error',
69+
err: `IBM STT failed: ${err.message}`
70+
}
71+
events.emit('data', event)
72+
eventHistory.push(event)
6773
})
6874
recognizeStream.on('close', () => {
6975
events.emit('close')
@@ -85,6 +91,12 @@ class IbmSTT {
8591
recognizeStream.destroy()
8692
}
8793
recognizeStream = null
94+
eventHistory = null
95+
},
96+
triggerHistoryEmit: () => {
97+
for (const eh of eventHistory) {
98+
events.emit('data', eh)
99+
}
88100
}
89101
}
90102
}

frontend/src/stt/kaldi.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class KaldiSTT {
4242

4343
const ws = new WebSocket(wsUri)
4444
const events = new EventEmitter()
45+
let eventHistory = []
4546

4647
ws.on('open', () => {
4748
ws.on('message', (data) => {
@@ -50,6 +51,7 @@ class KaldiSTT {
5051
const hypotheses = dj.result && dj.result.hypotheses && dj.result.hypotheses[0]
5152
if (hypotheses && hypotheses.transcript) {
5253
const event = {
54+
status: 'ok',
5355
text: hypotheses.transcript,
5456
final: !!dj.result.final,
5557
debug: dj
@@ -59,15 +61,19 @@ class KaldiSTT {
5961
event.end = _.round(_.toNumber(dj['total-length']), 3)
6062
}
6163
events.emit('data', event)
64+
eventHistory.push(event)
6265
}
6366
} catch (err) {
6467
debug(`received non JSON content on stream, ignoring. ${err.message}`)
6568
}
6669
})
6770
ws.on('error', (err) => {
68-
events.emit('data', {
69-
err: `${err.message}`
70-
})
71+
const event = {
72+
status: 'error',
73+
err: `Kaldi STT failed: ${err.message}`
74+
}
75+
events.emit('data', event)
76+
eventHistory.push(event)
7177
})
7278
ws.on('close', () => {
7379
events.emit('close')
@@ -89,6 +95,12 @@ class KaldiSTT {
8995
if (ws) {
9096
ws.close()
9197
}
98+
eventHistory = null
99+
},
100+
triggerHistoryEmit: () => {
101+
for (const eh of eventHistory) {
102+
events.emit('data', eh)
103+
}
92104
}
93105
})
94106
})

0 commit comments

Comments
 (0)