【问题标题】:Speech to text by AWS service using Java APIAWS 服务使用 Java API 将语音转文本
【发布时间】:2020-12-22 21:50:13
【问题描述】:

我想使用 AWS 服务和 AWS java-sdk 将语音转换为文本,但在 AWS java-sdk 中找不到任何 API。有什么服务可以做到这一点吗?我使用 AWS Polly 服务使用 AWS java-sdk 将文本转换为语音,但不是相反(语音到文本)。这怎么可能?

【问题讨论】:

    标签: amazon-web-services


    【解决方案1】:

    最近我设法构建了一个 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 解析的必要类,我避免了集合并且变得不那么广泛。

    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。

    我希望我没有忽略任何东西并且它会很有用,我花了一些时间来理解这个亚马逊模式,我希望那时能避免其他人。

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

    【讨论】:

    • 谢谢,您的回答对我使用 java SDK for aws transcribe 帮助很大!
    • 很高兴知道您对我很有帮助。
    • 非常感谢。它真的节省了我的时间。
    • 很好的答案 - 节省大量时间!
    【解决方案2】:
      StartTranscriptionJobRequest request = StartTranscriptionJobRequest.builder()
          .transcriptionJobName(transriptionJobName)
          .languageCode(LanguageCode.EsUS).settings(transcriptionSettings)
          .media(media).outputBucketName(BUCKET_NAME)
          .outputKey(outPutLocation)
          .build();
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-29
        • 2018-03-29
        • 1970-01-01
        相关资源
        最近更新 更多