Amazon Transcribe Service Java Implementation

Hi there, this is my second blog post regarding the Amazon Transcribe Service implementation. So what is Amazon Transcribe Service? Amazon Transcribe is an automatic speech recognition (ASR) service that makes it easy for developers to add speech-to-text capability to their applications. Using the Amazon Transcribe API, you can analyze audio files stored in Amazon S3 and have the service return a text file of the transcribed speech. For more information you can refer Amazon Transcribe developer documentation. So for the moment I implemented a service to upload a file to Amazon S3 and get a uploaded file url. Then creates a Amazon Transcribe service to speech to text recognition and get the transcribe text. Let’s start.

Amazon S3 Service

package com.test.aws;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;

import org.apache.commons.codec.binary.Base64;

import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.ListVersionsRequest;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import com.amazonaws.services.s3.model.S3VersionSummary;
import com.amazonaws.services.s3.model.VersionListing;

/**
 *
 * @author ravindu.s
 *
 */
public class AmazonS3ServiceImpl {

    private static String AUDIO_NAME = "my-audio";

    private static String BASE_BUCKET_NAME = "my-audio-bucket";

    private static final String CLIENT_ID = "AKIXXDRDEXXXXXXXXXX";

    private static final String CLIENT_SECRET = "PaoXXp/2WT+TXXji/cLVJwPi/XXXXXX";

    private static final String S3_EAST_ENDPOINT = "https://s3.us-east-1.amazonaws.com/";

    private static final String S3_REGION = "us-east-1";

    public String uploadAudioFile(String encodedText) {

        URL s3BucketUrl=null;

        try {
            AWSCredentials credentials = new BasicAWSCredentials(CLIENT_ID, CLIENT_SECRET);

            AmazonS3 s3client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new AWSStaticCredentialsProvider(credentials)).withRegion(S3_REGION).build();

            String bucketName = BASE_BUCKET_NAME;
            s3client.createBucket(bucketName);

            File file = convertToAudioFile(encodedText);
            s3client.putObject(new PutObjectRequest(bucketName, file.getName(), file)
                    .withCannedAcl(CannedAccessControlList.PublicRead));

            s3BucketUrl = getS3AudioUrl(BASE_BUCKET_NAME, file.getName());

        } catch (AmazonServiceException serviceException) {
            System.out.println("Error occoured -" + serviceException.getErrorMessage());

        } catch (AmazonClientException clientException) {
            System.out.println("Error occoured -" + clientException.getMessage());

        } catch (Exception e) {
            System.out.println("Error occoured -" + e.getMessage());

        }

        return s3BucketUrl.toString();

    }

    private URL getS3AudioUrl(String bucketName, String fileName) throws MalformedURLException {
        return new URL(new StringBuilder(S3_EAST_ENDPOINT).append(bucketName).append("/").append(fileName).toString());
    }

    private File convertToAudioFile(String encodedText) {

        File file = null;
        try {
            byte[] decodedString = Base64.decodeBase64(new String(encodedText).getBytes("UTF-8"));

            AudioFormat frmt = new AudioFormat(16000, 16, 1, true, false);

            AudioInputStream ais = new AudioInputStream(new ByteArrayInputStream(decodedString), frmt,
                    decodedString.length / frmt.getFrameSize());

            file = File.createTempFile(AUDIO_NAME, ".wav");
            file.deleteOnExit();
            AudioSystem.write(ais, AudioFileFormat.Type.WAVE, file);

        } catch (IOException e) {
            System.out.println(e);
        }

        return file;

    }

    public static void deleteBucket() {

        AWSCredentials credentials = new BasicAWSCredentials(CLIENT_ID, CLIENT_SECRET);

        AmazonS3 s3client = AmazonS3ClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials)).withRegion(S3_REGION).build();

        try {
            ObjectListing object_listing = s3client.listObjects(BASE_BUCKET_NAME);
            while (true) {
                for (Iterator iterator = object_listing.getObjectSummaries().iterator(); iterator.hasNext();) {
                    S3ObjectSummary summary = (S3ObjectSummary) iterator.next();
                    s3client.deleteObject(BASE_BUCKET_NAME, summary.getKey());
                }

                // more object_listing to retrieve?
                if (object_listing.isTruncated()) {
                    object_listing = s3client.listNextBatchOfObjects(object_listing);
                } else {
                    break;
                }
            }
            ;

            VersionListing version_listing = s3client
                    .listVersions(new ListVersionsRequest().withBucketName(BASE_BUCKET_NAME));
            while (true) {
                for (Iterator iterator = version_listing.getVersionSummaries().iterator(); iterator.hasNext();) {
                    S3VersionSummary vs = (S3VersionSummary) iterator.next();
                    s3client.deleteVersion(

                            BASE_BUCKET_NAME, vs.getKey(), vs.getVersionId());
                }

                if (version_listing.isTruncated()) {
                    version_listing = s3client.listNextBatchOfVersions(version_listing);
                } else {
                    break;
                }
            }

            s3client.deleteBucket(BASE_BUCKET_NAME);
        } catch (AmazonServiceException e) {
            System.err.println(e.getErrorMessage());
            System.exit(1);
        }
    }
}

Amazon Transcribe Service

package com.test.aws;

import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.transcribe.AmazonTranscribe;
import com.amazonaws.services.transcribe.AmazonTranscribeClientBuilder;
import com.amazonaws.services.transcribe.model.Media;
import com.amazonaws.services.transcribe.model.StartTranscriptionJobRequest;
import com.amazonaws.services.transcribe.model.StartTranscriptionJobResult;
/**
 *
 * @author ravindu.s
 *
 */
public class AmazonTranscribeServiceImpl {

    public static void callTranscribeService(){

        AWSCredentials awsCredentials= new BasicAWSCredentials("AKIAIGXMGZAO324W7R6Q", "jeKAdGtsUJX3L8mMx/X+6qP+4Jcs4fctlri1H3hv");

        ClientConfiguration clientConfig = new ClientConfiguration();
        clientConfig.setConnectionTimeout(60000);
        clientConfig.setMaxConnections(100);
        clientConfig.setSocketTimeout(60000);

        AmazonTranscribe transcribeClient = AmazonTranscribeClientBuilder.standard().withCredentials(
                new AWSStaticCredentialsProvider(awsCredentials)).withEndpointConfiguration(
                new AwsClientBuilder.EndpointConfiguration("https://transcribe.us-east-1.amazonaws.com/","us-east-1")).withClientConfiguration(clientConfig).build();
        StartTranscriptionJobRequest request=buildRequest();
        StartTranscriptionJobResult response= transcribeClient.startTranscriptionJob(request);
        System.out.println(response.getTranscriptionJob().getTranscriptionJobStatus());
    }

    private static StartTranscriptionJobRequest buildRequest() {
        StartTranscriptionJobRequest request=new StartTranscriptionJobRequest();
        request.setMediaSampleRateHertz(16000);
        request.setMediaFormat("wav");
        request.setLanguageCode("en-US");
        request.setTranscriptionJobName("JOB-001");
        Media media=new Media();
        media.setMediaFileUri("https://s3.us-east-1.amazonaws.com/my-audio-bucket/my-audio8171579702418162024.wav");
        request.setMedia(media);

        return request;
    }
}

Dependencies

Spring version – 4.3.14.RELEASE
JDK version – 1.8
aws-java-sdk-core – 1.11.271
aws-java-sdk-s3 – 1.11.271
aws-java-sdk-transcribe – 1.11.271

Happy coding 🙂

One thought on “Amazon Transcribe Service Java Implementation

Leave a comment