根据https://cloud.google.com/speech/quotas,异步请求持续180分钟。
但是当我使用这段代码时:
public async Task<object> StreamingMicRecognizeAsync(int seconds)
{
streamingCall = SpeechClient.Create().StreamingRecognize();
await streamingCall.WriteAsync(
new StreamingRecognizeRequest()
{
StreamingConfig = new StreamingRecognitionConfig()
{
Config = new RecognitionConfig()
{
Encoding = RecognitionConfig.Types.AudioEncoding.Linear16,
SampleRateHertz = 16000,
LanguageCode = "en-US"
},
InterimResults = true,
SingleUtterance = false
}
}
);
Task prinResp = Task.Run(async () =>
{
while (await streamingCall.ResponseStream.MoveNext(default(CancellationToken)))
{
foreach (var result in streamingCall.ResponseStream.Current.Results)
{
MessageBox.Show(result.Alternatives[0].Transcript.ToString());
}
}
});
// Read from the microphone and stream to API.
object writeLock = new object();
bool writeMore = true;
waveIn = new NAudio.Wave.WaveInEvent();
waveIn.DeviceNumber = 0;
waveIn.WaveFormat = new NAudio.Wave.WaveFormat(16000, 1);
waveIn.DataAvailable +=
(object sender, NAudio.Wave.WaveInEventArgs args) =>
{
lock (writeLock)
{
if (!writeMore || !isActive) return;
try
{
streamingCall.WriteAsync(
new StreamingRecognizeRequest()
{
AudioContent = Google.Protobuf.ByteString.CopyFrom(args.Buffer, 0, args.BytesRecorded)
}).Wait();
}
catch (Exception e) { my.message(e.Message); }
}
};
waveIn.StartRecording();
await Task.Delay(TimeSpan.FromSeconds(180*60));
waveIn.StopRecording();
lock (writeLock) writeMore = false;
await streamingCall.WriteCompleteAsync();
await prinResp;
return 0;
}
65秒后streamingCall.WriteAsync
显示“超过允许的最长流时长为65秒”。错误。
我如何获得180分钟? (即在translate.google.com上你可以使用“说话”功能超过一分钟,如何实现它?)
答案 0 :(得分:1)
正如@CamiloTerevinto所提到的,您需要为Speech API的异步请求提供一个云存储URI,持续时间超过1分钟。 Translate.google.com是Google工具,不具备与公共API相同的限制。我还相信翻译工具流式传输音频,将其上传到临时云存储,使用语音API转换为文本,以便进行翻译。
您可以使用Google.Cloud.Storage.V1 API将流上传到Google云端存储。然后,返回URI可以与Speech API异步请求一起使用,并且最多可以处理180分钟的音频。
Google有几个小examples关于如何在不同场景下使用Speech API,包括使用Google存储URI。我建议调查一下。
希望有所帮助