14
14
# limitations under the License.
15
15
"""Sample that streams audio to the Google Cloud Speech API via GRPC."""
16
16
17
- from __future__ import division
18
-
19
17
import contextlib
20
18
import re
21
19
import threading
22
20
23
21
from gcloud .credentials import get_credentials
24
- from google .cloud .speech .v1beta1 import cloud_speech_pb2 as cloud_speech
22
+ from google .cloud .speech .v1 import cloud_speech_pb2 as cloud_speech
25
23
from google .rpc import code_pb2
26
24
from grpc .beta import implementations
27
25
import pyaudio
28
26
29
27
# Audio recording parameters
30
28
RATE = 16000
31
29
CHANNELS = 1
32
- CHUNK = int ( RATE / 10 ) # 100ms
30
+ CHUNK = RATE // 10 # 100ms
33
31
34
32
# Keep the request alive for this many seconds
35
33
DEADLINE_SECS = 8 * 60 * 60
@@ -45,15 +43,15 @@ def make_channel(host, port):
45
43
creds = get_credentials ().create_scoped ([SPEECH_SCOPE ])
46
44
# Add a plugin to inject the creds into the header
47
45
auth_header = (
48
- 'Authorization' ,
49
- 'Bearer ' + creds .get_access_token ().access_token )
46
+ 'Authorization' ,
47
+ 'Bearer ' + creds .get_access_token ().access_token )
50
48
auth_plugin = implementations .metadata_call_credentials (
51
- lambda _ , cb : cb ([auth_header ], None ),
52
- name = 'google_creds' )
49
+ lambda _ , cb : cb ([auth_header ], None ),
50
+ name = 'google_creds' )
53
51
54
52
# compose the two together for both ssl and google auth
55
53
composite_channel = implementations .composite_channel_credentials (
56
- ssl_channel , auth_plugin )
54
+ ssl_channel , auth_plugin )
57
55
58
56
return implementations .secure_channel (host , port , composite_channel )
59
57
@@ -77,40 +75,41 @@ def record_audio(channels, rate, chunk):
77
75
78
76
79
77
def request_stream (stop_audio , channels = CHANNELS , rate = RATE , chunk = CHUNK ):
80
- """Yields `StreamingRecognizeRequest`s constructed from a recording audio
81
- stream.
78
+ """Yields `RecognizeRequest`s constructed from a recording audio stream.
82
79
83
80
Args:
84
81
stop_audio: A threading.Event object stops the recording when set.
85
82
channels: How many audio channels to record.
86
83
rate: The sampling rate.
87
84
chunk: Buffer audio into chunks of this size before sending to the api.
88
85
"""
89
- # The initial request must contain metadata about the stream, so the
90
- # server knows how to interpret it.
91
- recognition_config = cloud_speech .RecognitionConfig (
92
- encoding = 'LINEAR16' , sample_rate = rate )
93
- streaming_config = cloud_speech .StreamingRecognitionConfig (
94
- config = recognition_config ,
95
- # Note that setting interim_results to True means that you'll likely
96
- # get multiple results for the same bit of audio, as the system
97
- # re-interprets audio in the context of subsequent audio. However, this
98
- # will give us quick results without having to tell the server when to
99
- # finalize a piece of audio.
100
- interim_results = True , single_utterance = True
101
- )
102
-
103
- yield cloud_speech .StreamingRecognizeRequest (
104
- streaming_config = streaming_config )
105
-
106
86
with record_audio (channels , rate , chunk ) as audio_stream :
87
+ # The initial request must contain metadata about the stream, so the
88
+ # server knows how to interpret it.
89
+ metadata = cloud_speech .InitialRecognizeRequest (
90
+ encoding = 'LINEAR16' , sample_rate = rate ,
91
+ # Note that setting interim_results to True means that you'll
92
+ # likely get multiple results for the same bit of audio, as the
93
+ # system re-interprets audio in the context of subsequent audio.
94
+ # However, this will give us quick results without having to tell
95
+ # the server when to finalize a piece of audio.
96
+ interim_results = True , continuous = False ,
97
+ )
98
+ data = audio_stream .read (chunk )
99
+ audio_request = cloud_speech .AudioRequest (content = data )
100
+
101
+ yield cloud_speech .RecognizeRequest (
102
+ initial_request = metadata ,
103
+ audio_request = audio_request )
104
+
107
105
while not stop_audio .is_set ():
108
106
data = audio_stream .read (chunk )
109
107
if not data :
110
108
raise StopIteration ()
111
-
112
109
# Subsequent requests can all just have the content
113
- yield cloud_speech .StreamingRecognizeRequest (audio_content = data )
110
+ audio_request = cloud_speech .AudioRequest (content = data )
111
+
112
+ yield cloud_speech .RecognizeRequest (audio_request = audio_request )
114
113
115
114
116
115
def listen_print_loop (recognize_stream ):
@@ -137,8 +136,7 @@ def main():
137
136
make_channel ('speech.googleapis.com' , 443 )) as service :
138
137
try :
139
138
listen_print_loop (
140
- service .StreamingRecognize (
141
- request_stream (stop_audio ), DEADLINE_SECS ))
139
+ service .Recognize (request_stream (stop_audio ), DEADLINE_SECS ))
142
140
finally :
143
141
# Stop the request stream once we're done with the loop - otherwise
144
142
# it'll keep going in the thread that the grpc lib makes for it..
0 commit comments