Java調用火山引擎API實現看圖説話
在做AI音樂項目的時候,想到可以接一個圖片轉文字的API來為音樂生成的Prompt增加意境。
找到火山引擎有相應的圖像識別Api可以調用:
限制條件
|
名稱
|
內容
|
|
圖片要求
|
1. 圖片格式:JPG、JPEG、PNG、BMP等常見格式,建議使用JPG格式。2. 圖片文件大小:最大 5 MB。
|
請求參數
(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/...。