Google 云 Python API 库的身份验证停止工作

Authentication to Google Cloud Python API Library stopped working

我在 Google 云 API 的 Python 库中遇到身份验证问题。 起初它工作了几天没有问题,但突然 API 调用没有出现在 Google CloudPlatform 的 API 概述中。

我创建了一个服务帐户并在本地存储了 json 文件。然后我将环境变量 GCLOUD_PROJECT 设置为项目 ID,将 GOOGLE_APPLICATION_CREDENTIALS 设置为 json 文件的路径。

from google.cloud import speech
client = speech.Client()
print(client._credentials.service_account_email)

打印正确的服务帐户电子邮件。

以下代码 t运行 成功地编写了 audio_file,但是我的 Google 云项目的仪表板没有显示激活的语音 API 图表的任何内容.

import io
with io.open(audio_file, 'rb') as f:
    audio = client.sample(f.read(), source_uri=None, sample_rate=48000, encoding=speech.encoding.Encoding.FLAC)

alternatives = audio.sync_recognize(language_code='de-DE')

在某些时候,代码还 运行 存在一些关于使用限制的错误。我猜是由于身份验证不成功,以某种方式使用了 free/limited 选项。

我还通过安装 Google Cloud SDK 和 gcloud auth application-default login 尝试了身份验证的替代选项,但没有成功。

我不知道从哪里开始解决问题。 感谢您的帮助!

(我的系统是 运行 Windows 7 with Anaconda)

编辑: 错误计数 (Fehler) 随着对 API 的调用而增加。如何获得有关错误的详细信息?!

确保在设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量时使用绝对路径。此外,您可能想要 try inspecting the access token using OAuth2 tokeninfo 并确保其响应中包含 "scope": "https://www.googleapis.com/auth/cloud-platform"

有时候你会得到不同的错误信息如果你initialize the client with GRPC enabled:

0.24.0: speech_client = speech.Client(_use_grpc=True)

0.23.0: speech_client = speech.Client(use_gax=True)

通常是编码问题,您可以尝试使用样本音频或尝试使用类似 Unix rec 工具的工具生成 LINEAR16 样本:

rec --channels=1 --bits=16 --rate=44100 audio.wav trim 0 5

...

with io.open(speech_file, 'rb') as audio_file:
    content = audio_file.read()
    audio_sample = speech_client.sample(
        content,
        source_uri=None,
        encoding='LINEAR16',
        sample_rate=44100)

其他说明:

  • 同步识别仅限于 60 秒的音频,必须使用异步才能识别更长的音频
  • 如果您还没有,请为您的帐户设置结算

关于使用问题,问题实际上是当你使用新的google-cloud库访问ML APIs时,似乎每个人都对共享的项目进行身份验证每个人(因此它说你已经用完了你的限制,即使你没有使用任何东西)。要检查并确认这一点,您可以使用 python 客户端库调用您尚未启用的 ML API,这将给您一个结果,即使它不应该。这个问题仍然存在于其他语言的客户端库和 OS,所以我怀疑这是他们的 grpc 的问题。

因此,为了确保一致性,我总是使用使用我的 API 密钥的旧 googleapiclient。这是一个使用翻译 API:

的例子
from googleapiclient import discovery

service = discovery.build('translate', 'v2', developerKey='')

service_request = service.translations().list(q='hello world', target='zh')
result = service_request.execute()

print(result)

对于演讲 API,大致如下:

from googleapiclient import discovery

service = discovery.build('speech', 'v1beta1', developerKey='')

service_request = service.speech().syncrecognize()
result = service_request.execute()

print(result)

您可以在 https://developers.google.com/api-client-library/python/apis/ with the speech one located in https://developers.google.com/resources/api-libraries/documentation/speech/v1beta1/python/latest/.

处获取发现列表 APIs

使用发现库的另一个好处是,与当前库相比,您可以获得更多的选择,尽管通常实施起来会比较麻烦。