Проблема при попытке использовать Amazon Transcribe с ColdFusion с использованием Java SDK - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь использовать AWS Java SDK для разработки приложения ColdFusion, которое использует сервис Amazon Transcribe.К сожалению, мои познания в Java жалки (не говоря уже о самом SDK), и у меня есть куча времени, чтобы что-то произошло.

Приведенный ниже код предназначен для запуска задания транскрипции.Это не выдает ошибку, но это также не запускает работу.Я даже не могу сказать, отправляет ли он какую-либо информацию в 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>

1 Ответ

0 голосов
/ 19 мая 2018

Вот как у меня это получилось. Я начну с самого начала, на случай, если кто-нибудь прочтет это так же, как и я.

Первый шаг - получение AWS Java SDK. В какой-то момент у меня сложилось впечатление, что для сервиса Amazon Transcribe существует отдельный 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. Я помещаю свои файлы в S3, используя встроенную поддержку ColdFusion, в корзину, которую я назвал, например, «transcriptaudio» (обратите внимание на двоеточие, отделяющее идентификатор ключа от секрета):

<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>
...