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

AWS服务使用Java API进行语音到文本转换

刘明朗
2023-03-14

我想使用AWS服务和AWS java sdk将语音转换为文本,但在AWS java sdk中找不到任何API。有没有这样的服务?我使用AWS Polly服务使用AWS java sdk将文本转换为语音,但没有使用相反的方式(语音转换为文本)。如何做到这一点?

共有3个答案

郤玉书
2023-03-14

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

有关更多信息,请参阅此处的留档。

任元青
2023-03-14
  StartTranscriptionJobRequest request = StartTranscriptionJobRequest.builder()
      .transcriptionJobName(transriptionJobName)
      .languageCode(LanguageCode.EsUS).settings(transcriptionSettings)
      .media(media).outputBucketName(BUCKET_NAME)
      .outputKey(outPutLocation)
      .build();
满博
2023-03-14

最近,我成功地构建了一个Java客户端,在投入时间之前,必须指出,截至本出版物发布之日,获取包含“是”的音频文本所需的时间约为1分钟。鉴于这一性能,我选择了谷歌服务。

也就是说,我分享了可改进的代码,因为它旨在执行可行性测试。

该服务要求音频存放在一个bucket中,然后指示它转录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客户端,用对应于bucket的区域替换该区域。

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();

然后我们将音频文件上传到bucket

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

BUCKET\u NAME是具有BUCKET名称的常量。文件名:不必是文件名,它可以是我们想要使用的任何标识符。

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

    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) { }
    }

}

TranscritionJob.getTranscript(). getTranscriptFileUri()返回一个uri用于任何超文本传输协议客户端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);
}

Amazon Transcription是我为包含json而创建的一个类。我共享必要的类来包含json解析,我避免设置并且变得不那么广泛。

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。

我希望我没有忽视任何东西,它将是有用的,我花了一些时间来理解这个亚马逊模式,我希望避免其他人的时间。

抱歉,如果书写中有错误,但这不是我的母语。

 类似资料:
  • 我正在尝试用libgdx在iOS上开发一个应用程序。我想用文字来表达,但我找不到任何相关的东西。 我该怎么做? 谢啦

  • 我正在使用spyder IDE进行我的语音到文本转换项目,该项目使用谷歌语音到文本api。我在代码中集成了谷歌语音和文本,出现了类似“配额耗尽”的错误。在谷歌控制台的仪表板上,我可以看到可用的配额。 > 错误 文件"C:\Program Data\Anaconda3\lib\site-包\speech_recognition__init__. py",第932行,在recognize_google

  • 我正在尝试从扬声器转录音频 我正在将声音从扬声器传送到节点。js文件(https://askubuntu.com/a/850174) 这是我的抄本。js公司 但谷歌云语音到文本在1分钟内对流媒体识别有一个限制。所以我有一个错误“超过了允许的最大流持续时间65秒” 如何将流拆分为以静默为拆分器的块,或拆分为持续30秒的块?

  • 我想用nodejs和googlespeech-to-text api制作一个实时转录应用程序。 我正在使用RecordRTC和socket。io将音频块获取到后端服务器。目前,我正在录制1秒长的块,并且转录工作正常,但它没有将其视为流,而是在处理每个块后发送响应。这意味着我要收回半句话,谷歌无法利用上下文帮助自己识别演讲。 我的问题是,如何让谷歌将我的块视为一个连续的流。或者是否有其他解决方案可以

  • 我正在iOS应用程序中使用进行文本到语音转换。 语音合成器在所有设备上都运行良好,除了运行iOS9.0.2的iPad 2(型号A1395)。我使用Xcode 7.0.1。 问题是,在播放文本时说"希望"字母"p"要么真的很安静,要么不播放,用户只能听到"ho"。如果文本是“希望”,那么它播放正确。 有没有办法解决这个问题?

  • 带有en-us语音的AVSpeechsynthesizer是“A”的发音,是“大写字母A”,但只想要“A”,怎么能做到呢?