当前位置: 首页 > 知识库问答 >
问题:

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

饶曦之
2023-03-14

我正在尝试使用AWS Java SDK开发一个使用Amazon转录服务的ColdFusion应用程序。不幸的是,我对Java的了解很可怜(更不用说SDK本身了),我花了很长时间才实现任何事情。

下面的代码旨在启动转录作业。它不会抛出错误,但也不会启动作业。我甚至不知道它是否正在向AWS发送任何信息。

据我所知,这段代码完全不正确,但目前我最大的两个问题是:

>

  • 我是否错过了一些明显的步骤来实际将请求发送到AWS?

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

    提前感谢您的建议。

    (FWIW:CF版本为2016,java版本为1.8.0\u 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>
    
  • 共有1个答案

    公孙辰龙
    2023-03-14

    这就是我是如何做到这一点的。我将从头开始,以防任何人读到这篇文章都像我一样感到困惑。

    第一步是获取AWS Java SDK。在某种程度上,我的印象是,亚马逊转录服务有一个单独的SDK,但事实并非如此。下载文件后,将以下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的本机支持将我的文件放在S3中的一个桶中,我称之为“转录音频”(注意冒号将密钥ID与秘密分开):

    <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页面来在它完成后获取成绩单。这段代码基本上假设作业已经完成,但transcritionstatus变量会让我这样做。

    <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>
    
     类似资料:
    • 注意:试图访问第18行C:\xampp\htdocs\E-LAMAX\app\libraries\Core.php中null类型值的数组偏移量 致命错误:未捕获PDOException:SQLSTATE[42S02]:找不到基表或视图:1146表“lamax.settings”在C:\xampp\htdocs\E-lamax\app\libraries\Database.php中不存在。php:6

    • 我已经做了几个小时了,似乎进展不太快!我已经找到了很多PHP的例子,但是没有ColdFusion的例子。据我所知,我应该在正确的轨道上,但我不断得到一个错误返回。 我的理解是(当然,这可能是错误的),我用cfhttp触发API,并添加cfhttpparam进行授权。但是,我不完全确定头名应该是什么--我已经试过很多次了! 在线文档(https://datamarket.azure.com/data

    • 问题内容: 我在SO上发现了其他几个有关JavaMail API和通过SMTP服务器发送邮件的问题,但是没有一个使用TLS安全性进行讨论。我正在尝试使用JavaMail通过我的工作SMTP邮件服务器向我发送状态更新,但是它需要TLS,而且我在网上找不到任何有关如何使用JavaMail访问需要TLS加密的SMTP服务器的示例。有人能帮忙吗? 问题答案: 实际上,我们的产品中确实有一些通知代码,如果有

    • 我已经阅读了一些关于SaaS/PaaS/IaaS的信息,我在想: 如果我提供了一个SaaS应用程序,我的客户能否使用PaaS开发和部署他自己的应用程序,PaaS将使用一些API与我的SaaS应用程序交互?还是我对云服务的理解有误?

    • 所以我正在构建一个基本的NF令牌。创建了一个基本的铸币函数和映射。我用truffle测试了应用程序,尝试了solidity测试和JS测试。有以下错误。 测试脚本在契约中运行一个简单的内部函数,该函数返回一个int=1000,并将其与测试中声明的预期变量(letexpected=1000)进行比较。这是JS测试脚本 下面是Solidity测试脚本: 我还尝试测试铸币的令牌ID,以及基于我声明的映射的

    • Java代码: 应用程序在Android9及以下版本中运行,但当应用程序在Android10和11版本中运行时,应用程序会崩溃并出现文件错误。我认为创建临时文件有问题,因为它给了我一个错误。谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢