GCP Text-to-Speech API调用报错:无法识别JSON凭据类型求助
问题根因
你加载的client_secret.json是OAuth客户端凭据,仅用于需要用户登录授权的场景,不是GoogleCredential.FromStream()支持的服务账号密钥类型,因此抛出「Unrecognized credential type」错误。
解决步骤
- 进入GCP控制台对应项目的「IAM与管理」-「服务账号」页面
- 新建服务账号,为其分配
Cloud Text-to-Speech User权限角色;如果已有符合权限的服务账号可直接使用 - 进入对应服务账号的「密钥」标签页,选择「添加密钥」-「创建新密钥」,密钥类型选择JSON,下载生成的服务账号密钥文件
- 替换掉你代码中加载的
client_secret.json为新下载的服务账号密钥文件
代码修正说明
你原代码中误用了Logging服务的Scope和Endpoint,也不需要手动创建Grpc Channel,正确逻辑如下:
如果配置了环境变量GOOGLE_APPLICATION_CREDENTIALS指向服务账号JSON路径,可直接使用默认构造:
// 只要环境变量配置正确,直接调用Create即可自动加载凭据 var client = await TextToSpeechClient.CreateAsync();
如果需要手动加载指定路径的凭据,使用如下代码:
using (var stream = new FileStream("C:/textToSpeech/你的服务账号密钥文件名.json", FileMode.Open, FileAccess.Read)) { var credential = GoogleCredential.FromStream(stream).CreateScoped(TextToSpeechClient.DefaultScopes); var client = new TextToSpeechClientBuilder { Credential = credential }.Build(); var input = new SynthesisInput { Text = "This is Demo of the Google Cloud Text-to-Speech API" }; VoiceSelectionParams voiceSelection = new VoiceSelectionParams { LanguageCode = "en-US", SsmlGender = SsmlVoiceGender.Female, }; var audioConfig = new AudioConfig { AudioEncoding = AudioEncoding.Mp3 }; var response = await client.SynthesizeSpeechAsync(input, voiceSelection, audioConfig); using (var output = File.Create("output.mp3")) { response.AudioContent.WriteTo(output); } Console.WriteLine("Audio content written to file output.mp3"); }
额外验证点
- 打开你下载的服务账号JSON文件,确认顶层
type字段值为service_account - 确认GCP项目已启用「Cloud Text-to-Speech API」
- 确认服务账号已正确分配TTS调用权限,没有额外权限限制
内容的提问来源于stack exchange,提问作者mia
相关产品推荐
相关产品推荐

