
ASR后处理进阶SenseVoice-Small ONNX识别结果清洗与格式化脚本1. 项目背景与需求语音识别技术在日常应用中越来越普及但原始识别结果往往存在各种问题缺少标点符号、数字格式不统一、文本可读性差等。SenseVoice-Small ONNX语音识别工具虽然提供了基础的识别功能但在实际应用中我们经常需要对识别结果进行进一步处理使其更符合人类的阅读习惯。传统的语音识别后处理往往需要手动清理和格式化这个过程既耗时又容易出错。特别是当处理大量音频文件时人工后处理几乎不可行。因此我们需要一个自动化的解决方案能够对识别结果进行智能清洗和格式化。本文将介绍一个专门为SenseVoice-Small ONNX设计的后处理脚本它能够自动完成以下任务清理识别结果中的冗余信息智能添加和修正标点符号统一数字和特殊符号的格式提高最终文本的可读性和实用性2. 后处理脚本的核心功能2.1 文本清洗模块识别结果中常常包含一些不需要的字符或格式问题。我们的清洗模块能够处理以下情况去除多余空格识别结果中经常出现连续多个空格或不必要的空格清理特殊字符移除或替换识别过程中产生的异常字符统一换行格式确保文本的换行符一致性处理编码问题解决可能出现的编码不一致问题def clean_text(raw_text): 基础文本清洗函数 # 移除多余空格 cleaned re.sub(r\s, , raw_text) # 清理特殊字符保留中文、英文、数字和基本标点 cleaned re.sub(r[^\u4e00-\u9fff\u0041-\u005a\u0061-\u007a\u0030-\u0039\u3002\uff0c\uff01\uff1f\uff1a\uff1b\u201c\u201d\u3001\u300a\u300b\u2018\u2019\u2026], , cleaned) # 去除首尾空格 cleaned cleaned.strip() return cleaned2.2 标点优化模块虽然SenseVoice-Small已经集成了标点恢复功能但在某些情况下仍需要进一步优化句子边界检测基于语义和语法规则进一步优化句子的划分引号匹配确保引号的正确开闭省略号标准化统一省略号的表示方式问号与感叹号优化根据上下文调整语气标点的使用def optimize_punctuation(text): 标点符号优化函数 # 确保句子以标点结束 if text and text[-1] not in .!?。: text 。 # 标准化省略号 text re.sub(r\.{3,}, ……, text) text re.sub(r…, ……, text) # 优化引号匹配 text re.sub(r[][^]*[], lambda m: “ m.group()[1:-1] ”, text) return text2.3 数字与特殊符号处理语音识别中的数字和特殊符号经常需要标准化处理中文数字转阿拉伯数字将一百二十三转换为123金额标准化统一货币金额的表示方式日期时间格式化标准化日期和时间的表示分数与百分比正确处理分数和百分比表示def normalize_numbers(text): 数字标准化处理 # 中文数字转阿拉伯数字 number_map { 零: 0, 一: 1, 二: 2, 三: 3, 四: 4, 五: 5, 六: 6, 七: 7, 八: 8, 九: 9, 十: 10, 百: 100, 千: 1000, 万: 10000, 亿: 100000000 } # 简单的中文数字转换实际实现会更复杂 for cn_num, arabic_num in number_map.items(): text text.replace(cn_num, arabic_num) # 标准化电话号码格式 text re.sub(r(\d{3,4})[-\s]?(\d{3,4})[-\s]?(\d{4}), r\1-\2-\3, text) return text3. 完整后处理流程3.1 处理流程设计我们的后处理脚本采用流水线设计每个处理步骤都有明确的职责原始文本接收从SenseVoice-Small获取识别结果基础清洗移除明显的问题字符和格式问题句子分割基于语义进行智能句子划分标点优化为每个句子添加合适的标点数字标准化统一数字和特殊符号的格式最终格式化生成易于阅读的最终文本def full_postprocess(raw_result): 完整的后处理流程 # 步骤1: 基础文本清洗 cleaned_text clean_text(raw_result) # 步骤2: 句子分割基于简单规则实际可更复杂 sentences re.split(r[.!?。], cleaned_text) sentences [s.strip() for s in sentences if s.strip()] # 步骤3: 逐句处理 processed_sentences [] for sentence in sentences: # 数字标准化 sentence normalize_numbers(sentence) # 标点优化 sentence optimize_punctuation(sentence) processed_sentences.append(sentence) # 步骤4: 重新组合文本 final_text 。.join(processed_sentences) # 确保文本以句号结束如果不是问号或感叹号 if final_text and final_text[-1] not in !?: final_text 。 return final_text3.2 错误处理与日志健壮的后处理脚本需要包含完善的错误处理机制def safe_postprocess(raw_result, audio_filepathNone): 带错误处理的后处理函数 try: result full_postprocess(raw_result) # 记录处理日志可选 if audio_filepath: logging.info(f成功处理音频文件: {audio_filepath}) return result except Exception as e: logging.error(f后处理过程中发生错误: {str(e)}) # 返回原始结果避免数据丢失 return raw_result4. 实际应用示例4.1 示例代码集成将后处理脚本与SenseVoice-Small ONNX工具集成import streamlit as st from sense_voice_onnx import SenseVoiceONNX from postprocess import safe_postprocess # 初始化识别工具 asr_tool SenseVoiceONNX() def recognize_and_process(audio_path): 识别音频并进行后处理 # 原始识别 raw_result asr_tool.recognize(audio_path) # 后处理 processed_result safe_postprocess(raw_result, audio_path) return processed_result # Streamlit界面集成 uploaded_file st.file_uploader(上传音频文件, type[wav, mp3, m4a]) if uploaded_file: with st.spinner(正在处理...): result recognize_and_process(uploaded_file) st.text_area(识别结果, result, height200)4.2 处理效果对比通过实际案例展示后处理的效果提升处理前今天天气很好 我想去公园玩 但是我不知道怎么去 你能告诉我吗 谢谢处理后今天天气很好我想去公园玩。但是我不知道怎么去你能告诉我吗谢谢。处理前会议时间是二零二三年十二月十五日下午三点 地点在二零一会议室 请准时参加处理后会议时间是2023年12月15日下午3点地点在201会议室请准时参加。5. 高级功能与自定义5.1 自定义规则配置用户可以根据自己的需求自定义处理规则class CustomPostProcessor: def __init__(self, configNone): self.config config or { enable_number_norm: True, enable_punctuation: True, custom_rules: [] } def add_custom_rule(self, pattern, replacement): 添加自定义替换规则 self.config[custom_rules].append((pattern, replacement)) def apply_custom_rules(self, text): 应用自定义规则 for pattern, replacement in self.config[custom_rules]: text re.sub(pattern, replacement, text) return text5.2 批量处理支持脚本支持批量处理多个音频文件def batch_process(audio_files, output_dirresults): 批量处理多个音频文件 os.makedirs(output_dir, exist_okTrue) results [] for audio_file in audio_files: try: raw_result asr_tool.recognize(audio_file) processed_result safe_postprocess(raw_result, audio_file) # 保存结果 output_file os.path.join(output_dir, f{os.path.basename(audio_file)}.txt) with open(output_file, w, encodingutf-8) as f: f.write(processed_result) results.append((audio_file, processed_result)) except Exception as e: logging.error(f处理文件 {audio_file} 时出错: {str(e)}) return results6. 总结通过本文介绍的后处理脚本我们可以显著提升SenseVoice-Small ONNX语音识别工具的输出质量。这个脚本不仅能够清理和格式化识别结果还能根据中文语言特点进行智能优化使最终文本更符合人类的阅读习惯。主要优势大幅提升识别结果的可读性和实用性完全自动化处理无需人工干预灵活可配置适应不同场景需求易于集成到现有工作流中适用场景会议记录整理访谈内容转录讲座录音转文字视频字幕生成任何需要高质量文本转录的场景随着语音识别技术的不断发展后处理的重要性日益凸显。一个好的后处理脚本能够将原始的识别结果转化为真正可用的文本内容为用户节省大量编辑和校对的时间。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。