如何正确地将音频文件发送到Google Speech API?

时间:2017-07-02 01:51:39

标签: android audio encoding google-speech-api

我正在尝试通过以下演示在Android中实施Google Speech API:https://github.com/GoogleCloudPlatform/android-docs-samples

通过使用位于R.raw的给定“audio.raw”文件,我能够在我的应用程序中成功重现该示例,一切都运行良好。但是,当我尝试使用自己的音频文件时,它返回“API成功”而没有任何转录文本。我不确定它是否与文件的路径或编码有关,所以为了以防万一,我将包含两者的信息。

编码

我的音频文件是通过MediaRecorder录制语音获得的。这些是设置:

    myAudioRecorder = new MediaRecorder();
    myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_WB);
    myAudioRecorder.setAudioSamplingRate(16000);
    myAudioRecorder.setAudioEncodingBitRate(16000);
    myAudioRecorder.setAudioChannels(1);
    myAudioRecorder.setOutputFile(outputFile);

SpeechService的API中的recognInputStream()函数:

mApi.recognize(
      RecognizeRequest.newBuilder()
              .setConfig(RecognitionConfig.newBuilder()
                      .setEncoding(RecognitionConfig.AudioEncoding.AMR_WB) //originally it was LINEAR16
                      .setLanguageCode("en-US")
                      .setSampleRateHertz(16000)
                      .build())
              .setAudio(RecognitionAudio.newBuilder()
                      .setContent(ByteString.readFrom(stream))
                      .build())
              .build(),
      mFileResponseObserver);

Google的编码指南:https://cloud.google.com/speech/docs/best-practices

根据我的理解,我可以使用AMR_WB和16kHz而不是默认的LINEAR16,我只是不确定我是否做得对。

路径

这是完全有效的示例(使用来自回购的音频文件):

mSpeechService.recognizeInputStream(getResources().openRawResource(R.raw.audio));

但是,即使使用完全相同的文件,以下选项也不起作用:

InputStream inputStream = new URL("[website]/test/audio.raw").openStream();
mSpeechService.recognizeInputStream(inputStream);

既不:

Uri uri = Uri.parse("android.resource://[package]/raw/audio");
InputStream inputStream = getActivity().getContentResolver().openInputStream(uri); //"getActivity()" because this is in a Fragment
mSpeechService.recognizeInputStream(inputStream);

要清楚,上述路径上的结果与我的自定义音频文件上的结果相同:“API成功”,没有转录。我为自定义音频文件尝试过的其中一个选项是:

FileInputStream fis = new FileInputStream(filePath);
mSpeechService.recognizeInputStream(fis);

我不能100%确定问题出在路径中的唯一原因是因为如果API成功返回,则在指定路径中找到该文件。问题应该是编码,但是以不同方式发送的同一文件(“audio.raw”)会产生不同的结果,这很奇怪。

无论如何,提前谢谢你! :)

修改

要清楚,并不是它在转录中返回一个空字符串。它永远不会进入演示中也存在的“onSpeechRecognized”功能,因此不会给出转录。

0 个答案:

没有答案