火车票识别 API 文档

接口说明

火车票识别,基于深度神经网络模型的端到端文字识别系统,可以自动地从图片中定位火车票区域,识别出其中包含的信息。可以省去用户手动录入的过程,自动完成火车票信息的结构化和图像数据的采集,可以很方便的用于报销等系统中,给用户带来极大的便利。

该能力是通过HTTP API的方式给开发者提供一个通用的接口,适用于一次性交互数据传输的AI服务场景,块式传输。相较于SDK,API具有轻量、跨语言的特点,不过请注意该接口使用的HTTP API协议不支持跨域。

接口Demo

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

接口要求

集成火车票识别API时,需按照以下要求。

内容 说明
传输方式 http[s] (为提高安全性,强烈推荐https)
请求地址 http(s): //api.xf-yun.com/v1/private/s19cfe728 注:服务器IP不固定,为保证您的接口稳定,请勿通过指定IP的方式调用接口,使用域名方式调用
请求行 POST /v1/private/ss19cfe728
接口鉴权 签名机制,详情请参照下方鉴权认证
字符编码 UTF-8
响应格式 统一采用JSON格式
开发语言 任意,只要可以向讯飞云服务发起HTTP请求的均可
适用范围 任意操作系统,但因不支持跨域不适用于浏览器
图片格式 jpg/jpeg/png/bmp
图片大小 base64编码后大小不超过4M

接口调用流程

· 通过接口密钥基于hmac-sha256计算签名,将签名以及其他参数加在请求地址后面。详见下方 鉴权认证
· 将请求参数以及图片数据放在Http Request Body中,以POST表单的形式提交,详见下方 请求参数
· 向服务器端发送Http请求后,接收服务器端的返回结果。

鉴权认证

在调用业务接口时,请求方需要对请求进行签名,服务端通过签名来校验请求的合法性。

鉴权方法

通过在请求地址后面加上鉴权相关参数的方式,参数具体如下:

http示例url:

https://api.xf-yun.com/v1/private/s19cfe728?authorization=YXBpX2tleT0iOTEyMDVhZmUwZDE3ZTM4YzYxYmUzNWZjYTM0NjUwM2MiLCBhbGdvcml0aG09ImhtYWMtc2hhMjU2IiwgaGVhZGVycz0iaG9zdCBkYXRlIHJlcXVlc3QtbGluZSIsIHNpZ25hdHVyZT0iOXM0alJ4eVU1OEgxVG12R0JNbm9jazlZYU9BV0RNMXY1ZFBrRGNPKzF5QT0i&host=api.xf-yun.com%3A-1&date=Mon%2C+23+Nov+2020+06%3A31%3A17+GMT

鉴权参数:

参数 类型 必须 说明 示例
host string 请求主机 api.xf-yun.com
date string 当前时间戳,RFC1123格式("EEE, dd MMM yyyy HH:mm:ss z") Fri, 17 Jul 2020 06:26:58 GMT
authorization string 使用base64编码的签名相关信息(签名基于hamc-sha256计算) 参考下方详细生成规则

· date参数生成规则:

date必须是UTC+0或GMT时区,RFC1123格式(Fri, 17 Jul 2020 06:26:58 GMT)。
服务端会对date进行时钟偏移检查,最大允许300秒的偏差,超出偏差的请求都将被拒绝。

· authorization参数生成格式:

1)获取接口密钥APIKey 和 APISecret。
在讯飞开放平台控制台,创建一个应用后打开人脸比对页面可以获取,均为32位字符串。

2)参数authorization base64编码前(authorization_origin)的格式如下。

api_key="$api_key",algorithm="hmac-sha256",headers="host date request-line",signature="$signature"

其中 api_key 是在控制台获取的APIKey,algorithm 是加密算法(仅支持hmac-sha256),headers 是参与签名的参数(见下方注释)。
signature 是使用加密算法对参与签名的参数签名后并使用base64编码的字符串,详见下方。

注: headers是参与签名的参数,请注意是固定的参数名("host date request-line"),而非这些参数的值。

3)signature的原始字段(signature_origin)规则如下。

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

host: $host\ndate: $date\n$request-line

假设

请求url = api.xf-yun.com
date = Fri, 17 Jul 2020 06:26:58 GMT

那么 signature原始字段(signature_origin)则为:

host: api.xf-yun.com
date: Fri, 17 Jul 2020 06:26:58 GMT
POST /v1/private/s19cfe728 HTTP/1.1

4)使用hmac-sha256算法结合apiSecret对signature_origin签名,获得签名后的摘要signature_sha。

signature_sha=hmac-sha256(signature_origin,$apiSecret)

其中 apiSecret 是在控制台获取的APISecret

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

signature=base64(signature_sha)

假设

APISecret = apisecretXXXXXXXXXXXXXXXXXXXXXXX	
date = Fri, 17 Jul 2020 06:26:58 GMT

则signature为

signature=1gWRhcJRcOEJyWzoHZkHxxBgXEp0NCFHrPOoFJXu6M0=

6)根据以上信息拼接authorization base64编码前(authorization_origin)的字符串,示例如下。

api_key="apikeyXXXXXXXXXXXXXXXXXXXXXXXXXX", algorithm="hmac-sha256", headers="host date request-line", signature="1gWRhcJRcOEJyWzoHZkHxxBgXEp0NCFHrPOoFJXu6M0="

注: headers是参与签名的参数,请注意是固定的参数名("host date request-line"),而非这些参数的值。

7)最后再对authorization_origin进行base64编码获得最终的authorization参数。

authorization = base64(authorization_origin)
示例:
authorization=YXBpX2tleT0iOTEyMDVhZmUwZDE3ZTM4YzYxYmUzNWZjYTM0NjUwM2MiLCBhbGdvcml0aG09ImhtYWMtc2hhMjU2IiwgaGVhZGVycz0iaG9zdCBkYXRlIHJlcXVlc3QtbGluZSIsIHNpZ25hdHVyZT0iMWdXUmhjSlJjT0VKeVd6b0haa0h4eEJnWEVwME5DRkhyUE9vRkpYdTZNMD0i

鉴权结果

如果鉴权失败,则根据不同错误类型返回不同HTTP Code状态码,同时携带错误描述信息,详细错误说明如下:

HTTP Code 说明 错误描述信息 解决方法
401 缺少authorization参数 {"message":"Unauthorized"} 检查是否有authorization参数,详情见authorization参数详细生成规则
401 签名参数解析失败 {“message”:”HMAC signature cannot be verified”} 检查签名的各个参数是否有缺失是否正确,特别确认下复制的api_key是否正确
401 签名校验失败 {“message”:”HMAC signature does not match”} 签名验证失败,可能原因有很多。
1. 检查api_key,api_secret 是否正确。
2.检查计算签名的参数host,date,request-line是否按照协议要求拼接。
3. 检查signature签名的base64长度是否正常(正常44个字节)。
403 时钟偏移校验失败 {“message”:”HMAC signature cannot be verified, a valid date or x-date header is required for HMAC Authentication”} 检查服务器时间是否标准,相差5分钟以上会报此错误

时钟偏移校验失败返回示例:

HTTP/1.1 403 Forbidden
Date: Thu, 06 Dec 2018 07:55:16 GMT
Content-Length: 116
Content-Type: text/plain; charset=utf-8
{
    "message": "HMAC signature cannot be verified, a valid date or x-date header is required for HMAC Authentication"
}

请求参数

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

参数名 类型 必传 描述
header object 协议头部,用于上传平台参数
header.app_id string 在平台申请的appid信息
header.status string 请求状态,取值范围为:3(一次传完)
parameter object 能力参数,用于上传服务特性参数
parameter.s19cfe728 object 用于上传功能参数
parameter.s19cfe728.template_list string 票据类型(train_ticket:火车票)
parameter.s19cfe728.result object 用于上传响应数据参数
parameter.s19cfe728.result.encoding string 文本编码,可选值:utf8(默认值)
parameter.s19cfe728.result.compress string 文本压缩格式,可选值:raw(默认值)
parameter.s19cfe728.result.format string 文本格式,可选值:json(默认值)
payload object 用于上传请求数据
payload.s19cfe728_data_1 object 用于上传第一张图像数据
payload.s19cfe728_data_1.encoding string 第一张图像编码 可选值: jpg:jpg格式(默认值) jpeg:jpeg格式 png:png格式 bmp:bmp格式
payload.s19cfe728_data_1.image string 第一张图像数据,base64编码,需保证图像文件大小base64编码后不超过4MB
payload.s19cfe728_data_1.status int 第一张数据状态,取值范围为:3(一次传完)

请求参数示例:

{
  "header": {
    "app_id": "XXXXXXXX",
    "status": 3
  },
  "parameter": {
    "s19cfe728": {
      "template_list": "train_ticket",
      "result": {
        "encoding": "utf8",
        "compress": "raw",
        "format": "json"
      }
    }
  },
  "payload": {
    "s19cfe728_data_1": {
      "encoding": "jpg",
      "status": 3,
      "image": "/4AAQSkZJRgA..."
    },
  }
}

返回参数

参数名 类型 描述
header object 协议头部,用于描述平台特性的参数
header.sid string 本次会话id
header.code int 返回码 0表示会话调用成功(并不一定表示服务调用成功,服务是否调用成功以text字段中的ret为准) 其它表示会话调用异常,详情请参考错误码
header.message string 描述信息
payload object 数据段,用于携带响应的数据
payload.result object 火车票识别响应数据块
payload.result.compress string 文本压缩格式,仅在设置了parameter.s19cfe728.result.compress参数时返回
payload.result.encoding string 文本编码,仅在设置了parameter.s19cfe728.result.encoding参数时返回
payload.result.format string 文本格式,仅在设置了parameter.s19cfe728.result.format参数时返回
payload.result.text string 火车票识别返回结果,需要对其进行base64解码,解码后的返回字段如下

payload.result.text字段具体信息如下,其中各元素及结果请关注:

object_list[n].region_list[n].text_block_list[n].key
object_list[n].region_list[n].text_block_list[n].value

参数名 类型 描述 备注
engine_version string 引擎版本号 版本相关信息,无需特别关注
error_code int 返回码(0表示成功)
error_msg string 描述返回码信息
object_count int 目标数量 目前仅支持一次识别一个目标,一般返回1
version string json协议的版本号 版本相关信息,无需特别关注
object_list array 目标版面分析结果
object_list[n].error_code int 当前图片识别错误码(0表示成功)
object_list[n].error_msg string 当前图片识别错误码信息
object_list[n].type string 预留字段,暂无需关注
object_list[n].description string 识别的目标图像类别名称
object_list[n].width int 目标图像的宽度
object_list[n].height int 目标图像的高度
object_list[n].idx int 输出图片索引
object_list[n].table_count int 表格区域数量 火车票识别此项返回0
object_list[n].table_list array 表格区域 火车票识别此项返回空
object_list[n].region_count int 通用区域数量
object_list[n].region_list array 通用区域
object_list[n].region_list[n]
.id
string 序号,从0开始
object_list[n].region_list[n]
.order
int 同层级内的阅读顺序 无需特别关注
object_list[n].region_list[n]
.type
string 区域类型 可能返回的值有 Number1:票号 Ticket-check:检票口 Station-From:起始站 Number2-Train:车次 Station-To:目的站 Date:发车日期 Time:开车时间 Seat: 座位号 Number3-Amount:票价 Seat-type:座位类型 Number4-Identity:身份证号码 Name:乘车人姓名 Number5:条码数字
object_list[n].region_list[n]
.position
object 区域位置
object_list[n].region_list[n]
.position.tl_point
object 区域左上角坐标
object_list[n].region_list[n]
.position.tl_point.x
int 区域左上角x坐标
object_list[n].region_list[n]
.position.tl_point.y
int 区域左上角y坐标
object_list[n].region_list[n]
.position.tr_point
object 区域右上角坐标
object_list[n].region_list[n]
.position.tr_point.x
int 区域右上角x坐标
object_list[n].region_list[n]
.position.tr_point.y
int 区域右上角y坐标
object_list[n].region_list[n]
.position.bl_point
object 区域左下角坐标
object_list[n].region_list[n]
.position.bl_point.x
int 区域左下角x坐标
object_list[n].region_list[n]
.position.bl_point.y
int 区域左下角y坐标
object_list[n].region_list[n]
.position.br_point
object 区域右下角坐标
object_list[n].region_list[n]
.position.br_point.x
int 区域右下角x坐标
object_list[n].region_list[n]
.position.br_point.y
int 区域右下角y坐标
object_list[n].region_list[n]
.text_block_count
int 文本块数量
object_list[n].region_list[n]
.text_block_list
array 文本块结果
object_list[n].region_list[n]
.text_block_list[n].id
string id识别码
object_list[n].region_list[n]
.text_block_list[n].order
int 同层级内的阅读顺 无需特别关注
object_list[n].region_list[n]
.text_block_list[n].key
string 要素key值 可能返回的值有 Number1:票号 Ticket-check:检票口 Station-From:起始站 Number2-Train:车次 Station-To:目的站 Date:发车日期 Time:开车时间 Seat: 座位号 Number3-Amount:票价 Seat-type:座位类型 Number4-Identity:身份证号码 Name:乘车人姓名 Number5:条码数字
object_list[n].region_list[n]
.text_block_list[n].value
string 要素value值,识别后处理结果
object_list[n].region_list[n]
.text_block_list[n].position
object 文本块区域位置
object_list[n].region_list[n]
.text_block_list[n].position.tl_point
object 区域左上角坐标
object_list[n].region_list[n]
.text_block_list[n].position.tl_point.x
int 区域左上角x坐标
object_list[n].region_list[n]
.text_block_list[n].position.tl_point.y
int 区域左上角y坐标
object_list[n].region_list[n]
.text_block_list[n].position.tr_point
object 区域右上角坐标
object_list[n].region_list[n]
.text_block_list[n].position.tr_point.x
int 区域右上角x坐标
object_list[n].region_list[n]
.text_block_list[n].position.tr_point.y
int 区域右上角y坐标
object_list[n].region_list[n]
.text_block_list[n].position.bl_point
object 区域左下角坐标
object_list[n].region_list[n]
.text_block_list[n].position.bl_point.x
int 区域左下角x坐标
object_list[n].region_list[n]
.text_block_list[n].position.bl_point.y
int 区域左下角y坐标
object_list[n].region_list[n]
.text_block_list[n].position.br_point
object 区域右下角坐标
object_list[n].region_list[n]
.text_block_list[n].position.br_point.x
int 区域右下角x坐标
object_list[n].region_list[n]
.text_block_list[n].position.br_point.y
int 区域右下角y坐标
object_list[n].region_list[n]
.text_block_list[n].ocr_flag
int 当前要素是否进行识别,1代表识别,0代表不识别
object_list[n].region_list[n]
.text_block_list[n].tag
object 保留字段,无需特别关注
object_list[n].region_list[n]
.text_block_list[n].class
string 所属要素类型,英文名 可能返回的值有 Number1:票号 Ticket-check:检票口 Station-From:起始站 Number2-Train:车次 Station-To:目的站 Date:发车日期 Time:开车时间 Seat: 座位号 Number3-Amount:票价 Seat-type:座位类型 Number4-Identity:身份证号码 Name:乘车人姓名 Number5:条码数字
object_list[n].region_list[n]
.text_block_list[n].text_sent_count
int 文本行数量
object_list[n].region_list[n]
.text_block_list[n].text_sent_list
object 识别的文本行(文本块内可能包含多行文本)
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].text
string 文本行文字内容
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].position
object 文本块区域位置
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].position.tl_point
object 区域左上角坐标
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].position.tl_point.x
int 区域左上角x坐标
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].position.tl_point.y
int 区域左上角y坐标
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].position.tr_point
object 区域右上角坐标
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].position.tr_point.x
int 区域右上角x坐标
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].position.tr_point.y
int 区域右上角y坐标
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].position.bl_point
object 区域左下角坐标
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].position.bl_point.x
int 区域左下角x坐标
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].position.bl_point.y
int 区域左下角y坐标
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].position.br_point
object 区域右下角坐标
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].position.br_point.x
int 区域右下角x坐标
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].position.br_point.y
int 区域右下角y坐标
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].image_data
string 文本行图片base64编码数据,如不可解码则可不使用
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].angle
float 文本行角度(0-360),在原图中
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].char_count
int 文本行字符数
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].det_score
float 要素检测框置信度 无需特别关注
object_list[n].region_list[n]
.text_block_list[n].text_sent_list[n].score
float 该行文本识别置信度

返回参数示例:

{
  "header": {
    "code": 0,
    "message": "success",
    "sid": "ase0007ef41@hu175f4100e560210882"
  },
  "payload": {
    "result": {
      "compress": "raw",
      "encoding": "utf8",
      "format": "json",
      "text": "ewogICAiZW5naW5lX3Zlc..."
    }
  }
}

base64解码后的text示例:

{
	"error_msg": "Success",
	"object_list": [{
		"table_count": 0,
		"region_list": [{
			"text_block_list": [{
				"text_sent_count": 1,
				"ocr_flag": 1,
				"text_sent_list": [{
					"score": 0.89501667022705078,
					"det_score": 0.99697911739349365,
					"image_data": "/9j/4AAQ...",
					"angle": 0.0,
					"char_count": 10,
					"position": {
						"bl_point": {
							"x": 60,
							"y": 68
						},
						"br_point": {
							"x": 58,
							"y": 28
						},
						"tr_point": {
							"x": 273,
							"y": 22
						},
						"tl_point": {
							"x": 275,
							"y": 62
						}
					},
					"text": "237S080148"
				}],
				"id": "0",
				"position": {
					"bl_point": {
						"x": 58,
						"y": 69
					},
					"br_point": {
						"x": 277,
						"y": 69
					},
					"tr_point": {
						"x": 277,
						"y": 22
					},
					"tl_point": {
						"x": 58,
						"y": 22
					}
				},
				"tag": "",
				"class": "Number1",
				"value": "237S080148",
				"key": "Number1",
				"order": 0
			}],
			"text_block_count": 1,
			"id": "0",
			"position": {
				"bl_point": {
					"x": 58,
					"y": 69
				},
				"br_point": {
					"x": 277,
					"y": 69
				},
				"tr_point": {
					"x": 277,
					"y": 22
				},
				"tl_point": {
					"x": 58,
					"y": 22
				}
			},
			"type": "Number1",
			"order": 0
		}, {
			"text_block_list": [{
				"text_sent_count": 1,
				"ocr_flag": 1,
				"text_sent_list": [{
					"score": 0.61800277233123779,
					"det_score": 0.54159075021743774,
					"image_data": "/9j/4AAQSkZ...",
					"angle": 0.0,
					"char_count": 7,
					"position": {
						"bl_point": {
							"x": 681,
							"y": 54
						},
						"br_point": {
							"x": 538,
							"y": 54
						},
						"tr_point": {
							"x": 538,
							"y": 8
						},
						"tl_point": {
							"x": 681,
							"y": 8
						}
					},
					"text": "沪A售"
				}],
				"id": "1",
				"position": {
					"bl_point": {
						"x": 538,
						"y": 55
					},
					"br_point": {
						"x": 682,
						"y": 55
					},
					"tr_point": {
						"x": 682,
						"y": 8
					},
					"tl_point": {
						"x": 538,
						"y": 8
					}
				},
				"tag": "",
				"class": "Ticket-check",
				"value": "沪A售",
				"key": "Ticket-check",
				"order": 0
			}],
			"text_block_count": 1,
			"id": "1",
			"position": {
				"bl_point": {
					"x": 538,
					"y": 55
				},
				"br_point": {
					"x": 682,
					"y": 55
				},
				"tr_point": {
					"x": 682,
					"y": 8
				},
				"tl_point": {
					"x": 538,
					"y": 8
				}
			},
			"type": "Ticket-check",
			"order": 1
		}, {
			"text_block_list": [{
				"text_sent_count": 1,
				"ocr_flag": 1,
				"text_sent_list": [{
					"score": 0.66385108232498169,
					"det_score": 0.98743045330047607,
					"image_data": "/9j/4AAQSk...",
					"angle": 0.0,
					"char_count": 6,
					"position": {
						"bl_point": {
							"x": 262,
							"y": 129
						},
						"br_point": {
							"x": 116,
							"y": 129
						},
						"tr_point": {
							"x": 116,
							"y": 77
						},
						"tl_point": {
							"x": 262,
							"y": 77
						}
					},
					"text": "上海"
				}],
				"id": "2",
				"position": {
					"bl_point": {
						"x": 116,
						"y": 130
					},
					"br_point": {
						"x": 263,
						"y": 130
					},
					"tr_point": {
						"x": 263,
						"y": 77
					},
					"tl_point": {
						"x": 116,
						"y": 77
					}
				},
				"tag": "",
				"class": "Station-From",
				"value": "上海",
				"key": "Station-From",
				"order": 0
			}],
			"text_block_count": 1,
			"id": "2",
			"position": {
				"bl_point": {
					"x": 116,
					"y": 130
				},
				"br_point": {
					"x": 263,
					"y": 130
				},
				"tr_point": {
					"x": 263,
					"y": 77
				},
				"tl_point": {
					"x": 116,
					"y": 77
				}
			},
			"type": "Station-From",
			"order": 2
		}, {
			"text_block_list": [{
				"text_sent_count": 1,
				"ocr_flag": 1,
				"text_sent_list": [{
					"score": 0.82063788175582886,
					"det_score": 0.99642026424407959,
					"image_data": "/9j/4AAQ...",
					"angle": 0.0,
					"char_count": 7,
					"position": {
						"bl_point": {
							"x": 442,
							"y": 100
						},
						"br_point": {
							"x": 306,
							"y": 100
						},
						"tr_point": {
							"x": 306,
							"y": 62
						},
						"tl_point": {
							"x": 442,
							"y": 62
						}
					},
					"text": "K696次"
				}],
				"id": "3",
				"position": {
					"bl_point": {
						"x": 306,
						"y": 101
					},
					"br_point": {
						"x": 443,
						"y": 101
					},
					"tr_point": {
						"x": 443,
						"y": 62
					},
					"tl_point": {
						"x": 306,
						"y": 62
					}
				},
				"tag": "",
				"class": "Number2-Train",
				"value": "K696次",
				"key": "Number2-Train",
				"order": 0
			}],
			"text_block_count": 1,
			"id": "3",
			"position": {
				"bl_point": {
					"x": 306,
					"y": 101
				},
				"br_point": {
					"x": 443,
					"y": 101
				},
				"tr_point": {
					"x": 443,
					"y": 62
				},
				"tl_point": {
					"x": 306,
					"y": 62
				}
			},
			"type": "Number2-Train",
			"order": 3
		}, {
			"text_block_list": [{
				"text_sent_count": 1,
				"ocr_flag": 1,
				"text_sent_list": [{
					"score": 0.57298558950424194,
					"det_score": 0.97908437252044678,
					"image_data": "/9j/4AAQSkZJ...",
					"angle": 0.0,
					"char_count": 6,
					"position": {
						"bl_point": {
							"x": 629,
							"y": 116
						},
						"br_point": {
							"x": 479,
							"y": 116
						},
						"tr_point": {
							"x": 479,
							"y": 64
						},
						"tl_point": {
							"x": 629,
							"y": 64
						}
					},
					"text": "成都"
				}],
				"id": "4",
				"position": {
					"bl_point": {
						"x": 479,
						"y": 117
					},
					"br_point": {
						"x": 630,
						"y": 117
					},
					"tr_point": {
						"x": 630,
						"y": 64
					},
					"tl_point": {
						"x": 479,
						"y": 64
					}
				},
				"tag": "",
				"class": "Station-To",
				"value": "成都",
				"key": "Station-To",
				"order": 0
			}],
			"text_block_count": 1,
			"id": "4",
			"position": {
				"bl_point": {
					"x": 479,
					"y": 117
				},
				"br_point": {
					"x": 630,
					"y": 117
				},
				"tr_point": {
					"x": 630,
					"y": 64
				},
				"tl_point": {
					"x": 479,
					"y": 64
				}
			},
			"type": "Station-To",
			"order": 4
		}, {
			"text_block_list": [{
				"text_sent_count": 1,
				"ocr_flag": 1,
				"text_sent_list": [{
					"score": 0.86936992406845093,
					"det_score": 0.97458773851394653,
					"image_data": "/9j/4AAQS...",
					"angle": 0.0,
					"char_count": 18,
					"position": {
						"bl_point": {
							"x": 73,
							"y": 217
						},
						"br_point": {
							"x": 72,
							"y": 176
						},
						"tr_point": {
							"x": 332,
							"y": 172
						},
						"tl_point": {
							"x": 333,
							"y": 214
						}
					},
					"text": "2012年10月14日0"
				}],
				"id": "5",
				"position": {
					"bl_point": {
						"x": 72,
						"y": 219
					},
					"br_point": {
						"x": 334,
						"y": 219
					},
					"tr_point": {
						"x": 334,
						"y": 172
					},
					"tl_point": {
						"x": 72,
						"y": 172
					}
				},
				"tag": "",
				"class": "Date",
				"value": "2012年10月14日0",
				"key": "Date",
				"order": 0
			}],
			"text_block_count": 1,
			"id": "5",
			"position": {
				"bl_point": {
					"x": 72,
					"y": 219
				},
				"br_point": {
					"x": 334,
					"y": 219
				},
				"tr_point": {
					"x": 334,
					"y": 172
				},
				"tl_point": {
					"x": 72,
					"y": 172
				}
			},
			"type": "Date",
			"order": 5
		}, {
			"text_block_list": [{
				"text_sent_count": 1,
				"ocr_flag": 1,
				"text_sent_list": [{
					"score": 0.81844532489776611,
					"det_score": 0.95127266645431519,
					"image_data": "/9j/4AAQ...",
					"angle": 0.0,
					"char_count": 11,
					"position": {
						"bl_point": {
							"x": 467,
							"y": 202
						},
						"br_point": {
							"x": 467,
							"y": 165
						},
						"tr_point": {
							"x": 632,
							"y": 162
						},
						"tl_point": {
							"x": 633,
							"y": 200
						}
					},
					"text": "16车088号"
				}],
				"id": "6",
				"position": {
					"bl_point": {
						"x": 467,
						"y": 204
					},
					"br_point": {
						"x": 634,
						"y": 204
					},
					"tr_point": {
						"x": 634,
						"y": 162
					},
					"tl_point": {
						"x": 467,
						"y": 162
					}
				},
				"tag": "",
				"class": "Seat",
				"value": "16车088号",
				"key": "Seat",
				"order": 0
			}],
			"text_block_count": 1,
			"id": "6",
			"position": {
				"bl_point": {
					"x": 467,
					"y": 204
				},
				"br_point": {
					"x": 634,
					"y": 204
				},
				"tr_point": {
					"x": 634,
					"y": 162
				},
				"tl_point": {
					"x": 467,
					"y": 162
				}
			},
			"type": "Seat",
			"order": 6
		}, {
			"text_block_list": [{
				"text_sent_count": 1,
				"ocr_flag": 1,
				"text_sent_list": [{
					"score": 0.85434848070144653,
					"det_score": 0.99784362316131592,
					"image_data": "/9j/4AAQSkZJR...",
					"angle": 0.0,
					"char_count": 12,
					"position": {
						"bl_point": {
							"x": 284,
							"y": 262
						},
						"br_point": {
							"x": 86,
							"y": 262
						},
						"tr_point": {
							"x": 86,
							"y": 222
						},
						"tl_point": {
							"x": 284,
							"y": 222
						}
					},
					"text": "¥267:00元"
				}],
				"id": "7",
				"position": {
					"bl_point": {
						"x": 86,
						"y": 263
					},
					"br_point": {
						"x": 285,
						"y": 263
					},
					"tr_point": {
						"x": 285,
						"y": 222
					},
					"tl_point": {
						"x": 86,
						"y": 222
					}
				},
				"tag": "",
				"class": "Number3-Amount",
				"value": "¥267:00元",
				"key": "Number3-Amount",
				"order": 0
			}],
			"text_block_count": 1,
			"id": "7",
			"position": {
				"bl_point": {
					"x": 86,
					"y": 263
				},
				"br_point": {
					"x": 285,
					"y": 263
				},
				"tr_point": {
					"x": 285,
					"y": 222
				},
				"tl_point": {
					"x": 86,
					"y": 222
				}
			},
			"type": "Number3-Amount",
			"order": 7
		}, {
			"text_block_list": [{
				"text_sent_count": 1,
				"ocr_flag": 1,
				"text_sent_list": [{
					"score": 0.82718896865844727,
					"det_score": 0.98900371789932251,
					"image_data": "/9j/4AAQSkZJRgA...",
					"angle": 0.0,
					"char_count": 15,
					"position": {
						"bl_point": {
							"x": 608,
							"y": 247
						},
						"br_point": {
							"x": 459,
							"y": 247
						},
						"tr_point": {
							"x": 459,
							"y": 215
						},
						"tl_point": {
							"x": 608,
							"y": 215
						}
					},
					"text": "新空调硬座"
				}],
				"id": "8",
				"position": {
					"bl_point": {
						"x": 459,
						"y": 248
					},
					"br_point": {
						"x": 609,
						"y": 248
					},
					"tr_point": {
						"x": 609,
						"y": 215
					},
					"tl_point": {
						"x": 459,
						"y": 215
					}
				},
				"tag": "",
				"class": "Seat-type",
				"value": "新空调硬座",
				"key": "Seat-type",
				"order": 0
			}],
			"text_block_count": 1,
			"id": "8",
			"position": {
				"bl_point": {
					"x": 459,
					"y": 248
				},
				"br_point": {
					"x": 609,
					"y": 248
				},
				"tr_point": {
					"x": 609,
					"y": 215
				},
				"tl_point": {
					"x": 459,
					"y": 215
				}
			},
			"type": "Seat-type",
			"order": 8
		}, {
			"text_block_list": [{
				"text_sent_count": 1,
				"ocr_flag": 1,
				"text_sent_list": [{
					"score": 0.94312167167663574,
					"det_score": 0.91956210136413574,
					"image_data": "/9j/4AAQSkZJ...",
					"angle": 0.0,
					"char_count": 18,
					"position": {
						"bl_point": {
							"x": 92,
							"y": 373
						},
						"br_point": {
							"x": 92,
							"y": 339
						},
						"tr_point": {
							"x": 368,
							"y": 331
						},
						"tl_point": {
							"x": 369,
							"y": 366
						}
					},
					"text": "510623198911234136"
				}],
				"id": "9",
				"position": {
					"bl_point": {
						"x": 92,
						"y": 375
					},
					"br_point": {
						"x": 370,
						"y": 375
					},
					"tr_point": {
						"x": 370,
						"y": 331
					},
					"tl_point": {
						"x": 92,
						"y": 331
					}
				},
				"tag": "",
				"class": "Number4-Identity",
				"value": "510623198911234136",
				"key": "Number4-Identity",
				"order": 0
			}],
			"text_block_count": 1,
			"id": "9",
			"position": {
				"bl_point": {
					"x": 92,
					"y": 375
				},
				"br_point": {
					"x": 370,
					"y": 375
				},
				"tr_point": {
					"x": 370,
					"y": 331
				},
				"tl_point": {
					"x": 92,
					"y": 331
				}
			},
			"type": "Number4-Identity",
			"order": 9
		}, {
			"text_block_list": [{
				"text_sent_count": 2,
				"ocr_flag": 1,
				"text_sent_list": [{
					"score": 0.94215232133865356,
					"det_score": 0.58806312084197998,
					"image_data": "/9j/4AAQ...",
					"angle": 0.0,
					"char_count": 18,
					"position": {
						"bl_point": {
							"x": 104,
							"y": 373
						},
						"br_point": {
							"x": 104,
							"y": 338
						},
						"tr_point": {
							"x": 371,
							"y": 330
						},
						"tl_point": {
							"x": 372,
							"y": 366
						}
					},
					"text": "510623198911234136"
				}, {
					"score": 0.8950350284576416,
					"det_score": 0.97911089658737183,
					"image_data": "/9j/4AAQSk...",
					"angle": 1.5985372066497803,
					"char_count": 21,
					"position": {
						"bl_point": {
							"x": 100,
							"y": 409
						},
						"br_point": {
							"x": 99,
							"y": 380
						},
						"tr_point": {
							"x": 352,
							"y": 371
						},
						"tl_point": {
							"x": 353,
							"y": 401
						}
					},
					"text": "30671012371014S080148"
				}],
				"id": "10",
				"position": {
					"bl_point": {
						"x": 99,
						"y": 411
					},
					"br_point": {
						"x": 373,
						"y": 411
					},
					"tr_point": {
						"x": 373,
						"y": 330
					},
					"tl_point": {
						"x": 99,
						"y": 330
					}
				},
				"tag": "",
				"class": "Number5",
				"value": "510623198911234136\n30671012371014S080148",
				"key": "Number5",
				"order": 0
			}],
			"text_block_count": 1,
			"id": "10",
			"position": {
				"bl_point": {
					"x": 99,
					"y": 411
				},
				"br_point": {
					"x": 373,
					"y": 411
				},
				"tr_point": {
					"x": 373,
					"y": 330
				},
				"tl_point": {
					"x": 99,
					"y": 330
				}
			},
			"type": "Number5",
			"order": 10
		}],
		"error_msg": "Success",
		"region_count": 11,
		"width": 730,
		"description": "火车票",
		"error_code": 0,
		"idx": 0,
		"type": "",
		"height": 416,
		"table_list": []
	}],
	"object_count": 1,
	"error_code": 0,
	"engine_version": "2.0.2005",
	"version": 2.0
}

错误码

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

错误码 错误描述 说明 处理策略
10009 input invalid data 输入数据非法 检查输入数据
10010 service license not enough 没有授权许可或授权数已满 请到控制台提交工单联系技术人员
10019 service read buffer timeout, session timeout session超时 检查是否数据发送完毕但未关闭连接
10114 session timeout session 超时 会话时间超时,检查是否发送数据时间超过了60s
10139 invalid param 参数错误 检查参数是否正确
10160 parse request json error 请求数据格式非法 检查请求数据是否是合法的json
10161 parse base64 string error base64解码失败 检查发送的数据是否使用base64编码了
10163 param validate error:... 参数校验失败 具体原因见详细的描述
10200 read data timeout 读取数据超时 检查是否累计10s未发送数据并且未关闭连接
10223 RemoteLB: can't find valued addr lb 找不到节点 请到控制台提交工单联系技术人员
10313 invalid appid appid和apikey不匹配 检查appid是否合法
10317 invalid version 版本非法 请到控制台提交工单联系技术人员
10700 not authority 引擎异常 按照报错原因的描述,对照开发文档检查输入输出,如果仍然无法排除问题,请提供sid以及接口返回的错误信息,到控制台提交工单联系技术人员排查。
11200 auth no license 功能未授权 请先检查appid是否正确,并且确保该appid下添加了相关服务。若没问题,则按照如下方法排查。 1. 确认总调用量是否已超越限制,或者总次数授权已到期,若已超限或者已过期请联系商务人员。 2. 查看是否使用了未授权的功能,或者授权已过期。
11201 auth no enough license 该APPID的每日交互次数超过限制 根据自身情况提交应用审核进行服务量提额,或者联系商务购买企业级正式接口,获得海量服务量权限以便商用。

调用示例

火车票识别demo java语言

火车票识别demo python语言

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

常见问题

火车票识别为什么有的关键key没有返回,如发车日期Date等?

答:有的火车票比较老,日期格式排版不符合接口要求,可能会导致Date等关键key识别丢失。

火车票识别支持什么应用平台?

答:目前支持Web API应用平台。

火车票识别对车票图片有什么要求吗?

答:需要清晰的火车票图片,格式为jpg/jpeg/png/bmp,同时图片大小base64编码后不要超过4M。