@minto-ai/text-stream-slicer
Version:
实时将 Markdown 文本流智能切分为可朗读句子。
93 lines (62 loc) • 2.38 kB
Markdown
实时将 Markdown 文本流智能切分为可朗读句子。
- ✅ 流式处理:逐片段接收,边收边切
- ✅ 智能分段:按中英文句末标点切分,自动过滤 Markdown 与 emoji
- ✅ 歧义缓存:小数/句号、未闭合链接尾部缓存,等待后续片段确认
```bash
pnpm add @minto-ai/text-stream-slicer
```
```javascript
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))
```
处理输入的文本片段,结合内部缓存智能切分为可朗读句子。
> processText(text: string, includeRemaining?: boolean): string[]
1. `text (string)` 当前收到的文本片段(允许为空字符串)
2. `[includeRemaining=false] (boolean)` 是否收尾输出;`true` 时将剩余缓存一并输出
- `(string[])` 可朗读的句子数组;无完整句子时返回空数组
- 流式 SSE 场景
```javascript
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))
}
```
- 小数 / 句号歧义
```javascript
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 链接
```javascript
import TextStreamSlicer from '@minto-ai/text-stream-slicer'
const slicer = new TextStreamSlicer()
slicer.processText('官网') // []
slicer.processText('[链接](https://xx.com)') // []
console.log(slicer.processText('已结束。', true)) // ['官网链接已结束。']
```