|
""" |
|
Transcription API module |
|
""" |
|
|
|
import os |
|
from typing import Optional, Dict, Any |
|
|
|
from ..adapters import TranscriptionAdapterFactory |
|
from ..services import TranscriptionService |
|
from ..core import FFmpegAudioSplitter |
|
from ..utils import AudioProcessingConfig, AudioProcessingError |
|
|
|
|
|
class TranscriptionAPI: |
|
"""High-level API for transcription operations""" |
|
|
|
def __init__(self, config: Optional[AudioProcessingConfig] = None): |
|
self.config = config or AudioProcessingConfig() |
|
self.transcription_service = None |
|
self._initialize_service() |
|
|
|
def _initialize_service(self): |
|
"""Initialize transcription service with appropriate adapter""" |
|
try: |
|
|
|
endpoint_url = self._get_endpoint_url() |
|
|
|
|
|
transcriber = TranscriptionAdapterFactory.create_adapter( |
|
deployment_mode="auto", |
|
config=self.config, |
|
endpoint_url=endpoint_url |
|
) |
|
|
|
|
|
audio_splitter = FFmpegAudioSplitter() |
|
|
|
|
|
self.transcription_service = TranscriptionService( |
|
transcriber=transcriber, |
|
audio_splitter=audio_splitter, |
|
speaker_detector=None, |
|
config=self.config |
|
) |
|
|
|
except Exception as e: |
|
print(f"⚠️ Failed to initialize transcription service: {e}") |
|
raise AudioProcessingError(f"Service initialization failed: {e}") |
|
|
|
def _get_endpoint_url(self) -> Optional[str]: |
|
"""Get Modal endpoint URL from configuration""" |
|
try: |
|
import json |
|
config_file = "endpoint_config.json" |
|
if os.path.exists(config_file): |
|
with open(config_file, 'r') as f: |
|
config = json.load(f) |
|
return config.get("transcribe_audio") |
|
except Exception: |
|
pass |
|
return None |
|
|
|
async def transcribe_audio_file( |
|
self, |
|
audio_file_path: str, |
|
model_size: str = "turbo", |
|
language: Optional[str] = None, |
|
output_format: str = "srt", |
|
enable_speaker_diarization: bool = False |
|
) -> Dict[str, Any]: |
|
"""Transcribe audio file using the configured service""" |
|
|
|
if not self.transcription_service: |
|
raise AudioProcessingError("Transcription service not initialized") |
|
|
|
return await self.transcription_service.transcribe_audio_file( |
|
audio_file_path=audio_file_path, |
|
model_size=model_size, |
|
language=language, |
|
output_format=output_format, |
|
enable_speaker_diarization=enable_speaker_diarization |
|
) |
|
|
|
|
|
|
|
_api_instance = None |
|
|
|
def get_transcription_api() -> TranscriptionAPI: |
|
"""Get global transcription API instance""" |
|
global _api_instance |
|
if _api_instance is None: |
|
_api_instance = TranscriptionAPI() |
|
return _api_instance |
|
|
|
async def transcribe_audio_adaptive_sync( |
|
audio_file_path: str, |
|
model_size: str = "turbo", |
|
language: str = None, |
|
output_format: str = "srt", |
|
enable_speaker_diarization: bool = False |
|
) -> Dict[str, Any]: |
|
""" |
|
Adaptive transcription function that routes to appropriate backend |
|
""" |
|
api = get_transcription_api() |
|
return await api.transcribe_audio_file( |
|
audio_file_path=audio_file_path, |
|
model_size=model_size, |
|
language=language, |
|
output_format=output_format, |
|
enable_speaker_diarization=enable_speaker_diarization |
|
) |