Google Speech-to-Text API v2 Python权限拒绝问题求助
解决Google Speech-to-Text API v2 Python调用的PermissionDenied问题
核心问题分析
你遇到的speech.recognizers.recognize权限拒绝,本质是代码没有正确加载指定的服务账号凭证,导致请求用了其他无权限的身份(比如本地gcloud默认凭证、Cloud Shell的默认会话凭证)发起,而非你配置的Owner权限服务账号。
分步解决方案
1. 修复Windows路径转义问题
你的本地Windows路径中,反斜杠\会被Python解析为转义字符(比如\U、\D),导致凭证文件路径无效,无法加载正确的密钥。修改路径为以下两种方式之一:
- 使用双反斜杠:
credential_path = "C:\\Users\\Joffrey-PTMG\\Desktop\\U23\\OFC-SUBM2.0\\authgooglejson\\hidekey.json" - 使用原始字符串(在路径前加
r):credential_path = r"C:\Users\Joffrey-PTMG\Desktop\U23\OFC-SUBM2.0\authgooglejson\hidekey.json"
2. 直接指定凭证初始化客户端(更可靠)
不要依赖环境变量传递凭证,而是直接在初始化SpeechClient时加载密钥文件,避免环境变量覆盖或加载顺序问题:
import os from google.cloud.speech_v2 import SpeechClient from google.cloud.speech_v2.types import cloud_speech from google.oauth2 import service_account # 加载服务账号凭证 credentials = service_account.Credentials.from_service_account_file( r"C:\Users\Joffrey-PTMG\Desktop\U23\OFC-SUBM2.0\authgooglejson\hidekey.json" ) def transcribe_file_v2( project_id: str, audio_file: str, ) -> cloud_speech.RecognizeResponse: print(project_id) # 用指定凭证初始化客户端 client = SpeechClient(credentials=credentials) # 读取音频文件 with open(audio_file, "rb") as f: content = f.read() config = cloud_speech.RecognitionConfig( auto_decoding_config=cloud_speech.AutoDetectDecodingConfig(), language_codes=["fr-FR"], model="long", ) request = cloud_speech.RecognizeRequest( recognizer=f"projects/{project_id}/locations/global/recognizers/_", config=config, content=content, ) # 发起识别请求 response = client.recognize(request=request) for result in response.results: print(f"Transcript: {result.alternatives[0].transcript}") return response project_idvar = 'eighth-server-267708' audio_filevar = 'testtt.mp3' transcribe_file_v2(project_idvar, audio_filevar)
3. Cloud Shell环境的正确配置
在Cloud Shell中,若要使用指定的服务账号凭证,需确保:
- 先删除原有默认凭证缓存:
rm -rf ~/.config/gcloud/ - 导出凭证路径并立即生效(无需重启Shell):
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/hidekey.json" - 验证凭证是否加载成功:
确认当前活跃账号是你的服务账号邮箱。gcloud auth list
4. 验证服务账号权限
虽然你设置了Owner角色,但仍需确认:
- 服务账号已被正确添加到项目中,且角色绑定生效(IAM角色变更可能有1-2分钟延迟)
- 下载的密钥文件未过期,且内容完整(没有被修改或损坏)
为什么Cloud Shell中export后重启能正常运行?
重启Shell会清除原有环境变量和凭证缓存,新的GOOGLE_APPLICATION_CREDENTIALS设置会被客户端正确读取,而直接运行脚本时,可能Shell会话中已有其他凭证环境变量(比如默认的Cloud Shell会话凭证),导致客户端加载了错误的身份。
内容的提问来源于stack exchange,提问作者Joffrey Vedlem Ved
相关产品推荐
相关产品推荐

