news 2026/6/10 19:35:06

C#AI系列(5): 从零开始 C# 轻松语音识别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#AI系列(5): 从零开始 C# 轻松语音识别

本文代码已开源,仅需关注 萤火初芒 公众号回复AISharp即可查看仓库地址,获取完整项目及模型数据,供学习交流使用,无套路(部分测试图片为网图,侵删)。

本文项目在笔记本电脑上(Windows, NET10, x64)就可以自己动手尝试OCR, 实现如身份证识别、截图文本识别、扫描图转pdf等功能。

一、OCR的实现基础

实现OCR,我们直接从Tesseract(Apache 2.0,star 71.4K)开始。Tesseract 是目前最活跃、最精确的开源 OCR(光学字符识别)引擎之一,由 Google 维护。它能把图片中的印刷或手写文字转换成可编辑的纯文本、PDF、HTML 等多种格式,支持包括中文等 100 多种语言。Tesseract 4 以后引入基于深度学习的 LSTM 神经网络模型,对整行文字进行识别,准确率大幅提升。

在C#中调用Tesseract (https://github.com/tesseract-ocr/tesseract) 有两个方式:

  • 命令行调用:带参数执行 tesseract.exe 文件,读取控制台获取解析结果。适合简单直观,不需要写代码,直接在终端输入命令即可,且跨语言通用。
  • Wrapper调用:使用封装好的C#库直接调用相关函数。适合深度集成,提高性能,减少出错。

命令行调用及参数网上已有很好的详细说明(如https://tesseract-ocr.cn/tessdoc/Command-Line-Usage.html),本文不再赘述(已经包含在仓库项目文件中了噢)。

下面我们通过Wrapper调用的方式来使用Tesseract。C# 目前比较好用的Wrapper有同名的Tesseract(https://github.com/charlesw/tesseract, A .NET wrapper for tesseract-ocr 5.2.0.),在Nuget直接拉取可得到包含运行时和Wrapper库的完整程序,直接开箱即用。

二、Tesseract模型准备

执行OCR之前,要准备训练好模型,可以在官方仓库找到(https://github.com/tesseract-ocr/tessdata_best,https://github.com/tesseract-ocr/tessdata_fast),都是免费。
其中语言类模型(language .traineddata)能直接下载的 100 多种,命名规则就是“语言代码[+方向/变体]”。常用举例的有 eng、chi_sim、chi_tra、jpn、kor、rus、ara、deu、fra、spa、lat 等。另外就是垂直排版变体 chi_sim_vert、chi_tra_vert、jpn_vert、kor_vert, 其他特殊格式等:frak(德文花体)、equ(数学公式)、osd。

三、"四行代码"实现OCR

3.1 核心代码

核心代码就四行,非常简单,代码及注释如下:

// 1. 创建引擎实例(参数:语言包、数据路径)using(varengine=newTesseractEngine(tessDataPath,"chi_sim + eng",EngineMode.LstmOnly)){// 2. 加载图像using(varimg=Pix.LoadFromFile(imgPath)){// 3. 创建页面对象using(varpage=engine.Process(img,PageSegMode.Auto)){// 4. 获取识别结果Console.WriteLine("识别结果:\n"+page.GetText());}}}

3.2 模型参数

模型加载时可同时加载多个语言,与命令行参数相似,直接用“+”拼接即可,如"eng + chi_sim + osd"。

3.3 引擎模式

EngineMode,对应命令行参数(OEM,–oem N)。4 选 1,决定用哪套“底层引擎”:

  • 0: 仅传统引擎(tesseract 3 时代)
  • 1: 仅 LSTM 神经网络(tesseract 4+ 主推)
  • 2: 二者都跑,再合并结果
  • 3: 自动选择(默认,通常等于 1)

3.4 页面分割模式

PageSegMode,对应命令行参数(–psm N)
共 14 个等级(0-13),决定 Tesseract 把图像当成什么版式来处理:

  • 0: OSD only
  • 1: 自动分栏 + OSD
  • 2: 自动分栏,但不做 OSD 也不 OCR(未实现)
  • 3: 完全自动分栏,默认模式
  • 4: 单列可变尺寸文本
  • 5: 单一垂直文本块
  • 6: 单一统一文本块
  • 7: 单行
  • 8: 单个单词
  • 9: 圆圈内的单个单词
  • 10: 单个字符
  • 11: 稀疏文本(无顺序)
  • 12: 稀疏文本 + OSD
  • 13: 原始行(绕过 Tesseract 特殊调整)

3.5 注意事项

根据实际需求选择合适的模型来OCR,eng对标点符号的处理比较好,一般均可以带上。如果是识别车牌照文本,或无规律的文本,则需要自行考虑改变页面分割模式,非常影响识别效果。
普通文本OCR如下:

结果:

四 扩展应用

4.1 文本块坐标导出及分级处理

遍历page的内部,按block、或word分级获取ocr结果的语言、文本及坐标,这样可以更好辅助实现证件信息读取

using(variter=page.GetIterator()){iter.Begin();do{do{do{do{if(iter.IsAtBeginningOf(PageIteratorLevel.TextLine)){iter.GetImage(PageIteratorLevel.TextLine,0,outvarx,outvary);Console.WriteLine($"<BLOCK> ({x},{y}):{iter.GetWordRecognitionLanguage()}");}Console.Write(iter.GetText(PageIteratorLevel.Word));Console.Write(" ");if(iter.IsAtFinalOf(PageIteratorLevel.TextLine,PageIteratorLevel.Word)){Console.WriteLine();}}while(iter.Next(PageIteratorLevel.TextLine,PageIteratorLevel.Word));if(iter.IsAtFinalOf(PageIteratorLevel.Para,PageIteratorLevel.TextLine)){Console.WriteLine();}}while(iter.Next(PageIteratorLevel.Para,PageIteratorLevel.TextLine));}while(iter.Next(PageIteratorLevel.Block,PageIteratorLevel.Para));}while(iter.Next(PageIteratorLevel.Block));}

效果如下:

识别后,每个block后面的数字表示当前文本矩形框的左上角xy坐标

4.2 pdf生成

生成导入图像的pdf文件,且pdf中OCR内容区域的文本可被拾取。

using(IResultRendererrenderer=Tesseract.PdfResultRenderer.CreatePdfRenderer(@"test.pdf",tessDataPath,false)){// PDF Titleusing(renderer.BeginDocument("Serachablepdftest")){using(TesseractEngineengine=newTesseractEngine(tessDataPath,"chi_sim+eng",EngineMode.Default)){using(varimg=Pix.LoadFromFile(imgPath)){using(varpage=engine.Process(img,"Serachablepdftest")){renderer.AddPage(page);}}}}}

效果如下:

转成pdf文件后的文字拾取效果:

五、单文件打包问题

单文件发布时,可能存在发布成功,但运行程序出现错误的问题。这个与wrapper在加载运行时过程中的文件路径及处理有关。
本项目中对这个wrapper进行了处理,将原来动态加载的非托管库直接写死为win环境下的x64了,这样就可以很好的单文件发布(13.4mb + 模型)及aot发布(3mb + 2.6mb + 4mb + 模型)。
修改后的tesseract(wrapper)可以在仓库里找到。
算上chi_sim和eng模型,所有必须文件加起来独立运行无依赖,一共40mb。

六、 最后

有了tesseract,C#实现ocr也是很方便的事情。简单ocr再也不需要花钱注册会员来整了,随便自己或找个身边的程序员编译下,分分钟就搞定。

感谢您的阅读,本案例及更加完整丰富的机器学习模型案例的代码已全部开源,关注公众号回复AISharp即可查看仓库地址,本期相关代码在仓库下面的OCRSharp文件夹里可以找到。

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

构筑新势能稳基强新质:2025中国家电厂商互融发展峰会在杭州隆重举行

【导读】一个地区行业峰会&#xff0c;多年来受到全国相关行业组织、地方政府、兄弟协会的高度重视与参与&#xff0c;就足以说明这个行业活动具有很高的价值和意义&#xff0c;实际上专业人士眼中已将其看成是行业的真实写照与缩影。峰会内容不仅解读了当前行业关注的热点&…

作者头像 李华
网站建设 2026/6/10 13:11:29

如何快速安装WebOS Homebrew Channel:终极安装教程

智能电视用户的困境与破局 【免费下载链接】webos-homebrew-channel Unofficial webOS TV homebrew store and root-related tooling 项目地址: https://gitcode.com/gh_mirrors/we/webos-homebrew-channel 你是否曾经为LG WebOS智能电视的官方应用商店感到失望&#xf…

作者头像 李华
网站建设 2026/6/10 18:56:29

软件测试工程师如何利用LinkedIn吸引优质面试机会

在当今数字化的招聘环境中&#xff0c;LinkedIn已成为职业发展的核心平台之一。对软件测试从业者而言&#xff0c;它不仅是简历的展示窗口&#xff0c;更是构建专业形象、参与行业对话和直接对接招聘者的战略工具。本文将通过个人资料优化、内容互动策略和人脉拓展方法三个层面…

作者头像 李华
网站建设 2026/6/9 20:51:34

APP 安全测试项总结

一、安装包测试 1.1、关于反编译 目的是为了保护公司的知识产权和安全方面的考虑等&#xff0c;一些程序开发人员会在源码中硬编码一些敏感信息&#xff0c;如密码。而且若程序内部一些设计欠佳的逻辑&#xff0c;也可能隐含漏洞&#xff0c;一旦源码泄漏&#xff0c;安全隐患…

作者头像 李华
网站建设 2026/6/10 11:16:52

自动化测试做得好的标准是什么

自动化测试要做得好的标准&#xff0c;主要包括以下几个方面&#xff1a; 一、高覆盖率与精准定位 1、测试用例覆盖全面&#xff1a;自动化测试应覆盖产品的核心功能、关键业务流程以及常见的异常场景&#xff0c;确保测试范围广泛&#xff0c;降低遗漏风险。 2、问题定位准…

作者头像 李华
网站建设 2026/6/10 11:16:23

SplitJoin.vim 终极使用指南:快速切换代码格式

SplitJoin.vim 终极使用指南&#xff1a;快速切换代码格式 【免费下载链接】splitjoin.vim Switch between single-line and multiline forms of code 项目地址: https://gitcode.com/gh_mirrors/sp/splitjoin.vim SplitJoin.vim 是一个功能强大的 Vim 插件&#xff0c;…

作者头像 李华