From d9dc701de80f6c4a75d829dd1375a7fd56b3e67d Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 7 Sep 2022 18:03:13 +0800 Subject: [PATCH] Stop counting the words in SSML tags --- packages/text-to-speech/src/textToSpeech.ts | 23 +++++++++++---------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/text-to-speech/src/textToSpeech.ts b/packages/text-to-speech/src/textToSpeech.ts index 3bfe1be86..b7fef7368 100644 --- a/packages/text-to-speech/src/textToSpeech.ts +++ b/packages/text-to-speech/src/textToSpeech.ts @@ -13,7 +13,7 @@ export interface TextToSpeechInput { text: string voice?: string language?: string - textType?: 'html' | 'ssml' | 'utterance' + textType?: 'html' | 'utterance' rate?: number complimentaryVoice?: string audioStream?: NodeJS.ReadWriteStream @@ -51,6 +51,7 @@ export const synthesizeTextToSpeech = async ( const synthesizer = new SpeechSynthesizer(speechConfig) const speechMarks: SpeechMark[] = [] let timeOffset = 0 + let wordOffset = 0 synthesizer.synthesizing = function (s, e) { // convert arrayBuffer to stream and write to stream @@ -93,7 +94,7 @@ export const synthesizeTextToSpeech = async ( speechMarks.push({ word: e.text, time: (timeOffset + e.audioOffset) / 10000, - start: e.textOffset, + start: wordOffset + e.textOffset, length: e.wordLength, type: 'word', }) @@ -142,15 +143,19 @@ export const synthesizeTextToSpeech = async ( const result = await speakSsmlAsyncPromise(ssml) timeOffset = timeOffset + result.audioDuration } - } else { - // assemble ssml - const ssml = `${startSsml(null, ssmlOptions)}${input.text}${endSsml()}` - const result = await speakSsmlAsyncPromise(ssml) return { - audioData: Buffer.from(result.audioData), speechMarks, } } + // for utterance + const start = startSsml(ssmlOptions) + wordOffset = -start.length + const ssml = `${start}${input.text}${endSsml()}` + const result = await speakSsmlAsyncPromise(ssml) + return { + audioData: Buffer.from(result.audioData), + speechMarks, + } } catch (error) { console.error('synthesis error', error) throw error @@ -160,8 +165,4 @@ export const synthesizeTextToSpeech = async ( synthesizer.close() console.debug('synthesizer closed') } - - return { - speechMarks, - } }