@@ -200,14 +200,23 @@ function speakNext(text, endingSilenceMs = 0) {
200
200
} ) . catch (
201
201
( error ) => {
202
202
console . log ( `Error occurred while speaking the SSML: [ ${ error } ]` )
203
+
204
+ if ( spokenTextQueue . length > 0 ) {
205
+ speakNext ( spokenTextQueue . shift ( ) )
206
+ } else {
207
+ isSpeaking = false
208
+ }
203
209
}
204
210
)
205
211
}
206
212
207
213
function stopSpeaking ( ) {
208
214
spokenTextQueue = [ ]
209
215
avatarSynthesizer . stopSpeakingAsync ( ) . then (
210
- log ( "[" + ( new Date ( ) ) . toISOString ( ) + "] Stop speaking request sent." )
216
+ ( ) => {
217
+ isSpeaking = false
218
+ log ( "[" + ( new Date ( ) ) . toISOString ( ) + "] Stop speaking request sent." )
219
+ }
211
220
) . catch (
212
221
( error ) => {
213
222
console . log ( "Error occurred while stopping speaking: " + error )
@@ -318,6 +327,10 @@ window.startMicrophone = () => {
318
327
319
328
messages . push ( chatMessage )
320
329
let chatHistoryTextArea = document . getElementById ( 'chatHistory' )
330
+ if ( chatHistoryTextArea . innerHTML !== '' && ! chatHistoryTextArea . innerHTML . endsWith ( '\n\n' ) ) {
331
+ chatHistoryTextArea . innerHTML += '\n\n'
332
+ }
333
+
321
334
chatHistoryTextArea . innerHTML += "User: " + userQuery + '\n\n'
322
335
chatHistoryTextArea . scrollTop = chatHistoryTextArea . scrollHeight
323
336
@@ -390,60 +403,65 @@ window.startMicrophone = () => {
390
403
chunkString = previousChunkString + chunkString
391
404
}
392
405
393
- if ( ! chunkString . includes ( ' \n\n') ) {
406
+ if ( ! chunkString . endsWith ( '}}]}\n\n' ) && ! chunkString . endsWith ( '[DONE] \n\n') ) {
394
407
// This is a incomplete chunk, read the next chunk
395
408
return read ( chunkString )
396
409
}
397
410
398
411
chunkString . split ( '\n\n' ) . forEach ( ( line ) => {
399
- if ( line . startsWith ( 'data:' ) && ! line . endsWith ( '[DONE]' ) ) {
400
- const responseJson = JSON . parse ( line . substring ( 5 ) . trim ( ) )
401
- let responseToken = undefined
402
- if ( dataSources . length === 0 ) {
403
- responseToken = responseJson . choices [ 0 ] . delta . content
404
- } else {
405
- let role = responseJson . choices [ 0 ] . messages [ 0 ] . delta . role
406
- if ( role === 'tool' ) {
407
- toolContent = responseJson . choices [ 0 ] . messages [ 0 ] . delta . content
412
+ try {
413
+ if ( line . startsWith ( 'data:' ) && ! line . endsWith ( '[DONE]' ) ) {
414
+ const responseJson = JSON . parse ( line . substring ( 5 ) . trim ( ) )
415
+ let responseToken = undefined
416
+ if ( dataSources . length === 0 ) {
417
+ responseToken = responseJson . choices [ 0 ] . delta . content
408
418
} else {
409
- responseToken = responseJson . choices [ 0 ] . messages [ 0 ] . delta . content
410
- if ( responseToken !== undefined ) {
411
- if ( byodDocRegex . test ( responseToken ) ) {
412
- responseToken = responseToken . replace ( byodDocRegex , '' ) . trim ( )
413
- }
419
+ let role = responseJson . choices [ 0 ] . messages [ 0 ] . delta . role
420
+ if ( role === 'tool' ) {
421
+ toolContent = responseJson . choices [ 0 ] . messages [ 0 ] . delta . content
422
+ } else {
423
+ responseToken = responseJson . choices [ 0 ] . messages [ 0 ] . delta . content
424
+ if ( responseToken !== undefined ) {
425
+ if ( byodDocRegex . test ( responseToken ) ) {
426
+ responseToken = responseToken . replace ( byodDocRegex , '' ) . trim ( )
427
+ }
414
428
415
- if ( responseToken === '[DONE]' ) {
416
- responseToken = undefined
429
+ if ( responseToken === '[DONE]' ) {
430
+ responseToken = undefined
431
+ }
417
432
}
418
433
}
419
434
}
420
- }
421
-
422
- if ( responseToken !== undefined ) {
423
- assistantReply += responseToken // build up the assistant message
424
- displaySentence += responseToken // build up the display sentence
425
-
426
- // console.log(`Current token: ${responseToken}`)
427
435
428
- if ( responseToken === '\n' || responseToken === '\n\n' ) {
429
- speak ( spokenSentence . trim ( ) )
430
- spokenSentence = ''
431
- } else {
432
- responseToken = responseToken . replace ( / \n / g, '' )
433
- spokenSentence += responseToken // build up the spoken sentence
434
-
435
- if ( responseToken . length === 1 || responseToken . length === 2 ) {
436
- for ( let i = 0 ; i < sentenceLevelPunctuations . length ; ++ i ) {
437
- let sentenceLevelPunctuation = sentenceLevelPunctuations [ i ]
438
- if ( responseToken . startsWith ( sentenceLevelPunctuation ) ) {
439
- speak ( spokenSentence . trim ( ) )
440
- spokenSentence = ''
441
- break
436
+ if ( responseToken !== undefined ) {
437
+ assistantReply += responseToken // build up the assistant message
438
+ displaySentence += responseToken // build up the display sentence
439
+
440
+ // console.log(`Current token: ${responseToken}`)
441
+
442
+ if ( responseToken === '\n' || responseToken === '\n\n' ) {
443
+ speak ( spokenSentence . trim ( ) )
444
+ spokenSentence = ''
445
+ } else {
446
+ responseToken = responseToken . replace ( / \n / g, '' )
447
+ spokenSentence += responseToken // build up the spoken sentence
448
+
449
+ if ( responseToken . length === 1 || responseToken . length === 2 ) {
450
+ for ( let i = 0 ; i < sentenceLevelPunctuations . length ; ++ i ) {
451
+ let sentenceLevelPunctuation = sentenceLevelPunctuations [ i ]
452
+ if ( responseToken . startsWith ( sentenceLevelPunctuation ) ) {
453
+ speak ( spokenSentence . trim ( ) )
454
+ spokenSentence = ''
455
+ break
456
+ }
442
457
}
443
458
}
444
459
}
445
460
}
446
461
}
462
+ } catch ( error ) {
463
+ console . log ( `Error occurred while parsing the response: ${ error } ` )
464
+ console . log ( chunkString )
447
465
}
448
466
} )
449
467
@@ -460,9 +478,6 @@ window.startMicrophone = () => {
460
478
return read ( )
461
479
} )
462
480
. then ( ( ) => {
463
- let chatHistoryTextArea = document . getElementById ( 'chatHistory' )
464
- chatHistoryTextArea . innerHTML += '\n\n'
465
-
466
481
if ( spokenSentence !== '' ) {
467
482
speak ( spokenSentence . trim ( ) )
468
483
spokenSentence = ''
0 commit comments