You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:55:54