ciyidogan commited on
Commit
537d7bf
·
verified ·
1 Parent(s): 8b5af40

Update stt_google.py

Browse files
Files changed (1) hide show
  1. stt_google.py +79 -38
stt_google.py CHANGED
@@ -40,6 +40,9 @@ class GoogleCloudSTT(STTInterface):
40
  test_client = speech.SpeechClient()
41
  log_info("🔐 Testing Google credentials...")
42
  log_info("✅ Google credentials valid")
 
 
 
43
  except Exception as e:
44
  log_error(f"❌ Google credentials error", error=str(e))
45
  raise
@@ -51,23 +54,55 @@ class GoogleCloudSTT(STTInterface):
51
  self.client = None
52
  self.streaming_config = None
53
  self.is_streaming = False
54
- self.audio_queue = queue.Queue()
55
- self.responses_queue = queue.Queue()
56
  self.stream_thread = None
57
  self.stop_event = threading.Event()
58
- self.credentials_path = credentials_path # Sakla
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
 
60
  async def start_streaming(self, config: dict) -> None:
61
  """Initialize streaming session with clean state"""
62
  try:
63
- log_info(f"🎤 Starting Google STT streaming with config: {config}")
 
64
 
65
  # Önce mevcut stream'i temizle
66
  if self.is_streaming or self.stream_thread:
67
  log_warning("⚠️ Previous stream still active, stopping it first")
68
  await self.stop_streaming()
69
- # Temizlik için bekle
70
- await asyncio.sleep(0.1)
 
 
 
 
 
 
71
 
72
  # Her start_streaming'de yeni client oluştur
73
  self.client = speech.SpeechClient()
@@ -101,23 +136,23 @@ class GoogleCloudSTT(STTInterface):
101
  single_utterance=stt_config.single_utterance
102
  )
103
 
104
- # Queue'ları yeniden oluştur (tamamen temiz başla)
105
- self.audio_queue = queue.Queue()
106
- self.responses_queue = queue.Queue()
107
-
108
  self.is_streaming = True
109
- self.stop_event.clear()
110
 
111
- # Start streaming thread
112
- self.stream_thread = threading.Thread(target=self._run_stream)
 
 
 
 
113
  self.stream_thread.start()
114
 
115
- log_info("✅ Google STT streaming started successfully with clean state")
116
 
117
  except Exception as e:
118
  log_error(f"❌ Failed to start Google STT streaming", error=str(e))
119
  self.is_streaming = False
120
  self.client = None
 
121
  raise
122
 
123
  def _put_result(self, result: TranscriptionResult):
@@ -309,10 +344,11 @@ class GoogleCloudSTT(STTInterface):
309
  async def stop_streaming(self) -> Optional[TranscriptionResult]:
310
  """Stop streaming and clean up all resources"""
311
  if not self.is_streaming and not self.stream_thread:
 
312
  return None
313
 
314
  try:
315
- log_info("🛑 Stopping Google STT streaming and cleaning all resources...")
316
 
317
  # Flag'i hemen kapat
318
  self.is_streaming = False
@@ -320,24 +356,24 @@ class GoogleCloudSTT(STTInterface):
320
 
321
  # Send poison pill to stop request generator
322
  if self.audio_queue:
323
- self.audio_queue.put(None)
 
 
 
324
 
325
- # Wait for thread to finish
326
  if self.stream_thread and self.stream_thread.is_alive():
327
- self.stream_thread.join(timeout=10.0)
 
 
328
  if self.stream_thread.is_alive():
329
- log_warning("⚠️ STT thread did not stop gracefully, forcing termination")
 
 
 
 
330
 
331
- # Clear all queues completely
332
- if self.audio_queue:
333
- while not self.audio_queue.empty():
334
- try:
335
- self.audio_queue.get_nowait()
336
- except:
337
- pass
338
- # Queue'yu yeniden oluştur
339
- self.audio_queue = queue.Queue()
340
-
341
  final_result = None
342
  if self.responses_queue:
343
  while not self.responses_queue.empty():
@@ -347,41 +383,46 @@ class GoogleCloudSTT(STTInterface):
347
  final_result = result
348
  except:
349
  pass
350
- # Queue'yu yeniden oluştur
351
- self.responses_queue = queue.Queue()
352
 
353
- # Close and delete client
354
  if self.client:
355
  try:
356
  # Transport'u kapat
357
  if hasattr(self.client, 'transport') and hasattr(self.client.transport, 'close'):
358
  self.client.transport.close()
 
 
359
  # gRPC channel'ı kapat
360
  if hasattr(self.client, '_transport') and hasattr(self.client._transport, '_grpc_channel'):
361
  self.client._transport._grpc_channel.close()
 
362
  except Exception as e:
363
  log_warning(f"⚠️ Error closing Google client: {e}")
364
  finally:
365
  self.client = None
366
 
367
- # Reset all variables
 
 
 
 
368
  self.stream_thread = None
369
  self.streaming_config = None
370
  self.stop_event.clear()
371
 
372
- log_info("✅ Google STT streaming stopped and all resources cleaned")
373
  return final_result
374
 
375
  except Exception as e:
376
- log_error(f"❌ Failed to stop Google STT streaming", error=str(e))
377
  # Force cleanup on error
 
378
  self.stream_thread = None
379
  self.client = None
380
  self.streaming_config = None
381
- self.is_streaming = False
382
  self.stop_event.clear()
383
- self.audio_queue = queue.Queue()
384
- self.responses_queue = queue.Queue()
385
  return None
386
 
387
  def supports_realtime(self) -> bool:
 
40
  test_client = speech.SpeechClient()
41
  log_info("🔐 Testing Google credentials...")
42
  log_info("✅ Google credentials valid")
43
+ # Test client'ı kapat
44
+ if hasattr(test_client, 'transport') and hasattr(test_client.transport, 'close'):
45
+ test_client.transport.close()
46
  except Exception as e:
47
  log_error(f"❌ Google credentials error", error=str(e))
48
  raise
 
54
  self.client = None
55
  self.streaming_config = None
56
  self.is_streaming = False
57
+ self.audio_queue = None # Queue'ları None olarak başlat
58
+ self.responses_queue = None
59
  self.stream_thread = None
60
  self.stop_event = threading.Event()
61
+ self.credentials_path = credentials_path
62
+
63
+ # Session tracking
64
+ self.session_id = 0
65
+
66
+ def _create_fresh_queues(self):
67
+ """Create fresh queue instances"""
68
+ # Eski queue'ları temizle
69
+ if self.audio_queue:
70
+ while not self.audio_queue.empty():
71
+ try:
72
+ self.audio_queue.get_nowait()
73
+ except:
74
+ pass
75
+
76
+ if self.responses_queue:
77
+ while not self.responses_queue.empty():
78
+ try:
79
+ self.responses_queue.get_nowait()
80
+ except:
81
+ pass
82
+
83
+ # Yeni queue'lar oluştur
84
+ self.audio_queue = queue.Queue(maxsize=1000) # Max size ekle
85
+ self.responses_queue = queue.Queue(maxsize=100)
86
+ log_debug("✅ Created fresh queues")
87
 
88
  async def start_streaming(self, config: dict) -> None:
89
  """Initialize streaming session with clean state"""
90
  try:
91
+ self.session_id += 1
92
+ log_info(f"🎤 Starting Google STT streaming session #{self.session_id} with config: {config}")
93
 
94
  # Önce mevcut stream'i temizle
95
  if self.is_streaming or self.stream_thread:
96
  log_warning("⚠️ Previous stream still active, stopping it first")
97
  await self.stop_streaming()
98
+ # Temizlik için daha uzun bekle
99
+ await asyncio.sleep(0.5)
100
+
101
+ # Fresh queue'lar oluştur
102
+ self._create_fresh_queues()
103
+
104
+ # Stop event'i temizle
105
+ self.stop_event.clear()
106
 
107
  # Her start_streaming'de yeni client oluştur
108
  self.client = speech.SpeechClient()
 
136
  single_utterance=stt_config.single_utterance
137
  )
138
 
 
 
 
 
139
  self.is_streaming = True
 
140
 
141
+ # Start streaming thread with unique name
142
+ self.stream_thread = threading.Thread(
143
+ target=self._run_stream,
144
+ name=f"GoogleSTT-Session-{self.session_id}"
145
+ )
146
+ self.stream_thread.daemon = True # Daemon thread olarak işaretle
147
  self.stream_thread.start()
148
 
149
+ log_info(f"✅ Google STT streaming session #{self.session_id} started successfully")
150
 
151
  except Exception as e:
152
  log_error(f"❌ Failed to start Google STT streaming", error=str(e))
153
  self.is_streaming = False
154
  self.client = None
155
+ self._create_fresh_queues() # Hata durumunda da queue'ları temizle
156
  raise
157
 
158
  def _put_result(self, result: TranscriptionResult):
 
344
  async def stop_streaming(self) -> Optional[TranscriptionResult]:
345
  """Stop streaming and clean up all resources"""
346
  if not self.is_streaming and not self.stream_thread:
347
+ log_debug("Already stopped, nothing to do")
348
  return None
349
 
350
  try:
351
+ log_info(f"🛑 Stopping Google STT streaming session #{self.session_id}")
352
 
353
  # Flag'i hemen kapat
354
  self.is_streaming = False
 
356
 
357
  # Send poison pill to stop request generator
358
  if self.audio_queue:
359
+ try:
360
+ self.audio_queue.put(None)
361
+ except:
362
+ pass
363
 
364
+ # Thread'i durdur
365
  if self.stream_thread and self.stream_thread.is_alive():
366
+ log_info("⏳ Waiting for stream thread to finish...")
367
+ self.stream_thread.join(timeout=5.0) # 5 saniye bekle
368
+
369
  if self.stream_thread.is_alive():
370
+ log_warning("⚠️ STT thread did not stop gracefully after 5s")
371
+ # Thread'i zorla sonlandıramayız Python'da, ama daemon olduğu için
372
+ # ana program kapanınca otomatik kapanacak
373
+ else:
374
+ log_info("✅ Stream thread finished")
375
 
376
+ # Final result'ı al
 
 
 
 
 
 
 
 
 
377
  final_result = None
378
  if self.responses_queue:
379
  while not self.responses_queue.empty():
 
383
  final_result = result
384
  except:
385
  pass
 
 
386
 
387
+ # Client'ı kapat
388
  if self.client:
389
  try:
390
  # Transport'u kapat
391
  if hasattr(self.client, 'transport') and hasattr(self.client.transport, 'close'):
392
  self.client.transport.close()
393
+ log_debug("✅ Client transport closed")
394
+
395
  # gRPC channel'ı kapat
396
  if hasattr(self.client, '_transport') and hasattr(self.client._transport, '_grpc_channel'):
397
  self.client._transport._grpc_channel.close()
398
+ log_debug("✅ gRPC channel closed")
399
  except Exception as e:
400
  log_warning(f"⚠️ Error closing Google client: {e}")
401
  finally:
402
  self.client = None
403
 
404
+ # Queue'ları None yap (yeniden kullanım için fresh queue gerekecek)
405
+ self.audio_queue = None
406
+ self.responses_queue = None
407
+
408
+ # Diğer değişkenleri resetle
409
  self.stream_thread = None
410
  self.streaming_config = None
411
  self.stop_event.clear()
412
 
413
+ log_info(f"✅ Google STT streaming session #{self.session_id} stopped and cleaned")
414
  return final_result
415
 
416
  except Exception as e:
417
+ log_error(f"❌ Error during stop_streaming", error=str(e))
418
  # Force cleanup on error
419
+ self.is_streaming = False
420
  self.stream_thread = None
421
  self.client = None
422
  self.streaming_config = None
 
423
  self.stop_event.clear()
424
+ self.audio_queue = None
425
+ self.responses_queue = None
426
  return None
427
 
428
  def supports_realtime(self) -> bool: