转换Azure Computer Vision Read响应适配Azure认知搜索MergeText技能
问题解答
不需要为对接Text.MergeSkill专门转换boundingBox格式
先看Text.MergeSkill的输入定义,它本身不消费任何坐标、布局类字段,只接收三个参数:
text:原始文档的纯文本内容itemsToInsert:待插入的纯文本字符串数组,对应每张图片的OCR识别全文offsets:每个待插入文本对应的插入位置偏移量,这个值是Azure Cognitive Search在文档解压阶段,给提取出的normalized_images自动生成的contentOffset字段,和OCR接口返回的坐标数据完全无关。
你看到的内置OcrSkill输出的layoutText和嵌套的boundingBox结构,是给需要布局信息的下游技能(比如表单字段提取、指定区域内容识别)用的,Text.MergeSkill根本不会读取这部分内容。
自定义技能直接对接Text.MergeSkill的最简方案
你的自定义技能不需要输出完整的OcrSkill兼容结构,只要给每个输入的归一化图片返回一个纯字符串类型的text字段,内容是Read接口识别到的所有文本按行拼接的结果即可。
配置技能输出映射时,把这个text字段挂载到/document/normalized_images/*/text路径,和内置OcrSkill的输出路径保持一致,原有Text.MergeSkill的配置不用做任何修改就能正常运行。其中contentOffset不需要你生成,这个字段会在文档解析阶段自动附加到每个normalized_images节点下。
若需输出和内置OcrSkill完全兼容的格式(供其他依赖布局的技能使用),boundingBox转换逻辑如下
注意你贴的Read接口响应示例里的boundingBox是截断简化写法,实际生产环境Read接口返回的行、词级boundingBox是长度为8的一维数组,格式为[x1,y1,x2,y2,x3,y3,x4,y4],按顺序对应四边形四个顶点(左上、右上、右下、左下)的像素坐标,转换逻辑很简单,按顺序每两个值拆成一个x/y坐标点即可:
// 以JS为例,其他语言逻辑一致 function convertBbox(cvBbox) { const points = []; for (let i = 0; i < cvBbox.length; i += 2) { points.push({ x: cvBbox[i], y: cvBbox[i+1] }) } return points; }
完整结构转换步骤:
- 遍历
analyzeResult.readResults下对应页的lines数组,每个line用上述方法转换boundingBox,保留text字段 - 遍历每个line下的
words数组,每个word用同样方法转换boundingBox,保留text、confidence字段 - 页级全量文本直接把所有line的text用换行符拼接即可
- 语言字段直接取Read接口返回的检测语言值即可
内容的提问来源于stack exchange,提问作者michasaucer
相关产品推荐
相关产品推荐

