AWS服务使用Java API发送语音

时间:2017-12-01 03:33:55

标签: amazon-web-services

我想使用AWS服务和AWS java-sdk将语音转换为文本,但我无法在AWS java-sdk中找到任何API。有没有这样做的服务?我使用AWS Polly服务使用AWS java-sdk将文本转换为语音,但不是反向(语音到文本)。怎么可以这样做?

4 个答案:

答案 0 :(得分:10)

最近我设法建立了一个Java客户端,在投入时间之前,重要的是要说截至本出版日期,获取包含“是”的音频文本所需的时间大约是1分钟。 鉴于这种表现,我选择了Google服务。

那就是说我分享了可以改进的代码,因为它打算进行可行性测试。

此服务要求将音频存放在存储桶中,然后指示转录uri,然后启动工作,并以类似的方式获得json格式的结果。

在示例中,我们选择等待工作完成,然后获得结果。

主要依赖项是:

    <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-transcribe -->
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-transcribe</artifactId>
    <version>1.11.313</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 -->
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.11.313</version>
</dependency>

我选择的凭证:

static{
    System.setProperty("aws.accessKeyId", "yourAccessK");
    System.setProperty("aws.secretKey"  , "shhhhhhhhhh");
}

在源代码中,我们将创建S3和tanscribe客户端,将该区域替换为与该桶对应的区域。

private AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion("us-east-1").withClientConfiguration(new ClientConfiguration()).withCredentials(new DefaultAWSCredentialsProviderChain() ).build();
private AmazonTranscribe client = AmazonTranscribeClient.builder().withRegion("us-east-1").build();

然后我们将音频文件上传到存储桶

s3.putObject(BUCKET_NAME, fileName, new File(fullFileName));

BUCKET_NAME是具有存储桶名称的常量。 fileName:它不一定是文件的名称,它可以是我们想要使用的任何标识符。

将音频上传到存储桶后,我们将创建转录作业。

    StartTranscriptionJobRequest request = new StartTranscriptionJobRequest();

    request.withLanguageCode(LanguageCode.EsUS);

    Media media = new Media();

    media.setMediaFileUri(s3.getUrl(BUCKET_NAME, fileName).toString());

    request.withMedia(media).withMediaSampleRateHertz(8000);

查看语言选项和MediaSampleRateHertz。

为作业创建名称。

String transcriptionJobName = "myJob"; // consider a unique name as an id.

并完成请求并开始工作

request.setTranscriptionJobName(transcriptionJobName);
request.withMediaFormat("wav");

client.startTranscriptionJob(request);

在这种情况下,等待答案的循环,还有其他更有效的选项。

GetTranscriptionJobRequest jobRequest = new GetTranscriptionJobRequest();
jobRequest.setTranscriptionJobName(transcriptionJobName);
TranscriptionJob transcriptionJob;

while( true ){
    transcriptionJob = client.getTranscriptionJob(jobRequest).getTranscriptionJob();
    if( transcriptionJob.getTranscriptionJobStatus().equals(TranscriptionJobStatus.COMPLETED.name()) ){

        transcription = this.download( transcriptionJob.getTranscript().getTranscriptFileUri(), fileName);

        break;

    }else if( transcriptionJob.getTranscriptionJobStatus().equals(TranscriptionJobStatus.FAILED.name()) ){

            break;
    }
    // to not be so anxious
    synchronized ( this ) {
        try {
            this.wait(50);
        } catch (InterruptedException e) { }
    }

}

transcriptionJob.getTranscript()。getTranscriptFileUri()返回一个uri,用于任何http客户端Apache HttpClient,或者在我的情况下,我更喜欢JODD(https://jodd.org/http/

下载:

private AmazonTranscription download( String uri, String fileName ){
    HttpResponse response = HttpRequest.get(uri).send();
    String result = response.charset("UTF-8").bodyText();
    // result is a json 
    return gson.fromJson(result, AmazonTranscription.class);
}

AmazonTranscription是我创建的包含json的类。 我共享必要的类来包含json解析,我避免使用set并且不会那么广泛。

public class AmazonTranscription {

    private String jobName;
    private String accountId;
    private Result results;
    private String status;
}

public class Item {

    private String start_time;
    private String end_time;
    private List<Alternative> alternatives = new ArrayList<Alternative>();
    private String type;
}

public class Result {

    private List<Transcript> transcripts = new ArrayList<Transcript>();
    private List<Item>       items       = new ArrayList<Item>();
}

public class Transcript {

    private String transcript;
}

只需在需要的地方添加try / catch。

我希望我没有忽略任何事情并且它会有用,我花了一些时间来理解这个亚马逊模型,我希望在那个时候避开其他人。

对不起,如果写作中有错误,但这不是我的母语。

答案 1 :(得分:0)

  StartTranscriptionJobRequest request = StartTranscriptionJobRequest.builder()
      .transcriptionJobName(transriptionJobName)
      .languageCode(LanguageCode.EsUS).settings(transcriptionSettings)
      .media(media).outputBucketName(BUCKET_NAME)
      .outputKey(outPutLocation)
      .build();

答案 2 :(得分:-1)

您可以使用 Amazon Transcribe 。它是一种自动语音识别(ASR)服务,使开发人员可以轻松地将语音功能添加到应用程序的文本功能中。使用Amazon Transcribe API,您可以分析存储在Amazon S3中的音频文件,并让服务返回转录语音的文本文件。

有关更多信息,请参阅文档here

答案 3 :(得分:-1)

尝试亚马逊转录 - 准确的语音缩放文字。它是AWS服务,可帮助开发人员在其应用程序中为语言功能添加语音。转录是一种自动语音识别(ASR)服务。它支持其他AWS服务作为其源输入。例如,您可以使用 AWS S3 存储的MP3文件作为源输入。

Amazon Transcribe通过使用API​​启动作业来工作。有三种类型的API操作。

  • StartTranscriptionJob
  • GetTranscriptionJob
  • ListTranscriptionJobs

了解更多信息AWS Blog For Docs:AWS Transcribe Docs