腾讯 AI 开放平台目前处于免费公测阶段,提供很多有关图像和文本识别的 API 。

最近我们完成的 NoneBot QQ 聊天机器人项目就调用了它的暴恐识别和图片鉴黄接口,真香!

今天室友请教 OCR 方案,我想起这个平台于是顺手写了一份。

通用 OCR 接口

1. 接口描述

根据用户上传的图像,返回识别出的字段信息。

2. 请求参数

参数名称是否必选数据类型数据约束示例数据描述
app_idint正整数1000001应用标识(AppId)
time_stampint正整数1493468759请求时间戳(秒级)
nonce_strstring非空且长度上限32字节fa577ce340859f9fe随机字符串
signstring非空且长度固定32字节 签名信息,详见接口鉴权
imagestring原始图片的base64编码数据(原图大小上限1MB,支持JPG、PNG、BMP格式)...待识别图片

3. 响应参数

参数名称是否必选数据类型描述
retint返回码; 0表示成功,非0表示出错
msgstring返回信息;ret非0时表示出错时错误原因
dataobject返回数据;ret为0时有意义
+ item_listarray识别出的所有字段信息
+ + itemstring字段名称
+ + itemstringstring字段识别出来的信息
+ + itemcoordobject字段在图像中的像素坐标,包括左上角坐标x,y,以及宽、高width, height
+ + wordsarray字段识别出来的每个字的信息
+ + + characterstring识别出的单字字符
+ + + confidencefloat识别出的单字字符对应的置信度

4. 请求限制

单用户单接口的QPS(每秒请求次数)上限如下,如需更多请联系QQ客服反馈。

未认证用户个人认证用户企业认证用户
1210

签名算法

1. 计算步骤

用于计算签名的参数在不同接口之间会有差异,但算法过程固定如下4个步骤。

  1. 将<key, value>请求参数对按key进行字典升序排序,得到有序的参数对列表N
  2. 将列表N中的参数对按URL键值对的格式拼接成字符串,得到字符串T(如:key1=value1&key2=value2),URL键值拼接过程value部分需要URL编码,URL编码算法用大写字母,例如%E8,而不是小写%e8
  3. 将应用密钥以app_key为键名,组成URL键值拼接到字符串T末尾,得到字符串S(如:key1=value1&key2=value2&app_key=密钥)
  4. 对字符串S进行MD5运算,将得到的MD5值所有字符转换成大写,得到接口请求签名

2. 注意事项

  • 不同接口要求的参数对不一样,计算签名使用的参数对也不一样
  • 参数名区分大小写,参数值为空不参与签名
  • URL键值拼接过程value部分需要URL编码
  • 签名有效期5分钟,需要请求接口时刻实时计算签名信息
  • 更多注意事项,请查看常见问题

以下是用 Python 实现的 API 调用。

如需使用请先自行申请认证
如果图片超过 1MB 需要先经过压缩再发送请求

import hashlib
import string
import time
from random import randint
from urllib.parse import urlencode
import base64
import requests


app_id =  # 此处填写 API 账号
app_key =  # 此处填写 API 密码
nonce_str_example = 'fa577ce340859f9fe'
url = 'https://api.ai.qq.com/fcgi-bin/ocr/ocr_generalocr'
ct = lambda: time.time()


def get_nonce_str():
    nonce_str = ''
    len_str = string.digits + string.ascii_letters
    for i in range(len(nonce_str_example)):
        nonce_str += len_str[randint(0, len(len_str) - 1)]
    return nonce_str


def sign(req_data):
    new_list = sorted(req_data.items())
    encode_list = urlencode(new_list)
    req_data = encode_list + "&" + "app_key" + "=" + app_key
    md5 = hashlib.md5()
    md5.update(req_data.encode('utf-8'))
    data = md5.hexdigest()
    return data.upper()


def get_base64(path):
    with open(path, 'rb') as f:
        data = base64.b64encode(f.read())
        return data.decode()


def ocr(path):
    req_data = {
        'app_id': app_id,
        'time_stamp': int(ct()),
        'nonce_str': get_nonce_str(),
        'image': get_base64(path)
    }
    req_data['sign'] = sign(req_data)
    req_data = sorted(req_data.items())
    result = requests.post(url, data=req_data).json()
    return result


def print_img(path):
    data = ocr(path).get('data').get('item_list')
    for each in data:
        print(each.get('itemstring'))


if __name__ == '__main__':
    path = 'test.png'
    print_img(path)

test.png

测试效果

夏天的飞鸟,飞到我窗前唱歌, 又飞去了。
秋天的黄叶,它们没有什么可唱,只叹息声,飞落在那里。
Stray birds of summer come to my window to sing and fly away.
And yellow leaves of autumn, which have no songs, futter and fall there with a sign.
飞鸟集
STRAY
BIRDS
最后修改:2020 年 06 月 02 日 11 : 42 PM
如果觉得我的文章对你有用,请随意赞赏~