我尝试通过 Java 程序与 Google Cloud Speech API 进行通信,但收到此错误:
Exception in thread "main" com.google.api.gax.grpc.ApiException: io.grpc.StatusRuntimeException: INVALID_ARGUMENT: Invalid Wav File: Not 16 bit Linear PCM or 8 bit MULAW.
谁能帮我解决这个问题吗?
最佳答案
Google 云语音 API 接受 wav 文件。而且不仅如此。 来自文档:https://cloud.google.com/speech-to-text/docs/encoding
Note: Speech-to-Text supports WAV files with LINEAR16 or MULAW encoded audio.
根据Google语音转文本云网站上的语音转文本/资源,我能够上传带有8位PCM签名的.wav文件。转录得很好。但是,如果我尝试使用他们的 Java API 上传文件,则会出现此错误。我测试了几个库,包括新的测试版。所以我可以同意这很奇怪。我可以在每个播放器上播放 8 位 16KHz PCM SIGNED 编码,也可以播放 8KHz,并且文件头没有任何问题,我可以上传它,但不能通过 Java API 上传。
以下是一些可能有帮助的提示: 如果您想使用 API,则必须转换为 16 位 PCM,或例如 8 位 ULAW。
为此,您可以使用javax.sound.sampled库。
看一下这个例子:SimpleSoundCapture ! 您可以根据需要进行修改。输入“out”变量 ByteArrayOutputStream 或使用 ULAW 编码记录自定义编码 wav 文件。
您可以使用此设置:
AudioFormat.Encoding encoding = AudioFormat.Encoding.ULAW;
floatrate = 16000.0f;
int channels = 1;
int frameSize = 4;
int sampleSize = 8;
boolean bigEndian = true;
Google 从第二次、第三次起就能够毫无问题地识别 ULAW 样本。有时甚至从一开始就是如此。也用 8000.0f 进行了测试。 在使用ULAW之前,请先从语音API的RecognitionConfig对象中删除setEncoding()方法,因为使用ULAW可能会导致另一个异常。
RecognitionConfig config
= RecognitionConfig.newBuilder()
// .setEncoding(AudioEncoding.UNRECOGNIZED)
.setLanguageCode("en-US")
.setSampleRateHertz(16000)
.build();
关于java - 使用 Java 的 Google 云语音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42950768/