Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: add service.ai.ocr #6

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions rfcs/0000-add-ai-ocr-ability.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
- 提案时间: 2023-11-21
- 影响版本: 1400
- 相关 Issues: 无

## 【必填】概述

光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。亦即将图像中的文字进行识别,并以文本的形式返回。

## 【必填】动机

方便开发者更便利的使用AI相关一些能力,降低开发难度,从而可以开发更丰富的快应用;

## 【必填】API规格和使用案例

#### 接口声明
```javascript
{ "name": "service.ai.ocr" }
```

#### 导入模块
```javascript
import ocr from '@service.ai.ocr' 或 const ocr = require('@service.ai.ocr')
```

#### 接口定义
---
##### ocr.getProvider()
检查当前设备是否支持OCR,获取服务提供商。

##### 参数:

##### 返回值:
字符串,服务提供商的代号,如厂商的英文品牌名称,假如无此服务则返回空字符串;

##### 代码案例:
```javascript
console.log(ocr.getProvider())
```

#


##### ocr.detect(object)
对目标图片进行OCR识别。

##### 参数:
| 参数名 | 类型 | 是否必填 | 说明 |
| :----- | :---- | :--: |:---------------------------------------------------------- |
| data | Object | 是 | 输入的数据资源 |
| config | Object | 否 | OCR能力配置 |
| success | Function | 否 | 成功回调函数 |
| fail | Function | 否 | 失败回调函数 |

###### 参数 - data值:
| 参数名 | 类型 | 是否必填 | 说明 |
| :----- | :---- | :--: |:---------------------------------------------------------- |
| type | String | 是 | 输入的数据资源类型,可以为uri、rawString; |
| content | String | 是 | 与type匹配的资源描述; |

###### 参数 - data - type值:
| type参数值 | 说明 |
| :-----|:---------------------------------------------------------- |
| uri | content表示数据从文件获取,提供文件的本地路径,类型为String; |
| rawString | content表示数据实际内容,类型为String,表示base64类型图片; |

###### 参数 - config值:
| 参数名 | 类型 | 是否必填 | 说明 |
| :-----: | :----: | :--: |:----------------------------------------------------------: |
| mode | Number | 否 | 识别模式:0表示按行识别,1表示按段落识别,默认值为0; |


##### 返回值:
| 参数名 | 类型 | 是否必填 | 说明 |
| :-----: | :----: | :--: |:----------------------------------------------------------: |
| result | Array\<OCRResult> | 是 | 识别出的文本块; |

##### 返回值 OCRResult值:
| 参数名 | 类型 | 是否必填 | 说明 |
| :----- | :---- | :--: |:---------------------------------------------------------- |
| type | String | 是 | 识别出的数据传递方式,与入参data中的type字段定义一致,这里一般为“rawString” |
| content | String | 是 | 识别出的数据描述,与入参data中的content字段含义一致,这里是识别出的文本; |
| boundingBox | Number[] | 是 | 识被识别出的文本的不规则包围盒,包含偶数个浮点数,每2个浮点数表示一个包围盒上的点的坐标; |

boundingBox演示:

![boundingBox 图片](https://i.postimg.cc/x86TQWmH/20231121-112611.png)

如上图,则boundingBox的值为[x1, y1, x2, y2, x3, y3, x4, y4],boundingBox中相邻的点连接表示包围盒上的一条边,且首尾相连;

##### 代码案例:
```javascript
const uri = "internal://tmp/c2e94480-9d45-4666-bf0a-41b41782bb1f/IMG_20230905_171143.jpg"
ocr.detect({
data: {
type: 'uri',
content: uri
},
config: {
mode: 0
},
success: (data) => {
const texts = data.result
for(const text of texts){
const {type, content, boundingBox} = text
}
console.log("OCR success")
}
})
```



## 【必填】提案人员是否愿意自行实现该功能

是:提案人员愿意在提案通过后自行实现该功能;

## 详细设计

可选,请向一个熟悉 hapjs内部实现的人讲解如何在 hapjs中实现这个功能,或讲解实现这一功能需要什么步骤。

## 缺陷

我们是不是可以不做这个功能,请考虑:

- 实现这个功能的投入:包括代码的复杂度、代码体积的增加、实现功能投入的人力
- 这个功能是不是不需要 hapjs提供,使用 hapjs的开发者也可以在应用层实现,甚至实现得更好
- 对 hapjs既有惯用开发习惯的影响
- 对已发布版本和现有功能的影响,以及用户进行迁移的成本
- 对其它未有代码实现的 RFC 提案的影响

## 替代选择

还有其他的方案也可以实现这个功能吗?

## 适配策略

如果我们实现了这个提案,有没有什么办法可以帮助开发者更好地适应这个改动?