GCP语音到文本-Java API不起作用

时间:2019-08-13 09:50:04

标签: java google-cloud-platform google-cloud-speech transcription

我有一个使用Chrome浏览器中的MediaRecorder记录的示例.webm文件。当我使用Google Speech Java客户端获取视频的转录时,它将返回空的转录。这是我的代码的样子

SpeechSettings settings = null;
Path path = Paths.get("D:\\scrap\\gcp_test.webm");
byte[] content = null;
try {
    content = Files.readAllBytes(path);
    settings = SpeechSettings.newBuilder().setCredentialsProvider(credentialsProvider).build();
} catch (IOException e1) {
    throw new IllegalStateException(e1);
}

try (SpeechClient speech = SpeechClient.create(settings)) {
    // Builds the request for remote FLAC file
    RecognitionConfig config = RecognitionConfig.newBuilder()
                    .setEncoding(AudioEncoding.LINEAR16)
                    .setLanguageCode("en-US")
                    .setUseEnhanced(true)
                    .setModel("video")
                    .setEnableAutomaticPunctuation(true)
                    .setSampleRateHertz(48000)
                    .build();

    RecognitionAudio audio = RecognitionAudio.newBuilder().setContent(ByteString.copyFrom(content)).build();

    // RecognitionAudio audio = RecognitionAudio.newBuilder().setUri("gs://xxxx/gcp_test.webm") .build();

    // Use blocking call for getting audio transcript
    RecognizeResponse response = speech.recognize(config, audio);
    List<SpeechRecognitionResult> results = response.getResultsList();

    for (SpeechRecognitionResult result : results) {
        SpeechRecognitionAlternative alternative = result.getAlternativesList().get(0);
        System.out.printf("Transcription: %s%n", alternative.getTranscript());
    }
} catch (Exception e) {
    e.printStackTrace();
    System.err.println(e.getMessage());
}

如果,我使用相同的文件并访问SSIS - Script task: Replace TEXT in text file using VBscript with dynamic file path,并在演示部分中上传文件。它似乎工作正常并显示转录。我对这里出了什么问题一无所知。我验证了演示发送的请求,这里看起来像

https://cloud.google.com/speech-to-text/

我正在发送确切的参数集,但是没有用。尝试将文件上传到Cloud存储,但结果也相同(无转录)。

2 个答案:

答案 0 :(得分:0)

经过错误和试验(并查看javascript示例)之后,我可以解决问题。音频的序列化版本应为FLAC格式。我正在将视频文件(webm)原样发送到Google Cloud。该站点上的演示使用Javascript Audio API提取音频流,然后以base64格式发送数据以使其正常工作。

这是我执行以获取输出的步骤。

  1. 使用FFMPEG从webm将音频流提取为FLAC格式。

    ffmpeg -i sample.webm -vn -acodec flac sample.flac

  2. 提取的文件应使用存储云或作为ByteString发送。

  3. 在调用语音API时设置适当的模型(对于英语video模型有效,而对于法语command_and_search模型有效)。我对此没有任何逻辑上的理由。经过谷歌云站点上的演示反复试验后,我意识到了这一点。

答案 1 :(得分:0)

我得到了flac编码文件的结果。

示例代码产生带有时间戳的单词,

library(shiny)

ui <- fluidPage(
  img(src="sample.gif", align = "left",height='250px',width='500px')
)

server <- function(input, output, session) {

}

shinyApp(ui, server)

GCP支持不同的语言,我在示例中使用了“ en-US”。 请参考以下链接document以了解语言列表。