调用Google Cloud Speech-to-text v2 API遇403权限错误求助
Google Cloud Speech-to-Text v2 API 403权限错误问题
错误响应
{ "error": { "code": 403, "message": "Permission 'speech.recognizers.recognize' denied on resource (or it may not exist).", "status": "PERMISSION_DENIED", "details": [ { "@type": "type.googleapis.com/google.rpc.ErrorInfo", "reason": "IAM_PERMISSION_DENIED", "domain": "iam.googleapis.com", "metadata": { "permission": "speech.recognizers.recognize" } } ] } }
已完成操作
- 创建服务账号
- 为其分配Cloud Speech Client IAM角色
- 创建服务账号密钥
- 创建识别器(recognizer)
- 使用JWT向Google授权服务器认证获取访问令牌
- 调用Google Speech-to-text v2 API(返回上述权限错误)
API调用信息
- 端点:
https://{Location}-speech.googleapis.com/v2/projects/{Project ID}/locations/{Recognizer Location}/recognizers/{Recognizer Name}:recognize?access_token={Access Token} - 请求头:
Authorization: Bearer、Content-Type: audio/wav、accept: */*
补充信息
- 程序功能:允许用户录制音频,发送至Google转写后进行后续处理
- 已成功调用v1版Speech-to-text API,正在迁移至v2版本
- 未为服务账号委派全域权限
- 认证时JWT声明未提供"sub"字段
- 获取认证响应时未返回范围信息(请求时已提供,文档示例响应包含该字段),仅返回访问令牌、令牌类型和过期时间
排查建议
- 确认角色权限覆盖v2需求:检查Cloud Speech Client角色是否包含
speech.recognizers.recognize权限。v2 API的权限与v1不同,v1使用speech.speech.recognition,需确保当前角色能覆盖v2的特定权限。 - 验证识别器资源权限:确认识别器与服务账号在同一项目、同区域,且服务账号对该识别器资源有直接权限绑定。项目级角色可能因资源配置问题未生效到特定识别器。
- 检查令牌请求范围:确保JWT请求时指定的scope为
https://www.googleapis.com/auth/cloud-platform或https://www.googleapis.com/auth/speech,这两个范围才有权限调用v2 API。 - 测试令牌有效性:用
gcloud auth activate-service-account --key-file=你的密钥文件.json激活服务账号,再用gcloud auth print-access-token生成令牌,替换到API调用中测试,排除令牌生成流程的问题。 - 核对端点参数正确性:确认端点中的项目ID、识别器区域、识别器名称无拼写错误,区域需与创建识别器时完全一致(如
us-central1不能简写)。 - 修正请求头格式:Authorization头需完整格式为
Authorization: Bearer {实际访问令牌},确保令牌已正确拼接在Bearer之后。
内容的提问来源于stack exchange,提问作者hja190
相关产品推荐
相关产品推荐

