Java调用火山引擎API实现看图说话

在做AI音乐项目的时候,想到可以接一个图片转文字的API来为音乐生成的Prompt增加意境。

找到火山引擎有相应的图像识别Api可以调用:

https://www.volcengine.com/docs/86081/1660414

限制条件

名称 内容
图片要求 1. 图片格式:JPG、JPEG、PNG、BMP等常见格式,建议使用JPG格式。2. 图片文件大小:最大 5 MB。

请求说明

名称 内容
接口地址 https://visual.volcengineapi.com
请求方式 POST
Content-Type application/x-www-form-urlencoded

请求参数

(1)header请求参数

公共请求参数

以下请求参数列表仅列出了接口请求参数和必要公共参数,完整公共参数列表见 公共参数

名称 类型 是否必填 描述
X-Date String 使用UTC时间,精确到秒。请使用格式:YYYYMMDD’T’HHMMSS’Z’ ,例如:20201103T104027Z
Authorization String HMAC-SHA256:签名方法-Credential为签名凭证,其中:-AccessKeyId为访问密钥ID,可在 访问密钥(Access Key) 获取;-ShortDate为请求的短时间,使用UTC时间,精确到日。请使用格式:YYYYMMDD,例如:20180201;-Region为请求地区,国内一般为为cn-north-1;-Service为请求的服务,一般为cv;-SignedHeaders为参与签名计算的头部信息,content-type 和 host 为必选头部;-Signature为签名,可在 签名方法 获取。注:我们提供了SDK及签名示例供您实现服务快速接入,具体可参考 快速接入例如:HMAC-SHA256 Credential={AccessKeyId}/{ShortDate}/{Region}/{Service}/request, SignedHeaders={SignedHeaders}, Signature={Signature}
X-Security-Token String 指安全令牌服务(Security Token Service,STS) 颁发的临时安全凭证中的SessionToken,使用长期密钥时无需填写该参数。

(2)Query参数

业务请求参数

参数 可选/必选 类型 说明
Action 必选 String 接口名,取值:PoemMaterial
Version 必选 String 版本号,取值:2020-08-26

(3)Body参数

业务请求参数

参数 可选/必选 类型 说明
image_base64 必选(二选一,优先生效) String 图片文件,base64编码
image_url 必选(二选一) String 图片文件URL

调用SDK Demo

package com.volcengine.example.visual;

import com.alibaba.fastjson.JSON;
import com.volcengine.service.visual.IVisualService;
import com.volcengine.service.visual.impl.VisualServiceImpl;
import com.volcengine.service.visual.model.request.VisualPoemMaterialRequest;
import com.volcengine.service.visual.model.response.VisualPoemMaterialResponse;
import org.apache.commons.codec.binary.Base64;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class PoemMaterialDemo {

    public static void main(String[] args) throws IOException {
        IVisualService visualService = VisualServiceImpl.getInstance();

        // call below method if you dont set ak and sk in ~/.vcloud/config
        visualService.setAccessKey("您的 AK");
        visualService.setSecretKey("您的 SK");

        VisualPoemMaterialRequest req = new VisualPoemMaterialRequest();

        String base64 = jpgToBase64("test.jpg");

        req.setImageBase64(base64);

        try {
            VisualPoemMaterialResponse response = visualService.poemMaterial(req);
            System.out.println(JSON.toJSONString(response));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String jpgToBase64(String jpgPath) throws IOException {
        File file = new File(jpgPath);
        byte[] buf = new byte[(int) file.length()];
        try (FileInputStream in = new FileInputStream(file)) {
            in.read(buf);
        }
        // 火山 SDK 要求 **去掉 data:image/...;base64,** 前缀,纯字符串
        return Base64.encodeBase64String(buf);
    }
}

结果展示

test.jpg
在这里插入图片描述

输出返回:

{
    "code": 10000,
    "data": {
        "poems": [
            "闻道东来有诏,却恐西留无计,顿使雪山轻。",
            "雪山万叠看不厌,雪尽山青又一奇。",
            "严冬不肃杀,何以见阳春。——吕温《孟冬蒲津关河亭作》",
            "锦里遥看井底迷,雪山忽认屏间误。",
            "金水朗然明皎洁,雪山堆积就中高。"
        ]
    },
    "message": "Success",
    "request_id": "20251013211650D09F42159FAAEE6A2450",
    "time_elapsed": "7.146749252s"
}

注意

如果是开通的子用户,需要给子用户在平台开通使用API的权限。

否则会有如下报错:

java.lang.Exception: {"ResponseMetadata":{"RequestId":"20251013210804E25BF53105A9CB5B57F2","Action":"PoemMaterial","Version":"2020-08-26","Service":"cv","Region":"cn-north-1","Error":{"CodeN":100013,"Code":"AccessDenied","Message":"User is not authorized to perform: cv:PoemMaterial on resource: "}}}

在测试时,test.jpg文件记得放在根目录下,即pom.xml的同级目录下。

Java 在启动时,“当前工作目录” 并不是 .java 文件所在的目录,而是 你启动 JVM 时所在的目录(即“工作目录”)。
在 IDEA 里,这个目录默认是 Project 的根目录VisualCommonRequestDemo 那一级),而不是 src/main/java/... 或者 target/classes/...

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐