谷歌语音到文本与java和twilio



我在使用谷歌语音转换为文本将音频文件转换为文本时遇到问题。我可以从Twilio下载该文件,但当我将音频文件提供给谷歌语音时,它会给我0长度的响应。但如果我使用vlc媒体播放器转换这个下载的文件,然后将其提供给谷歌语音,那么它就会给我正确的输出。请帮帮我,我已经被困了大约一个星期了。

收到Twilio的回复后,我将其保存在一个扩展名为.wav的文件中

InputStream in = new URL(jsonObject.get("redirect_to").toString()).openStream();
Files.copy(in, Paths.get("src/main/resources/mp.wav"), StandardCopyOption.REPLACE_EXISTING);

下面是谷歌语音到文本的代码。

Path path = Paths.get("src/main/resources/mp.wav");
byte[] content = Files.readAllBytes(path);
ByteString audioBytes = ByteString.copyFrom(content);
try (SpeechClient speech = SpeechClient.create()) {
RecognitionConfig recConfig =
RecognitionConfig.newBuilder()
.setEncoding(RecognitionConfig.AudioEncoding.LINEAR16)
.setLanguageCode("en-US")
.setSampleRateHertz(44100)
.setModel("default")
.setAudioChannelCount(2)
.build();

RecognitionAudio recognitionAudio = RecognitionAudio.newBuilder().setContent(audioBytes).build();
OperationFuture<LongRunningRecognizeResponse, LongRunningRecognizeMetadata> response =
speech.longRunningRecognizeAsync(recConfig, recognitionAudio);
while (!response.isDone()) {
System.out.println("Waiting for response...");
Thread.sleep(10000);
}
List<SpeechRecognitionResult> results = response.get().getResultsList();
for (SpeechRecognitionResult result : results) {
// There can be several alternative transcripts for a given chunk of speech. Just use the
// first (most likely) one here.
SpeechRecognitionAlternative alternative = result.getAlternativesList().get(0);
System.out.printf("Transcription: %s%n", alternative.getTranscript());
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}

正如@philnash所建议的,通过在录制URL中添加.mp3扩展名,可以从Twilio下载MP3版本的录制。这同样适用于".wav"扩展名。

InputStream in = new URL(jsonObject.get(“redirect_to”).toString()+”.mp3”).openStream(); // or “.wav”
Files.copy(in, Paths.get(“src/main/resources/mp.wav”), StandardCopyOption.REPLACE_EXISTING);

我用一个Twilio录音样本测试了这一点,ffprobe的结果如下。

下载的.wav文件

Input #0, **wav**, from 'from-twilio-change-extension.wav':
Duration: 00:00:14.60, bitrate: 128 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 8000 Hz, 1 channels, s16, 128 kb/s

下载的.mp3文件

Input #0, **mp3**, from 'from-twilio-change-extension.mp3':
Duration: 00:00:14.68, start: 0.000000, bitrate: 32 kb/s
Stream #0:0: Audio: mp3, 22050 Hz, mono, fltp, 32 kb/s

至于Speech-to-Text API支持的音频编码,支持WAV和MP3,但MP3是Beta功能,仅在v1p1beta1版本中可用。因此,客户端库导入将看起来像com.google.cloud.speech.v1p1beta1.Packages...RecognitionConfig中的音频编码必须根据所使用的音频文件的编码进行更改。对于.wav文件,必须使用RecognitionConfig.AudioEncoding.LINEAR16,对于.mp3文件,必须采用RecognitionConfig.AudioEncoding.MP3


另一种选择是使用FFMPEG工具将音频文件转换为语音到文本识别的编解码器之一。有关该工具使用情况的更多信息,请点击此处。在您的场景中,.mka.wav/.mp3的转换可以从Java代码中完成,如下所示。

String[] ffmpegCommand = {"ffmpeg", "-i", "/full/path/to/inputFile.mka", "/full/path/to/outputFile.wav"};
ProcessBuilder pb = new ProcessBuilder(ffmpegCommand);
pb.inheritIO();
pb.start();

最新更新