41
41
SAMPLE_RATE = 16000
42
42
CHUNK_SIZE = int (SAMPLE_RATE / 10 ) # 100ms
43
43
44
- RED = ' \033 [0;31m'
45
- GREEN = ' \033 [0;32m'
46
- YELLOW = ' \033 [0;33m'
44
+ RED = " \033 [0;31m"
45
+ GREEN = " \033 [0;32m"
46
+ YELLOW = " \033 [0;33m"
47
47
48
48
49
49
def get_current_time ():
@@ -123,12 +123,14 @@ def generator(self):
123
123
if self .bridging_offset > self .final_request_end_time :
124
124
self .bridging_offset = self .final_request_end_time
125
125
126
- chunks_from_ms = round ((self .final_request_end_time -
127
- self .bridging_offset ) / chunk_time )
126
+ chunks_from_ms = round (
127
+ (self .final_request_end_time - self .bridging_offset )
128
+ / chunk_time
129
+ )
128
130
129
- self .bridging_offset = ( round ( (
130
- len (self .last_audio_input ) - chunks_from_ms )
131
- * chunk_time ) )
131
+ self .bridging_offset = round (
132
+ ( len (self .last_audio_input ) - chunks_from_ms ) * chunk_time
133
+ )
132
134
133
135
for i in range (chunks_from_ms , len (self .last_audio_input )):
134
136
data .append (self .last_audio_input [i ])
@@ -157,7 +159,7 @@ def generator(self):
157
159
except queue .Empty :
158
160
break
159
161
160
- yield b'' .join (data )
162
+ yield b"" .join (data )
161
163
162
164
163
165
def listen_print_loop (responses , stream ):
@@ -201,35 +203,37 @@ def listen_print_loop(responses, stream):
201
203
if result .result_end_time .nanos :
202
204
result_nanos = result .result_end_time .nanos
203
205
204
- stream .result_end_time = int ((result_seconds * 1000 )
205
- + (result_nanos / 1000000 ))
206
+ stream .result_end_time = int ((result_seconds * 1000 ) + (result_nanos / 1000000 ))
206
207
207
- corrected_time = (stream .result_end_time - stream .bridging_offset
208
- + (STREAMING_LIMIT * stream .restart_counter ))
208
+ corrected_time = (
209
+ stream .result_end_time
210
+ - stream .bridging_offset
211
+ + (STREAMING_LIMIT * stream .restart_counter )
212
+ )
209
213
# Display interim results, but with a carriage return at the end of the
210
214
# line, so subsequent lines will overwrite them.
211
215
212
216
if result .is_final :
213
217
214
218
sys .stdout .write (GREEN )
215
- sys .stdout .write (' \033 [K' )
216
- sys .stdout .write (str (corrected_time ) + ': ' + transcript + ' \n ' )
219
+ sys .stdout .write (" \033 [K" )
220
+ sys .stdout .write (str (corrected_time ) + ": " + transcript + " \n " )
217
221
218
222
stream .is_final_end_time = stream .result_end_time
219
223
stream .last_transcript_was_final = True
220
224
221
225
# Exit recognition if any of the transcribed phrases could be
222
226
# one of our keywords.
223
- if re .search (r' \b(exit|quit)\b' , transcript , re .I ):
227
+ if re .search (r" \b(exit|quit)\b" , transcript , re .I ):
224
228
sys .stdout .write (YELLOW )
225
- sys .stdout .write (' Exiting...\n ' )
229
+ sys .stdout .write (" Exiting...\n " )
226
230
stream .closed = True
227
231
break
228
232
229
233
else :
230
234
sys .stdout .write (RED )
231
- sys .stdout .write (' \033 [K' )
232
- sys .stdout .write (str (corrected_time ) + ': ' + transcript + ' \r ' )
235
+ sys .stdout .write (" \033 [K" )
236
+ sys .stdout .write (str (corrected_time ) + ": " + transcript + " \r " )
233
237
234
238
stream .last_transcript_was_final = False
235
239
@@ -238,37 +242,42 @@ def main():
238
242
"""start bidirectional streaming from microphone input to speech API"""
239
243
240
244
client = speech .SpeechClient ()
241
- config = speech .types . RecognitionConfig (
242
- encoding = speech .enums . RecognitionConfig .AudioEncoding .LINEAR16 ,
245
+ config = speech .RecognitionConfig (
246
+ encoding = speech .RecognitionConfig .AudioEncoding .LINEAR16 ,
243
247
sample_rate_hertz = SAMPLE_RATE ,
244
- language_code = 'en-US' ,
245
- max_alternatives = 1 )
246
- streaming_config = speech .types .StreamingRecognitionConfig (
247
- config = config ,
248
- interim_results = True )
248
+ language_code = "en-US" ,
249
+ max_alternatives = 1 ,
250
+ )
251
+ streaming_config = speech .StreamingRecognitionConfig (
252
+ config = config , interim_results = True
253
+ )
249
254
250
255
mic_manager = ResumableMicrophoneStream (SAMPLE_RATE , CHUNK_SIZE )
251
256
print (mic_manager .chunk_size )
252
257
sys .stdout .write (YELLOW )
253
258
sys .stdout .write ('\n Listening, say "Quit" or "Exit" to stop.\n \n ' )
254
- sys .stdout .write (' End (ms) Transcript Results/Status\n ' )
255
- sys .stdout .write (' =====================================================\n ' )
259
+ sys .stdout .write (" End (ms) Transcript Results/Status\n " )
260
+ sys .stdout .write (" =====================================================\n " )
256
261
257
262
with mic_manager as stream :
258
263
259
264
while not stream .closed :
260
265
sys .stdout .write (YELLOW )
261
- sys .stdout .write ('\n ' + str (
262
- STREAMING_LIMIT * stream .restart_counter ) + ': NEW REQUEST\n ' )
266
+ sys .stdout .write (
267
+ "\n " + str (STREAMING_LIMIT * stream .restart_counter ) + ": NEW REQUEST\n "
268
+ )
263
269
264
270
stream .audio_input = []
265
271
audio_generator = stream .generator ()
266
272
267
- requests = (speech .types .StreamingRecognizeRequest (
268
- audio_content = content )for content in audio_generator )
273
+ requests = (
274
+ speech .StreamingRecognizeRequest (audio_content = content )
275
+ for content in audio_generator
276
+ )
269
277
270
- responses = client .streaming_recognize (streaming_config ,
271
- requests )
278
+ responses = client .streaming_recognize (
279
+ requests = requests , config = streaming_config
280
+ )
272
281
273
282
# Now, put the transcription responses to use.
274
283
listen_print_loop (responses , stream )
@@ -282,11 +291,11 @@ def main():
282
291
stream .restart_counter = stream .restart_counter + 1
283
292
284
293
if not stream .last_transcript_was_final :
285
- sys .stdout .write (' \n ' )
294
+ sys .stdout .write (" \n " )
286
295
stream .new_stream = True
287
296
288
297
289
- if __name__ == ' __main__' :
298
+ if __name__ == " __main__" :
290
299
291
300
main ()
292
301
0 commit comments