Files
bigwo/test2/VOICE_ASR_OPTIMIZATION_PLAN.md

15 KiB
Raw Permalink Blame History

语音识别精准度优化方案(延时优先)

版本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

当前配置:

context: '一成,一成系统,大沃,PM,PM-FitLine,FitLine,细胞营养素,Ai众享,AI众享,盛咖学愿,数字化工作室,Activize,Basics,Restorate,NTC,基础三合一,招商,阿育吠陀'

优化后配置:

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

/**
 * 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.jsnormalizeKnowledgeAlias() 之前调用

优先级: 🟡 高优先级(低延时、效果明显)


方案三:增强模糊匹配知识库触发(< 50ms⏱️ < 50ms

修改文件: server/services/realtimeDialogRouting.js

优化 hasKnowledgeKeyword() 函数:

/**
 * 增强版知识库关键词检测
 * 支持模糊匹配、拼音近似、上下文推断
 */
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

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 中添加配置项,方便灵活调整:

# ASR 优化配置
ENABLE_FAST_ASR_CORRECTION=true      # 开启极速同音词映射
ENABLE_FUZZY_KB_TRIGGER=true         # 开启模糊匹配触发
ENABLE_LLM_ASR_CORRECTION=false      # LLM纠错默认关闭可选开启
LLM_ASR_CORRECTION_TIMEOUT=1500      # LLM纠错超时时间毫秒

七、回滚保障

所有优化都是增量式、可配置的:

  • 每个优化都可以独立开关
  • 出现问题可立即通过环境变量关闭
  • 保留原有逻辑作为兜底