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