gpt4 book ai didi

java - 尝试使用 Java SDK 将 Amazon Transcribe 与 ColdFusion 结合使用时遇到问题

转载 作者:行者123 更新时间:2023-11-30 07:46:47 28 4
gpt4 key购买 nike

我正在尝试使用 AWS Java 开发工具包开发一个使用 Amazon Transcribe 服务的 ColdFusion 应用程序。不幸的是,我对 Java 的了解很少(更不用说 SDK 本身了),而且我正忙于做任何事情。

以下代码旨在启动转录作业。它不会引发错误,但也不会启 Action 业。我什至不知道它是否正在向 AWS 发送任何信息。

据我所知,这段代码完全没有根据,但现在我最大的两个问题是:

  1. 我是否遗漏了一些将请求实际发送到 AWS 的明显步骤?

  2. 我如何访问从 AWS 返回的任何响应? invokeRequest 变量的转储似乎只是请求数据。

提前感谢您的任何建议。

(FWIW:CF版本是2016,java版本是1.8.0_171,AWS SDK是1.11.331)

<cfscript>
/* Set up credentials */
awsCredentials = createObject('java','com.amazonaws.auth.BasicAWSCredentials').init('#variables.AWSAccessKeyID#', '#variables.AWSSecretKey#');
awsStaticCredentialsProvider = CreateObject('java','com.amazonaws.auth.AWSStaticCredentialsProvider').init(awsCredentials);

/* Create the Transcribe Service Object*/
serviceObject = CreateObject('java', 'com.amazonaws.services.transcribe.AmazonTranscribeAsyncClientBuilder').standard().withCredentials(variables.awsStaticCredentialsProvider).withRegion(#variables.awsRegion#).build();


/* Set up transcription job */
MediaFileUri = CreateObject('java','com.amazonaws.services.transcribe.model.Media').init();
MediaFileUri.setMediaFileUri('#variables.mediafilelocation#');
invokeRequest = CreateObject('java','com.amazonaws.services.transcribe.model.StartTranscriptionJobRequest').init();
invokeRequest.withLanguageCode('en-US');
invokeRequest.withMedia(MediaFileUri);
invokeRequest.withMediaFormat('wav');
invokeRequest.withTranscriptionJobName('#variables.jobname#');

/* Check results of request */


/* Shut down client*/
serviceObject.shutdown();
</cfscript>

最佳答案

下面是我是如何让它工作的。我将从头开始,以防有人读到这篇文章时和我一样感到困惑。

第一步是获取 AWS Java SDK。在某些时候,我的印象是有一个单独的 SDK 专门用于 Amazon Transcribe 服务,但事实并非如此。下载文件后,将以下 jar 文件放在/{coldfusion}/lib/文件夹中(我不确定所有这些都是必需的,但这对我有用):

aws-java-sdk-xxxx.jar
httpclient-xxxx.jar
httpcore-xxxx.jar
jackson-annotations-xxxx.jar
jackson-core-xxxx.jar
jackson-databind-xxxx.jar
jackson-dataformat-cbor-xxxx.jar
joda-time-xxxx.jar

重新启动 ColdFusion 服务。

转录服务要求要转录的媒体文件位于 S3 中。例如,我使用 ColdFusion 的 native 支持将我的文件放在 S3 中的一个我称为“transcriptaudio”的存储桶中(注意将 key ID 与 secret 分开的冒号):

<cffile
action = "copy"
source = "c:\temp\myfilename.wav"
destination = "s3://#variables.AWSAccessKeyID#:#variables.AWSSecretKey#@transcriptaudio/">

媒体的 URL 将是:

https://s3.{awsregion}.amazonaws.com/transcriptaudio/myfilename.wav

然后这是我开始转录工作的代码:

<cfscript>
/* Set up credentials */
awsCredentials = CreateObject('java', 'com.amazonaws.auth.BasicAWSCredentials').init('#variables.AWSAccessKeyID#','#variables.AWSSecretKey#');
variables.awsStaticCredentialsProvider = CreateObject('java','com.amazonaws.auth.AWSStaticCredentialsProvider').init(awsCredentials);

/* Create the Transcribe Service Object*/
serviceObject = CreateObject('java', 'com.amazonaws.services.transcribe.AmazonTranscribeAsyncClientBuilder').standard().withCredentials(variables.awsStaticCredentialsProvider).withRegion(#variables.awsRegion#).build();

/* Set up transcription job */
MediaFileUri = CreateObject('java','com.amazonaws.services.transcribe.model.Media').init();
MediaFileUri.setMediaFileUri('#variables.mediafileurlstring#');
requestObject = CreateObject('java','com.amazonaws.services.transcribe.model.StartTranscriptionJobRequest').init();
requestObject.withLanguageCode('en-US');
requestObject.withMedia(MediaFileUri);
requestObject.withMediaFormat('wav');
requestObject.withTranscriptionJobName('#variables.jobName#');

/* Send the request */
sendRequest = serviceObject.startTranscriptionJob(requestObject);

/* Shut down client*/
serviceObject.shutdown();
</cfscript>

正如 Ageax 在评论中指出的那样,转录是异步发生的,所以我有一个单独的 CF 页面来在它完成后获取转录。这段代码基本上假定工作已完成,但 transcriptionStatus 变量会让我这样做。

<cfscript>
/* Set up credentials */
awsCredentials = CreateObject('java','com.amazonaws.auth.BasicAWSCredentials').init('#variables.AWSAccessKeyID#','#variables.AWSSecretKey#');
variables.awsStaticCredentialsProvider = CreateObject('java','com.amazonaws.auth.AWSStaticCredentialsProvider').init(awsCredentials);

/* Create the Transcribe Service Object*/
serviceObject = CreateObject('java', 'com.amazonaws.services.transcribe.AmazonTranscribeAsyncClientBuilder').standard().withCredentials(variables.awsStaticCredentialsProvider).withRegion(#variables.awsRegion#).build();

/* Set up results object */
requestResultObject = CreateObject('java', 'com.amazonaws.services.transcribe.model.GetTranscriptionJobRequest').init();
requestResultObject.withTranscriptionJobName('#variables.jobName#');

/* Get the results */
requestResult = serviceObject.GetTranscriptionJob(requestResultObject);

/* parse result object into useful variables */
transcriptionStatus = requestResult.TranscriptionJob.TranscriptionJobStatus.toString();
transcriptURL = requestResult.TranscriptionJob.Transcript.TranscriptFileUri.toString();
</cfscript>

此时我有了 TranscriptURL,当使用 cfhttp 检索时,它会返回大量不必要的信息,至少对我来说是这样。这是我获取成绩单实际文本的代码(该服务返回数组中的成绩单,因此如果由于某种原因每个作业可能会有多个成绩单,我会遍历数组)(和是的,我在这里切换到 CF 标签,因为我在标签中工作更舒服):

<CFHTTP url="#variables.transcriptURL#" result="transcriptContentResponse">
<CFSET ResultsStruct = DeserializeJSON(variables.transcriptContentResponse.FileContent)>
<CFSET TranscriptsArray = ResultsStruct.Results.transcripts>

<CFLOOP Array = "#variables.TranscriptsArray#" index="ThisTranscript" >
<cfoutput>
#ThisTranscript['transcript']#
</cfoutput>
</CFLOOP>

关于java - 尝试使用 Java SDK 将 Amazon Transcribe 与 ColdFusion 结合使用时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50382666/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com