news 2026/5/1 6:15:58

FST ITN-ZH教程:如何扩展支持更多中文文本类型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FST ITN-ZH教程:如何扩展支持更多中文文本类型

FST ITN-ZH教程:如何扩展支持更多中文文本类型

1. 简介与背景

中文逆文本标准化(Inverse Text Normalization, ITN)是语音识别系统中不可或缺的一环。其核心任务是将模型输出的口语化、非结构化中文表达,转换为标准、可计算的格式。例如:

  • 二零零八年八月八日2008年08月08日
  • 早上八点半8:30a.m.
  • 一百二十三123

FST ITN-ZH 是一个基于有限状态转导器(Finite State Transducer, FST)实现的中文ITN工具,具备高精度、低延迟的特点。当前版本已支持日期、时间、数字、货币等常见类型,但实际业务场景中常需处理更复杂的表达形式。

本文将详细介绍如何对FST ITN-ZH 的 WebUI 进行二次开发,并扩展其功能以支持更多中文文本类型,如电话号码、身份证号、地址缩写等,提升系统的实用性与覆盖范围。

2. 系统架构与工作原理

2.1 整体架构概览

FST ITN-ZH 的处理流程如下:

输入文本 ↓ 分词与模式匹配(正则/规则) ↓ FST 转换引擎(基于 OpenFST 或 pynini) ↓ 标准化输出 ↓ WebUI 展示结果

其中:

  • 前端:Gradio 构建的 WebUI,提供交互界面
  • 后端:Python + pynini 实现的 FST 规则引擎
  • 数据流:用户输入 → 规则匹配 → FST 转换 → 返回结果

2.2 FST 核心机制解析

FST 是一种双态自动机,能够定义输入符号串到输出符号串的映射关系。在 ITN 中,每个转换类型(如“数字”)都对应一组 FST 规则。

以“中文数字转阿拉伯数字”为例,关键规则包括:

import pynini # 定义基本数字映射 digit_map = pynini.string_map([ ("零", "0"), ("一", "1"), ("二", "2"), ("三", "3"), ("四", "4"), ("五", "5"), ("六", "6"), ("七", "7"), ("八", "8"), ("九", "9") ]) # 构建万进制单位转换逻辑 def build_number_fst(): # 千、百、十等单位处理 ... return fst

这些规则最终被编译成加权有限状态机,在线性时间内完成转换。

3. 扩展新文本类型的实现步骤

3.1 新增“电话号码”支持

需求分析

中文语音中常见的电话号码表达方式:

  • 幺七八六五四三二幺零
  • 一七七 六六六六 七七七七

目标输出:

  • 1786543210
  • 17766667777
实现方案
  1. 定义正则匹配模式
import re def detect_phone(text): pattern = r'(?:[一二三四五六七八九零壹贰叁肆伍陆柒捌玖零]十)?' \ r'[幺一二三四五六七八九][零一二三四五六七八九]{10}' matches = re.findall(pattern, text) return matches
  1. 构建 FST 映射规则
phone_digit_map = pynini.string_map([ ("零", "0"), ("一", "1"), ("二", "2"), ("三", "3"), ("四", "4"), ("五", "5"), ("六", "6"), ("七", "7"), ("八", "8"), ("九", "9"), ("幺", "1") ]) # 编译为替换规则 phone_fst = pynini.transducer("", "", input_token_type="utf8", output_token_type="utf8") for inp, out in phone_digit_map.pairs(): phone_fst |= pynini.cross(inp, out)
  1. 集成至主流程
from fst_itn.core import compose_fsts # 将电话号码规则加入总规则链 final_fst = ( date_fst @ time_fst @ number_fst @ currency_fst @ phone_fst # 新增 )
  1. WebUI 添加开关控制

app.py中添加复选框:

with gr.Accordion("高级设置"): convert_phone = gr.Checkbox(label="转换电话号码", value=True)

并在推理时判断是否启用:

if convert_phone: text = apply_fst(text, phone_fst)

3.2 支持“身份证号”标准化

特点分析
  • 长度固定:18位(末位可能为X)
  • 包含出生日期段:前6位为地区码,7-14位为出生年月日
  • 常见读法:一九九零年一月一日对应19900101
实现策略
  1. 拆解结构

    • 地区码:忽略,保持原样
    • 出生日期:调用已有日期ITN模块
    • 顺序码+校验码:直接转数字
  2. 组合式处理

def normalize_id_card(text): # 提取出生日期部分并标准化 birth_part = extract_date_span(text) # 如“一九九零年一月一日” normalized_birth = itn_date(birth_part) # → 19900101 # 拼接其余部分 rest_digits = text.replace(birth_part, "") cleaned_rest = "".join([cn_to_digit(c) for c in rest_digits]) return f"{normalized_birth}{cleaned_rest}"
  1. 边界处理
    • 支持“X”读作“叉”或“西”
    • 处理连读情况,如“一二三四五”→“12345”

3.3 增加“地址缩写”识别能力

典型场景
  • 北京市朝阳区北京朝阳
  • 广东省深圳市南山区广东深圳南山
解决思路

使用预定义行政区划表进行匹配:

PROVINCES = ["北京", "上海", "广东", "江苏", ...] CITIES = {"北京": ["朝阳", "海淀"], "深圳": ["南山", "福田"], ...} def shorten_address(text): for province in PROVINCES: if province in text: for city in CITIES.get(province, []): if city in text: return f"{province}{city}" return text # 未匹配则保留原样

该函数可在 FST 流程之后作为后处理步骤调用。

4. 工程优化与最佳实践

4.1 性能优化建议

  1. 缓存编译后的 FST

    @lru_cache(maxsize=1) def get_compiled_fst(): return compile_rules()
  2. 批量处理减少开销

    • 批量转换时统一加载模型,避免重复初始化
    • 使用pynini.compose批量执行多个转换
  3. 异步响应提升体验

    async def async_convert(text): loop = asyncio.get_event_loop() result = await loop.run_in_executor(None, sync_itn, text) return result

4.2 错误处理与鲁棒性增强

  • 添加输入合法性校验
  • 设置超时机制防止长文本阻塞
  • 记录异常日志便于调试
try: result = apply_itn_rules(input_text) except Exception as e: logging.error(f"ITN failed on '{input_text}': {str(e)}") return input_text # 失败时返回原文

4.3 可配置化设计

通过 JSON 配置文件管理各类开关:

{ "enable_phone": true, "enable_id_card": false, "convert_single_digit": true, "fully_expand_wan": false }

启动时加载配置,实现灵活部署。

5. 总结

5. 总结

本文围绕FST ITN-ZH 中文逆文本标准化系统的功能扩展进行了深入探讨,重点讲解了如何通过二次开发支持更多中文文本类型。主要内容包括:

  1. 理解系统架构:掌握基于 FST 的 ITN 工作机制,明确前后端协作流程。
  2. 新增电话号码支持:利用正则匹配与 FST 映射,实现“幺七八”到“178”的精准转换。
  3. 身份证号标准化:结合日期ITN模块,完成复合结构的分段处理。
  4. 地址缩写优化:引入行政区划知识库,提升语义简洁性。
  5. 工程化改进:提出性能优化、错误处理和配置化等可落地的最佳实践。

通过上述方法,开发者可以持续扩展 FST ITN-ZH 的能力边界,适应更多真实应用场景。未来还可进一步探索:

  • 结合 NLP 模型做上下文感知转换
  • 支持方言变体(如粤语数字)
  • 提供 API 接口供外部系统调用

本项目由科哥进行 WebUI 二次开发,承诺永久开源使用,请保留版权信息。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 1:04:07

文本一句话精准分割万物|基于sam3提示词引导模型实战

文本一句话精准分割万物|基于sam3提示词引导模型实战 1. 技术背景与核心价值 图像分割作为计算机视觉中的基础任务,长期以来依赖于大量标注数据和特定场景的模型训练。传统方法如U-Net、Mask R-CNN等虽在特定领域表现优异,但泛化能力有限&a…

作者头像 李华
网站建设 2026/4/18 17:13:50

Qwen2.5-0.5B-Instruct功能实测:中文对话与代码生成体验

Qwen2.5-0.5B-Instruct功能实测:中文对话与代码生成体验 1. 引言 1.1 背景与需求 随着大语言模型在各类应用场景中的广泛落地,轻量化、低延迟的推理方案逐渐成为边缘计算和本地部署场景下的核心诉求。尤其在资源受限的设备上(如笔记本电脑…

作者头像 李华
网站建设 2026/5/1 8:20:06

SAM3模型解析:掩码解码器的工作原理

SAM3模型解析:掩码解码器的工作原理 1. 技术背景与核心问题 图像分割作为计算机视觉中的基础任务,长期以来依赖于大量标注数据和特定类别的训练。传统的语义分割、实例分割方法在面对新类别时往往需要重新训练模型,难以实现“万物皆可分”的…

作者头像 李华
网站建设 2026/5/1 8:28:05

Meta-Llama-3-8B-Instruct数据增强:提高泛化性的技巧

Meta-Llama-3-8B-Instruct数据增强:提高泛化性的技巧 1. 引言:为何需要对Meta-Llama-3-8B-Instruct进行数据增强 随着大语言模型在对话系统、代码生成和多任务处理中的广泛应用,如何提升其在特定场景下的泛化能力成为工程落地的关键挑战。M…

作者头像 李华
网站建设 2026/5/1 10:25:45

2048游戏AI智能助手:轻松突破高分记录的终极攻略

2048游戏AI智能助手:轻松突破高分记录的终极攻略 【免费下载链接】2048-ai AI for the 2048 game 项目地址: https://gitcode.com/gh_mirrors/20/2048-ai 还在为2048游戏中的数字合并感到困扰吗?这款智能AI助手将彻底改变你的游戏体验&#xff0c…

作者头像 李华
网站建设 2026/5/1 6:47:53

Youtu-2B提示词工程优化:提升输出质量实战

Youtu-2B提示词工程优化:提升输出质量实战 1. 引言 1.1 业务场景描述 随着轻量化大语言模型在边缘计算和低资源设备上的广泛应用,如何在有限算力条件下最大化模型的输出质量成为关键挑战。Youtu-LLM-2B作为腾讯优图实验室推出的2B参数级通用语言模型&…

作者头像 李华