Speech API时长限制为65秒而非180分钟,如何获取180分钟时长?
你这里的核心问题是混淆了Google Speech-to-Text两种不同API的限制:流式识别(Streaming Speech-to-Text)和异步批量识别(Asynchronous Batch Speech Recognition)。
流式API(也就是你现在用的streamingCall.WriteAsync所属的接口)本身设计用于实时短音频交互场景,所以有65秒的最大流时长限制——这是硬性设计约束,没法突破。而你看到的180分钟配额,是专门针对异步批量识别服务的,它就是为处理长音频文件而生的。
要实现180分钟的音频识别,你需要切换到异步批量识别方案,具体步骤如下:
1. 准备音频文件
异步批量识别要求音频文件存储在Google Cloud Storage(GCS),或者提供可公开访问的HTTP URL。如果你的音频是本地文件,先上传到GCS桶中(记得配置桶的权限,让Speech服务能读取到文件)。
2. 调用异步识别API
使用LongRunningRecognize接口(而非流式的StreamingRecognize)发起请求,这个接口会返回一个长运行操作(Long-Running Operation),你可以通过轮询获取结果,也可以设置回调通知。
以下是适配你技术栈的C#示例代码:
using Google.Cloud.Speech.V1; using System; using System.Threading.Tasks; using System.Text; public class LongAudioSpeechRecognition { public static async Task<string> ProcessLongAudioAsync(string gcsAudioUri) { // 初始化Speech客户端 var speechClient = SpeechClient.Create(); // 根据你的音频实际情况配置参数(编码、采样率、语言等) var recognitionConfig = new RecognitionConfig { Encoding = RecognitionConfig.Types.AudioEncoding.Mp3, SampleRateHertz = 44100, LanguageCode = "zh-CN", EnableAutomaticPunctuation = true }; // 指定GCS上的音频文件路径 var recognitionAudio = RecognitionAudio.FromStorageUri(gcsAudioUri); // 发起异步识别请求 var operation = await speechClient.LongRunningRecognizeAsync(recognitionConfig, recognitionAudio); Console.WriteLine("异步识别任务已提交,等待处理完成..."); // 轮询直到任务完成(也可配置异步回调) var recognitionResult = await operation.PollUntilCompletedAsync(); // 拼接完整识别结果 var fullTranscript = new StringBuilder(); foreach (var result in recognitionResult.Results) { foreach (var alternative in result.Alternatives) { fullTranscript.AppendLine(alternative.Transcript); } } return fullTranscript.ToString(); } }
3. 关于translate.google.com的"speak"功能
你提到的Translate的"speak"功能属于**文本转语音(Text-to-Speech, TTS)**服务,和语音转文本(Speech-to-Text)是完全不同的产品。TTS的流式API设计目标是实时输出长文本对应的音频流,所以没有类似65秒的限制,这和你当前的语音识别场景没有直接可比性。
额外注意事项
- 确保你的GCP项目有足够的异步识别配额(默认配额已支持长音频处理,特殊需求可申请调整)。
- 音频文件格式需符合Speech服务的要求(支持MP3、FLAC、WAV等格式,可参考官方文档确认)。
内容的提问来源于stack exchange,提问作者T.Todua

