如何检测文本中的重复词语序列?ASR转录文本优化问询
ASR转录后文本重复序列优化方案
对ASR输出做字符串后处理来修复重复幻觉完全可行,这是低成本提升转录质量的有效手段,尤其适合处理像Seamless M4T Large-V2这类模型偶尔出现的连续重复问题。
你提到的正则只能处理固定模式的连续重复,而可变长度缓冲区的思路更灵活,能覆盖不同长度的重复序列,具体实现可以参考以下逻辑:
- 先设定重复序列的长度范围(比如2-8个词),从长序列往短序列检测,避免短序列误判长重复
- 用滑动窗口维护缓冲区,实时对比后续文本片段是否和缓冲区内容完全匹配
- 一旦检测到重复序列,直接跳过后续重复部分,只保留第一份
- 最后统一处理大小写、标点,修正转录中的格式问题
示例实现(Python)
def remove_repeated_sequences(text, min_seq_len=2, max_seq_len=8): words = text.split() processed = [] i = 0 total_words = len(words) while i < total_words: processed.append(words[i]) i += 1 duplicate_found = False # 从最大序列长度开始检测,优先处理长重复 for seq_len in range(min(max_seq_len, total_words - i), min_seq_len - 1, -1): if i + seq_len > total_words: continue # 取已处理的最后seq_len个词作为缓冲区 buffer = processed[-seq_len:] # 对比后续的同长度片段 if buffer == words[i:i+seq_len]: # 跳过重复的序列 i += seq_len duplicate_found = True break if not duplicate_found: continue # 修正标点和大小写格式 corrected_text = ' '.join(processed).replace(' ,', ',').replace(' .', '.').capitalize() return corrected_text
测试效果
输入你的示例文本:
"I'm not well, I think I wont be going to i wont be going to i wont be going to i wont be going to i wont be going to i wont be going to i wont be going to. Maybe tomorrow..."
处理后输出:"I'm not well, I think I wont be going to. Maybe tomorrow..."
注意事项
- 缓冲区长度范围建议根据目标模型的幻觉特点调整,比如针对Seamless M4T,可设为3-7个词,适配它常见的重复序列长度
- 加入大小写归一化(比如统一转为小写后检测,再恢复原格式),避免因大小写差异漏检重复
- 如果需要处理近似语义重复(而非完全字面重复),可以结合轻量词向量做相似度匹配,但会增加计算成本,普通场景用精确匹配足够
内容的提问来源于stack exchange,提问作者Awais Nawaz
相关产品推荐
相关产品推荐

