合合信息TextIn智能文字识别API使用介绍及体验

技术原理与API功能介绍

技术基本原理

智能文字识别技术,主要使用的是光学字符识别(OCR)技术,它的工作原理实际上是通过将图像中的文字转换成机器可以读取的文本。首先,技术会对图像进行预处理,这包括调整图像的大小、消除噪声、增强对比度等,有时还会把彩色或灰度图像转换成黑白图像,以便更容易识别文字。接下来,OCR系统会分析这些经过预处理的图像,找出文字所在的区域,可能是行、单词甚至是每一个字符。之后,系统会对每个字符进行识别,这一步通常利用模式识别技术,比如神经网络或支持向量机,将图中的字符与已知的字符模板进行匹配,或者通过机器学习模型来预测字符。最后,在字符识别之后,文本通常还需要一些后处理来提高准确率和可读性,例如通过语法检查和词典来纠正拼写错误。随着深度学习技术的进步,OCR技术的效率和准确性都得到了显著的提升,它现在被广泛应用在从自动文档处理到车牌识别,甚至是手机应用中的实时文字识别等多个场景。

TextIn API 的功能和实际使用场景说明

通用文字识别

通用文字识别API是面向多种类型文本内容的识别服务,实际应用中,尤其是对于开发者们来说,应该是最广为使用的TextIn API,包括:

  • 文字识别:可从各类图像或文档中准确提取文字,适用于快速文本数据化处理,如网页图片文字提取或社交媒体图片中的文字识别。
  • 在开发一个文档管理系统时,可以利用文字识别功能自动分类和标记上传的文档内容,从而减少人工输入的错误和提高处理速度。
  • 表格识别:能够识别并结构化图像或PDF中的表格数据,极大地方便了财务、统计等需要大量处理表格数据的场景。
  • 在财务软件开发中,表格识别可以用来从各类发票和财务报表中提取数据,自动填充账本,极大地简化财务人员的工作负担。
  • 办公文档识别:专为办公文档设计,能够识别提取出Word、PDF等办公软件文件中的文字,支持复杂格式和多种语言的识别。
  • 在企业内容管理系统中,办公文档识别可以帮助自动化地将重要文档中的信息录入系统,同时保持文档的格式和元数据,方便后续的文档检索和管理。

图像智能处理

图像智能处理API提供高级图像编辑和优化功能,为开发者提供了高级的图像编辑、优化和分析工具:包括:

  • 图像切边增强:能够自动调整用户上传的图像,剪裁不必要的边框,增强图像焦点和美观性。
  • 在电商平台的图像处理中,自动切边可以确保商品图片的焦点统一,提升商品页面的整体视觉效果。
  • PS检测:分析图像以确定是否经过Photoshop等软件的修改,适用于版权保护和真实性验证。
  • 在门户网站或内容审核系统中,PS检测可以帮助审核团队识别潜在的伪造图片,保障发布内容的真实性和可信度。
  • 自动擦除手写:能够识别并自动清除图像中的手写笔迹,用于改善扫描文档的可读性和美观。
  • 在文档数字化处理中,自动擦除手写功能可以帮助将历史档案或手写注释的文档转化为清洁的电子版本,便于长期存储和检索。

卡证文字识别

卡证文字识别API专注于各类证件的文字提取,应用包括:

  • 身份证识别:快速读取身份证信息,适用于在线身份验证、客户信息快速录入等。
  • 名片识别:自动提取名片上的联系信息,简化联系信息的数字化存储过程。
  • 营业执照识别:从营业执照中提取公司名称、法人等关键信息,支持企业快速注册或核验流程。

另外还包括以下这些在个性化需求中可以使用的特定方向的增强API:

针对各类票据的票据文字识别/验真

票据文字识别及验真API:

  • 票据文字识别:自动识别收据、发票等票据上的文字,助力财务自动化处理。
  • 增票验真:对增值税发票进行验证,确保票据的真实性和有效性,重要于财务审计和税务合规。

文档格式转换

文档格式转换API提供跨格式的文档转换服务:

  • PDF/Word/Excel等格式转换:允许用户将文件从一种格式转换为另一种格式,例如PDF转PPT,或Word转PDF,确保文档在不同平台和设备上的可用性和一致性。

这些API产品的功能覆盖了从简单的文字识别到复杂的图像处理和文件转换等多个层面,适用于多种实际应用场景。

API使用示例

初次尝试调用API时,对于工作台给出的调用示例代码稍加改动即可获得json格式且结果非常准确的图片文本。
代码如下,将ID和密码字符改为工作台里自己的版本即可使用。

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws Exception {
        
        String url = "https://api.textin.com/ai/service/v2/recognize";
        String appId = "0602d**************";
        String secretCode = "5256343************";
        //appID和secretCode在用户的工作台中获取
        BufferedReader in = null;
        DataOutputStream out = null;
        String result = "";
        try {
            byte[] imgData = readfile("example.jpg"); // image
            URL realUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("Content-Type", "application/octet-stream");
            conn.setRequestProperty("x-ti-app-id", appId);
            conn.setRequestProperty("x-ti-secret-code", secretCode);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setRequestMethod("POST"); // 设置请求方式
            out = new DataOutputStream(conn.getOutputStream());
            out.write(imgData);
            out.flush();
            out.close();
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!" + e);
            e.printStackTrace();
        }
        finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        System.out.println(result);
    }
    public static byte[] readfile(String path)
    {
        String imgFile = path;
        InputStream in = null;
        byte[] data = null;
        try
        {
            in = new FileInputStream(imgFile);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        return data;
    }

}

示例图片是:
一个很糊的拍出来的课件
此时返回的结果为

{“code”:200,“message”:“success”,“duration”:86,“result”:{“angle”:0,“width”:443,“lines”:[{“angle”:0,“type”:“text”,“direction”:1,“handwritten”:0,“score”:0.999,“position”:[36,9,399,4,399,24,36,30],“text”:“(11分)有一个16位数据宽度的浮点运算部件,浮点数的格式为”},{“angle”:0,“type”:“text”,“direction”:1,“handwritten”:0,“score”:0.995,“position”:[60,40,374,36,374,57,60,60],“text”:“数符(1位)尾数(7位)阶符(1位)阶码(7位)”},{“angle”:0,“type”:“text”,“direction”:1,“handwritten”:0,“score”:0.975,“position”:[24,78,436,75,436,96,24,99],“text”:“其中阶码用移码表示;尾数用补码表示。已知:(X)10-7/32,Y的浮”},{“angle”:0,“type”:“text”,“direction”:1,“handwritten”:0,“score”:0.991,“position”:[12,103,122,103,122,119,12,119],“text”:“点数表示为A87FH。”},{“angle”:0,“type”:“text”,“direction”:1,“handwritten”:0,“score”:0.999,“position”:[28,124,420,124,420,144,28,144],“text”:“(1)(2分)在浮点数格式中,用规格化数表示尾数,有什么优点?”},{“angle”:0,“type”:“text”,“direction”:1,“handwritten”:0,“score”:0.995,“position”:[27,146,300,148,300,169,27,167],“text”:“(2)(2分)写出X的规格化浮点数表示形式。”},{“angle”:0,“type”:“text”,“direction”:1,“handwritten”:0,“score”:0.998,“position”:[26,171,219,171,219,191,26,191],“text”:“(3)(2分)求Y的二进制真值。”},{“angle”:0,“type”:“text”,“direction”:1,“handwritten”:0,“score”:0.985,“position”:[24,194,439,198,439,220,24,216],“text”:“(4)(5分)求X+Y浮点数[X+Y](采用0舍1入法,列出计算步骤)。”}],“height”:234},“version”:“v2.0.0”}

根据企业提供的API文档,引入gson库对json结构的响应体进行处理,以示例代码为模板进行改动后,调用API后返回的结果中可以得到方便使用的有分行格式的文本。

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import com.google.gson.Gson;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws Exception {
        String url = "https://api.textin.com/ai/service/v2/recognize";
        String appId = "0602d9f*************";
        String secretCode = "5256343*************";
        BufferedReader in = null;
        DataOutputStream out = null;
        StringBuilder result = new StringBuilder();
        try {
            byte[] imgData = readfile("example.jpg");
            URL realUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("Content-Type", "application/octet-stream");
            conn.setRequestProperty("x-ti-app-id", appId);
            conn.setRequestProperty("x-ti-secret-code", secretCode);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setRequestMethod("POST");
            out = new DataOutputStream(conn.getOutputStream());
            out.write(imgData);
            out.flush();
            out.close();
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
            Gson gson = new Gson();
            Map<?, ?> response = gson.fromJson(result.toString(), Map.class);
            formatResponse(response);
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!" + e);
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

    public static byte[] readfile(String path) {
        String imgFile = path;
        InputStream in = null;
        byte[] data = null;
        try {
            in = new FileInputStream(imgFile);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return data;
    }

    public static void formatResponse(Map<?, ?> response) {
        Map<?, ?> result = (Map<?, ?>) response.get("result");
        System.out.println("识别结果:");
        List<Map<?, ?>> lines = (List<Map<?, ?>>) result.get("lines");
        for (Map<?, ?> line : lines) {
            System.out.println(line.get("text"));
        }
    }
}

运行结果:

识别结果:
(11分)有一个16位数据宽度的浮点运算部件,浮点数的格式为
数符(1位)尾数(7位)阶符(1位)阶码(7位)
其中阶码用移码表示;尾数用补码表示。已知:(X)10-7/32,Y的浮
点数表示为A87FH。
(1)(2分)在浮点数格式中,用规格化数表示尾数,有什么优点?
(2)(2分)写出X的规格化浮点数表示形式。
(3)(2分)求Y的二进制真值。
(4)(5分)求X+Y浮点数[X+Y](采用0舍1入法,列出计算步骤)。

个人使用体验

界面使用体验

开发者进入工作台的界面如下。

工作台界面

左侧菜单提供了清晰的功能区块划分,如通用文字识别、图像智能处理等,让开发者能快速找到需要的服务。在顶部菜单和右侧边栏中,能够看到“文档中心”和“官方社群”等入口,提供了快速访问API文档和社区支持的途径,对开发者使用十分友好。

中间的用户个性化信息区域,必要信息也进行了突出显示,HTTP头信息、URL参数等关键信息框都位于非常容易观察到的位置,同时必填项有明显的标记。

可以在整个右侧组件的上方调整选择查看API文档本身,示例代码或调用结果。而在示例代码选择上,TextIn提供了多种编程语言(如Java, C#,Python, PHP等)的代码示例。让不同技术栈的开发者可以快速理解如何集成和使用API。在关键位置的中文注释也对初次使用者非常友好。

总体来说,TextIn工作台的界面设计注重用户体验和功能性,能够让开发者在短时间内理解和开始使用API。开发体验是非常顺畅的。

API文档

  • 在完整性方面,文档提供了详细的功能描述,列举了API的核心特性,并针对可能的应用场景给出了清晰的指导,确保了用户能够全面了解产品的能力。
  • 在可理解性方面,文档结构合理、层次分明,有助于开发者快速导航并理解相关信息,同时,丰富的请求和响应示例进一步增强了这一点。准确性也得到了很好的体现,尤其是通过错误码的详尽列表,为问题解决和调试提供了必要的信息。
  • 在可操作性方面,文档包含了对于初次使用的必要的操作指导,比如怎么构建请求体和添加请求头等,使得开发者可以实际操作和实施API。并且对文件格式和大小有明确的说明,减少了用户试错的时间。

根据API文档的内容,以示例代码为范本,在本地IDE接入API之后,可以非常便捷快速的获取到调用结果。由于API文档较为规范清晰,调用过程也如前文API使用示例描述,运行和调试都非常顺利。

定位和优势

定价策略

TextIn的定价策略非常灵活,采取按需付费的定价模式,价格低至0.04元/次。使用户能够根据实际使用量进行支付,无需固定费用或长期订阅,这大大降低了入门门槛和总体成本。此外,为了满足不同用户的需求,TextIn还提供多样的套餐选择和优惠方案,包括量大优惠、长期合作折扣等。

市场优势

在国内市场中,相较于如阿里云和腾讯云这类大型云服务器厂商提供的OCR服务,在技术精度相似的情况下,TextIn的定价有显著优惠许多的优势。相较于如WPS办公系列和福昕PDF等同样具有文字识别功能的产品,TextIn在文字识别技术的精准度和处理速度方面表现更加卓越,尤其在处理复杂文档和多样化格式方面具有明显优势。开发者和企业用户在选择文字识别解决方案时,TextIn不仅定价优惠、技术领先,同时也提供了更加人性化的开发工具和接口,极大地简化了集成和使用过程。

与国外产品如微软的Azure云服务的识别技术相比,TextIn的产品在本地化处理上更具优势。特别是对中文的识别和理解能力,TextIn展示了对国内语境的深入把握,包括对各种中文标点符号和中文字体的高精度识别能力。这种对于中文使用的深刻理解确保了其在国内市场的高兼容性和用户满意度,能够更好地满足国内开发者和企业用户的核心需求,帮助解决其痛点。

因此,无论是从成本效益、技术精度还是用户体验角度,TextIn的智能文字识别API都显示出了其市场领先的竞争力。这些优势不仅使其在国内市场中占据了有利位置,也为其在国际市场上的竞争提供了强有力的支持和潜力。

总结

调用时,API文档规范,开发者友好,编码过程顺利。调用后,返回的调用结果准确度高,速度快,API性能条件比较优越。遇到问题时有多个途径可以及时获取技术支持。总的来说是非常适合开发的。

个人觉得可以优化的地方有:

  • 可以在适当的地方加入一些图示和流程图,可以帮助视觉化学习者更快地理解API的工作流程和架构。

  • 文档中没有提到是否提供了任何官方的SDK或辅助库。如果有SDK或库的相关信息,会对简化开发过程非常有用。

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值