语音识别文本处理单元测试应聚焦纯函数逻辑,如清洗、纠错、标准化,避免测试不可靠的SpeechRecognition API;需用Jest验证空输入、标点处理、大小写、边界情况及同音字纠错等场景。

对语音识别文本处理写单元测试,核心是把语音识别结果当作普通字符串输入,聚焦在你写的清洗、纠错、标准化等逻辑上,而不是测试浏览器的 SpeechRecognition API 本身(它不可靠、不支持 Node.js、且无法稳定模拟)。
1. 分离语音识别与文本处理逻辑
先确保你的文本处理函数是纯函数(无副作用、只依赖输入参数),例如:
function normalizeSpeechText(text) {
if (!text || typeof text !== 'string') return '';
return text
.trim()
.replace(/,|。|!|?|;|:/g, '') // 去除中文标点
.replace(/\s+/g, ' ') // 合并空白
.toLowerCase();
}
✅ 这样就能直接对 normalizeSpeechText 单独测试,无需真实语音识别。
2. 用 Jest 写基础单元测试(推荐)
安装 Jest:npm install --save-dev jest,然后写测试文件 speech-text.test.js:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 测试空输入、null、undefined
- 测试含中文标点、多余空格、大小写混合的典型识别结果
- 测试边界情况:全空格、纯标点、超长文本
示例:
test('normalizes Chinese speech text correctly', () => {
expect(normalizeSpeechText('你好啊! 今天天气怎么样?')).toBe('你好啊 今天天气怎么样');
expect(normalizeSpeechText(' 开灯, ')).toBe('开灯');
expect(normalizeSpeechText('')).toBe('');
expect(normalizeSpeechText(null)).toBe('');
});
3. 模拟识别错误场景(提升鲁棒性)
真实语音识别常出错,比如同音字、数字误读、停顿转空格。可针对性构造测试用例:
"零二三" → 应转为 "023""打开空调" → 可能被识别成 "打开恐调",需加拼音纠错或关键词匹配"调到二十五度" → 提取数字 "25"
如果你封装了纠错逻辑(如基于规则或简单映射),就为它单独写测试:
test('converts spoken numbers to digits', () => {
expect(convertSpokenNumbers('零二三')).toBe('023');
expect(convertSpokenNumbers('十五')).toBe('15');
});
4. 避免测不可控部分
不要尝试 mock SpeechRecognition 实例来“测识别流程”。原因:
- 浏览器 API 在 Node 环境无法运行(Jest 默认跑在 Node)
- 即使在 Puppeteer 或 Playwright 中测试,响应延迟、权限弹窗、麦克风状态都会让测试不稳定
- 单元测试目标是逻辑正确性,不是端到端可用性
端到端验证可另起集成测试(如用 Playwright 模拟用户点击“开始识别”并断言 UI 反馈),但不属于单元测试范畴。
专注可预测、可重复、无外部依赖的文本变换逻辑,测试才真正可靠。

















