Spaces:
Paused
Paused
| """ | |
| Real-time STT Manager for streaming transcription | |
| """ | |
| from typing import AsyncIterator, Optional, Dict, Any | |
| import asyncio | |
| from datetime import datetime | |
| import sys | |
| from stt_interface import STTInterface, STTConfig, TranscriptionResult | |
| from config_provider import ConfigProvider | |
| from logger import log_info, log_error, log_warning, log_debug | |
| class STTStreamManager: | |
| """Manages real-time STT streaming""" | |
| def __init__(self): | |
| self.stt_provider: Optional[STTInterface] = None | |
| self.is_streaming = False | |
| self.config = None | |
| self.accumulated_text = "" | |
| self.last_final_result = None | |
| async def initialize(self, stt_provider: STTInterface, config: Dict[str, Any]): | |
| """Initialize STT stream manager""" | |
| self.stt_provider = stt_provider | |
| # STTConfig objesi oluştur | |
| self.config = STTConfig( | |
| language=config.get("language", "tr-TR"), | |
| sample_rate=config.get("sample_rate", 16000), | |
| encoding=config.get("encoding", "WEBM_OPUS"), | |
| enable_punctuation=config.get("enable_punctuation", True), | |
| interim_results=config.get("interim_results", True), | |
| single_utterance=False, # Important for continuous listening | |
| speech_timeout_ms=config.get("speech_timeout_ms", 2000), | |
| vad_enabled=config.get("vad_enabled", True), | |
| noise_reduction_enabled=config.get("noise_reduction_enabled", True), | |
| noise_reduction_level=config.get("noise_reduction_level", 2), | |
| enable_word_timestamps=config.get("enable_word_timestamps", False), | |
| model=config.get("model", "latest_long"), | |
| use_enhanced=config.get("use_enhanced", True) | |
| ) | |
| # Start streaming session - artık STTConfig objesi gönderiyoruz | |
| await self.stt_provider.start_streaming(self.config) | |
| self.is_streaming = True | |
| log_info("✅ STT stream manager initialized") | |
| async def process_chunk(self, audio_chunk: bytes) -> AsyncIterator[TranscriptionResult]: | |
| """Process audio chunk and yield transcription results""" | |
| if not self.is_streaming or not self.stt_provider: | |
| log_info("⚠️ STT not streaming or provider not initialized") | |
| return | |
| try: | |
| # Stream audio to STT provider | |
| async for result in self.stt_provider.stream_audio(audio_chunk): | |
| # Update accumulated text for final results | |
| if result.is_final: | |
| self.accumulated_text = result.text | |
| self.last_final_result = result | |
| yield result | |
| except Exception as e: | |
| log_error("❌ STT processing error", e) | |
| # Yield error result | |
| yield TranscriptionResult( | |
| text="", | |
| is_final=False, | |
| confidence=0.0, | |
| timestamp=datetime.now().timestamp(), | |
| is_interrupt=True | |
| ) | |
| async def stop_streaming(self) -> Optional[TranscriptionResult]: | |
| """Stop streaming and get final result""" | |
| if not self.is_streaming or not self.stt_provider: | |
| return None | |
| try: | |
| self.is_streaming = False | |
| final_result = await self.stt_provider.stop_streaming() | |
| if final_result: | |
| self.accumulated_text = final_result.text | |
| self.last_final_result = final_result | |
| log_info("✅ STT streaming stopped") | |
| return final_result | |
| except Exception as e: | |
| log_error("❌ Error stopping STT stream", e) | |
| return None | |
| def reset(self): | |
| """Reset accumulated text and state""" | |
| self.accumulated_text = "" | |
| self.last_final_result = None | |
| log_info("🔄 STT stream manager reset") | |
| def get_accumulated_text(self) -> str: | |
| """Get all accumulated text from the session""" | |
| return self.accumulated_text |