语音Api限制为65秒而不是180分钟

时间:2018-03-04 19:39:59

标签: c# google-cloud-speech

根据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上你可以使用“说话”功能超过一分钟,如何实现它?)

1 个答案:

答案 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。我建议调查一下。

希望有所帮助