Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@minto-ai/text-stream-slicer

mingtu425ISC1.0.28TypeScript support: included

实时将 Markdown 文本流智能切分为可朗读句子。

文本, 文本流分段

readme

介绍

实时将 Markdown 文本流智能切分为可朗读句子。

  • ✅ 流式处理:逐片段接收,边收边切
  • ✅ 智能分段:按中英文句末标点切分,自动过滤 Markdown 与 emoji
  • ✅ 歧义缓存:小数/句号、未闭合链接尾部缓存,等待后续片段确认

安装

# pnpm
pnpm add @minto-ai/text-stream-slicer

快速开始

import TextStreamSlicer from '@minto-ai/text-stream-slicer'

const slicer = new TextStreamSlicer()

// 流式片段(如 SSE / WebSocket)
console.log(slicer.processText('你要')) // []
console.log(slicer.processText('抱我吗?')) // ['你要抱我吗?']

// 输入结束收尾输出
console.log(slicer.processText('', true))

API

实例方法

TextStreamSlicer#processText

处理输入的文本片段,结合内部缓存智能切分为可朗读句子。

processText(text: string, includeRemaining?: boolean): string[]

参数

  1. text (string) 当前收到的文本片段(允许为空字符串)
  2. [includeRemaining=false] (boolean) 是否收尾输出;true 时将剩余缓存一并输出

返回值

  • (string[]) 可朗读的句子数组;无完整句子时返回空数组

高级示例

  • 流式 SSE 场景
import TextStreamSlicer from '@minto-ai/text-stream-slicer'

const slicer = new TextStreamSlicer()
const evtSource = new EventSource('/chat-sse')

evtSource.onmessage = (event) => {
  const sentences = slicer.processText(event.data)
  sentences.forEach(s => speak(s))
}

evtSource.onerror = () => {
  const tail = slicer.processText('', true)
  tail.forEach(s => speak(s))
}
  • 小数 / 句号歧义
import TextStreamSlicer from '@minto-ai/text-stream-slicer'

const slicer = new TextStreamSlicer()
slicer.processText('停车费') // []
slicer.processText('2') // []
slicer.processText('.') // []
console.log(slicer.processText('3元。', true)) // ['停车费2.3元。']
  • Markdown 链接
import TextStreamSlicer from '@minto-ai/text-stream-slicer'

const slicer = new TextStreamSlicer()
slicer.processText('官网') // []
slicer.processText('[链接](https://xx.com)') // []
console.log(slicer.processText('已结束。', true)) // ['官网链接已结束。']