news 2026/5/14 6:36:06

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
# OCR与语音识别——政务AI的两个实用场景

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

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


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

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

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

优点

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

缺点

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

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


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

文字识别

frompaddleocrimportPaddleOCR ocr=PaddleOCR(use_angle_cls=True,lang='ch')result=ocr.ocr(r'd:\20250325151517.jpg',cls=True)forlineinresult:forjinrange(0,line.__len__()):print(line[j][1][0])

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

比EasyOCR好在哪

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

表格结构识别

frompaddleocrimportPPStructure 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可以直接从图片里提取表格数据。

注意事项

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

两者对比

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

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


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

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

原理

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

importwebsocketimportbase64importjson STATUS_FIRST_FRAME=0STATUS_CONTINUE_FRAME=1STATUS_LAST_FRAME=2frameSize=1280# 每帧1280字节intervel=0.04# 发送间隔40ms,模拟实时语音流withopen(AudioFile,"rb")asfp:whileTrue:buf=fp.read(frameSize)audio=str(base64.b64encode(buf),'utf-8')ifnotaudio:status=STATUS_LAST_FRAME# 第一帧:带参数ifstatus==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# 中间帧:只带音频elifstatus==STATUS_CONTINUE_FRAME:d={"header":{"status":1,"app_id":APPID},"payload":{"audio":{"audio":audio,"sample_rate":16000,"encoding":"raw"}}}ws.send(json.dumps(d))# 最后一帧elifstatus==STATUS_LAST_FRAME:d={"header":{"status":2,"app_id":APPID},"payload":{"audio":{"audio":audio,"sample_rate":16000,"encoding":"raw"}}}ws.send(json.dumps(d))breaktime.sleep(intervel)

鉴权机制

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

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签名鉴权模式,很多云服务都用这种方式。

返回结果解析

defon_message(ws,message):message=json.loads(message)payload=message.get("payload")ifpayload:text=payload["result"]["text"]text=json.loads(str(base64.b64decode(text),"utf8"))result=''foriintext['ws']:forjini["cw"]:result+=j["w"]print(result)

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

注意事项

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

四、环境搭建总结

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

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


五、总结

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

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


相关阅读:

  • 《政务OCR选型:EasyOCR vs PaddleOCR》
  • 《94万条热线问题的分析之路——KMeans聚类、动态相似度与大模型分类》
  • 《向量数据库实战——用Milvus+Ollama搭建社保知识检索系统》
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 6:30:05

链表存储式栈

#include <stdio.h> #include <stdlib.h>#include <stdio.h> #include <stdlib.h> #include <string.h>#include <stdlib.h> typedef struct stack_node{int data;struct stack_node * next; } STstacknode; /*声明一个结构体来存储栈顶&a…

作者头像 李华
网站建设 2026/5/14 6:28:07

发音人「像真人」之外还要看什么:稳定性与一致性

&#x1f3af; 发音人「像真人」之外还要看什么&#xff1a;稳定性与一致性在文字转语音领域&#xff0c;「像真人」往往是第一印象。然而&#xff0c;当您需要批量生成有声内容、长期使用同一音色时&#xff0c;真正决定体验的是稳定性与一致性。 顶伯文字转语音工具正是围绕这…

作者头像 李华
网站建设 2026/5/14 6:21:12

Godot相机系统进阶:Phantom Camera插件核心功能与实战指南

1. 项目概述&#xff1a;为什么我们需要一个“幻影相机”&#xff1f; 如果你在Godot引擎里做过游戏&#xff0c;尤其是需要动态镜头切换、平滑跟随或者复杂运镜的项目&#xff0c;那你一定对内置的 Camera2D 和 Camera3D 节点又爱又恨。爱的是它们基础功能稳定&#xff0…

作者头像 李华
网站建设 2026/5/14 6:20:41

嵌入式固件开发知识体系构建:从硬件交互到系统级设计

1. 固件开发者知识体系构建&#xff1a;从“会写代码”到“懂系统”干了十几年嵌入式&#xff0c;我越来越觉得&#xff0c;固件开发这行&#xff0c;光会调库、写业务逻辑是远远不够的。你写的每一行代码&#xff0c;最终都要在真实的物理世界里跑起来&#xff0c;要和传感器、…

作者头像 李华
网站建设 2026/5/14 6:20:08

安培匝数抵消法:精准测量大直流偏置下微小电流纹波的工程实践

1. 项目概述&#xff1a;一次基于物理原理的精密电流纹波追查在电力电子和测试测量领域&#xff0c;我们常常会遇到一些看似简单、实则棘手的测量难题。问题的核心往往不在于设备不够先进&#xff0c;而在于我们是否能够跳出常规思维&#xff0c;回归到最基本的物理定律去寻找解…

作者头像 李华
网站建设 2026/5/14 6:06:06

智能文本分块策略:中英文混合场景下的语义完整性保障

RAG系统里最容易被低估的环节不是向量数据库&#xff0c;也不是LLM&#xff0c;而是怎么把文档切开。切得太碎&#xff0c;上下文丢失&#xff0c;LLM答非所问&#xff1b;切得太大&#xff0c;embedding稀释了关键信息&#xff0c;检索精度下降。更麻烦的是&#xff0c;中文和…

作者头像 李华