Skip to content

Commit 114559e

Browse files
yinhewYulin Li
andauthored
[Live Avatar] update chat sample to make some refinements (#2182)
* [TalkingAvatar] Add sample code for TTS talking avatar real-time API * sample codes for batch avatar synthesis * Address repository check failure * update * [Avatar] Update real time avatar sample code to support multi-lingual * [avatar] update real time avatar chat sample to receive GPT response streamingly * [Live Avatar] update chat sample to make some refinements --------- Co-authored-by: Yulin Li <[email protected]>
1 parent 9ea2566 commit 114559e

File tree

2 files changed

+58
-43
lines changed

2 files changed

+58
-43
lines changed

samples/js/browser/avatar/chat.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ <h2 style="background-color: white; width: 300px;">Avatar Configuration</h2>
7575

7676
<h2 style="background-color: white; width: 400px;">Avatar Conversation Control Panel</h2>
7777
<label for="prompt">System Prompt</label><br/>
78-
<textarea id="prompt">Please provide concise answers, not exceeding 25 words.</textarea>
78+
<textarea id="prompt">You are an AI assistant that helps people find information.</textarea>
7979
<br/>
8080

8181
<button id="startSession" onclick="window.startSession()">Open Video Connection</button>

samples/js/browser/avatar/js/chat.js

Lines changed: 57 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -200,14 +200,23 @@ function speakNext(text, endingSilenceMs = 0) {
200200
}).catch(
201201
(error) => {
202202
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+
}
203209
}
204210
)
205211
}
206212

207213
function stopSpeaking() {
208214
spokenTextQueue = []
209215
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+
}
211220
).catch(
212221
(error) => {
213222
console.log("Error occurred while stopping speaking: " + error)
@@ -318,6 +327,10 @@ window.startMicrophone = () => {
318327

319328
messages.push(chatMessage)
320329
let chatHistoryTextArea = document.getElementById('chatHistory')
330+
if (chatHistoryTextArea.innerHTML !== '' && !chatHistoryTextArea.innerHTML.endsWith('\n\n')) {
331+
chatHistoryTextArea.innerHTML += '\n\n'
332+
}
333+
321334
chatHistoryTextArea.innerHTML += "User: " + userQuery + '\n\n'
322335
chatHistoryTextArea.scrollTop = chatHistoryTextArea.scrollHeight
323336

@@ -390,60 +403,65 @@ window.startMicrophone = () => {
390403
chunkString = previousChunkString + chunkString
391404
}
392405

393-
if (!chunkString.includes('\n\n')) {
406+
if (!chunkString.endsWith('}}]}\n\n') && !chunkString.endsWith('[DONE]\n\n')) {
394407
// This is a incomplete chunk, read the next chunk
395408
return read(chunkString)
396409
}
397410

398411
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
408418
} 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+
}
414428

415-
if (responseToken === '[DONE]') {
416-
responseToken = undefined
429+
if (responseToken === '[DONE]') {
430+
responseToken = undefined
431+
}
417432
}
418433
}
419434
}
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}`)
427435

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+
}
442457
}
443458
}
444459
}
445460
}
446461
}
462+
} catch (error) {
463+
console.log(`Error occurred while parsing the response: ${error}`)
464+
console.log(chunkString)
447465
}
448466
})
449467

@@ -460,9 +478,6 @@ window.startMicrophone = () => {
460478
return read()
461479
})
462480
.then(() => {
463-
let chatHistoryTextArea = document.getElementById('chatHistory')
464-
chatHistoryTextArea.innerHTML += '\n\n'
465-
466481
if (spokenSentence !== '') {
467482
speak(spokenSentence.trim())
468483
spokenSentence = ''

0 commit comments

Comments
 (0)