Android对接华为AI - 文本识别

准备工作

在开发应用前:

1、需要在AppGallery Connect中配置相关信息,包括:注册成为开发者和创建应用。

2、使用ML Kit云侧服务(端侧服务可不开通)需要开发者在AppGallery Connect上打开ML Kit服务开关。

集成HMS Core SDK

工程根目录build.gradle文件

复制代码
buildscript {
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
        // 配置HMS Core SDK的Maven仓地址。
        maven {url 'https://developer.huawei.com/repo/'}
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.0.4'
        classpath 'com.huawei.agconnect:agcp:1.6.2.300'
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
        // 配置HMS Core SDK的Maven仓地址。
        maven {url 'https://developer.huawei.com/repo/'}
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

app module下的build.gradle依赖华为基础SDK包与语言识别模型包:

复制代码
// 引入基础SDK
implementation 'com.huawei.hms:ml-computer-vision-ocr:3.11.0.301'
// 引入拉丁语文字识别模型包
implementation 'com.huawei.hms:ml-computer-vision-ocr-latin-model:3.11.0.301'
// 引入日韩语文字识别模型包
implementation 'com.huawei.hms:ml-computer-vision-ocr-jk-model:3.11.0.301'
// 引入中英文文字识别模型包
implementation 'com.huawei.hms:ml-computer-vision-ocr-cn-model:3.11.0.301'

配置混淆脚本

复制代码
-dontwarn com.huawei.**
-keep class com.huawei.** {*;}
-dontwarn org.slf4j.**
-keep class org.slf4j.** {*;}
-dontwarn org.springframework.**
-keep class org.springframework.** {*;}
-dontwarn com.fasterxml.jackson.**
-keep class com.fasterxml.jackson.** {*;}
-keep class com.huawei.noah.bolttranslator.**{*;}
-dontwarn com.huawei.hisi.**
-keep class com.huawei.hisi.** {*;}

添加权限

复制代码
    <!--相机权限-->
    <uses-permission android:name="android.permission.CAMERA" />
    <!--使用网络权限-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--写权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--读权限-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!--录音权限-->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!--获取网络状态权限-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--获取wifi状态权限-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

端侧识别

复制代码
    /**
     * 端侧文本识别
     */
    private void textAnalyzer() {
        long startTime =  (new Date()).getTime();
        Log.d("textAnalyzer", "start: " + startTime);
        MLLocalTextSetting setting = new MLLocalTextSetting.Factory()
                .setOCRMode(MLLocalTextSetting.OCR_DETECT_MODE)
                // 设置识别语种。
                .setLanguage("zh")
                .create();
        MLTextAnalyzer analyzer = MLAnalyzerFactory.getInstance().getLocalTextAnalyzer(setting);
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.test2);
        // 通过bitmap创建MLFrame,bitmap为输入的Bitmap格式图片数据。
        MLFrame frame = MLFrame.fromBitmap(bitmap);
        Task<MLText> task = analyzer.asyncAnalyseFrame(frame);
        task.addOnSuccessListener(new OnSuccessListener<MLText>() {
            @Override
            public void onSuccess(MLText text) {
                List<MLText.Block> blocks = text.getBlocks();
                StringBuilder sb = new StringBuilder();
                for (MLText.Block block : blocks) {
                    sb.append(block.getStringValue());
                }
                // 识别成功处理。
                tv.setText("识别成功: " + sb.toString());
                Log.d("textAnalyzer", "识别成功:\n " + sb.toString());
                long endTime =  (new Date()).getTime();
                Log.d("textAnalyzer", "end: " + endTime);
                Log.d("textAnalyzer", "耗时: " + (endTime-startTime));
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(Exception e) {
                // 识别失败处理。
                tv.setText("识别失败");
            }
        });
    }

端侧识别测试

原图:test2.png

识别结果:

云侧文本识别

注意:此功能收费,但是精确度更高。

配置应用的鉴权信息

先申请apikey:
https://developer.huawei.com/consumer/cn/console/api/credentials/dev388421841221889538

然后配置apikey

云侧文本识别实现

复制代码
    MLApplicationInit.init();

    /**
     * 云侧文本识别
     */
    private void textAnalyzerNet() {
        long startTime =  (new Date()).getTime();
        Log.d("textAnalyzerNet", "start: " + startTime);
        // 方式一:使用自定义参数配置。
        // 创建语言集合。
        List<String> languageList = new ArrayList();
        languageList.add("zh");
        languageList.add("en");
        // 设置参数。
        MLRemoteTextSetting setting = new MLRemoteTextSetting.Factory()
                // 设置云侧文本字体模式:
                // 若选择手写体格式,文本检测模式仅支持稀疏文本,语言列表仅支持中文(zh),边界框格式仅支持NGON四顶点坐标。
                // setTextDensityScene、setLnaguageList、setBorderType等方法设置均不生效。
                // 若选择印刷体格式,则需要手动设置语言列表,检测模式和边框样式,或采取默认配置。
                // MLRemoteTextSetting.OCR_HANDWRITTENFONT_SCENE:手写体。
                // MLRemoteTextSetting.OCR_PRINTFONT_SCENE:印刷体。
                .setTextFontScene(MLRemoteTextSetting.OCR_HANDWRITTENFONT_SCENE)
                // 设置云侧文本检测模式:
                // MLRemoteTextSetting.OCR_COMPACT_SCENE:文本密集场景的文本识别。
                // MLRemoteTextSetting.OCR_LOOSE_SCENE:文本稀疏场景的文本识别。
                .setTextDensityScene(MLRemoteTextSetting.OCR_LOOSE_SCENE)
                // 设置识别语言列表,使用ISO 639-1标准。
                .setLanguageList(languageList)
                // 设置文本边界框返回格式。
                // MLRemoteTextSetting.NGON:返回四边形的四个顶点坐标。
                // MLRemoteTextSetting.ARC:返回文本排列为弧形的多边形边界的顶点,最多可返回多达72个顶点的坐标。
                .setBorderType(MLRemoteTextSetting.ARC)
                .create();
        MLTextAnalyzer analyzer = MLAnalyzerFactory.getInstance().getRemoteTextAnalyzer(setting);
        // 方式二:使用默认参数配置,自动检测语种进行识别,适用于文本稀疏场景,文本框返回格式为:MLRemoteTextSetting.NGON。
        //MLTextAnalyzer analyzer = MLAnalyzerFactory.getInstance().getRemoteTextAnalyzer();
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.test2);
        // 通过bitmap创建MLFrame,bitmap为输入的Bitmap格式图片数据。
        MLFrame frame = MLFrame.fromBitmap(bitmap);
        Task<MLText> task = analyzer.asyncAnalyseFrame(frame);
        task.addOnSuccessListener(new OnSuccessListener<MLText>() {
            @Override
            public void onSuccess(MLText text) {
                // 识别成功。
                List<MLText.Block> blocks = text.getBlocks();
                StringBuilder sb = new StringBuilder();
                for (MLText.Block block : blocks) {
                    sb.append(block.getStringValue());
                    sb.append("\n");
                }
                // 识别成功处理。
                tv.setText("识别成功: " + sb.toString());
                Log.d("textAnalyzerNet", "识别成功:\n " + sb.toString());
                long endTime =  (new Date()).getTime();
                Log.d("textAnalyzerNet", "end: " +endTime);
                Log.d("textAnalyzerNet", "耗时: " + (endTime-startTime));
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(Exception e) {
                // 识别失败,获取相关异常信息。
                try {
                    MLException mlException = (MLException) e;
                    // 获取错误码,开发者可以对错误码进行处理,根据错误码进行差异化的页面提示。
                    int errorCode = mlException.getErrCode();
                    // 获取报错信息,开发者可以结合错误码,快速定位问题。
                    String errorMessage = mlException.getMessage();
                } catch (Exception error) {
                    // 转换错误处理。
                }
            }
        });
    }

云侧文本识别测试

原图:test2.png

识别结果:

官网参考

更多内容,请参考官网:
https://developer.huawei.com/consumer/cn/doc/hiai-Guides/text-recognition-0000001050040053

相关推荐
妙妙屋(zy)3 小时前
Claude Code+CC-Switch+CC-Connect+飞书使用教程
ai
小七-七牛开发者6 小时前
Coding Agent 规则管理:CLAUDE.md、Skills、Hooks、Subagents 到底怎么选?
ai·大模型·agent·claude·token·loop·mcp·claudecode·ai coding
doiito12 小时前
左脚踩右脚:让 LLM 自进化的 Agent 轨迹训练法——为什么它能补上主流范式的最后一块拼图
ai·系统设计
带刺的坐椅21 小时前
从 Claude Code 隐私争议,看 SolonCode 的设计选择
ai·llm·agent·claudecode·soloncode·codingplan
lincats1 天前
Claude Code项目越写越乱?这套清理流程能救你
ai·ai agent·claude code
云燕实验室CloudLab1 天前
《AI开始"抱团"思考了!多智能体 + 思维图到底有多强?》
ai·学习工具·智慧学伴
小七-七牛开发者1 天前
论文解读:DeepSeek DSpark 在真实高并发推理服务中,如何保证 Token 生成又好又快?
ai·大模型·编程·ai coding
doiito1 天前
【Agent Harness】Gliding Horse 核心设计理念,不跟风开发自己的AI Agent
ai·rust·架构设计·系统设计·ai agent
doiito2 天前
【Agent Harness】Gliding Horse 的 L2 作战地图:让多 Agent 协作从“摸黑”变成“透明”
ai·rust·架构设计·系统设计·ai agent
xiezhr2 天前
逛GitHub发现一款免费带有AI功能的数据库管理工具DBX
ai·开源软件·自然语言·数据库管理工具