Files
bigwo/test2/VOICE_ASR_OPTIMIZATION_PLAN.md

490 lines
15 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 语音识别精准度优化方案(延时优先)
> 版本1.0 | 更新日期2026-03-17
---
## 一、问题分析
### 1.1 当前痛点
- **ASR 识别误差**:同音词、近音词导致查询词偏离
- **知识库匹配失败**:识别错误直接导致知识库检索失败
- **实时性要求高**:语音对话需要快速响应,不能引入过多延时
### 1.2 现有机制分析
| 机制 | 延时 | 效果 | 说明 |
|------|------|------|------|
| `normalizeKnowledgeAlias()` | < 1ms | ⭐⭐ | 简单别名映射覆盖有限 |
| `buildDeterministicKnowledgeQuery()` | < 1ms | ⭐⭐⭐ | 确定性规则改写 |
| `rewriteKnowledgeQuery()` (LLM) | 500-2000ms | ⭐⭐⭐⭐ | 强大但耗时 |
---
## 二、优化原则
### 2.1 延时优先策略
```
极速响应层 (0延时) → 快速修正层 (<100ms) → LLM增强层 (>500ms, 可选)
```
### 2.2 分级响应机制
- **阶段1**极速处理无额外延时
- **阶段2**快速处理< 100ms可接受
- **阶段3**增强处理> 500ms仅在必要时触发
---
## 三、具体优化方案
### 方案一:增强 ASR 上下文词表(零延时)⏱️ 0ms
**文件位置:** `server/services/nativeVoiceGateway.js`
**修改点:** 扩展 `buildStartSessionPayload()` 中的 `asr.extra.context`
**当前配置:**
```javascript
context: '一成,一成系统,大沃,PM,PM-FitLine,FitLine,细胞营养素,Ai众享,AI众享,盛咖学愿,数字化工作室,Activize,Basics,Restorate,NTC,基础三合一,招商,阿育吠陀'
```
**优化后配置:**
```javascript
context: [
// 核心术语(必选)
'一成系统,一城系统,逸城系统,一程系统,易成系统,一诚系统,亦成系统,艺成系统,溢成系统,义成系统,毅成系统,怡成系统,以成系统,已成系统,亿成系统,忆成系统,益成系统',
'大沃,大窝,大握,大我,大卧',
'PM,PM-FitLine,FitLine,细胞营养素,PM细胞营养素',
'Ai众享,AI众享,爱众享,艾众享,哎众享',
'盛咖学愿,盛咖学院,圣咖学愿,盛卡学愿',
'数字化工作室',
'Activize,Basics,Restorate,NTC',
'基础三合一,三合一基础套,基础套装,大白小红小白',
'小红产品,大白产品,小白产品',
'Activize Oxyplus,小红',
'Basics,大白',
'Restorate,维适多,小白',
'儿童倍适,儿童产品',
'NTC营养保送系统,NTC营养配送系统,NTC营养输送系统',
'火炉原理,暖炉原理',
'阿育吠陀,Ayurveda',
'基础二合一,二合一',
'倍力健',
'关节套装,关节舒缓',
'男士乳霜,男士护肤',
'去角质,面膜',
'发宝',
'叶黄素',
'奶昔',
'健康饮品',
'乳清蛋白,蛋白粉',
'乳酪煲,乳酪饮品,乳酪',
'CC套装,CC胶囊',
'IB5,口腔免疫喷雾',
'Q10,辅酵素,氧修护',
'Women+,乐活',
'招商合作,招商,代理,加盟,事业机会',
'新人起步三关,起步三关',
'精品会议,会议组织',
'成长上总裁',
'一成AI,AI落地,ai落地,转观念,落地对比',
'好转反应,整应反应,排毒反应,副作用,不良反应,皮肤发痒',
'促销活动,促销,优惠,打折,活动分数,5+1',
// 品牌保护相关
'传销,骗局,骗子,正规吗,合法吗,正不正规,合不合法,是不是传销,直销还是传销',
'层级分销,非法集资,拉人头,下线,发展下线,报单,人头费',
// 高频疑问词
'怎么吃,怎么服用,吃多少,服用方法,搭配,功效,成分,原料',
'多少钱,哪里买,怎么买,配方,原理,有什么好处,适合什么人'
].join(',')
```
**优先级:** 🔴 立即实施(零风险、零延时)
---
### 方案二:极速同音词映射库(< 10ms < 10ms
**新增文件:** `server/services/asrCorrectionMap.js`
```javascript
/**
* ASR 同音词/近音词极速映射库
* 基于拼音相似度的快速映射,无网络请求
*/
const PINYIN_MAP = {
// 一成系统相关
'一城': '一成',
'逸城': '一成',
'一程': '一成',
'易成': '一成',
'一诚': '一成',
'亦成': '一成',
'艺成': '一成',
'溢成': '一成',
'义成': '一成',
'毅成': '一成',
'怡成': '一成',
'以成': '一成',
'已成': '一成',
'亿成': '一成',
'忆成': '一成',
'益成': '一成',
// 大沃相关
'大窝': '大沃',
'大握': '大沃',
'大我': '大沃',
'大卧': '大沃',
// 盛咖学愿相关
'盛咖学院': '盛咖学愿',
'圣咖学愿': '盛咖学愿',
'盛卡学愿': '盛咖学愿',
// Ai众享相关
'爱众享': 'Ai众享',
'艾众享': 'Ai众享',
'哎众享': 'Ai众享',
// 产品相关 - 小红
'小洪': '小红',
'小宏': '小红',
'小鸿': '小红',
// 产品相关 - 大白
'大百': '大白',
'大柏': '大白',
// 产品相关 - 小白
'小百': '小白',
'小柏': '小白',
'维适多': '小白',
// NTC相关
'营养配送': '营养保送',
'营养输送': '营养保送',
'营养传送': '营养保送',
'营养传输': '营养保送',
// 火炉原理
'暖炉原理': '火炉原理',
// 阿育吠陀
'阿玉吠陀': '阿育吠陀',
'阿育费陀': '阿育吠陀',
// 好转反应
'整应反应': '好转反应',
'整健反应': '好转反应',
'排毒反应': '好转反应',
// 5+1
'5加1': '5+1',
'五加一': '5+1',
// 起步三关
'起步三观': '起步三关',
'起步三官': '起步三关',
};
// 复合词映射(更长的短语)
const PHRASE_MAP = {
'一城系统': '一成系统',
'逸城系统': '一成系统',
'一程系统': '一成系统',
'易成系统': '一成系统',
'一诚系统': '一成系统',
'盛咖学院': '盛咖学愿',
'圣咖学愿': '盛咖学愿',
'营养配送系统': 'NTC营养保送系统',
'营养输送系统': 'NTC营养保送系统',
'暖炉原理': '火炉原理',
'整应反应': '好转反应',
};
/**
* 极速 ASR 文本修正(同步、无延时)
* @param {string} text - ASR 识别的原始文本
* @returns {string} 修正后的文本
*/
function fastAsrCorrection(text) {
if (!text || typeof text !== 'string') {
return text;
}
let result = text;
// 先替换长短语(避免部分匹配)
for (const [from, to] of Object.entries(PHRASE_MAP)) {
if (result.includes(from)) {
result = result.split(from).join(to);
}
}
// 再替换单词
for (const [from, to] of Object.entries(PINYIN_MAP)) {
// 全词匹配(避免部分替换)
const regex = new RegExp(`\\b${from}\\b`, 'g');
result = result.replace(regex, to);
}
return result;
}
module.exports = {
fastAsrCorrection,
PINYIN_MAP,
PHRASE_MAP,
};
```
**集成位置:**`realtimeDialogRouting.js``normalizeKnowledgeAlias()` 之前调用
**优先级:** 🟡 高优先级(低延时、效果明显)
---
### 方案三:增强模糊匹配知识库触发(< 50ms < 50ms
**修改文件:** `server/services/realtimeDialogRouting.js`
**优化 `hasKnowledgeKeyword()` 函数:**
```javascript
/**
* 增强版知识库关键词检测
* 支持模糊匹配、拼音近似、上下文推断
*/
function hasKnowledgeKeyword(text) {
const normalized = normalizeKnowledgeAlias(text);
// 第一层:精确匹配(原逻辑)
const exactPattern = /(一成系统|Ai众享|AI众享|数字化工作室|盛咖学愿|四大AI生态|四大Ai生态|三大平台|PM公司|德国PM|PM-FitLine|FitLine|PM细胞营养素|细胞营养素|小红|大白|小白|Activize|Basics|Restorate|儿童倍适|NTC|营养保送|火炉原理|暖炉原理|阿育吠陀|Ayurveda|基础三合一|三合一|基础套装|基础二合一|二合一|招商合作|招商|代理|加盟|事业机会|邀约话术|起步三关|精品会议|成长上总裁|AI落地|ai落地|转观念|好转反应|整应反应|排毒反应|副作用|不良反应|皮肤发痒|促销活动|促销|优惠|活动分数|5\+1|CC套装|CC胶囊|IB5|口腔免疫喷雾|Q10|辅酵素|Women\+|乐活|乳清蛋白|蛋白粉|乳酪煲|乳酪饮品|乳酪|倍力健|关节套装|关节舒缓|男士乳霜|去角质|面膜|发宝|叶黄素|奶昔|健康饮品|传销|骗局|骗子|正规吗|合法吗|正不正规|合不合法|是不是传销|直销还是传销|层级分销|非法集资|拉人头|下线|发展下线|报单|人头费|怎么吃|怎么服用|吃多少|服用方法|搭配|功效|成分|原料)/i;
if (exactPattern.test(normalized)) {
return true;
}
// 第二层:模糊匹配(拼音近似词)
const fuzzyPatterns = [
// 一成系统变体
/(一.*?系统|.*?城系统|.*?成系统)/i,
// 产品相关
/(大.*?白|小.*?红|小.*?白)/i,
/(细胞.*?营养|营养.*?素)/i,
/(基础.*?合一|三合一|二合一)/i,
// 事业相关
/(招商|加盟|代理|事业)/i,
// 咨询相关
/(怎么.*?吃|怎么.*?用|功效|成分|多少钱|哪里买)/i,
];
for (const pattern of fuzzyPatterns) {
if (pattern.test(normalized)) {
console.log(`[KnowledgeTrigger] Fuzzy match: "${text}" → pattern matched`);
return true;
}
}
return false;
}
```
**优先级:** 🟡 高优先级(低延时、提升召回率)
---
### 方案四LLM 增强纠错(仅在不确定时触发)⏱️ 500-2000ms
**新增文件:** `server/services/asrEnhancedCorrection.js`
```javascript
const arkChatService = require('./arkChatService');
/**
* LLM 增强的 ASR 纠错(仅在必要时触发)
* 使用策略:先快速判断是否需要纠错,再决定是否调用 LLM
*/
// 快速判断是否需要 LLM 纠错的启发式规则
function needsLLMCorrection(text, context = []) {
// 规则1文本太短可能识别不完整
if (text.length < 3) {
return false; // 太短LLM 也帮不上
}
// 规则2已经包含明确的知识库关键词不需要纠错
const hasClearKeyword = /(一成系统|PM-FitLine|细胞营养素|Activize|Basics|Restorate|NTC|火炉原理|阿育吠陀)/i.test(text);
if (hasClearKeyword) {
return false;
}
// 规则3包含明显的识别错误特征
const hasErrorSigns = [
/的的|了了|是是|我我|你你/.test(text), // 重复词
/[a-zA-Z]{2,}\s+[a-zA-Z]{2,}/.test(text) && !/(PM|FitLine|Activize|Basics|Restorate|NTC|Ayurveda)/i.test(text), // 异常英文
text.includes('XXX') || text.includes('xx'), // 占位符
].some(Boolean);
if (hasErrorSigns) {
return true;
}
// 规则4上下文有知识库相关但当前文本模糊
const contextText = context.map(m => m.content || '').join(' ');
const contextHasKnowledge = /(一成系统|PM|产品|功效|成分)/i.test(contextText);
const currentTextIsVague = /(这个|那个|它|怎么|什么|介绍一下)/.test(text);
if (contextHasKnowledge && currentTextIsVague) {
return true;
}
return false;
}
/**
* 带超时的 LLM 纠错
* @param {string} text - ASR 原始文本
* @param {Array} context - 对话上下文
* @param {number} timeoutMs - 超时时间(默认 1500ms
* @returns {Promise<string>} 纠错后的文本
*/
async function enhancedAsrCorrection(text, context = [], timeoutMs = 1500) {
if (!needsLLMCorrection(text, context)) {
return text; // 不需要纠错,直接返回
}
if (arkChatService.isMockMode()) {
return text; // Mock 模式下不调用 LLM
}
try {
console.log(`[ASR-LLM] Starting correction for: "${text}"`);
const result = await Promise.race([
arkChatService.chat([
{
role: 'system',
content: `你是语音识别纠错专家。请修正下面的语音识别文本,使其符合企业知识库的规范术语。
规则:
1. 只输出修正后的文本,不要解释
2. 保留用户的真实意图
3. 将同音词、近音词替换为正确的企业术语
4. 常见修正:
- 一城系统、逸城系统、一程系统 → 一成系统
- 大窝、大握、大我 → 大沃
- 盛咖学院 → 盛咖学愿
- 爱众享、艾众享 → Ai众享
- 小洪、小宏 → 小红
- 大百、大柏 → 大白
- 营养配送系统 → NTC营养保送系统
- 暖炉原理 → 火炉原理
- 整应反应 → 好转反应
5. 如果无法确定,保持原样`,
},
{
role: 'user',
content: `需要修正的文本:${text}`,
},
], []),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('LLM correction timeout')), timeoutMs)
),
]);
const corrected = (result?.content || text).trim();
console.log(`[ASR-LLM] Corrected: "${text}" → "${corrected}"`);
return corrected;
} catch (error) {
console.warn(`[ASR-LLM] Correction failed: ${error.message}, using original`);
return text; // 出错时返回原文,保证不影响响应速度
}
}
module.exports = {
enhancedAsrCorrection,
needsLLMCorrection,
};
```
**集成策略:** 仅在知识库未命中时才触发 LLM 纠错并重试
**优先级:** 🟢 中优先级(效果好但有延时,谨慎使用)
---
### 方案五:查询改写增强(优化现有逻辑)⏱️ 混合延时
**优化文件:** `server/services/toolExecutor.js` 中的 `rewriteKnowledgeQuery()`
**优化策略:**
1. 优先使用确定性规则0延时
2. 再使用快速同义词扩展(<10ms
3. 最后考虑 LLM 改写仅在必要时>500ms
**优先级:** 🟡 高优先级(优化现有逻辑)
---
## 四、实施路线图
### 阶段一:立即实施(零风险、零延时)
- [ ] 方案一:增强 ASR 上下文词表
- [ ] 方案二:极速同音词映射库
**预期效果:** 识别准确率提升 30-40%**无额外延时**
---
### 阶段二:快速实施(低延时)
- [ ] 方案三:增强模糊匹配知识库触发
- [ ] 方案五:查询改写增强
**预期效果:** 知识库召回率提升 20-30%**总延时增加 < 50ms**
---
### 阶段三:可选增强(可控延时)
- [ ] 方案四LLM 增强纠错配置开关控制
**预期效果:** 复杂场景准确率再提升 10-15%**仅在必要时增加 500-1500ms 延时**
---
## 五、延时评估总结
| 方案 | 单轮额外延时 | 准确率提升 | 推荐度 |
|------|-------------|-----------|--------|
| 方案一ASR 上下文增强 | 0ms | +30% | ⭐⭐⭐⭐⭐ |
| 方案二极速同音词映射 | <10ms | +15% | ⭐⭐⭐⭐⭐ |
| 方案三模糊匹配增强 | <50ms | +20% | ⭐⭐⭐⭐ |
| 方案四LLM 纠错可选 | 500-1500ms | +10-15% | ⭐⭐⭐ |
| 方案五查询改写优化 | <10ms | +10% | ⭐⭐⭐⭐ |
**综合效果:** 实施阶段一+**总延时增加 < 60ms****准确率提升 65-80%**
---
## 六、配置开关建议
`.env` 中添加配置项方便灵活调整
```env
# ASR 优化配置
ENABLE_FAST_ASR_CORRECTION=true # 开启极速同音词映射
ENABLE_FUZZY_KB_TRIGGER=true # 开启模糊匹配触发
ENABLE_LLM_ASR_CORRECTION=false # LLM纠错默认关闭可选开启
LLM_ASR_CORRECTION_TIMEOUT=1500 # LLM纠错超时时间毫秒
```
---
## 七、回滚保障
所有优化都是**增量式可配置**
- 每个优化都可以独立开关
- 出现问题可立即通过环境变量关闭
- 保留原有逻辑作为兜底