likes
comments
collection
share

从零到 TextIn:深入探讨 API 集成,释放文字识别的威力

作者站长头像
站长
· 阅读数 8

从零到 TextIn:深入探讨 API 集成,释放文字识别的威力

前言

当我们踏入数字化时代,文字不再只是静态的字符,而是成为了信息传递和智能决策的核心。在这个时代,我们急需先进的智能文字识别技术,以便让机器更深刻地理解和处理文本信息。而合合信息公司作为一家引领行业的先锋,不仅仅提供了文字处理的解决方案,更带来了智能文字识别的革命。

无论您是技术爱好者、开发者,还是对智能技术充满好奇心的读者,都将在本文中找到关于 TextIn 文字识别的全面解读。让我们一同走进文字的智能化时代,探索如何快速集成 TextIn 让机器真正理解和处理文字信息的奥秘。

TextIn 的 API 申请

首先,您需要在 TextIn 官网注册一个账号,并在个人账户的工作台界面获取相应的机器人产品。值得一提的是,新用户可获得 1000 次的免费额度,足够您体验和集成开发相当一段时间。 www.textin.com/

从零到 TextIn:深入探讨 API 集成,释放文字识别的威力 现在,您已经可以使用 API 了,接下来我们将解决以下两个问题: 1.我们该如何快速调用它的 API 进行使用 2.如何在调用的时候证明我们的身份

我们接下来一个个去解决

我提供了两种集成 TextIn 的方法,如果想要快速使用可以直接跳到第二部分查看 TextIn SDK 集成

一、TextIn 的 API 调用实战

首先,我们需要在工作台的总览页面右下角找到身份验证所需的 x-ti-app-idx-ti-secret-code,保存这两个数据。

从零到 TextIn:深入探讨 API 集成,释放文字识别的威力 紧接着,访问您想要调用的机器人模型的官方文档,找到该机器人对应的请求 URL 和示例代码。将示例代码复制到您的电脑并运行即可。

从零到 TextIn:深入探讨 API 集成,释放文字识别的威力

封装发送请求工具类

以图片识别机器人为例,我们创建了一个 TextIn 发送请求的工具类。该工具类中包含了对不同机器人的请求方法,以便于代码复用。

/**
 * 发送请求给 AI
 * @param requestUrl 请求 url
 * @param image 需要解析的图片
 * @return 解析后字符串
 */
public static String CallAI (String requestUrl, MultipartFile image) {
    // 从 MultipartFile 中获取图片数据
    byte[] imgData;
    try {
        imgData = image.getBytes();
    } catch (IOException e) {
        log.error("Error reading image file", e);
        throw new BusinessException(ErrorCode.PARAMS_ERROR, "文件错误");
    }

    // 通用文字识别
    String url = requestUrl;
    String appId = TextlnConstant.APP_ID;
    String secretCode = TextlnConstant.SECRET_CODE;
    BufferedReader in = null;
    DataOutputStream out = null;
    String result = "";
    // todo 引入 Guava Retrying 重试机制
    try {
        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) {
        log.error("发送 POST 请求出现异常!" + e);
    }
    finally {
        try {
            if (out != null) {
                out.close();
            }
            if (in != null) {
                in.close();
            }
        } catch (IOException ex) {
            log.error("关闭图片识别流出现异常!" + ex);
        }
    }

    return result;
}

将请求的机器人模型的 url 和图片文件作为方法参数传入,加强代码的复用性,并提取相关的 appId 和 secretCode 参数存放在常量类中,避免魔法数字和提高代码可读性

封装模型调用工具类

由于对于不同机器人的调用有着不同的请求 url 和不同的返回值处理方法,我们再定义一个工具类便于按需调用不同的模型,同样我们以图片识别为例,首先将图片识别机器人请求 url 存放在我们对应的常量类中,按照官方文档给出的返回值结果获取或者我们可以自己根据返回值结果来个性化提取,由于返回值是 JSON 格式,我采用了谷歌的 Gson 工具来解析提取文本,当然还有 Hutool 的 JSONUtil 工具库也非常值得使用

从零到 TextIn:深入探讨 API 集成,释放文字识别的威力 我们在官方的 maven 仓库找一个使用量最多的 Gson 依赖引入我们的 pom.xml 文件

<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.9</version>
</dependency>

当我们准备开始调用 TextIn 的 API 进行我们的操作时,我们还需要考虑一个问题,当我们调用 API 失败时,我们该如何知道出现了什么问题呢?在官方文档的最下方,给出了所有可能的错误码和对应的信息,我们可以根据调用 API 返回的错误码来获取错误信息

从零到 TextIn:深入探讨 API 集成,释放文字识别的威力 对于这个问题我们可以根据官方提供的所有的错误码和信息设计一个简单的枚举类,并在枚举类中提供一个可以根据错误码获取对应的错误信息的方法

public enum TextlnErrorCodeEnum {

    SUCCESS(200, "成功"),
    NULL_APP_ID_OR_SECRET_CODE(40101, "x-ti-app-id 或 x-ti-secret-code 为空"),
    INVALID_APP_ID_OR_SECRET_CODE(40102, "x-ti-app-id 或 x-ti-secret-code 无效,验证失败"),
    CLIENT_IP_NOT_IN_WHITE_LIST(40103, "客户端IP不在白名单"),
    INSUFFICIENT_BALANCE(40003, "余额不足,请充值后再使用"),
    INVALID_PARAMETERS(40004, "参数错误,请查看技术文档,检查传参"),
    INACTIVE_OR_NONEXISTENT_ROBOT(40007, "机器人不存在或未发布"),
    INACTIVE_ROBOT(40008, "机器人未开通,请至市场开通后重试"),
    UNSUPPORTED_IMAGE_TYPE(40301, "图片类型不支持"),
    EXCEEDED_FILE_SIZE_LIMIT(40302, "上传文件大小不符,文件大小不超过 10M"),
    UNSUPPORTED_FILE_TYPE(40303, "文件类型不支持"),
    INVALID_IMAGE_SIZE(40304, "图片尺寸不符,图像宽高须介于 20 和 10000(像素)之间"),
    FILE_NOT_UPLOADED(40305, "识别文件未上传"),
    SERVICE_UNAVAILABLE(30203, "基础服务故障,请稍后重试"),
    INTERNAL_SERVER_ERROR(500, "服务器内部错误");

    /**
     * 状态码
     */
    private final Integer code;

    /**
     * 信息
     */
    private final String message;

    TextlnErrorCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 根据 code 获取信息
     *
     * @param code
     * @return
     */
    public static String getMessageByCode(Integer code) {
        if (ObjectUtils.isEmpty(code)) {
            return null;
        }
        for (TextlnErrorCodeEnum errorCode : TextlnErrorCodeEnum.values()) {
            if (Objects.equals(errorCode.code, code)) {
                return errorCode.message;
            }
        }
        return null;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

然后我们就可以定义我们的工具类来使用图片识别机器人的功能

/**
 * 图片文字识别
 * @param image
 * @return
 */
public static List<String> JudgeImage (MultipartFile image) {
    String response = TextlnSendUtils.CallAI(TextlnConstant.RECOGNIZE_URL, image);
    // 解析结果 json 字符串
    Gson gson = new Gson();
    JsonObject jsonObject = gson.fromJson(response, JsonObject.class);

    // 校验返回值
    int code = jsonObject.get("code").getAsInt();
    ThrowUtils.throwIf(!Objects.equals(code, 200), ErrorCode.SYSTEM_ERROR, TextlnErrorCodeEnum.getMessageByCode(code));

    // 获取 "lines" 数组 => 每行文字的识别结果
    JsonArray linesArray = jsonObject.getAsJsonObject("result").getAsJsonArray("lines");

    List<String> textList = new ArrayList<>();

    // 遍历 "lines" 数组
    for (JsonElement lineElement : linesArray) {
        JsonObject lineObject = lineElement.getAsJsonObject();
        // 获取 "text" 字段的值
        String text = lineObject.get("text").getAsString();
        textList.add(text);
    }

    return textList;
}

这样我们就可以在需要的时候传入图片文件数据,调用 TextIn 发送请求工具类,并传入图片数据和对应的机器人请求 url。最后,提取图片中识别出来的每一行数据,封装为一个集合返回,完成对图片识别 API 的集成

以下是 API 调用的关系结构

  • controller -> JudgeImageUtils (controller 层使用工具类的不同方法指定需要调用的模型)
    • JudgeImageUtils -> TextInSendUtils (模型调用工具类使用 TextIn 产品请求发送工具类)

实现多层解耦,提高代码的灵活性、可维护性和可扩展性

调用示例

/**
 * 图片识别
 * @param image
 * @return
 */
@PostMapping("/")
public BaseResponse<List<String>> recognize(@RequestPart("image") MultipartFile image) {
    // 返回图片识别结果文本
    List<String> textList = JudgeImageUtils.JudgeImage(image);

    return ResultUtils.success(textList);
}

最后在 swagger 文档中测试图片的识别结果

从零到 TextIn:深入探讨 API 集成,释放文字识别的威力

二、集成 TextIn SDK

根据以上的步骤我们可能会觉得,仍然有些繁琐,那可以怎么样再次简化我们的集成流程呢?我针对 TextIn 产品的一些功能方法做了对应的 SDK,如果需要使用可以直接去 maven 官方仓库下载依赖或者在我的 github 仓库中下载我的依赖包导入本地。

由于 sonatype 2024 年暂时关闭了创建问题的功能,maven 仓库暂时无法使用我的 SDK

github 仓库地址:github.com/my5411/text…

导入依赖

首先将对应的依赖导入我们项目的 pom.xml 文件

<dependency>
    <groupId>com.zhou</groupId>
    <artifactId>textIn-client-sdk</artifactId>
    <version>0.0.2</version>
</dependency>

开始使用

github 仓库中的 README.md 文件仅供参考

身份鉴权

在我们项目的 application.yml 文件中加入我们账户对应的鉴权信息

textin:
  client:
    appId: xxx
    secretCode: xxx

创建客户端

直接在项目需要使用的位置注入相关的 bean 即可快速创建 TextIn 使用的客户端

@Resource
private TextInApiClient textInApiClient;

客户端测试

使用客户端的 testConnect 方法测试客户端的连通性,然后就可以使用提供的图像识别方法进行简单的测试,以下是图片识别简单的代码实例

/**
 * 图片识别 MyTextIn SDK 测试
 * @param multipartFile
 * @return
 */
@PostMapping("/testPic/mySDK")
public BaseResponse<List<String>> testPicMyTextInSDK(@RequestPart("file") MultipartFile multipartFile) {
    String testConnect = textInApiClient.testConnect();
    System.out.println(testConnect);
    List<String> picData = textInApiClient.judgeImage(multipartFile);

    return ResultUtils.success(picData);
}

同样,我们还提供了相应的表格图片识别和图片剪切增强功能,更多功能期待您的发现和补充。

结语

通过本文,我们深入了解了如何申请 TextIn 的 API,快速调用并集成。作为技术爱好者和开发者,我们不仅仅是观望者,更是创造者,通过 TextIn 的强大功能,我们能够将智能文字识别融入到自己的项目中,赋予应用更多可能性。

这个旅程中,我们不仅仅是解锁了 TextIn API 的潜力,更是在技术的海洋中航行,不断探索前行。文字识别只是冰山一角,未来的可能性无限,让我们一起勇敢地面对挑战,将智能技术融入更多的场景,创造出更加美好和智能的世界。

感谢您的阅读,希望您在 TextIn 的文字智能化时代中,探索出更多的精彩故事。让我们携手共建智能未来!