Skip to content

Commit 92b2b89

Browse files
committed
Remove 'alternatives' key when accessing results.
1 parent e5184af commit 92b2b89

File tree

4 files changed

+69
-37
lines changed

4 files changed

+69
-37
lines changed

docs/speech-usage.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ See: `Speech Asynchronous Recognize`_
5555
... operation.poll() # API call
5656
>>> operation.complete
5757
True
58-
>>> operation.results[0]['alternatives'][0]['transcript']
59-
"how old is the Brooklyn Bridge"
60-
>>> operation.results[0]['alternatives'][0]['confidence']
58+
>>> operation.results[0].transcript
59+
'how old is the Brooklyn Bridge'
60+
>>> operation.results[0].confidence
6161
0.98267895
6262
6363

google/cloud/speech/operation.py

Lines changed: 52 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,15 @@
1515
"""Long running operation representation for Google Speech API"""
1616

1717
from google.cloud._helpers import _rfc3339_to_datetime
18+
from google.cloud import operation
1819

1920

20-
class Operation(object):
21+
class Operation(operation.Operation):
2122
"""Representation of a Google API Long-Running Operation.
2223
24+
:type client: :class:`~google.cloud.speech.client.Client`
25+
:param client: Instance of speech client.
26+
2327
:type name: int
2428
:param name: ID assigned to an operation.
2529
@@ -52,31 +56,21 @@ def __init__(self, client, name, complete=False, last_updated=None,
5256
def from_api_repr(cls, client, response):
5357
"""Factory: construct an instance from Google Speech API.
5458
59+
:type client: :class:`~google.cloud.speech.client.Client`
60+
:param client: Instance of speech client.
61+
5562
:type response: dict
5663
:param response: Dictionary response from Google Speech Operations API.
5764
5865
:rtype: :class:`Operation`
5966
:returns: Instance of `~google.cloud.speech.operations.Operation`.
6067
"""
61-
last_updated = None
62-
progress_percent = 0
63-
results = None
64-
start_time = None
65-
6668
name = response['name']
67-
metadata = response.get('metadata', None)
68-
69-
if metadata:
70-
last_updated = _rfc3339_to_datetime(metadata.get('lastUpdateTime'))
71-
start_time = _rfc3339_to_datetime(metadata.get('startTime'))
72-
progress_percent = metadata.get('progressPercent')
73-
74-
if response.get('response'):
75-
results = response.get('response').get('results')
7669
complete = response.get('done', False)
7770

78-
return cls(client, name, complete, last_updated, progress_percent,
79-
results, start_time)
71+
operation_instance = cls(client, name, complete)
72+
operation_instance._update(response)
73+
return operation_instance
8074

8175
@property
8276
def complete(self):
@@ -150,10 +144,46 @@ def _update(self, response):
150144
:param response: Response from Speech API Operations endpoint.
151145
See: `speech_operations`_.
152146
"""
153-
metadata = response['metadata']
154-
results = response.get('response', {}).get('results')
155-
self._last_updated = _rfc3339_to_datetime(metadata['lastUpdateTime'])
147+
metadata = response.get('metadata', None)
148+
raw_results = response.get('response', {}).get('results', None)
149+
results = []
150+
if raw_results:
151+
for result in raw_results[0]['alternatives']:
152+
results.append(Transcript(result))
153+
if metadata:
154+
self._last_updated = _rfc3339_to_datetime(
155+
metadata['lastUpdateTime'])
156+
self._start_time = _rfc3339_to_datetime(metadata['startTime'])
157+
self._progress_percent = metadata.get('progressPercent', 0)
158+
156159
self._results = results
157-
self._start_time = _rfc3339_to_datetime(metadata['startTime'])
158160
self._complete = response.get('done', False)
159-
self._progress_percent = metadata.get('progressPercent', 0)
161+
162+
163+
class Transcript(object):
164+
"""Representation of Speech Transcripts
165+
166+
:type result: dict
167+
:param result: Dictionary of transcript and confidence of recognition.
168+
"""
169+
def __init__(self, result):
170+
self._transcript = result.get('transcript')
171+
self._confidence = result.get('confidence')
172+
173+
@property
174+
def transcript(self):
175+
"""Transcript text from audio.
176+
177+
:rtype: str
178+
:returns: Text detected in audio.
179+
"""
180+
return self._transcript
181+
182+
@property
183+
def confidence(self):
184+
"""Confidence score for recognized speech.
185+
186+
:rtype: float
187+
:returns: Confidence score of recognized speech [0-1].
188+
"""
189+
return self._confidence

speech/unit_tests/_fixtures.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
'google.cloud.speech.v1beta1.AsyncRecognizeMetadata'),
4141
'progressPercent': 100,
4242
'startTime': '2016-09-22T17:52:25.536964Z',
43-
'lastUpdateTime': '2016-09-22T17:52:27.802902Z'
43+
'lastUpdateTime': '2016-09-22T17:52:27.802902Z',
4444
},
4545
'done': True,
4646
'response': {
@@ -52,11 +52,11 @@
5252
{
5353
'transcript': 'how old is the Brooklyn Bridge',
5454
'confidence': 0.98267895
55-
}
56-
]
57-
}
58-
]
59-
}
55+
},
56+
],
57+
},
58+
],
59+
},
6060
}
6161

6262
OPERATION_INCOMPLETE_RESPONSE = {
@@ -66,7 +66,7 @@
6666
'google.cloud.speech.v1beta1.AsyncRecognizeMetadata'),
6767
'progressPercent': 27,
6868
'startTime': '2016-09-22T17:52:25.536964Z',
69-
'lastUpdateTime': '2016-09-22T17:52:27.802902Z'
69+
'lastUpdateTime': '2016-09-22T17:52:27.802902Z',
7070
},
71-
'done': False
71+
'done': False,
7272
}

unit_tests/speech/test_operation.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ def test_ctor_defaults(self):
2424

2525
def test_from_api_repr(self):
2626
from unit_tests.speech._fixtures import OPERATION_COMPLETE_RESPONSE
27+
from google.cloud.speech.operation import Transcript
2728
RESPONSE = OPERATION_COMPLETE_RESPONSE
2829

2930
client = _Client()
@@ -34,11 +35,10 @@ def test_from_api_repr(self):
3435
self.assertEqual('123456789', operation.name)
3536
self.assertTrue(operation.complete)
3637

37-
alternatives = operation.results[0]['alternatives']
38-
38+
self.assertIsInstance(operation.results[0], Transcript)
3939
self.assertEqual('how old is the Brooklyn Bridge',
40-
alternatives[0]['transcript'])
41-
self.assertEqual(0.98267895, alternatives[0]['confidence'])
40+
operation.results[0].transcript)
41+
self.assertEqual(0.98267895, operation.results[0].confidence)
4242
self.assertTrue(operation.complete)
4343

4444
def test_update_response(self):
@@ -84,8 +84,10 @@ def test_poll_complete(self):
8484
class _Connection(object):
8585
def __init__(self, response):
8686
self.response = response
87+
self._requested = []
8788

8889
def api_request(self, method, path):
90+
self._requested.append({'method': method, 'path': path})
8991
return self.response
9092

9193

0 commit comments

Comments
 (0)