简体   繁体   中英

TransportError: HTTPSConnectionPool error calling Google Cloud Speech API from Python 2.7

I downloaded Google Cloud SDK by following https://cloud.google.com/sdk/docs/quickstart-debian-ubuntu . And I downloaded Google Speech API by following https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/speech/cloud-client . When I run python transcribe.py resources/audio.raw, the error happens. I got an error,TransportError: HTTPSConnectionPool(host='accounts.google.com', port=443): Max retries exceeded with url: /o/oauth2/token (Caused by SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)'),)) )>)

Traceback is

 E1019 18:46:20.868555489 3813 plugin_credentials.c:74] Getting metadata from plugin failed with error: Traceback (most recent call last): File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 154, in grpc._cython.cygrpc.plugin_get_metadata (src/python/grpcio/grpc/_cython/cygrpc.c:7054) File "/home/pi/py2env/local/lib/python2.7/site-packages/grpc/_plugin_wrapping.py", line 106, in __call__ AuthMetadataPluginCallback(wrapped_cygrpc_callback)) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/auth/transport/grpc.py", line 73, in __call__ callback(self._get_authorization_headers(context), None) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/auth/transport/grpc.py", line 61, in _get_authorization_headers headers) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/auth/credentials.py", line 121, in before_request self.refresh(request) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/oauth2/credentials.py", line 117, in refresh self._client_secret)) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/oauth2/_client.py", line 189, in refresh_grant response_data = _token_endpoint_request(request, token_uri, body) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/oauth2/_client.py", line 104, in _token_endpoint_request method='POST', url=token_uri, headers=headers, body=body) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/auth/transport/requests.py", line 115, in __call__ raise exceptions.TransportError(exc) TransportError: HTTPSConnectionPool(host='accounts.google.com', port=443): Max retries exceeded with url: /o/oauth2/token (Caused by SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)'),)) Traceback (most recent call last): File "transcribe.py", line 94, in <module> transcribe_file(args.path) File "transcribe.py", line 52, in transcribe_file response = client.recognize(config, audio) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/cloud/gapic/speech/v1/speech_client.py", line 201, in recognize return self._recognize(request, options) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/gax/api_callable.py", line 452, in inner return api_caller(api_call, this_settings, request) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/gax/api_callable.py", line 438, in base_caller return api_call(*args) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/gax/api_callable.py", line 376, in inner return a_func(*args, **kwargs) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/gax/retry.py", line 127, in inner ' classified as transient', exception) google.gax.errors.RetryError: RetryError(Exception occurred in retry method that was not classified as transient, caused by <_Rendezvous of RPC that terminated with (StatusCode.UNAUTHENTICATED, Traceback (most recent call last): File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 154, in grpc._cython.cygrpc.plugin_get_metadata (src/python/grpcio/grpc/_cython/cygrpc.c:7054) File "/home/pi/py2env/local/lib/python2.7/site-packages/grpc/_plugin_wrapping.py", line 106, in __call__ AuthMetadataPluginCallback(wrapped_cygrpc_callback)) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/auth/transport/grpc.py", line 73, in __call__ callback(self._get_authorization_headers(context), None) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/auth/transport/grpc.py", line 61, in _get_authorization_headers headers) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/auth/credentials.py", line 121, in before_request self.refresh(request) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/oauth2/credentials.py", line 117, in refresh self._client_secret)) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/oauth2/_client.py", line 189, in refresh_grant response_data = _token_endpoint_request(request, token_uri, body) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/oauth2/_client.py", line 104, in _token_endpoint_request method='POST', url=token_uri, headers=headers, body=body) File "/home/pi/py2env/local/lib/python2.7/site-packages/google/auth/transport/requests.py", line 115, in __call__ raise exceptions.TransportError(exc) TransportError: HTTPSConnectionPool(host='accounts.google.com', port=443): Max retries exceeded with url: /o/oauth2/token (Caused by SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)'),)) )>)

I installed module can be used https to ubuntu,so I really cannnot understand why this error happens.Authentication of Google Cloud API is ok,so I do not know this is for what kind of error.How should I fix this?

Looks like it is a problem of using an outdated version of openssl. I solved the issue for me on Centos 7 by running yum update openssl and updating to version 1.0.2 following instructions from here .

Also, in addition in a Gentoo Linux machine I had to downgrade certifi with pip uninstall -y certifi && pip install certifi==2015.04.28

It looks a grpcio issue that's causing the error. I suggest installing the latest version the Cloud Speech API client library (which specifies its required version of grpcio ) and try again. Rather than downloading it from GH, I suggest using pip install instead.

"Hello World" s2t-demo.py example (Py2&3 compatible):

from __future__ import print_function
from google.cloud import speech

# Py2 vs. 3 library compatibility
recogcfg = speech.RecognitionConfig if hasattr(
        speech, 'RecognitionConfig') else speech.enums.RecognitionConfig

# build request metadata
FILE = 'gs://YOUR_BUCKET/AUDIO_FILE.wav'
body = {
    'audio': {'uri': FILE},
    'config': {
        'language_code': 'en-US',
        'encoding': recogcfg.AudioEncoding.LINEAR16,
    },
}

# call Speech-to-Text API to transcribe text from specified audio file
S2T = speech.SpeechClient()
rsp = S2T.recognize(**body).results[0].alternatives[0]
print('** %.2f%% confident of this transcript of %r:\n\t%r' % (
        rsp.confidence*100., FILE, rsp.transcript))

Recommended steps (recommend using a virtualenv):

  1. gcloud auth application-default login - setup credentials
  2. pip install -U pip google-cloud-speech - update pip and install client library
  3. pip list - confirm google-cloud-speech v1.3.4+ and grpcio 1.41.1+
  4. gsutil cp AUDIO_FILE.wav gs://YOUR_BUCKET - copy audio file to Cloud Storage
  5. python s2t-demo.py - run app and see audio file transcription

Example output:

$ python s2t-demo.py
** 93.05% confident of this transcript of 'gs://bucket/text.wav':
        'Google headquarters in Mountain View unveiled the new Android phone at the Consumer Electronics Show Sundar pichai said in his keynote that users love their new Android phones'

The code sample works for both Python 2 and 3 in case you want to upgrade sooner than later.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM