Skip to content

Utility Functions

Low-level sentence-boundary utilities exported from vue-text-to-speech. Useful when building custom streaming pipelines on top of useVoiceQueue.

Import

ts
import { extractCompleteSentences, splitSentences } from 'vue-text-to-speech'

Both functions use a shared Intl.Segmenter instance ({ granularity: 'sentence' }) and add zero runtime dependencies.


extractCompleteSentences

Used internally by useStreamingTTS on every incoming token. Given a growing buffer of accumulated tokens, returns all sentences that are safe to enqueue, plus the remaining partial sentence.

ts
function extractCompleteSentences(buffer: string): {
  sentences: string[]   // complete sentences ready to speak
  remaining: string     // partial sentence still forming
}

How it works

The last segment produced by Intl.Segmenter is always treated as incomplete, because more tokens may arrive and extend it. All earlier segments are considered complete.

ts
// Token arrives: "Hello world. How are"
extractCompleteSentences('Hello world. How are')
// → { sentences: ['Hello world.'], remaining: 'How are' }

// Next token arrives: " you?"
extractCompleteSentences('How are you?')
// → { sentences: ['How are you?'], remaining: '' }

Streaming example

ts
import { extractCompleteSentences } from 'vue-text-to-speech'
import { useVoiceQueue } from 'vue-text-to-speech'

const { enqueue } = useVoiceQueue()

let buffer = ''

for await (const token of myLLMStream()) {
  buffer += token
  const { sentences, remaining } = extractCompleteSentences(buffer)
  sentences.forEach(enqueue)
  buffer = remaining
}

// Flush any trailing partial sentence when stream ends
if (buffer.trim()) enqueue(buffer)

TIP

Use useStreamingTTS if you want this pattern handled automatically, including AbortController-based cancellation.


splitSentences

Splits a complete text string into all its sentences. Intended for pre-existing content, not streaming buffers.

ts
function splitSentences(text: string): string[]

Example

ts
import { splitSentences } from 'vue-text-to-speech'

splitSentences('Hello world. How are you? Fine, thanks!')
// → ['Hello world.', 'How are you?', 'Fine, thanks!']

splitSentences('')
// → []

Enqueuing a paragraph

ts
import { splitSentences } from 'vue-text-to-speech'
import { useVoiceQueue } from 'vue-text-to-speech'

const { enqueue } = useVoiceQueue()

const paragraph = 'The quick brown fox jumped. It landed gracefully.'
splitSentences(paragraph).forEach(enqueue)

Browser / Node Support

Intl.Segmenter is available in:

EnvironmentSupport
Chrome 87+
Edge 87+
Firefox 78+
Safari 14.1+
Node.js 16+

Released under the MIT License.