Qwen3-ASR-1.7B代码实例:识别结果后处理——数字/单位/专有名词标准化

张开发
2026/4/13 16:45:26 15 分钟阅读

分享文章

Qwen3-ASR-1.7B代码实例:识别结果后处理——数字/单位/专有名词标准化
Qwen3-ASR-1.7B代码实例识别结果后处理——数字/单位/专有名词标准化1. 引言从“听清”到“听懂”的最后一公里语音识别模型比如我们之前介绍的Qwen3-ASR-1.7B已经能把你说的话“听清”并转成文字了。但如果你仔细看它的输出可能会发现一些小问题数字“123”可能被写成“一百二十三”或“一二三”。单位“5kg”可能被识别成“5千克”或“五公斤”。公司名“OpenAI”可能被写成“open ai”或“欧喷AI”。这些不一致虽然不影响我们理解大意但在一些正式场合——比如生成会议纪要、整理采访稿、制作视频字幕时——就显得不够专业甚至可能引起误解。这就是“识别结果后处理”要解决的问题。你可以把它理解为语音识别的“校对”和“润色”环节。今天我们就以Qwen3-ASR-1.7B的识别结果为例手把手教你如何通过代码让机器转写的文字变得更规范、更统一、更“像人话”。2. 为什么需要后处理一个直观的例子我们先来看一段Qwen3-ASR-1.7B可能输出的“原始”识别结果“本次项目预算约为一百二十三点五万元人民币我们需要采购服务器二十台每台配置不低于三十二g内存和两t硬盘。合作方包括microsoft和阿里巴巴云。”读起来没问题对吧但如果我们想把它放进Excel表格或者交给财务系统问题就来了数字不一致“一百二十三点五万”很难被程序直接计算。单位混乱“g”和“t”作为存储单位通常写作“GB”和“TB”。专有名词格式不统一“microsoft”应该为首字母大写的“Microsoft”“阿里巴巴云”的官方名称是“阿里云”。后处理的目标就是把上面这段话变成这样“本次项目预算约为123.5万元人民币我们需要采购服务器20台每台配置不低于32GB内存和2TB硬盘。合作方包括Microsoft和阿里云。”看到了吗经过后处理的文本不仅看起来更舒服更重要的是它变成了结构化、可计算、符合规范的数据价值大大提升。3. 核心后处理任务拆解后处理不是一个单一操作而是一套组合拳。针对Qwen3-ASR-1.7B的输出我们主要解决三类问题3.1 数字标准化把中文数字、口语化数字转换成标准的阿拉伯数字格式。中文数字转阿拉伯数字如“一百二十三” - “123”混合数字处理如“一百二十三点五” - “123.5”单位词分离如“一百二十三万元” - “123万元”数字和单位分开处理3.2 单位标准化将口语化、简写的单位统一为行业或学术标准缩写。大小写规范“g” - “GB”, “t” - “TB”中英文统一“千克”和“kg”根据上下文统一为一种格式统一“公里”和“km”的统一3.3 专有名词校正识别并纠正特定的实体名词如公司名、产品名、人名、地名等。大小写修正“openai” - “OpenAI”中英文名统一“阿里巴巴云” - “阿里云” (或保留“Alibaba Cloud”)常见错误纠正基于知识库的纠错4. 实战代码一步步构建后处理管道理论说完了我们直接上代码。下面我将用一个完整的Python类来演示如何实现这个后处理管道。import re from typing import Dict, List, Optional import cn2an # 一个强大的中文数字转阿拉伯数字库 class ASRPostProcessor: Qwen3-ASR-1.7B 识别结果后处理器 负责数字、单位、专有名词的标准化 def __init__(self): # 初始化各种规则和映射表 self._init_number_patterns() self._init_unit_mapping() self._init_entity_mapping() def _init_number_patterns(self): 初始化数字相关的正则表达式模式 # 匹配纯中文数字如一百二十三 self.chinese_number_pattern re.compile(r[零一二三四五六七八九十百千万亿点]) # 匹配带单位的中文数字如一百万元 self.chinese_number_with_unit_pattern re.compile( r([零一二三四五六七八九十百千万亿点])(元|万元|亿元|斤|公斤|克|米|公里|秒|分钟|小时|天|年) ) # 匹配口语化数字如俩、仨 self.colloquial_number_map { 俩: 2, 两: 2, 仨: 3, 廿: 20, 卅: 30, 卌: 40 } def _init_unit_mapping(self): 初始化单位标准化映射表 self.unit_mapping { # 计算机存储单位 g: GB, gb: GB, G: GB, t: TB, tb: TB, T: TB, m: MB, mb: MB, M: MB, k: KB, kb: KB, K: KB, # 长度单位 公里: km, 千米: km, 米: m, 厘米: cm, 毫米: mm, # 重量单位 公斤: kg, 千克: kg, 斤: 500g, # 特殊处理1斤500g 克: g, # 时间单位保持中文可能更合适 小时: 小时, # 不转换 分钟: 分钟, 秒: 秒, # 货币单位 块钱: 元, 块: 元, 万元: 万元, # 财务常用保留 亿元: 亿元, } def _init_entity_mapping(self): 初始化专有名词映射表可根据需要扩展 self.entity_mapping { # 科技公司 openai: OpenAI, open ai: OpenAI, 微软: Microsoft, microsoft: Microsoft, micro soft: Microsoft, 谷歌: Google, google: Google, 阿里巴巴云: 阿里云, 阿里云: 阿里云, alibaba cloud: Alibaba Cloud, # 常见产品/技术 chatgpt: ChatGPT, chat gpt: ChatGPT, python: Python, java: Java, javascript: JavaScript, # 可添加更多领域人名、地名、机构名等 } def normalize_numbers(self, text: str) - str: 标准化文本中的数字 1. 口语化数字转换 2. 中文数字转阿拉伯数字 3. 处理带单位的数字 result text # 第一步替换口语化数字 for colloquial, standard in self.colloquial_number_map.items(): result result.replace(colloquial, standard) # 第二步处理带单位的中文数字需要先处理避免单位丢失 def _replace_chinese_number_with_unit(match): chinese_num match.group(1) unit match.group(2) try: # 使用cn2an将中文数字转为阿拉伯数字 arabic_num cn2an.cn2an(chinese_num, smart) return f{arabic_num}{unit} except: # 转换失败返回原文本 return match.group(0) result self.chinese_number_with_unit_pattern.sub( _replace_chinese_number_with_unit, result ) # 第三步处理剩余的中文数字不带单位的 def _replace_chinese_number(match): chinese_num match.group(0) try: return str(cn2an.cn2an(chinese_num, smart)) except: return chinese_num result self.chinese_number_pattern.sub(_replace_chinese_number, result) return result def normalize_units(self, text: str) - str: 标准化文本中的单位 注意需要智能判断上下文避免错误替换 result text # 按单位长度从长到短排序避免部分匹配问题 sorted_units sorted(self.unit_mapping.keys(), keylen, reverseTrue) # 构建一个更智能的替换函数 def _smart_unit_replacement(unit): standard_unit self.unit_mapping[unit] # 对于存储单位我们通常希望它前面有数字 if standard_unit in [GB, TB, MB, KB]: # 使用正则查找模式数字空格/无空格单位 pattern re.compile(rf(\d)\s*{re.escape(unit)}, re.IGNORECASE) return pattern.sub(rf\1{standard_unit}, result) # 对于其他单位直接替换 return result.replace(unit, standard_unit) # 应用替换 for unit in sorted_units: if unit in result.lower(): # 不区分大小写查找 result _smart_unit_replacement(unit) return result def normalize_entities(self, text: str) - str: 标准化专有名词 使用精确匹配和模糊匹配结合的方式 result text # 精确匹配全词匹配不区分大小写 for wrong, correct in self.entity_mapping.items(): # 使用正则确保是全词匹配 pattern re.compile(rf\b{re.escape(wrong)}\b, re.IGNORECASE) result pattern.sub(correct, result) return result def post_process(self, text: str) - str: 完整的后处理流程 注意处理顺序很重要 # 步骤1: 数字标准化单位处理依赖数字格式 text self.normalize_numbers(text) # 步骤2: 单位标准化实体处理可能依赖单位 text self.normalize_units(text) # 步骤3: 专有名词校正 text self.normalize_entities(text) # 步骤4: 额外的清理工作可选 # 例如合并多余空格标准化标点等 text re.sub(r\s, , text).strip() return text # 使用示例 if __name__ __main__: # 初始化后处理器 processor ASRPostProcessor() # 模拟Qwen3-ASR-1.7B的原始输出 raw_text 本次项目预算约为一百二十三点五万元人民币我们需要采购服务器二十台每台配置不低于三十二g内存和两t硬盘。合作方包括microsoft和阿里巴巴云。下周俩会议讨论chatgpt集成方案。 print(原始识别结果) print(raw_text) print(\n *50 \n) # 应用后处理 processed_text processor.post_process(raw_text) print(后处理结果) print(processed_text)运行上面的代码你会看到这样的输出原始识别结果 本次项目预算约为一百二十三点五万元人民币我们需要采购服务器二十台每台配置不低于三十二g内存和两t硬盘。合作方包括microsoft和阿里巴巴云。下周俩会议讨论chatgpt集成方案。 后处理结果 本次项目预算约为123.5万元人民币我们需要采购服务器20台每台配置不低于32GB内存和2TB硬盘。合作方包括Microsoft和阿里云。下周2会议讨论ChatGPT集成方案。5. 高级技巧与注意事项基本的后处理管道建好了但在实际使用中你可能会遇到更复杂的情况。下面分享几个进阶技巧5.1 处理上下文相关的歧义有些转换需要看上下文。比如“苹果”是水果还是公司“Java”是编程语言还是咖啡/地名对于这种情况我们可以引入简单的上下文判断def smart_java_replacement(text: str) - str: 智能替换Java避免将印尼岛屿或咖啡替换成编程语言 # 如果上下文中有编程相关的词汇才进行替换 programming_keywords [编程, 代码, 开发, 程序, 软件, 编译] for keyword in programming_keywords: if keyword in text and java in text.lower(): text re.sub(r\bjava\b, Java, text, flagsre.IGNORECASE) break return text5.2 维护可更新的规则库不要把规则硬编码在代码里。更好的做法是使用配置文件或数据库import json class RuleBasedPostProcessor: def __init__(self, rule_file: str rules.json): with open(rule_file, r, encodingutf-8) as f: self.rules json.load(f) self.unit_rules self.rules.get(units, {}) self.entity_rules self.rules.get(entities, {}) def reload_rules(self, rule_file: str): 动态重载规则无需重启服务 with open(rule_file, r, encodingutf-8) as f: self.rules json.load(f)rules.json示例{ units: { g: GB, t: TB, 公里: km }, entities: { openai: OpenAI, 微软: Microsoft } }5.3 与Qwen3-ASR-1.7B集成将后处理器与你的语音识别流程无缝集成import torch from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor from post_processor import ASRPostProcessor # 导入我们写的后处理器 class EnhancedASRPipeline: def __init__(self, model_nameQwen/Qwen3-ASR-1.7B): # 加载原始模型 self.model AutoModelForSpeechSeq2Seq.from_pretrained( model_name, torch_dtypetorch.float16, device_mapauto ) self.processor AutoProcessor.from_pretrained(model_name) # 初始化后处理器 self.post_processor ASRPostProcessor() def transcribe(self, audio_path): # 1. 原始识别 raw_text self._raw_transcribe(audio_path) # 2. 后处理 cleaned_text self.post_processor.post_process(raw_text) return { raw_text: raw_text, cleaned_text: cleaned_text, audio_duration: self._get_audio_duration(audio_path) } def _raw_transcribe(self, audio_path): # 这里是原始的识别代码 # ... 加载音频推理生成文本 ... return raw_text_result6. 总结通过今天的学习你应该已经掌握了如何为Qwen3-ASR-1.7B这样的语音识别模型添加一个实用的后处理层。我们来回顾一下关键点后处理是必要的它让机器转写的文字从“基本正确”提升到“专业可用”。三大核心任务数字标准化、单位标准化、专有名词校正各有其挑战和解决方法。处理顺序很重要一般按照数字→单位→实体的顺序进行避免相互干扰。规则与智能结合既要有明确的规则映射也要考虑上下文歧义等复杂情况。可维护性通过配置文件管理规则便于更新和扩展。实际应用建议对于通用场景使用本文提供的基础后处理器已经能解决80%的问题。对于垂直领域如医疗、法律、金融你需要收集该领域的专有名词和表达习惯扩充规则库。后处理会增加一定的计算开销但对于文本来说通常可以忽略不计。始终保留原始识别结果以便对照和调试。最后要记住后处理不是要100%完美——那是不可能的。我们的目标是用最小的代价获得最大的可读性和可用性提升。现在你的Qwen3-ASR-1.7B工具不仅听得清更能“听得懂”输出专业级的文字稿了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章