如何使用Java SDK获取AWS Transcribe作业的转录结果
如何通过Java SDK从AWS Transcribe作业获取转录文本?
你遇到的问题很典型——AWS Transcribe返回的TranscriptFileUri是S3对象的完整URL,但S3 Java SDK的getObject方法并不接受直接传入URL,它需要明确的桶名和对象键两个参数。下面是具体的解决步骤和代码示例:
核心思路
Transcribe返回的URI格式通常是两种之一:
- 路径式访问:
https://s3.<region>.amazonaws.com/<bucket-name>/<object-key> - 虚拟主机式访问:
https://<bucket-name>.s3.<region>.amazonaws.com/<object-key>
我们需要从这个URL里提取出桶名和对象键,再传入getObject方法。
Java SDK v1 实现示例
import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.S3Object; import java.net.URI; import java.net.URL; public class TranscriptReader { public static void main(String[] args) { // 从Transcribe作业获取的转录文件URI String transcriptUri = job.getTranscript().getTranscriptFileUri(); try { URL s3Url = new URI(transcriptUri).toURL(); String bucketName; String objectKey; // 解析不同格式的S3 URL if (s3Url.getHost().startsWith("s3.")) { // 路径式格式:提取路径中的第一个部分作为桶名 String[] pathSegments = s3Url.getPath().split("/"); bucketName = pathSegments[1]; // 拼接剩余路径作为对象键 objectKey = String.join("/", java.util.Arrays.copyOfRange(pathSegments, 2, pathSegments.length)); } else { // 虚拟主机格式:提取主机名的第一个部分作为桶名 bucketName = s3Url.getHost().split("\\.")[0]; // 路径部分去掉开头的/作为对象键 objectKey = s3Url.getPath().substring(1); } // 初始化S3客户端(确保已配置好AWS凭证) AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); // 获取S3对象 S3Object transcriptObject = s3Client.getObject(bucketName, objectKey); // 读取转录内容(示例:转成字符串) String transcriptContent = new String(transcriptObject.getObjectContent().readAllBytes()); System.out.println("转录内容:" + transcriptContent); } catch (Exception e) { e.printStackTrace(); } } }
Java SDK v2 实现示例
如果你用的是AWS SDK v2,写法会更简洁:
import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.core.ResponseInputStream; import software.amazon.awssdk.services.s3.model.GetObjectResponse; import java.net.URI; public class TranscriptReaderV2 { public static void main(String[] args) { String transcriptUri = job.getTranscript().getTranscriptFileUri(); // 声明S3客户端(try-with-resources自动关闭) try (S3Client s3Client = S3Client.create()) { URI uri = URI.create(transcriptUri); String bucketName; String objectKey; if (uri.getHost().startsWith("s3.")) { // 路径式解析 String path = uri.getPath().substring(1); int firstSlashIndex = path.indexOf('/'); bucketName = path.substring(0, firstSlashIndex); objectKey = path.substring(firstSlashIndex + 1); } else { // 虚拟主机解析 bucketName = uri.getHost().split("\\.")[0]; objectKey = uri.getPath().substring(1); } // 构建获取对象请求 GetObjectRequest getObjectRequest = GetObjectRequest.builder() .bucket(bucketName) .key(objectKey) .build(); // 获取并读取内容 ResponseInputStream<GetObjectResponse> response = s3Client.getObject(getObjectRequest); String transcriptContent = new String(response.readAllBytes()); System.out.println("转录内容:" + transcriptContent); } catch (Exception e) { e.printStackTrace(); } } }
注意事项
- 权限配置:确保你的Java程序使用的IAM角色/用户拥有目标S3对象的
s3:GetObject权限,否则会抛出访问被拒绝的错误。 - 区域匹配:如果你的S3桶不在默认区域,初始化S3客户端时需要指定对应区域(比如
AmazonS3ClientBuilder.standard().withRegion("us-east-1").build())。
内容的提问来源于stack exchange,提问作者Oscar Courchaine
相关产品推荐
相关产品推荐

