# OCR与语音识别——政务AI的两个实用场景

OCR与语音识别------政务AI的两个实用场景

OCR和语音识别,听起来高大上,实际上做起来没那么复杂。这篇记录我用EasyOCR、PaddleOCR做文字识别,用科大讯飞做语音转文字的过程。不是论文,是踩坑笔记。


一、EasyOCR:最省事的文字识别

python 复制代码
import easyocr

reader = easyocr.Reader(['ch_sim', 'en'], gpu=False)
result = reader.readtext(r'd:\20250325151517.jpg')

for detection in result:
    print(detection[1])

三行代码。ch_sim是简体中文,en是英文,gpu=False用CPU跑。输入一张图片,输出识别的文字。

优点

  • 安装简单,pip install easyocr一条命令
  • 支持中文,开箱即用
  • CPU就能跑,不需要GPU

缺点

  • 速度慢,一张图几秒钟
  • 中文识别准确率一般,手写体和模糊图片效果差
  • 不支持表格结构识别

适合场景:简单的文字提取,不要求高准确率。


二、PaddleOCR:中文识别更强,还支持表格

文字识别

python 复制代码
from paddleocr import PaddleOCR

ocr = PaddleOCR(use_angle_cls=True, lang='ch')
result = ocr.ocr(r'd:\20250325151517.jpg', cls=True)

for line in result:
    for j in range(0, line.__len__()):
        print(line[j][1][0])

也是几行代码。use_angle_cls=True开启文字方向检测,图片倒着也能识别。

比EasyOCR好在哪

  • 中文识别准确率明显更高
  • 速度更快(PaddlePaddle底层优化)
  • 支持旋转文字检测

表格结构识别

python 复制代码
from paddleocr import PPStructure

table_engine = PPStructure(table_model_dir=r'e:\model\ch_ppstructure_mobile_v2.0_SLANet_infer')
result = table_engine(r'd:\20250325151517.jpg')
print(result)

PPStructure是PaddleOCR的扩展,专门做文档结构分析。输入一张包含表格的图片,输出表格的结构(行、列、单元格)和内容。

政务场景大量表格------审批表、报销单、统计报表。以前要人工录入,PPStructure可以直接从图片里提取表格数据。

注意事项

  • 模型文件要单独下载,不像文字识别模型自动下载
  • 表格识别准确率取决于图片质量,拍照歪的、有阴影的效果差
  • 复杂合并单元格识别不太准

两者对比

维度 EasyOCR PaddleOCR
安装 pip一条命令 pip安装+可能需要额外下载模型
中文准确率 一般 较好
速度
表格识别 不支持 支持(PPStructure)
GPU需求 不需要 不需要,但有GPU更快
适合场景 快速验证、简单文字 生产环境、表格提取

我的结论:在政务场景下,PaddleOCR是更好的选择。中文识别准确率更高,表格识别是刚需。具体选型可以看我另一篇《政务OCR选型:EasyOCR vs PaddleOCR》。


三、科大讯飞语音听写:PCM音频转文字

政务热线有大量电话录音,需要转成文字做分析。

原理

讯飞语音听写API用WebSocket协议:客户端把音频分帧发送,服务端实时返回识别结果。

python 复制代码
import websocket
import base64
import json

STATUS_FIRST_FRAME = 0
STATUS_CONTINUE_FRAME = 1
STATUS_LAST_FRAME = 2

frameSize = 1280    # 每帧1280字节
intervel = 0.04     # 发送间隔40ms,模拟实时语音流

with open(AudioFile, "rb") as fp:
    while True:
        buf = fp.read(frameSize)
        audio = str(base64.b64encode(buf), 'utf-8')

        if not audio:
            status = STATUS_LAST_FRAME

        # 第一帧:带参数
        if status == STATUS_FIRST_FRAME:
            d = {
                "header": {"status": 0, "app_id": APPID},
                "parameter": {"iat": {"domain": "slm", "language": "zh_cn", "accent": "mulacc"}},
                "payload": {"audio": {"audio": audio, "sample_rate": 16000, "encoding": "raw"}}
            }
            ws.send(json.dumps(d))
            status = STATUS_CONTINUE_FRAME

        # 中间帧:只带音频
        elif status == STATUS_CONTINUE_FRAME:
            d = {
                "header": {"status": 1, "app_id": APPID},
                "payload": {"audio": {"audio": audio, "sample_rate": 16000, "encoding": "raw"}}
            }
            ws.send(json.dumps(d))

        # 最后一帧
        elif status == STATUS_LAST_FRAME:
            d = {
                "header": {"status": 2, "app_id": APPID},
                "payload": {"audio": {"audio": audio, "sample_rate": 16000, "encoding": "raw"}}
            }
            ws.send(json.dumps(d))
            break

        time.sleep(intervel)

鉴权机制

讯飞的API鉴权比较复杂------HMAC-SHA256签名:

python 复制代码
signature_origin = "host: iat.cn-huabei-1.xf-yun.com\n"
signature_origin += "date: " + date + "\n"
signature_origin += "GET /v1 HTTP/1.1"

signature_sha = hmac.new(APISecret.encode('utf-8'),
                         signature_origin.encode('utf-8'),
                         digestmod=hashlib.sha256).digest()
authorization = base64.b64encode(signature_sha).decode('utf-8')

把host、date、request-line拼接后用HMAC-SHA256签名,再base64编码,拼成URL参数。这是标准的HTTP签名鉴权模式,很多云服务都用这种方式。

返回结果解析

python 复制代码
def on_message(ws, message):
    message = json.loads(message)
    payload = message.get("payload")
    if payload:
        text = payload["result"]["text"]
        text = json.loads(str(base64.b64decode(text), "utf8"))
        result = ''
        for i in text['ws']:
            for j in i["cw"]:
                result += j["w"]
        print(result)

讯飞返回的结果是base64编码的JSON,里面ws是词组列表,cw是字列表,w是每个字的文本。解析过程有点绕,但跑通一次就好了。

注意事项

  • 音频格式:讯飞要求PCM格式,16K采样率。如果是WAV/MP3,需要先用FFmpeg转换
  • 实时性:每帧40ms发送,模拟实时语音流。如果是离线文件转写,讯飞也有专门的API
  • 并发限制:免费版有并发连接数限制,批量转写需要注意

四、环境搭建总结

组件 安装方式
EasyOCR pip install easyocr,首次运行自动下载模型(约100MB)
PaddleOCR pip install paddleocr,表格模型需手动下载
讯飞语音 pip install websocket-client,需注册讯飞开放平台获取APPID/Key
Python 3.9-3.11

三个工具都不需要GPU,CPU就能跑。PaddleOCR和讯飞语音在有GPU的环境下会更快。


五、总结

工具 做了什么 关键点
EasyOCR 简单文字识别 安装最简单,中文准确率一般
PaddleOCR 中文文字+表格识别 政务场景首选,表格识别是刚需
讯飞语音 PCM音频转文字 WebSocket分帧发送,实时返回结果

三个工具分别解决三个问题:图片里有字→OCR提取、图片里有表格→PPStructure解析、录音里有话→讯飞转写。在政务AI落地中,这三个能力经常组合使用:热线电话录音转文字 → 文字做NLP分析 → 分析结果输出到报表,报表里的表格可能又需要OCR识别。环环相扣。


相关阅读:

  • 《政务OCR选型:EasyOCR vs PaddleOCR》
  • 《94万条热线问题的分析之路------KMeans聚类、动态相似度与大模型分类》
  • 《向量数据库实战------用Milvus+Ollama搭建社保知识检索系统》
相关推荐
yjcode7891 小时前
探索游戏充值新纪元:友价源码技术革新之旅
大数据·人工智能·游戏·游戏交易
冬奇Lab1 小时前
Agent 系列(11):A2A 协议——Agent 与 Agent 如何协作
人工智能·agent
snow@li1 小时前
AI:理解 大数据、算法、算力、电力、生成式AI、token 之间的关系
大数据·人工智能·算法
冬奇Lab1 小时前
每日一个开源项目(第120篇):SkillLens - 微软出品,照亮 AI Agent 技能生命周期的“显微镜”
人工智能·开源·资讯
qingyulee1 小时前
深度学习介绍、pytorch框架
人工智能·深度学习
oort1232 小时前
VLStream:全开源决策式AI视频平台,赋能企业构建自主可控、降本增效的智能视觉应用介绍
大数据·开发语言·人工智能·开源·音视频·数据库架构
Agent_Sea2 小时前
IDC/Omdia/Gartner AI平台排名可信度穿透判断:第三方数据该怎么读
人工智能·大模型·ai平台
视***间2 小时前
算力筑基,智领人形机器人新时代 —— 英伟达 × 宇树科技携手推进具身智能,视程空间基于 NVIDIA 全栈算力产品助力机器人产业落地
人工智能·机器人·nvidia·机器狗·gpt-oss·视程空间·宇树机器人
EAIReport2 小时前
Spring AI 详解:Java 开发者快速落地 AI 应用
java·人工智能·spring
人工智能AI技术2 小时前
【VibeCoding系列教程07】 零代码平台——Bolt.new
人工智能