1. 接口说明

拍照速算识别基于深度学习的端到端识别技术,自动识别图片中的速算题并智能批改,返回标准LaTeX公式及批改结果。覆盖K12教育范围内15种题型,支持口算、竖式、方程、脱式计算等,详细请参照 速算题型 。支持的场景有印刷体、手写体、拍照场景。

该能力是通过HTTP API的方式给开发者提供一个通用的接口。HTTP API适用于一次性交互数据传输的AI服务场景,比如上传图片识别其中的文字等;相较于SDK,API具有轻量、跨语言的特点。另外,请注意该接口使用的HTTP API协议不支持跨域

2. 接口Demo

示例demo请点击 这里 下载。目前仅提供部分开发语言的demo,其他语言请参照下方接口文档进行开发。也欢迎热心的开发者到 讯飞开放平台社区 分享你们的demo。

3. 接口要求

集成拍照速算识别API时,需按照以下要求。

内容说明
传输方式https
请求地址https://rest-api.xfyun.cn/itr
请求行POST /v2/itr HTTP/1.1
接口鉴权签名机制,详情请参照下方接口鉴权
字符编码UTF-8
响应格式统一采用JSON格式
开发语言任意,只要可以向讯飞云服务发起HTTP请求的均可
适用范围任意操作系统,但因不支持跨域不适用于浏览器
图片属性最短边至少15px,最长边最大4096px,支持文字与水平轴小于±15°夹角偏转
图片格式jpg/png/bmp
图片大小base64编码后大小不超过4M

4. 接口调用流程

· 通过接口密钥基于hamc-sha256计算签名,将签名以及其他参数放在Http Request Header中。详见下方 鉴权认证

· 将请求参数以及图片数据放在Http Request Body中。详见下方 请求参数

· 向服务器端发送Http请求后,接收服务器端的返回结果。

4.1. 鉴权认证

在调用业务接口时,须对HTTP请求进行签名,服务端通过签名来识别用户并验证其合法性。

4.1.1. 鉴权方法

在Http Request Header中配置以下鉴权参数用于授权认证,其中签名信息放在请求头Authorization中。Header示例:

  1. Content-Type:application/json
  2. Accept:application/json,version=1.0
  3. Host:rest-api.xfyun.cn
  4. Date:Mon, 18 Mar 2019 08:32:07 GMT
  5. Digest:SHA-256=MGNjNThlMTU3ZWNmYjU4YTlhNTAwNDI5NWE4NTBmNWM5ZTMwMmM5OGZiNzE2ODY4ZjM2ZTQxYmNjMzkzZjIwYQ==
  6. Authorization:api_key="your_key", algorithm="hmac-sha256", headers="host date request-line digest", signature="$signature"

鉴权参数:

参数类型必须说明示例
Hoststring请求主机rest-api.xfyun.cn
Datestring当前时间戳,RFC1123格式("EEE, dd MMM yyyy HH:mm:ss z")Tue, 19 Mar 2019 01:31:46 GMT
Digeststring使用base64编码的进行SHA256计算的请求body,body请参考下方请求参数SHA-256=MGNjNThlMTU3ZWNmYjU4YTlhNTAw….
Authorizationstring使用base64编码的签名相关信息(签名基于hamc-sha256计算)参考下方签名详细生成规则

· date参数生成规则:

date必须是UTC+0或GMT时区,RFC1123格式(Mon, 02 Jan 2006 15:04:05 GMT)。服务端会对Date进行时钟偏移检查,最大允许300秒的偏差,超出偏差的请求都将被拒绝。

· Authorization参数生成格式:

  1. Authorization: api_key="your_key", algorithm="hmac-sha256", headers="host date request-line digest", signature="$signature"
  2. 示例:Authorization: api_key="a68af9b44ceaa8e1c1f53313dc6bd766", algorithm="hmac-sha256", headers="host date request-line digest", signature="Qdns+0diwvG9Jm0sPmVyF+hr+3dZTSEQO5kbzOtL0b4="

其中 api_key 是在控制台获取的APIKey(创建WebAPI平台应用并添加拍照速算识别服务后即可查看,为32位字符串。)algorithm 是加密算法(仅支持hmac-sha256),headers 是参与签名的参数。signature 是使用加密算法对参与签名的参数签名后并使用base64编码的字符串,详见下方。

· signature参数生成规则:

signature原始字段由 host,date,request-line,digest四个参数按照格式拼接成拼接的格式为(\n为换行符,’:’后面有一个空格): host: $host\ndate: $date\n$request-line\ndigest: $digest

例如,请求的url为:https://rest-api.xfyun.cn/v2/itr请求的body为:{"common":{"app_id":"xxxxxxxx"},"business":{"ent":"math-arith","aue":"raw"},"data":{"image":"/9j/4AAQSkZJRgABAQAAAQABA…="}}则signature生成步骤如下:

1)对请求body进行SHA256计算,把计算结果进行Base64编码后的字符串写在"SHA-256="后,即字段digest的值

  1. digest: SHA-256=Base64(SHA256(请求body))
  2. 例:digest: SHA-256=MGNjNThlMTU3ZWNmYjU4YTlhNTAwNDI5NWE4NTBmNWM5ZTMwMmM5OGZiNzE2ODY4ZjM2ZTQxYmNjMzkzZjIwYQ==

2)构建signature原始字段(signature_origin)

  1. host: rest-api.xfyun.cn
  2. date: Mon, 18 Mar 2019 09:02:18 GMT
  3. POST /v2/itr HTTP/1.1
  4. digest: SHA-256=MGNjNThlMTU3ZWNmYjU4YTlhNTAwNDI5NWE4NTBmNWM5ZTMwMmM5OGZiNzE2ODY4ZjM2ZTQxYmNjMzkzZjIwYQ==

3)使用hmac-sha256算法结合apiSecret(向平台申请的APISecret)对signature_origin签名,获得签名后的摘要signature_sha

  1. signature_sha=hmac-sha256(signature_origin,$apiSecret)

4)使用base64编码对signature_sha进行编码,获得最终的signature

  1. signature=base64(signature_sha)

4.1.2. 鉴权示例(golang)

  1. package main
  2. import (
  3. "crypto/hmac"
  4. "crypto/sha256"
  5. "encoding/base64"
  6. "fmt"
  7. "time"
  8. "github.com/valyala/fasthttp"
  9. )
  10. const (
  11. //支持的算法
  12. Algorithm = "hmac-sha256"
  13. //版本协议
  14. HttpProto = "HTTP/1.1"
  15. //假定的secret
  16. Secret = "12345"
  17. )
  18. func assemblyRequestHeader(req *fasthttp.Request, apiKey, host, uri string, body []byte) {
  19. req.Header.Set("Content-Type", "application/json")
  20. //设置请求头 其中Host Date 必须有
  21. req.Header.Set("Host", host)
  22. //date必须是utc时区,且不能和服务器时间相差300s
  23. currentTime := time.Now().UTC().Format(time.RFC1123)
  24. req.Header.Set("Date", currentTime)
  25. //对body进行sha256签名,生成digest头部,POST请求必须对body验证
  26. digest := "SHA-256=" + signBody(body)
  27. req.Header.Set("Digest", digest)
  28. //根据请求头部内容,生成签名
  29. sign := generateSignature(host, currentTime,"POST", uri, HttpProto, digest,Secret)
  30. //组装Authorization头部
  31. authHeader := fmt.Sprintf(`api_key="%s", algorithm="%s", headers="host date request-line digest", signature="%s"`, apiKey, Algorithm, sign)
  32. req.Header.Set("Authorization", authHeader)
  33. }
  34. func generateSignature(host, date, httpMethod, requestUri, httpProto, digest string, secret string) string {
  35. //不是request-line的话,则以 header名称,后跟ASCII冒号:和ASCII空格,再附加header值
  36. var signatureStr string
  37. if len(host) != 0 {
  38. signatureStr = "host: " + host + "\n"
  39. }
  40. signatureStr += "date: " + date + "\n"
  41. //如果是request-line的话,则以 http_method request_uri http_proto
  42. signatureStr += httpMethod + " " + requestUri + " " + httpProto + "\n"
  43. signatureStr += "digest: " + digest
  44. return hmacsign(signatureStr, secret)
  45. }
  46. func hmacsign(data, secret string) string {
  47. mac := hmac.New(sha256.New, []byte(secret))
  48. mac.Write([]byte(data))
  49. encodeData := mac.Sum(nil)
  50. return base64.StdEncoding.EncodeToString(encodeData)
  51. }
  52. func signBody(data []byte) string {
  53. //进行sha256签名
  54. sha := sha256.New()
  55. sha.Write(data)
  56. encodeData := sha.Sum(nil)
  57. //经过base64转换
  58. return base64.StdEncoding.EncodeToString(encodeData)
  59. }

4.1.3. 鉴权结果

如果认证成功,会返回HTTP 101状态码,表示协议升级成功;如果认证失败,则根据不同错误类型返回不同HTTP Code状态码,同时携带错误描述信息,详细错误说明如下:

HTTP Code说明错误描述信息
401缺少authorization请参数{“message”:”Unauthorized”}
403时钟偏移校验失败{“message”:”HMAC signature cannot be verified, a valid date or x-date header is required for HMAC Authentication”}
403签名参数解析失败{“message”:”HMAC signature cannot be verified”}
403签名校验失败{“message”:”HMAC signature does not match”}

认证失败返回示例:

  1. HTTP/1.1 403 Forbidden
  2. Date: Thu, 06 Dec 2018 07:55:16 GMT
  3. Content-Length: 116
  4. Content-Type: text/plain; charset=utf-8
  5. {
  6. "message": "HMAC signature does not match"
  7. }

4.2. 请求参数

在调用业务接口时,都需要在 Http Request Body 中配置以下参数,请求数据均为json字符串。

参数名类型必传描述
commonobject公共参数,请见上方common参数说明
businessobject用于上传业务参数
business.entstring请求引擎类型,只支持math-arith
business.auestring预留压缩格式,暂时只支持raw
dataobject用于上传识别图像数据
data.imagebytes图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式

: base64编码后大小会增加约1/3请求参数示例:

  1. {
  2. "common":{
  3. "app_id":"xxxxxxxx"
  4. },
  5. "business":{
  6. "ent":"math-arith",
  7. "aue" :"raw"
  8. },
  9. "data":{
  10. "image":"/9j/4AAQSkZJRgABAQAAAQABAAD/2..."
  11. }
  12. }

4.3. 返回参数

参数名类型描述
sidstring本次会话id
codeint返回码,0表示成功,其它表示异常,详情请参考错误码
messagestring描述信息
dataobject拍照速算识别返回信息,详见下方

data字段具体信息

参数名类型描述备注
ITRResult.attr_exceptionint异常信息属性正常情况为“0x0”,空白图为“0x7011”
ITRResult.categorystring题型只有math_phfw_arith
ITRResult.versionstring接口版本号
ITRResult.multi_line_info对象当前题型所有小题的位置等信息当前题型只有一个
multi_line_info.imp_line_info对象每个小题的位置等信息见后面描述
imp_line_info.imp_line_rect对象该行公式所在的区域位置见后面描述
imp_line_rect.left_up_point_xint该行公式所在矩形区域左上角顶点的像素横坐标数字,大于等于0
imp_line_rect.left_up_point_yint该行公式所在矩形区域左上角顶点的像素纵坐标数字,大于等于0
imp_line_rect.right_down_point_xint该行公式所在矩形区域右下角顶点的像素横坐标数字,大于等于0
imp_line_rect.right_down_point_yint该行公式所在矩形区域右下角顶点的像素纵坐标数字,大于等于0
imp_line_info.total_scoreint该速算题判决正误信息1(正确)/0(错误)
imp_line_info.rec_rejectionint拒识标志不为0(拒识,说明该行公式输出结果不可信)
imp_line_info.strict_scoreint预留字段,无需关注
ITRResult.recog_result对象数组当前题型所有小题的识别结果当前题型只有一个
recog_result.line_char_result对象预留字段,无需关注
recog_result.line_word_result对象每个小题的识别结果见后面描述
line_word_result.beg_pos_xint该行公式起始位置横坐标数字,大于等于0
line_word_result.beg_pos_yint该行公式起始位置纵坐标数字,大于等于0
line_word_result.end_pos_xint该行公式结束位置横坐标数字,大于等于0
line_word_result.end_pos_yint该行公式结束位置纵坐标数字,大于等于0
line_word_result.word_contentstring该行公式识别结果Latex公式
line_word_result.word_gwppfloat该行公式的后验概率数字,大于等于0

: 其中加粗部分为获取速算题识别结果、区域和批改正误信息的关键字段。

返回参数示例:

  1. {
  2. "code": 0,
  3. "message": "",
  4. "sid": "itr0001d1af@gz16990297366463e902",
  5. "data": {
  6. "ITRResult": {
  7. "attr_exception": 0,
  8. "category": "math_phfw_arith",
  9. "multi_line_info": {
  10. "imp_line_info": [{
  11. "imp_line_rect": {
  12. "left_up_point_x": 156,
  13. "left_up_point_y": 183,
  14. "right_down_point_x": 416,
  15. "right_down_point_y": 259
  16. },
  17. "rec_rejection": 0,
  18. "strict_score": 0,
  19. "total_score": 1
  20. },
  21. ......
  22. {
  23. "imp_line_rect": {
  24. "left_up_point_x": 634,
  25. "left_up_point_y": 1303,
  26. "right_down_point_x": 897,
  27. "right_down_point_y": 1395
  28. },
  29. "rec_rejection": 0,
  30. "strict_score": 0,
  31. "total_score": 1
  32. }]
  33. },
  34. "recog_result": [{
  35. "line_char_result": null,
  36. "line_word_result": [{
  37. "beg_pos": [0],
  38. "beg_pos_x": [0],
  39. "beg_pos_y": [0],
  40. "end_pos": [258],
  41. "end_pos_x": [258],
  42. "end_pos_y": [74],
  43. "word_content": ["3 7 - 8 = 2 9"],
  44. "word_gwpp": [0.9989326596260071]
  45. },
  46. ......
  47. {
  48. "beg_pos": [0],
  49. "beg_pos_x": [0],
  50. "beg_pos_y": [0],
  51. "end_pos": [262],
  52. "end_pos_x": [262],
  53. "end_pos_y": [91],
  54. "word_content": ["7 2 - 8 = 6 4"],
  55. "word_gwpp": [0.9990690350532532]
  56. }]
  57. }],
  58. "version": "3.6.0.1022"
  59. }
  60. }
  61. }

5. 错误码

HTTP Code说明错误描述信息
10106非法的消息内容ErrorContentInvalid
10700连接引擎失败ErrorConnectFail
1009解析响应消息体失败ErrorCodePASEDATA

备注:如出现上述列表中没有的错误码,可到 这里 查询。

6. 速算题型

No.题型名称题型示例
1四则混合运算示例图片
2带题标号的四则混合运算示例图片
3已知结果求运算因子示例图片
4填写“<” “>” “=”示例图片
5填最大数、最小数示例图片
6约等于估算示例图片
7带余除数法示例图片
8相邻数示例图片
9分数四则运算示例图片
10单位换算示例图片
11竖式加减法示例图片
12竖式乘除法示例图片
13脱式运算示例图片
14解方程示例图片
15求平方示例图片

7. 调用示例

拍照速算识别demo python2语言

拍照速算识别demo java语言

注: 其他开发语言请参照 接口调用流程 进行开发,也欢迎热心的开发者到 讯飞开放平台社区 分享你们的demo。

8. 图片样例

拍照速算识别 图片样例 JPG文件

拍照速算识别 图片样例 PNG文件

拍照速算识别 图片样例 BMP文件

注: 如果测试过程中,发现图片符合要求但却不能识别,有可能是由于图片的真实格式和文件后缀不符,请通过图片的二进制流的头文件确认图片真实格式,不符合要求需要进行格式转换。

Copyright © iflytek.com 2018 all right reserved,powered by Gitbook该文件修订时间:2019-05-07 07:12:51