mirror of
https://github.com/EKKOLearnAI/hermes-web-ui.git
synced 2026-07-15 21:21:05 +00:00
1dbc0aac2a
* chore: release webui 0.6.28 * feat: improve mcu wifi reprovisioning * feat: update mcu firmware recovery and tts segmentation
63 lines
2.6 KiB
TypeScript
63 lines
2.6 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
createMcuSpeechSegmenter,
|
|
normalizeMcuSpeechText,
|
|
} from '../../packages/server/src/services/global-agent/mcu-speech-segmenter'
|
|
|
|
describe('MCU speech segmenter', () => {
|
|
it('waits for markdown links to close before emitting speech', () => {
|
|
const segmenter = createMcuSpeechSegmenter({ maxChars: 24 })
|
|
|
|
expect(segmenter.pushDelta('请打开 [控制台')).toEqual([])
|
|
expect(segmenter.pushDelta('](https://example.com)。\n')).toEqual([
|
|
'请打开 控制台。',
|
|
])
|
|
})
|
|
|
|
it('skips fenced code and table rows when flushing readable text', () => {
|
|
const segmenter = createMcuSpeechSegmenter({ maxChars: 24 })
|
|
|
|
const segments = [
|
|
...segmenter.pushDelta('结果如下:\n```ts\nconst value = 1;\n```\n'),
|
|
...segmenter.pushDelta('| 名称 | 值 |\n| --- | --- |\n| foo | 1 |\n请确认。'),
|
|
]
|
|
const flushed = segmenter.flush()
|
|
expect(segments).toEqual([])
|
|
expect(flushed).toContain('结果如下')
|
|
expect(flushed).toContain('请确认')
|
|
expect(flushed).not.toContain('const value')
|
|
expect(flushed).not.toContain('foo')
|
|
})
|
|
|
|
it('emits completed paragraphs and carries unfinished paragraphs into the next one', () => {
|
|
const segmenter = createMcuSpeechSegmenter({ maxChars: 24 })
|
|
|
|
expect(segmenter.pushDelta('第一段还没结束\n')).toEqual([])
|
|
expect(segmenter.pushDelta('第二段结束了。\n')).toEqual([
|
|
'第一段还没结束 第二段结束了。',
|
|
])
|
|
expect(segmenter.pushDelta('第三段好了!\n')).toEqual([
|
|
'第三段好了!',
|
|
])
|
|
})
|
|
|
|
it('does not split long paragraphs on the old max character soft boundary', () => {
|
|
const segmenter = createMcuSpeechSegmenter({ maxChars: 24 })
|
|
const longText = '这是一段很长很长的内容,没有提前结束,也不会因为逗号,或者长度超过限制就提前播放'
|
|
|
|
expect(segmenter.pushDelta(longText)).toEqual([])
|
|
expect(segmenter.pushDelta(',直到段落正常结束。\n')).toEqual([
|
|
`${longText},直到段落正常结束。`,
|
|
])
|
|
})
|
|
|
|
it('normalizes markdown without preserving table syntax', () => {
|
|
const normalized = normalizeMcuSpeechText('结果如下:\n| 名称 | 值 |\n| --- | --- |\n| foo | 1 |\n[详情](https://example.com)。参考 https://example.com/a?b=1 和 www.example.com/path')
|
|
expect(normalized).toContain('结果如下')
|
|
expect(normalized).toContain('详情')
|
|
expect(normalized).not.toContain('https')
|
|
expect(normalized).not.toContain('www.')
|
|
expect(normalized).not.toContain('foo')
|
|
})
|
|
})
|